Govarbitrage
Search the build
-
eb7e3132026-07-28 auto-save: 2026-07-28T06:58:06 (1 files) — tsconfig.tsbuildinfo -
0de26912026-07-28 agents: drop CRE-adjacent service/trade firms from CRE finder -
a2ed0e62026-07-27 auto-save: 2026-07-27T21:24:43 (1 files) — tsconfig.tsbuildinfo -
2d441932026-07-27 agents: drop financial-advisory/wealth firms from CRE finder -
c53b1f22026-07-27 agents: relevance-weighted ranking — surface stronger CRE matches first -
c1734732026-07-27 auto-save: 2026-07-27T20:24:23 (1 files) — tsconfig.tsbuildinfo -
93bf1bd2026-07-27 agents: fix off-topic type gate — exact-token match, not \b-regex -
80933622026-07-27 chore: v0.4.0 → v0.5.0 (session close — basic-auth login + price lock) -
70e7b1e2026-07-27 auto-save: 2026-07-27T08:49:12 (1 files) — tsconfig.tsbuildinfo -
05f0b662026-07-27 auctions/govarbitrage: basic un/pw IS the login — passing the outer wall mints an ADMIN session, no email/login form (Steve) -
4d4adb42026-07-27 auto-save: 2026-07-27T07:48:56 (1 files) — tsconfig.tsbuildinfo -
53850922026-07-27 govarbitrage: lock Standard=$19 / Premium=$49 (Steve-approved prices; code had drifted to 12/29) -
64529102026-07-26 chore: v0.4.0 (session close) — /agents search debug+improve, precision filter, sort+density, security hardening, a11y+dedupe -
d17c2b22026-07-26 agents: a11y + empty/loading-state polish on agent-finder -
b791b342026-07-26 agents: contact-based dedupe — collapse same office surfaced under multiple lenses (same phone; or same website when phones don't contradict), so national-brand branch offices stay distinct -
3b38d912026-07-26 auto-save: 2026-07-26T17:14:46 (4 files) — src/app/api/agents/search/route.ts src/lib/places.ts src/lib/rate-limit.ts src/lib/places.test.ts -
8b396742026-07-26 agents: harden search route — session-keyed rate-limit (unspoofable vs X-Forwarded-For), city/state/zip validation, allSettled (partial results survive) + billed-only query count + sanitized upstream errors -
78d5fa82026-07-26 agents: results grid gets sort (best/rating/reviews/name) + density slider, localStorage-persisted (Steve standing-rule: every grid needs sort+density) -
69f9dc12026-07-26 agents: precision-first commercial filter — require positive commercial evidence (name signal or brokerage-brand allowlist), drop residential/off-topic (LA 57->28, verified live vs Google Places) -
f82010f2026-07-26 deploy: provision GOOGLE_PLACES_API_KEY (non-destructive) + bounded /login smoke-retry — fixes silent 503 on /agents live search -
75b5e882026-07-26 agents: better search — 3 curated CRE query lenses/kind (buyer+leasing), types-based commercial filter, exact billed-query count + honest cost estimate ($0.24/both) -
63fd9d52026-07-26 agents: explicit 'not tied to surplus listings' disclaimer (contrarian FIX-FIRST — the nav link implied a catalog connection the copy fix alone left standing) -
4aa02342026-07-26 agents: honest copy — standalone commercial-RE finder 'by location', drop false 'near a surplus property' framing (catalog has ~2 commercial real-property listings, not 111) -
dd2a6412026-07-25 chore: lint, refactor (ssrf fe80::/10 mask, middleware dedup), v0.3.0 (session close) -
74ea2fe2026-07-25 feat(agents): commercial CRE buyer/leasing agent finder via Google Places (commercial-only, login-gated, rate-limited, cost-surfaced) -
45015872026-07-25 fleet-sso: bump minted role VIEWER->ANALYST + PREMIUM tier for the fleet operator (operational access + full data; credentials still ADMIN-only) -
dd56e4d2026-07-25 seo: make /selling-avenues public in middleware (was crawlable in robots+sitemap but gated → indexed-redirect) -
026c8ee2026-07-25 security(DTD-B): fleet SSO mints VIEWER not ADMIN; role-tier requireWrite (ANALYST floor) + requireAdmin on credentials (GET was unguarded) -
d468e962026-07-25 refine(yolo): DB-side pagination + bounded reports, table sort/density controls, public-page dark-mode tokens, buyer-page reorder; contrarian fixes (double-desc, sort-select label, null-order, non-silent caps) -
1a778cf2026-07-25 auto-save: 2026-07-25T12:36:15 (8 files) — src/app/b/[slug]/page.tsx src/app/deals/page.tsx src/app/newsletter/page.tsx src/app/pricing/page.tsx src/components/listings-table.tsx -
1d1a7ee2026-07-25 refine: SEO (real-domain sitemap/robots, metadata+JSON-LD), SSRF guard on url import, login timing fix, dashboard/score/retail correctness, table+detail UX polish -
2c066de2026-07-25 auctions: accept fleet SSO (aafleet) cookie → one shared login across *.agentabrams.com -
6c0f4d82026-07-22 Username-only sign-in (email login retired); admin uses std fleet password -
1a64a1d2026-07-22 Sign-in accepts bare username (resolved via email local-part) or full email -
873b83f2026-07-14 chore: v0.2.1 (session close — auth wall) -
9b99d812026-07-13 Add outer admin/DW2024! basic-auth wall (bypass Stripe webhook + import-token clients) -
8e80bc62026-07-13 chore: lint (Link over bare <a>), refactor (toEdition helper, HTML_ESCAPE), stale-comment fix, v0.1.0 → v0.2.0 (session close) -
887f5c62026-07-13 5x sweeps 3-4: OG/twitter tags on /newsletter, honest live copy (page+email), https-only guard on live digest links -
059a0542026-07-13 5x live verification: 2 consecutive clean sweeps, 0 defects -
974fc372026-07-13 Go-live: george-env runtime cred injection (py), newsletter server + digest wrappers, launchd 6am/5pm subscriber digest -
c4846342026-07-13 Newsletter live transport: George /api/send with external-send approval header, runtime-injected creds (george-env.sh pattern), server + digest wrappers; live still gated on env mode+token -
dba59ea2026-07-13 auto-save: 2026-07-13T01:52:00 (8 files) — prisma/schema.prisma scripts/seed-digest-snapshots.ts src/app/api/listings/[id]/route.ts src/app/listings/[id]/page.tsx src/lib/digest-snapshot.ts -
519132e2026-07-13 SEO plumbing: sitemap.xml (static pages + every archive date), robots.txt (public routes allowed, app/private disallowed), canonicals from NEWSLETTER_BASE_URL -
5e22c502026-07-13 Public SEO deal archive: /deals index + /deals/[date] teaser pages (ROI band + confidence shown, max-bid/net-profit withheld behind subscribe CTA), middleware allowlist, nav links -
343863b2026-07-13 DigestSnapshot model: freeze each honesty-gated Top-10 at send time (public-safe fields only); capture wired into digest send + standalone; seed script with marked fabricated edition -
8d983492026-07-13 Contrarian fixes: digest send-to-list engine (TEST-logged), redact tokens in outbox logs, honest pre-launch landing copy -
e626b082026-07-13 Public /newsletter landing: digest pitch, subscribe form with confirm-your-email state, CAN-SPAM small print; nav link -
d2427302026-07-13 Newsletter API: subscribe (honeypot+rate-limit, enumeration-safe), confirm, one-click unsubscribe; TEST-mode email outbox -
562ea5d2026-07-13 Subscriber model: double-opt-in newsletter (PENDING/CONFIRMED/UNSUBSCRIBED, unique tokens) -
687fd822026-07-13 Reprice tiers to research-backed audience-building points: Standard $19->$12, Premium $49->$29 -
f564b8f2026-07-13 3-tier paid-alerts paywall (Free/Standard/Premium) — TEST/mock Stripe, value-gated -
11626722026-07-13 Honesty Gate: confidence-discounted, capped, disclaimed hot-deal figures (no inflated-ROI chargeback trap) -
bba72072026-07-12 set-admin: generate strong random password server-side (no hardcoded default) -
deba4c52026-07-10 seed: never hardcode admin password — set out-of-band via set-admin (ADMIN_PASSWORD env) -
6b2f5762026-07-10 Unified admin credential (admin@agentabrams.com) durable across deploys + set-admin script -
0eefdaf2026-07-10 deploy: non-destructive db push + install prod cron (refresh @noon + liveness /15m) -
e9ed2a52026-07-10 Add HOT DEAL alerts + fast dead-listing removal + listing lifecycle -
97704b22026-07-10 Add daily-noon refresh runners for Municibid/PublicSurplus/GovPlanet -
b44789f2026-07-10 Crack GovPlanet (free): extract embedded quickviews JSON, USD, no browser -
6b3da442026-07-10 Wire Municibid + Public Surplus imports into deploy-auctions.sh -
e9f92ce2026-07-10 Crack Public Surplus (free): SSR category HTML parser, no API/browser -
860397d2026-07-10 Crack Municibid (free): SSR /browse HTML parser, no API/browser at runtime -
a0d4cae2026-07-10 auto-save: 2026-07-10T08:44:50 (1 files) — scripts/deploy-auctions.sh -
52165722026-07-10 Phase 21b: deploy-auctions.sh uses --force-reset (old Kamatera DB = 26 disposable stub rows on incompatible schema; repopulated by seed + free feeds) -
49f18582026-07-10 Phase 21: deploy-auctions.sh — one-shot update deploy to auctions.agentabrams.com (rsync+migrate+build+free-feed populate+pm2), preserves server .env -
357a4ea2026-07-10 Phase 20: FREE GraysOnline (AU) importer via harvested Algolia index GOL_MAIN (public app-id+key, $0); AUD→USD conversion; +GRAYS_AU source; 100 lots verified -
ab802732026-07-10 Phase 19: free maestro importer now pulls 3 LS marketplaces (GovDeals + GoIndustry + Network Intl) via businessId; +2 source enums; daily job pulls all three ($0). GoIndustry industrial/lab equipment now flowing (60 listings) -
bd529032026-07-10 Phase 18: FREE GovDeals importer via maestro.lqdt1.com/search/list (public key, no Apify, no browser, $0) — cracked via openclaw real-Chrome API capture; daily-120 free job replaces paid Apify (retired: plist + runners deleted); GI/NI siblings supported -
9b61dc82026-07-10 Phase 17: all fields searchable + sortable — client global filter matches every field (text/number/score), per-column filter row (toggle), all data columns sortable, filtered-count + filtered CSV export, pageSize 1000 -
cbd0fd32026-07-10 Phase 16: activate daily-30 GovDeals Apify job (4:40am, ~$0.49/run/~$15mo); compute real cost from known pricing (init+results×0.01599) not run usageTotalUsd which undercounts; verification run OK (30 listings, 0 failed) -
eb11f2d2026-07-10 Phase 15: daily GovDeals Apify runner built (triggerApifyRun + run-apify-govdeals.ts + wrapper + 4:40am plist + cost-tracker apify_govdeals pricing) — schedule NOT loaded pending Steve's go; reads free, runs paid -
abdaa992026-07-10 Phase 14: GovDeals via Apify (parseforge/govdeals-scraper) — apify-govdeals importer + script + read-only auth-gated route; 10 real GovDeals listings ingested; token routed via secrets-manager; paid actor runs intentionally gated -
2be57392026-07-09 Phase 13: 5am GSA import launchd job (com.steve.govarbitrage-gsa-import) refreshes 200 live auctions before the 6am digest; run-gsa-import.sh wrapper -
424827a2026-07-09 Phase 12: international arbitrage venues — per-item offer links (eBay UK/DE/AU, Yahoo Auctions JP, Mercari, Carousell HK, Grays/Pickles AU, Taobao/JD/Alibaba CN, Catawiki/Troostwijk EU) as 'International Offers' column + detail section; sourcing directory for Europe/HK/Japan/AU/China on /selling-avenues; +1 test -
e4596b52026-07-09 Phase 11: per-item cross-network offer links (eBay sold/active, GovDeals, AllSurplus, MachineryTrader/LabX/DOTmed) + social 'goods-needed' board links (Reddit/r-Flipping/ISO, FB Marketplace, Craigslist, Discord) — 2 dashboard columns + detail sections; +4 tests -
1a7aa382026-07-09 Phase 10: live GSA Auctions API importer (free, no scraping) — src/importers/gsa.ts + /api/import/gsa + scripts/import-gsa.ts; ingest useAI toggle for fast bulk; 30 real federal listings imported, now surfacing in the digest -
5a58b682026-07-09 chore: gitignore logs/ (untrack generated digest preview) -
dbc30032026-07-09 Phase 9: twice-daily Top-10 opportunity email digest with detailed per-item tables (valuation + full cost breakdown + scores) via George; launchd 6am/5pm; creds sourced from ~/.claude.json (never duplicated) -
ec9c8a32026-07-09 auto-save: 2026-07-09T23:12:38 (1 files) — scripts/ -
3d43a922026-07-09 Phase 8: rate-limiting (in-memory sliding window) on login (per-IP + per-email) and public buyer-lead; +3 tests, live-verified 429 -
2eef6fc2026-07-09 Phase 7: real session auth — scrypt passwords, jose JWT cookies, Edge middleware gating all routes, login/logout/me, roles+AuditLog, session-aware write-guard, +5 auth tests -
5833bd02026-07-09 Phase 6 (contrarian fixes): real AES-256-GCM secret encryption + credentials API, IMPORT_TOKEN write-guard on all write routes, fix scrape ?ac= typo, qty>1 cost test, honest security README -
7b18a952026-07-09 Phase 5: importers (CSV/extension/URL) + worker + compliant buyer workflow + reports + selling-avenues + MV3 extension + docs/Docker + Playwright -
19346842026-07-09 auto-save: 2026-07-09T22:42:31 (5 files) — README.md extension/ src/app/selling-avenues/ src/importers/ src/lib/selling-avenues.ts -
cd720872026-07-09 Phase 4b: ESLint 9 flat config (Next 16 native) — lint passes 0 errors -
270f0592026-07-09 Phase 4: dashboard (cards + full-column TanStack table + CSV/profiles), listing detail, API routes — builds + serves live -
23bcc512026-07-09 Phase 3: local-Ollama AI identification, research pipeline, 25-listing seed (full research/costs/scores) -
111d8f12026-07-09 Phase 2: deterministic valuation/cost/scoring engines + 16 passing Vitest tests -
d537d062026-07-09 Phase 1: Next.js 16 + TS + Prisma 6 + Postgres scaffold, full schema synced
Authors
- Steve89
Agents used
- search-specialist1
- secrets-manager1
Skills used
- /app8
- /page5
- /selling-avenues4
- /billing4
- /price4
- /leasing3
- /agents3
- /deals3
- /newsletter3
- /pricing3
- /realty2
- /real2
- /net2
- /reversible2
- /govarbitrage2
- /login2
- /search2
- /route2
- /places2
- /state2
- /score2
- /listings2
- /scores2
- /location2
- /browser2
- /browse2
- /image2
- /importers2
- /gsa2
- /trade1
Creative ideas + design notes
0de2691 · 2026-07-28 · agents: drop CRE-adjacent service/trade firms from CRE finder
Distinct precision unit after type-gate (93bf1bd), relevance-ranking (c53b1f2), finance-FP (2d44193): a name-signal false-positive class for CRE-ADJACENT SERVICE firms. A Places 'commercial real estate broker' text search surfaces appraisal/title/escrow/construction/mortgage-lending/ inspection/property-management firms whose 'commercial'/'property' tokens satisfy COMMERCIAL_RE, so they were wrongly kept as buyer/leasing brokers. isCommercial() now drops a CRE_SERVICE_RE name UNLESS it carries a BROKER_ANCHOR_RE (broker/brokerage/realty/real estate/leasing/tenant rep/ investment sales/net lease) or an allowlisted brand — a full-service brokerage's valuation/PM arm survives. Runs before the positive keep (same reason as the finance gate). 9/9 service FPs drop, 7/7 legit brokers + brand arms preserved. +20 tests, 151/151, tsc+eslint clean.
2d44193 · 2026-07-27 · agents: drop financial-advisory/wealth firms from CRE finder
The broker/finance verticals overlap, so a Places text search for 'commercial real estate broker' surfaces wealth-management, financial- advisory and securities firms. Their names carry finance-ambiguous tokens (investments/advisors/capital markets) that also satisfy the generic COMMERCIAL_RE keep, so 'Sterling Financial Advisors', 'Vanguard Investment Advisors', 'Edward Jones Investments' etc. were wrongly kept as CRE brokers (the finance type-gate only catches Google-tagged finance; many wealth firms come back as establishment/POI). Add a financial-advisory name gate that runs before the commercial keep: a wealth/securities/financial firm is dropped UNLESS it carries an unambiguous real-estate anchor (real estate/realty/CRE/properties/ leasing/net lease/investment sales/commercial) or an allowlisted CRE brand. 'investment sales' stays a CRE anchor so legit investment-sales brokers survive. +18 offline regression tests, 131/131, tsc+eslint clean. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
c53b1f2 · 2026-07-27 · agents: relevance-weighted ranking — surface stronger CRE matches first
The commercial-RE finder ranked purely by rating*log(reviews), so a weakly-commercial high-rated generic outranked a two-lens national brokerage (CBRE surfaced by both buyer+leasing) with modest reviews. Add bounded relevanceScore() (national brand +0.3, strong commercial name +0.2, both-lens coverage +0.1) folded into the rank as a multiplier + relevance tiebreak. Bounded so a 0-review brand still weighs rating*log(1)=0 and cannot leapfrog a genuinely reviewed office. Pure/offline/reversible; +7 tests (113/113), tsc clean, $0 no billing. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
93bf1bd · 2026-07-27 · agents: fix off-topic type gate — exact-token match, not \b-regex
Google Places types are underscore-joined (furniture_store, shopping_mall). '_' is a JS word char, so \bstore\b never fired inside a compound type — the step-1 off-topic gate was a near no-op: an 'Office Furniture Warehouse' tagged furniture_store (commercial-sounding name) was wrongly KEPT as a CRE broker. Replace OFF_TOPIC_TYPE_RE / RESIDENTIAL_TYPE_RE with exact-token Sets + isOffTopicType() (Set membership OR *_store suffix), and expand the blocklist (shopping_mall, finance, lawyer, car_dealer, *_store, etc). +11 regression tests. tsc clean; full suite 106/106. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
d17c2b2 · 2026-07-26 · agents: a11y + empty/loading-state polish on agent-finder
- aria-label on City/State/ZIP inputs (placeholder is not an accessible name) - type filter is a role=group with aria-pressed toggle buttons + focus-visible ring - error text gets role=alert; sr-only role=status/aria-live announces searching + result count - loading skeleton grid (shaped placeholders) replaces the bare Searching… button - sort <select> gets aria-label + focus-visible ring; results container aria-busy - fix pre-existing react-hooks/set-state-in-effect lint error on the deliberate localStorage-hydration effect (scoped disable w/ justification) DTD-loop follow-on to the dedupe pass. tsc clean, eslint clean (this file), next build OK, 96/96 tests pass. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
b791b34 · 2026-07-26 · agents: contact-based dedupe — collapse same office surfaced under multiple lenses (same phone; or same website when phones don't contradict), so national-brand branch offices stay distinct
DTD unanimous 5/5 (Claude+Codex+Qwen+Grok+Kimi) picked this as the highest-value SAFE/reversible refinement. Phone is authoritative per-office identity (fixes CBRE + CBRE Investment Sales dup); website only merges when phones can't prove two branches. Pure lib logic + 23 new offline unit tests (dedupeByContact/normalizePhone/normalizeHost), zero live Places billing. tsc clean, 96/96 tests pass. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
687fd82 · 2026-07-13 · Reprice tiers to research-backed audience-building points: Standard $19->$12, Premium $49->$29
Market research (search-specialist, 2026 comps): category entry norm $5-30/mo; direct gov-auction comp GovAuctions.app=$7/mo; Amazon tools $19-89. $12/$29 undercuts the pack to maximize signups in the growth phase. env-overridable.
f564b8f · 2026-07-13 · 3-tier paid-alerts paywall (Free/Standard/Premium) — TEST/mock Stripe, value-gated
Tier enum + User.tier/stripe fields; src/lib/tiers.ts (Free $0 / Standard $19 / Premium $49 draft, env-overridable); src/lib/billing.ts (Stripe TEST-only, refuses sk_live_, mock mode when no key); /pricing page + UpgradeButton; /api/billing/checkout + /billing/success (mock-upgrades) + /api/billing/webhook (real source of truth in test); getCurrentTier() (ADMIN->PREMIUM); listings API gates FREE (caps rows + redacts max-bid/ROI/scores) vs paid (full intelligence). Verified: /pricing 200 (3 tiers), checkout 401 unauth, typecheck+build clean. Live keys/real charges/price/distribution remain Steve-gated.
1162672 · 2026-07-13 · Honesty Gate: confidence-discounted, capped, disclaimed hot-deal figures (no inflated-ROI chargeback trap)
Per yolo cycle-2 DTD (A + Honesty-Gate-first) and the cycle-1 contrarian: paid alerts must never sell a bare '727% ROI' heuristic. hot-deals.ts now computes a CONFIDENCE (from real comp count + sell-prob + used-comps) that haircuts the optimistic sale/ROI (LOW 0.5 / MED 0.7 / HIGH 0.9) and caps displayed ROI at 200%; hot-deal-alert.ts shows the conservative low-side figures + a confidence badge + a mandatory 'verify comps' disclaimer + honest header. Unit-verified.
deba4c5 · 2026-07-10 · seed: never hardcode admin password — set out-of-band via set-admin (ADMIN_PASSWORD env)
Redeploys no longer clobber a real credential; fresh installs get a random throwaway hash until set-admin runs. Removes the hardcoded default from the repo.
0eefdaf · 2026-07-10 · deploy: non-destructive db push + install prod cron (refresh @noon + liveness /15m)
Drop --force-reset (schema changes are additive; imports upsert) so deploys no longer wipe live data. Install /etc/cron.d/govarbitrage so the live site self- refreshes daily and sweeps dead listings every 15 min. Hot-deal alerts stay on mac3 (George creds never touch prod).
e9ed2a5 · 2026-07-10 · Add HOT DEAL alerts + fast dead-listing removal + listing lifecycle
- ListingStatus (ACTIVE/ENDED/REMOVED) + endedAt/lastSeenAt/livenessCheckedAt + hotAlertedAt on Listing; queryListings defaults to ACTIVE (dead listings vanish from the grid); ingest reactivates + stamps lastSeenAt on re-import. - HOT DEAL gate (src/lib/hot-deals.ts): buy-side headroom (recMaxBid>bid) + proven sell-side (demand + probOfSale + comps/expected-sale) + net/ROI bar. Tuned to score>=82 elite band (corpus is bimodal; heuristic valuations run optimistic until real-comp calibration). scripts/hot-deal-alert.ts emails new deals via George (sell-side-first layout, flags buyer leads), dedups via hotAlertedAt. Verified live send. - Two-tier liveness (scripts/liveness-sweep.ts): Tier1 instant-expire past closingAt ($0, no net); Tier2 network-verify null-clock items, REMOVE on 404/410/gone-markers only (never on transient errors). - Runners run-hot-deals.sh (George shim, mac3) + run-liveness.sh.
97704b2 · 2026-07-10 · Add daily-noon refresh runners for Municibid/PublicSurplus/GovPlanet
launchd jobs com.steve.govarbitrage-{municibid,publicsurplus,govplanet}-free
fire at 12:00/12:04/12:08 (staggered), refreshing the LOCAL db that feeds
the digest. Verified via kickstart+log (100 fetched, idempotent upsert).
b44789f · 2026-07-10 · Crack GovPlanet (free): extract embedded quickviews JSON, USD, no browser
GovPlanet runs the IronPlanet/Ritchie Bros stack (NOT on LS maestro API).
searchResults.ips + /buy-now embed a per-item quickviews.push({...}) JSON
object with all fields (equipId/description/price/location/photo/timeLeft),
already USD. Brace/string-aware scanner extracts them (values contain ')'
inside strings). Added GOVPLANET to enum + SOURCE_MAP + table filter.
116 rows ingested. 8th free source. $0 no-browser-at-runtime.
e9f92ce · 2026-07-10 · Crack Public Surplus (free): SSR category HTML parser, no API/browser
/sms/browse/cataucs?catid=C&page=P returns 25 fully-rendered auction cards to plain curl (HTTP 200). Parse .auction-item cards across 28 categories; 100% field coverage (title/price/state/image + relative-time->closingAt). $0 no-browser-at-runtime. 80 rows ingested. 7th free source.
860397d · 2026-07-10 · Crack Municibid (free): SSR /browse HTML parser, no API/browser at runtime
Municibid is server-rendered ASP.NET (no JSON listings API — the earlier gist.build lead was the Customer.io chat widget). Plain curl gets HTTP 200, so parse .browse-item cards + ?page=N pagination. 100% field coverage (title/price/bids/absolute-close/location/image), $0. 100 rows ingested.
File tree
- .dockerignore
- .env.example
- .gitignore
- 5x/REPORT.md
- Dockerfile
- README.md
- docker-compose.yml
- docs/API.md
- docs/ARCHITECTURE.md
- eslint.config.mjs
- extension/README.md
- extension/background.js
- extension/content.js
- extension/manifest.json
- extension/popup.html
- extension/popup.js
- next.config.ts
- package-lock.json
- package.json
- playwright.config.ts
- postcss.config.mjs
- prisma/schema.prisma
- prisma/seed.ts
- public/.gitkeep
- scripts/deploy-auctions.sh
- scripts/george-env.py
- scripts/george-env.sh
- scripts/hot-deal-alert.ts
- scripts/import-apify-govdeals.ts
- scripts/import-govdeals-free.ts
- scripts/import-govplanet-free.ts
- scripts/import-grays.ts
- scripts/import-gsa.ts
- scripts/import-municibid-free.ts
- scripts/import-publicsurplus-free.ts
- scripts/liveness-sweep.ts
- scripts/probe-govdeals.ts
- scripts/run-digest.sh
- scripts/run-govdeals-free.sh
- scripts/run-govplanet-free.sh
- scripts/run-gsa-import.sh
- scripts/run-hot-deals.sh
- scripts/run-liveness.sh
- scripts/run-municibid-free.sh
- scripts/run-newsletter-digest.sh
- scripts/run-newsletter-server.sh
- scripts/run-publicsurplus-free.sh
- scripts/seed-digest-snapshots.ts
- scripts/send-digest.ts
- scripts/send-newsletter-digest.ts
- scripts/set-admin.ts
- src/app/agents/page.tsx
- src/app/api/agents/search/route.ts
- src/app/api/auth/login/route.ts
- src/app/api/auth/logout/route.ts
- src/app/api/auth/me/route.ts
- src/app/api/billing/checkout/route.ts
- src/app/api/billing/webhook/route.ts
- src/app/api/credentials/route.ts
- src/app/api/import/apify-govdeals/route.ts
- src/app/api/import/csv/route.ts
- src/app/api/import/extension/route.ts
- src/app/api/import/gsa/route.ts
- src/app/api/import/url/route.ts
- src/app/api/listings/[id]/buyer-lead/route.ts
- src/app/api/listings/[id]/buyer-page/route.ts
- src/app/api/listings/[id]/route.ts
- src/app/api/listings/route.ts
- src/app/api/newsletter/confirm/route.ts
- src/app/api/newsletter/result-page.ts
- src/app/api/newsletter/subscribe/route.ts
- src/app/api/newsletter/unsubscribe/route.ts
- src/app/b/[slug]/page.tsx
- src/app/billing/success/page.tsx
- src/app/deals/[date]/page.tsx
- src/app/deals/page.tsx
- src/app/globals.css
- src/app/layout.tsx
- src/app/listings/[id]/page.tsx
- src/app/login/page.tsx
- src/app/newsletter/SubscribeForm.tsx
- src/app/newsletter/page.tsx
- src/app/page.tsx
- src/app/pricing/UpgradeButton.tsx
- src/app/pricing/page.tsx
- src/app/reports/page.tsx
- src/app/robots.ts
- src/app/selling-avenues/page.tsx
- src/app/sitemap.ts
- src/components/agent-finder.tsx
- src/components/dashboard-cards.tsx
- src/components/listings-table.tsx
- src/components/logout-button.tsx
- src/components/offer-form.tsx
- src/components/ui/badge.tsx
- src/components/ui/button.tsx
- src/components/ui/card.tsx
- src/components/ui/input.tsx
- src/engines/constants.ts
- src/engines/costs.test.ts
- src/engines/costs.ts
- src/engines/demand.ts
- src/engines/freight.ts
- src/engines/scoring.test.ts
- src/engines/scoring.ts
- src/engines/types.ts
- src/engines/valuation.test.ts
- src/engines/valuation.ts
- src/importers/apify-govdeals.ts
- src/importers/csv.ts
- src/importers/govdeals-free.ts
- src/importers/govplanet-free.ts
- src/importers/grays-free.ts
- src/importers/gsa.ts
- src/importers/ingest.ts
- src/importers/municibid-free.ts
- src/importers/publicsurplus-free.ts
- src/importers/scrape.ts
- src/lib/ai.ts
- src/lib/auth.test.ts
- src/lib/auth.ts
- src/lib/billing.ts
- src/lib/crypto.test.ts
- src/lib/crypto.ts
- src/lib/current-user.ts
- src/lib/dashboard.ts
- src/lib/db.ts
- src/lib/digest-snapshot.ts
- src/lib/fleet-sso.ts
- src/lib/hot-deals.ts
- src/lib/listing-detail.ts
- src/lib/listings.ts
- src/lib/marketplace-links.test.ts
- src/lib/marketplace-links.ts
- src/lib/newsletter.ts
- src/lib/password.ts
- src/lib/places.test.ts
- src/lib/places.ts
- src/lib/rate-limit.test.ts
- src/lib/rate-limit.ts
- src/lib/reports.ts
- src/lib/selling-avenues.ts
- src/lib/send-digest.ts
- src/lib/session.ts
- src/lib/site.ts
- src/lib/ssrf-guard.ts
- src/lib/tiers.ts
- src/lib/utils.ts
- src/middleware.ts
- src/pipeline/research.ts
- src/worker/index.ts
- tests/e2e/smoke.spec.ts
- tsconfig.json
- tsconfig.tsbuildinfo
- vitest.config.ts