This site's own Mirror Test — live
Radical Transparency
A site that teaches you to flip products over should survive being flipped. This page is the second dashboard — the whole engine, in plain English. If anything here ever stops being true, that's a bug report we want.
What we will never do
- ✕ No streaks, no guilt loops, no re-engagement notifications. Progress persists; the site never nags.
- ✕ No manufactured scarcity, no countdowns, no “only 3 badges left.”
- ✕ No third-party ad trackers, no cookies for tracking, no fingerprinting.
- ✕ No selling or sharing of anything you type, ever, to anyone.
- ✕ No account requirement. The whole course works logged-out, forever — signing in buys cross-device sync and a named certificate, and gates nothing.
- ✕ No marketing email. Making an account subscribes you to nothing; there is nothing to unsubscribe from.
Where your data lives
- Signed out — your progress, briefs, deal plans, teardowns: localStorage in your browser. We have no copy, and clearing site data destroys it.
- Signed in — the same things: your browser and one Firestore document keyed to your account id, in the studio's own GCP project. It holds exactly the record you can see on your progress page, including the text you typed into the briefs, because that text is what syncing is for. Nothing else is collected and it is never used for anything but showing it back to you. Delete your account and the document goes with it.
- Your sign-in itself: handled by Clerk (email and password, or whichever provider you choose). We never see your password.
- Your credential: a self-describing token in the badge URL you choose to share. Minting sends nothing to us.
- The Wall (opt-in): handle + rank, in service memory (not yet a database — it can reset on redeploy).
- GHOST conversations: sent to the Claude API to generate the reply; not stored by this site.
- Analytics: PostHog (US cloud), cookieless, with a random anonymous id stored in your localStorage. Delete it below any time.
Every event this site can send
The complete list, enforced by a type in the source (lib/analytics.ts). There is nothing beyond what you see here.
$pageview — which page was viewed (path only — never query strings)module_complete — a lesson was marked complete (which one)lesson_read_done — the reading step of a lesson was ticked off (which lesson)progress_synced — progress was saved to an account (nothing about what the progress was)mirror_pass / mirror_fail — a Mirror Test attempt (which test, which attempt number)calc_used — a calculator was touched (which equation)assignment_saved — a field assignment was filed (which one, how many characters — not the text)canvas_export — the Canvas was exported (how many fields were filled — not their contents)boss_won — a boss fight was won (which boss)weird_played — the weird game finished (score)teardown_created — a teardown card was minted (which pattern — never the app name)case_generated — a cost-of-inaction brief was generated (no numbers)oath_signed — the Oath was signed (not the name)portrait_shared — a portrait card was downloaded (heal % + crack count)badge_minted — a credential was minted (rank + index)linkedin_add_clicked — the add-to-LinkedIn button was clickedwall_joined — a handle joined the wall (rank only)ghost_asked — GHOST was asked a question (never the question itself)Why track at all? To find where the course loses people and fix it — the funnel, not the person. Block it with any content blocker; the site works identically.
Your localStorage, live
This is read directly from your browser right now — the actual bytes, not a description of them.
di_progress_v1your whole course record (progress, worksheets, canvas, teardowns)— not setdi_anon_idthe random anonymous analytics id— not setFound rot under our gradient? Flip us over. Or go run the test that matters: Mirror Test 14 is this site →