ATLAS

Ten phases to live

About 33 to 35 working days solo. The spine (1 to 7) gets a paying customer hosted and scanning. Polish (8 to 10) makes it pretty, self-serve, and sellable. Blue numbers are spine.

The Build

Phase by phase

Each phase ships on its own branch and stops at a checkpoint. Files are real paths so Nyx can start cold.

1

Make the box Chrome-free

Flip Facebook to the proven impit path, swap the Vinted token fetch to impit, drop cars + Mercari from the hosted process set, add a refuse-and-log guard so a box never scans direct without a proxy. facebook-sniper.js fb-impit-client.js vinted-sniper.js server.cjs fb-config.js · 3 days · no deps
Checkpoint: FB + Vinted return listings on system Node with one proxy, zero chromium processes spawn, no-proxy start refuses loudly.
2

Proxy-pool rotation + per-worker pacing

The fix the code read surfaced: today only the cars scanner spreads targets across proxies. Port that pattern (getProxyForIndex + bounded runPool) into every marketplace sniper, with a fixed 45s per-worker gap so each IP stays ~80/hr no matter the search count. This is what removes the cap and turns proxies into the speed dial. lib/shared-marketplace/proxy-pool.js (new) wired into all 8 snipers · 4 days · needs P1
Checkpoint: 30 FB searches across 5 proxies, logs prove each IP under 90/hr, full refresh ~4.5 min, no cap enforced.
3

Server-injected proxies, rip out BYO UI

