Skip to content
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 clicked
wall_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 set
di_anon_idthe random anonymous analytics id— not set

Found rot under our gradient? Flip us over. Or go run the test that matters: Mirror Test 14 is this site →