Self-hosted Supreme drop & restock monitor with a local web UI. It watches the "new arrivals" feed of the Supreme online stores (US / EU / UK), takes snapshots of size and colorway availability for every new item, and shows a change feed: new drops, restocks, sell-outs, and size changes — all on your own machine, no cloud, no accounts.
Built with TypeScript, Node.js, Express and Playwright. State is stored in plain JSON files. The UI is a dependency-free vanilla JS single page app.
This project has not been maintained since April 2026 and is published as-is for reference. It scrapes the public supreme.com storefront, so any change to the site's markup or bot protection can break it at any time — it may work, it may not. There are no plans for updates or support, but feel free to fork it if you find it useful as a starting point for your own tracker.
- Multi-region scanning — Supreme US, EU and UK stores, each region can be enabled/disabled and given its own scan interval.
- Tracks the "new" feed — only items currently flagged as
newon the shop page are followed, keeping the scan small and fast. - Size & colorway snapshots — for every item, every colorway route is visited and per-size availability is recorded.
- Change feed — the UI shows a timeline of events:
discovered— a new item appeared in the feedrestocked— sizes came back in stocksold_out— an item or colorway sold outsizes_changed/colors_changed— availability shiftedmissing_from_new— an item dropped off the "new" list
- Per-item fast tracking — assign a shorter custom interval to specific items you care about (e.g. check one hoodie every 2 minutes while the region scans every 10).
- Scan pacing profiles —
careful/balanced/fastpresets control page delays and timeouts; scans are sequential with randomized jitter to keep the tracker polite. - Priority queue — region scans always take precedence over single-item scans, so full sweeps aren't starved.
- Manual browser session — if the store shows a captcha / access challenge, one click opens a visible Chromium window that shares the tracker's cookie state; solve it manually, close the window, and the tracker resumes.
- Desktop notifications — access issues are reported via
terminal-notifieron macOS (optional). - Local-first — everything (state, cookies, snapshots) lives in
./data/on your disk. Nothing is sent anywhere.
Requirements: Node.js 20+.
git clone https://github.com/Lemelson/supreme-restock-tracker.git
cd supreme-restock-tracker
npm install
npx playwright install chromium
npm run startThen open http://localhost:3310.
On macOS you can also double-click start-tracker.command / stop-tracker.command in the project root to run it in the background.
To use a different port:
PORT=8080 npm run start┌────────────┐ queue ┌──────────┐ Playwright ┌──────────────┐
│ Express UI │ ─────────▶ │ Tracker │ ───────────▶ │ supreme.com │
│ (public/) │ │ (queue + │ │ US / EU / UK │
└────────────┘ │ differ) │ └──────────────┘
▲ └────┬─────┘
│ JSON state │ snapshots
└──────── data/ ◀────────┘
- On a timer, the tracker opens the region's shop page in headless Chromium and collects every product link labeled
new. - Each product page embeds a Shopify-style product JSON (
<script id="product-…-json">) — it is parsed for variants, sizes and availability. Colorway thumbnails are clicked through to capture every color route. - The new snapshot is diffed against the previous one; differences become change events in the feed.
- Browser cookies/session state are persisted per region under
data/storage/<region>.json, so a manually solved challenge carries over to headless scans.
| Path | Purpose |
|---|---|
| src/server.ts | Express server: static UI + JSON API |
| src/tracker.ts | Scan scheduler, priority queue, snapshot diffing, change events |
| src/supremeScraper.ts | Playwright scraping: shop feed, product JSON, colorway discovery, pacing |
| src/store.ts | JSON state store (data/state.json), migrations, dedupe |
| src/manual-session.ts | Visible Chromium session for solving captchas, shares cookie state |
| src/config.ts | Region defaults (URLs, intervals) |
| src/types.ts | All shared types |
| public/ | Vanilla JS web UI (no build step) |
| scripts/ | One-off inspection helpers used during development |
The UI talks to a small JSON API — usable directly if you want to script it:
GET /api/state— full application statePOST /api/scan-all— queue a scan of every enabled regionPOST /api/regions/:id— update region settings (enabled,defaultIntervalMinutes)POST /api/regions/:id/scan— queue one region scanPOST /api/regions/:id/manual-session— open the visible browser sessionPOST /api/products/:handle— per-item tracking settings (enabled,intervalMinutes,archived)POST /api/products/:handle/scan— scan one item now
Supreme sits behind bot protection. When a scan hits a challenge, the region is marked with an error and retried later. Use the Open Manual Session button in the UI (or npm run session -- us https://us.supreme.com/pages/shop): a visible Chromium window opens with the same stored session, you solve the challenge like a human, close the window, and the refreshed cookies are saved for the headless scans.
The tracker never copies cookies from your personal browser profile.
All state lives under ./data/ (gitignored):
data/state.json— products, snapshots, change feed, logsdata/storage/<region>.json— Playwright cookie/session state per region
Delete the folder to reset everything.
This is a personal monitoring tool, published for educational purposes. It only reads publicly available product pages, scans sequentially with deliberate delays, and does not automate purchases (it is not a checkout bot). If you run it, keep the pacing polite and make sure your usage complies with the store's terms of service. Supreme is a trademark of its respective owner; this project is not affiliated with or endorsed by Supreme.