The flywheel
Growth here is not a funnel you refill — it is a loop you turn. Every platform you are already on carries your attributed link, the backend verifies the minutes, and that same verification is the proof advertisers buy. Nothing here is a projection: each stage below says whether it is live today or still waiting on the platform backend.
The loop, in five stages
Every stage is code you can read: two live in
the browser (assets/js/demo.js) and three are enforced server-side
(backend/src/worker.js).
Capture
Every page reads ?ref= on arrival and remembers the referrer locally —
even before a backend exists.
Activate
The last eligible referral click within 14 days receives attribution. Bonuses apply to base earnings in the referred user's first 30 days.
Earn
The user keeps 70% base plus a platform-funded 10% launch boost. Referrals add 5% of base to each person for the first 30 days, also platform-funded.
Share
The moment a balance moves, this page turns it into an artifact for whichever platform they are already on.
Advertise
/stats publishes verified minutes, the platform mix and held-vs-released
referral cost. That is the buyer's proof — no dashboard theatre.
The back-edge is the whole point: more verified minutes → a more valuable auction → higher winning bids → bigger user balances → more sharing → more verified minutes. A funnel leaks at every step; a loop pays the people who close it.
Your share kit
One code, one link, ten artifacts. The code is
generated in this browser and is deliberately not your device id — the
device id is the only identifier the platform holds and
GET /earnings/{deviceId} is public, so a share link must never carry it.
—
referees bound to your code
—
eligible users reported by backend
—
pending referral credit
No backend URL configured, so
there is nothing to report yet — these read — rather than a fake zero.
Set one in Profile → BACKEND API URL and they fill in from
GET /referrals/{code}.
Where your people already are
Each artifact below is real: copy it, and whoever acts on it lands with your code attached — or, where a platform does not carry a referrer at all, this page says so instead of pretending.
Mac app (.dmg)
no referrerThe strongest artifact you have: it is the product. But a GitHub release download drops the query string on its redirect, and a .dmg cannot read its own URL, so no ref can ride along. Share the web-app link when the credit matters; share the .dmg when the friction matters.
Homebrew
no referrerA brew install cannot carry a
referrer — Homebrew has no query string to put it in. Share the web-app link when the credit matters; share the command when the friction matters. We will not pretend the
two are the same.
brew install --cask freecoffee
Web app (PWA)
attributedYour link opens the installable web app on any machine — the same Mac status area placement mock, the same ledger, no DMG needed. Install prompts differ per browser; the page handles that itself.
GitHub
link onlyThe public release repo (the dev repo is
private). GitHub serves the repo page itself, so the ref is not applied
until someone follows the link from there — useful reach, honest attribution.
AI agent (MCP)
attributedHand the URL to an agent and it can read the ledger, publish a validated campaign, or check delivery from the tool manifest. Same attribution rules as a human visit.
X
attributedOpens the composer with the pitch and your attributed link pre-filled. Audience: indie Mac developers — the people who both use this and buy the next campaign slot.
Share-to-feed with your link. Audience: the advertiser side — marketers and founders who buy desktop placements.
Submit with your link. Post where the honest day-zero framing is the interesting part — a Mac status area auction with an empty room is a better story than a fake one.
Hacker News
attributedSubmit the site. One caveat worth knowing:
HN discussions of this shape go well when the numbers are published — which is exactly
what model.html and /stats are for.
The highest-converting artifact in the kit, and the one COLD-START-OUTREACH.md already scripts. Opens your mail client with the pitch and the link ready to send.
What is live today — and what is not
A flywheel you cannot audit is a slogan. Every row below points at the code that does the thing, so you can check it rather than trust it.
| Stage | Status | Where it lives |
|---|---|---|
Capture ?ref= on any page |
Live | demo.js → captureInboundRef() — memory stays local |
| Register a code / claim a code | Live when a backend URL is set | POST /referral — 14-day last-click attribution |
| First 30 days of referred-user earnings | Live server-side | applyReferralAccrual() — credit is held, not paid |
| 5% of base to each person, 30 days, platform-funded | Live server-side | applyReferralCredit() — never out of the referred user's 70% base |
| Per-platform attribution (mac, pwa, agent…) | Live on every report | /track → platform, rolled up in aggregateStats() |
| Advertiser proof: mix + held vs released referral cost | Live, aggregate-only, no token | GET /stats → platforms[], referralSpend |
| Payout rails (Stripe / Whop) | Simulated | payouts.html — the rail choice is stored, no money moves |
| Real advertiser campaigns | 0 live | Feed is empty until the first review passes — advertisers.html |
The same rule as everywhere else in this repo: no counter moves without a matching real state change. The public mix stays empty while the network is empty.
Why it compounds instead of leaking
Every user is a distribution surface. Ten artifacts from one code, on platforms they already open daily — no ad spend to acquire the second user.
Rewards follow earnings. Both 5% bonuses apply only to the referred user's base earnings in their first 30 days. No base earnings means no referral bonus.
Verification is the same asset twice. The minutes that pay users are the minutes advertisers buy — one measurement, two customers, and the public mix is checkable by both.
Day zero is the wedge. An empty auction with published economics is worth joining early; the first advertiser gets 100% share of voice on terms nobody can fake.
The loop's honest bottleneck is simple: campaign #1. Until a real campaign clears review, stages 1–4 turn and stage 5 waits — the launch offer is the wedge that starts it.