No customer ever sees or supplies a proxy. Boxes read the pool from env (provisioner-injected). Delete the proxy onboarding step, settings panel, warning modal, and the IPC bridge. ui/modules/onboarding/step-proxies.js settings/proxies-panel.js lib/proxies/* preload.cjs · 2 days · needs P1
Checkpoint: no proxy field anywhere in the UI; app still scans on the injected pool.
4

Auto-resolve the Facebook location slug

Customer enters a city or zip at signup; the app resolves the FB Marketplace slug + location id automatically, no manual URL paste. lib/geo-resolver/* fb-scraper.js (preloadMarketplaceMetadata) · 3 days · needs P1
Checkpoint: enter "Atlanta, GA", FB scans return Atlanta listings from the stored slug + id.
5

Headless worker mode + scan-window scheduler

Strip the worker box of UI serving and run scanners as a headless worker. Add the scheduler: active window default 12h, customer-editable, multiple split blocks per day, timezone-aware. Pull config from the control box, push finds back to it. server.cjs (worker mode) lib/worker/schedule.js lib/worker/control-client.js (new) · 4 days · needs P2, P3
Checkpoint: box serves zero HTML; scanning sleeps outside a split 7-9am + 5-11pm window in the customer's TZ; finds POST to the control endpoint.
6

Control plane: API + database + provisioning

The brain, shared by everyone, serverless so it costs $0. Cloudflare Workers for the API (auth, watchlist + archive CRUD, finds ingest) and the provisioner (Whop webhook plus a Cron trigger to poll box readiness), Cloudflare D1 for the database. Oxylabs proxy allocation, Hetzner box placement (fill to N, then a new box), Cloudflare DNS, Resend credential email. Finds retention pruned (keep ~30 days) so D1 stays free. workers/{api,provision,hetzner,cloudflare,oxylabs,whop,email}.js + D1 schema · 6 days · needs P1, P5. Alternative: the same logic as a Node app on one ~$5/mo VPS.
Checkpoint: a test Whop purchase auto-provisions a worker container with the pool baked in and customer + config rows in D1, no human step. Two customers run on one CX21, no Chrome.
7

Auth + login + billing lifecycle

Whop OAuth login on top of the existing gate, sessions, and the billing webhook that does the lifecycle: on a successful renewal, rotate the customer's proxies (Oxylabs Replace IPs), auto-vet the new ones, re-replace any flagged, push to the worker and restart; on cancel or failed payment, deprovision (stop worker, release proxies, drop DNS). lib/license/whop-oauth.cjs + control API auth + webhook routes + oxylabs.js rotate · 3 days · needs P6
Checkpoint: a customer logs in and reaches only their own data; a simulated renewal swaps their 5 IPs for fresh vetted ones; a cancel deprovisions the worker.
8

Dashboard SPA (the front-end app)

Static single-page app on Cloudflare Pages talking to the control API: watchlist with a live set and an unlimited archive (swap searches in and out), the live refresh-speed indicator + Speed Pack upsell, the split-block scan-window editor, recent finds feed, an optional bring-your-own Gemini key for AI scoring, account. Light theme, mobile-first at 390px. atlas-app/* (new Cloudflare Pages project) · 5 days · needs P6, P7
Checkpoint: full flow usable at 390px; refresh indicator updates as you move searches between live and archive or change proxies; split-window editor saves to the API.
9

Notifications

Instant Telegram push on a match, no app install needed. Scanner emits the find, control box fires the message. Keep Discord. lib/shared-marketplace/notifier.js + per-sniper hook + Telegram sender · 2 days · needs P5
Checkpoint: a new matching listing pushes to Telegram within one scan cycle.
10

Atlas marketing site

getatlas.com static landing on Cloudflare Pages: the undercut message, the no-cap + speed story, comparison pages, free-vs-Cloud, signup to Whop. Reuse and reskin ~/projects/atlas-site with brand color #6f9bff and the ATLAS wordmark. Runs in parallel from day one. · 3 days · no deps
Checkpoint: getatlas.com live, light theme, comparison + pricing + speed story, signup links to Whop.

Effort by phase (working days)

1 Chrome-free
3d
2 Proxy rotation
4d
3 Strip proxy UI
2d
4 FB location
3d
5 Worker + window
4d
6 Control box
6d
7 Auth + login
3d
8 Dashboard SPA
5d
9 Notifications
2d
10 Landing
3d
Sequencing: spine = phases 1 to 7, about 25 days, gets a paying customer hosted and scanning. Polish = 8 to 10, about 10 days. Phase 10 (landing) runs in parallel from day one. Total solo estimate ~33 to 35 working days.
Your Shopping List

What you personally buy + set up

None of this is code. It is the stuff Nyx cannot do for you. Get these moving in parallel with the build.

Storage: we store text only (customers, searches, finds) in D1, free up to 5 GB, and prune finds older than ~30 days so it never grows. We do not store listing images, we link the marketplace's own image URL, so there is no image-hosting bill. Even a billion archived searches is just tiny config rows.
AI scoring (v1): customers paste their own Gemini key (Google's free tier), so AI costs Atlas $0 and you provision no keys. An Atlas-bundled key is deferred to after the Whop migration.
Go-To-Market

The $1,000 land grab

Steal the open-core playbook: a free version for trust and reach, comparison pages that hijack competitor searches, a Discord community, then convert to Cloud. Customer copy says "free version" and "Community Edition," never the o-word.

Budget split

Reseller creators
$400
Reddit ads
$300
Affiliate seed
$150
Content + tools
$100
Buffer
$50

The plays

  • Comparison pages. "Atlas vs Swoopa", "Atlas vs Flipify". Hijack their brand searches with your flat price + marketplace count.
  • Free version as the hook. Credibility and reach; funnel to Cloud for the convenience.
  • Reseller creators. 1 or 2 micro-sponsorships on flipping channels. "The tool that scans Vinted too."
  • Discord-first. Lean on the funnel you already run; community is the moat.
Existing Customers

Lifetimes + low-monthly, handled

Lifetime owners

Keep the desktop license forever, grandfathered. Offer Cloud hosting at cost (~$22/mo), they already paid for the software, so they only cover the box + proxies. Goodwill, not a clawback.

Low-monthly payers

Grandfather their current rate on desktop. Give them the same ~$22 hosted lane or full Cloud. No forced increases, migration is a carrot.

Before You Say Go

Decisions only you can make

Control plane: serverless or VPS. Cloudflare Workers + D1 is $0 and recommended; a ~$5/mo VPS is simpler to SSH into and debug. Pick one for Phase 6.
Speed Pack price. Proxies cost ~$3.20 each, so a 5-pack costs us ~$16. Plan shows +$20 (Turbo) and +$35 (Max). Confirm, or set your own.
Domain. getatlas.com confirmed (older notes had .app). Lock one, and decide app.getatlas.com vs a /app path for the dashboard.
Intro window. $60 for one month then $75: hard date, or first-N customers?
Notification channel for v1. Telegram only, or also email + browser push?
Box density. Ship at 2 per box, tune up to 3 to 4 once memory is measured? Recommend ship at 2.
Oxylabs sourcing. Pre-buy a fixed pool and assign, or wire the Oxylabs API for on-demand allocation? Affects Phase 6 scope.