Light Scout
LS-2610Product2026 — now

Vintage Radar

A morning digest of four UK vintage wholesalers — only what changed, ranked against what each subscriber buys.

U1 Vintage Radar LS-2610 · 2026 — now Python 1 GitHub Actions 2 Cloudflare Pages 3 D1 4 Android iOS Web AI
Period
2026 — now
Platforms
Web
Stack
PythonGitHub ActionsCloudflare PagesD1
Links
Summary

Reads every lot from four wholesalers each morning, works out what moved overnight, and emails each subscriber only the finds that matter to them, priced per piece.

The problem

Good lots on vintage wholesale sites go quickly, and checking four shops at the wrong time of day means missing them. A listing at £180 also says very little on its own: thirty shirts at £180 is £6 a piece, and that is the number that decides a buy.

Constraints

No server and no running cost. Detection has to stay a fixed, small load on the shops however many people subscribe, and consent has to be something a person actually granted, not a form that signs anyone up.

What we built

Every shop runs on Shopify, so the radar reads each catalogue’s /products.json feed rather than scraping HTML: real prices, stock flags and timestamps, and nothing breaks when a shop redesigns.

  • Detection runs once. One pass compares every shop against yesterday’s snapshot and produces a shared list of events: new lots, price cuts, all-time lows, restocks.
  • Scoring runs per person, and is pure. Each subscriber’s watchlist, thresholds and buying season are applied to that list with no network or shared state, so it is cheap and easy to test.
  • Price per piece. Lot sizes are parsed from titles, and a cut has to clear both a percentage and an absolute threshold before it wakes anyone.
  • Season ahead of the weather. The clock is pushed forward by a lead time, so fleeces and coats rank up in August, when that stock is listed.

It runs daily on GitHub Actions, which keeps the full price history in the commit log. Mail goes through Resend from a subdomain of this site. A Cloudflare Pages site with Functions and D1 holds join requests and an admin dashboard where each one is accepted by hand. A daily Instagram card posts the best find of the morning.

What shipped

Live, with the first hundred places free permanently, a promise kept as a flag in the database rather than inferred from join dates. Quiet mornings send nothing.