Govarbitrage

repo: ~/Projects/govarbitrage · 89 commits · 7 in last 24h, 34 in last 7d · ▂ ▆█▄

Search the build

89 commits indexed

  1. eb7e313 2026-07-28 auto-save: 2026-07-28T06:58:06 (1 files) — tsconfig.tsbuildinfo
  2. 0de2691 2026-07-28 agents: drop CRE-adjacent service/trade firms from CRE finder
  3. a2ed0e6 2026-07-27 auto-save: 2026-07-27T21:24:43 (1 files) — tsconfig.tsbuildinfo
  4. 2d44193 2026-07-27 agents: drop financial-advisory/wealth firms from CRE finder
  5. c53b1f2 2026-07-27 agents: relevance-weighted ranking — surface stronger CRE matches first
  6. c173473 2026-07-27 auto-save: 2026-07-27T20:24:23 (1 files) — tsconfig.tsbuildinfo
  7. 93bf1bd 2026-07-27 agents: fix off-topic type gate — exact-token match, not \b-regex
  8. 8093362 2026-07-27 chore: v0.4.0 → v0.5.0 (session close — basic-auth login + price lock)
  9. 70e7b1e 2026-07-27 auto-save: 2026-07-27T08:49:12 (1 files) — tsconfig.tsbuildinfo
  10. 05f0b66 2026-07-27 auctions/govarbitrage: basic un/pw IS the login — passing the outer wall mints an ADMIN session, no email/login form (Steve)
  11. 4d4adb4 2026-07-27 auto-save: 2026-07-27T07:48:56 (1 files) — tsconfig.tsbuildinfo
  12. 5385092 2026-07-27 govarbitrage: lock Standard=$19 / Premium=$49 (Steve-approved prices; code had drifted to 12/29)
  13. 6452910 2026-07-26 chore: v0.4.0 (session close) — /agents search debug+improve, precision filter, sort+density, security hardening, a11y+dedupe
  14. d17c2b2 2026-07-26 agents: a11y + empty/loading-state polish on agent-finder
  15. 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
  16. 3b38d91 2026-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
  17. 8b39674 2026-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
  18. 78d5fa8 2026-07-26 agents: results grid gets sort (best/rating/reviews/name) + density slider, localStorage-persisted (Steve standing-rule: every grid needs sort+density)
  19. 69f9dc1 2026-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)
  20. f82010f 2026-07-26 deploy: provision GOOGLE_PLACES_API_KEY (non-destructive) + bounded /login smoke-retry — fixes silent 503 on /agents live search
  21. 75b5e88 2026-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)
  22. 63fd9d5 2026-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)
  23. 4aa0234 2026-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)
  24. dd2a641 2026-07-25 chore: lint, refactor (ssrf fe80::/10 mask, middleware dedup), v0.3.0 (session close)
  25. 74ea2fe 2026-07-25 feat(agents): commercial CRE buyer/leasing agent finder via Google Places (commercial-only, login-gated, rate-limited, cost-surfaced)
  26. 4501587 2026-07-25 fleet-sso: bump minted role VIEWER->ANALYST + PREMIUM tier for the fleet operator (operational access + full data; credentials still ADMIN-only)
  27. dd56e4d 2026-07-25 seo: make /selling-avenues public in middleware (was crawlable in robots+sitemap but gated → indexed-redirect)
  28. 026c8ee 2026-07-25 security(DTD-B): fleet SSO mints VIEWER not ADMIN; role-tier requireWrite (ANALYST floor) + requireAdmin on credentials (GET was unguarded)
  29. d468e96 2026-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)
  30. 1a778cf 2026-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
  31. 1d1a7ee 2026-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
  32. 2c066de 2026-07-25 auctions: accept fleet SSO (aafleet) cookie → one shared login across *.agentabrams.com
  33. 6c0f4d8 2026-07-22 Username-only sign-in (email login retired); admin uses std fleet password
  34. 1a64a1d 2026-07-22 Sign-in accepts bare username (resolved via email local-part) or full email
  35. 873b83f 2026-07-14 chore: v0.2.1 (session close — auth wall)
  36. 9b99d81 2026-07-13 Add outer admin/DW2024! basic-auth wall (bypass Stripe webhook + import-token clients)
  37. 8e80bc6 2026-07-13 chore: lint (Link over bare <a>), refactor (toEdition helper, HTML_ESCAPE), stale-comment fix, v0.1.0 → v0.2.0 (session close)
  38. 887f5c6 2026-07-13 5x sweeps 3-4: OG/twitter tags on /newsletter, honest live copy (page+email), https-only guard on live digest links
  39. 059a054 2026-07-13 5x live verification: 2 consecutive clean sweeps, 0 defects
  40. 974fc37 2026-07-13 Go-live: george-env runtime cred injection (py), newsletter server + digest wrappers, launchd 6am/5pm subscriber digest
  41. c484634 2026-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
  42. dba59ea 2026-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
  43. 519132e 2026-07-13 SEO plumbing: sitemap.xml (static pages + every archive date), robots.txt (public routes allowed, app/private disallowed), canonicals from NEWSLETTER_BASE_URL
  44. 5e22c50 2026-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
  45. 343863b 2026-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
  46. 8d98349 2026-07-13 Contrarian fixes: digest send-to-list engine (TEST-logged), redact tokens in outbox logs, honest pre-launch landing copy
  47. e626b08 2026-07-13 Public /newsletter landing: digest pitch, subscribe form with confirm-your-email state, CAN-SPAM small print; nav link
  48. d242730 2026-07-13 Newsletter API: subscribe (honeypot+rate-limit, enumeration-safe), confirm, one-click unsubscribe; TEST-mode email outbox
  49. 562ea5d 2026-07-13 Subscriber model: double-opt-in newsletter (PENDING/CONFIRMED/UNSUBSCRIBED, unique tokens)
  50. 687fd82 2026-07-13 Reprice tiers to research-backed audience-building points: Standard $19->$12, Premium $49->$29
  51. f564b8f 2026-07-13 3-tier paid-alerts paywall (Free/Standard/Premium) — TEST/mock Stripe, value-gated
  52. 1162672 2026-07-13 Honesty Gate: confidence-discounted, capped, disclaimed hot-deal figures (no inflated-ROI chargeback trap)
  53. bba7207 2026-07-12 set-admin: generate strong random password server-side (no hardcoded default)
  54. deba4c5 2026-07-10 seed: never hardcode admin password — set out-of-band via set-admin (ADMIN_PASSWORD env)
  55. 6b2f576 2026-07-10 Unified admin credential (admin@agentabrams.com) durable across deploys + set-admin script
  56. 0eefdaf 2026-07-10 deploy: non-destructive db push + install prod cron (refresh @noon + liveness /15m)
  57. e9ed2a5 2026-07-10 Add HOT DEAL alerts + fast dead-listing removal + listing lifecycle
  58. 97704b2 2026-07-10 Add daily-noon refresh runners for Municibid/PublicSurplus/GovPlanet
  59. b44789f 2026-07-10 Crack GovPlanet (free): extract embedded quickviews JSON, USD, no browser
  60. 6b3da44 2026-07-10 Wire Municibid + Public Surplus imports into deploy-auctions.sh
  61. e9f92ce 2026-07-10 Crack Public Surplus (free): SSR category HTML parser, no API/browser
  62. 860397d 2026-07-10 Crack Municibid (free): SSR /browse HTML parser, no API/browser at runtime
  63. a0d4cae 2026-07-10 auto-save: 2026-07-10T08:44:50 (1 files) — scripts/deploy-auctions.sh
  64. 5216572 2026-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)
  65. 49f1858 2026-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
  66. 357a4ea 2026-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
  67. ab80273 2026-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)
  68. bd52903 2026-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
  69. 9b61dc8 2026-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
  70. cbd0fd3 2026-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)
  71. eb11f2d 2026-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
  72. abdaa99 2026-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
  73. 2be5739 2026-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
  74. 424827a 2026-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
  75. e4596b5 2026-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
  76. 1a7aa38 2026-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
  77. 5a58b68 2026-07-09 chore: gitignore logs/ (untrack generated digest preview)
  78. dbc3003 2026-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)
  79. ec9c8a3 2026-07-09 auto-save: 2026-07-09T23:12:38 (1 files) — scripts/
  80. 3d43a92 2026-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
  81. 2eef6fc 2026-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
  82. 5833bd0 2026-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
  83. 7b18a95 2026-07-09 Phase 5: importers (CSV/extension/URL) + worker + compliant buyer workflow + reports + selling-avenues + MV3 extension + docs/Docker + Playwright
  84. 1934684 2026-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
  85. cd72087 2026-07-09 Phase 4b: ESLint 9 flat config (Next 16 native) — lint passes 0 errors
  86. 270f059 2026-07-09 Phase 4: dashboard (cards + full-column TanStack table + CSV/profiles), listing detail, API routes — builds + serves live
  87. 23bcc51 2026-07-09 Phase 3: local-Ollama AI identification, research pipeline, 25-listing seed (full research/costs/scores)
  88. 111d8f1 2026-07-09 Phase 2: deterministic valuation/cost/scoring engines + 16 passing Vitest tests
  89. d537d06 2026-07-09 Phase 1: Next.js 16 + TS + Prisma 6 + Postgres scaffold, full schema synced

Authors

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

Commits with substantial prose (≥120 chars) — the rationale behind each move.

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

155 files tracked. Click any to browse the source at HEAD.

Other build journals

← Google Places Key Provisioner  ·  all 4 projects  ·  Govauctions Mcp →

Export

commits.csv · feed.atom · project.json · commits.json

rendered in 1ms