A subscription trading-signals platform that scans 692 crypto, forex and commodity markets in real time — with its own billing, accounts, alerts and a second macro product served under one domain.
Turn a personal market-scanner into a product people pay for. That means the parts a small team usually splits up, done by one person: a live data engine that never sleeps, subscription billing that survives edge cases, accounts and access tiers, push and email alerts, and an honest way to measure whether the signals are any good.
Partway through, a second product — a macro-intelligence dashboard — had to fold into the same domain and the same login, without duplicating auth or exposing either app's secrets. That constraint shaped most of the architecture below.
Two independent Python services run behind one public origin. The trading app owns the login, billing and notifications. Any request under /macro is proxied over loopback to the macro service, carrying the signed-in user as an HMAC-signed identity header — so the second app trusts the first directly, with no shared cookie, no second login, and no secret crossing the wire.
A loopback mount serves a second Python app under the same domain and session. The signed-in identity is passed as a short-lived HMAC-signed header, so neither app loads the other's secrets or needs a cross-site handshake.
Five access tiers enforced on both server and client. Stripe checkout and webhooks drive upgrades and downgrades, with signature verification, a five-minute replay window, and a backup path so a missed event still lands the right tier.
Identity was being resolved by scanning sessions on a non-unique field, which could serve one user another's account. Fixed to resolve strictly from the authenticated session. A pre-commit scanner now blocks any key from reaching git.
Signal engines, the notifier and both apps stay up under a watchdog on cron and launchd, recovering from restarts on their own. Strategy work is validated with walk-forward, intra-bar backtesting rather than flattering close-only numbers.