Building a Philosophy Quiz That Shows Its Work
The Millerman School quiz asks you to imagine advising a philosopher-king, hides how your answers are scored, and gates your results behind an email form. I wanted to know if fiction, transparency, and real exemplars could do the job better. whothinkslikeyou.com is the result.
The Problem with Philosophy Quizzes
I took the Millerman School quiz a few months ago. It's the most well-known online philosophy diagnostic, and it's frustrating in ways that feel like design failures rather than philosophical ones.
The scenarios are contrived. "A brilliant scientist discovers a technology that could double human lifespan, but only for those who can afford it." Nobody has faced this decision. The answer options bundle orthogonal ideas together so you can't tell what's actually being measured. Scoring is a black box -- you answer 30 questions and get a radar chart with no explanation of how any individual answer moved the needle.
Worst of all, there's an email gate. You answer 30 questions about the nature of truth and political authority, and then you're asked to hand over your email before you can see the results. The quiz assumes you already know what "Straussian" means. If you don't, the results are a collection of labels that reference a conversation you were never part of.
These aren't philosophical problems. They're design problems. The underlying idea -- mapping everyday intuitions to real philosophical traditions -- is genuinely interesting. The execution just treats the quiz as a lead-gen funnel instead of an educational tool.
Eight Decisions Before Any Code
The previous posts on this blog are about agent architecture and infrastructure legibility. This project is a consumer product, not a pipeline. But the same discipline applies: document every decision before writing code, so you can evaluate whether each one is working.
I wrote eight architecture decision records before the first line of JSX. Each one has a rationale, rejected alternatives, and consequences. Here's the summary:
| ADR | Decision | Key Rationale |
|---|---|---|
| 001 | Fiction-only narratives | Reduces cognitive load, leverages existing emotional investment |
| 002 | Forced binary dilemmas | Forces genuine signal -- no "balanced" escape hatch |
| 003 | Seed + follow-up structure | Places you on a pole, then pushes back to disambiguate |
| 004 | Transparent scoring | Every answer shows "+2 toward Discoverer" -- the core differentiator |
| 005 | Exemplar-based results | "You think like Plato" communicates more than a spectrum bar |
| 006 | Per-question takes | 120 unique commentaries, not generic dimension blurbs |
| 007 | FastAPI + disk + Cloudflare | $6/mo, zero open ports, disk JSON as database |
| 008 | Both poles defined | You see what you are AND what you're not |
Three of these deserve a closer look because they're doing most of the work.
The Fiction Gambit
The most distinctive design choice: you pick a single fictional world -- The Matrix, Breaking Bad, Star Wars, or Game of Thrones -- and all ten questions live inside that story. The quiz never leaves the narrative.
This solves two problems at once. First, it eliminates the contrived scenario problem. "Morpheus offers the truth -- even though it's brutal. Cypher wants back in the simulation because the steak tastes real enough. Who are you siding with?" tests the same metaphysical dimension as the longevity-drug thought experiment, but the user already cares about these characters. The emotional investment is pre-built.
Second, it creates narrative coherence across all five dimensions. You're not re-orienting every question. The Matrix path explores truth, authority, knowledge, technology, and identity all through Neo, Morpheus, and the machines. Each question builds on the same world you've been thinking about since you pressed "start."
The seed + follow-up structure layers on top of this. The seed question places you on a spectrum (worth ±2 points). Then the follow-up shows you what you just said ("You said: Morpheus -- I'd want to know what's real, even if it's ugly") and pushes back with a complication. If you picked the red pill, the follow-up asks: Morpheus's life is objectively worse now -- hunted, eating slop on a hovercraft. Still worth it? That's worth ±1 more point.
Five dimensions, two questions each, seven-point scale per dimension. Ten questions total, all inside one story. The branching means each follow-up is tailored to the answer you actually gave, not a generic second question.
Transparent Scoring as the Core Feature
This is the design decision that matters most. Every answer in your results shows a colored
pill: +2 toward Discoverer, -1 toward Creator. You see exactly
how each answer moved your score. There's no hidden weighting, no "we consider multiple
factors" hand-waving.
Transparency isn't just a UX choice -- it's the educational mechanism. Seeing the scoring encourages "what if I'd answered differently?" thinking, which is the philosophical reflection the quiz is trying to produce. The Millerman quiz gives you a radar chart and says "you're 72% Straussian." This quiz says "here's the specific question where you leaned Straussian, here's what that means, and here's Leo Strauss's take on the same question."
The results also define both poles of every dimension, side by side. You don't just see "Discoverer (Platonist)" -- you see that next to "Creator (Nietzschean)" with a plain-English definition of each. Your side gets a thicker border. You don't really understand what "Discoverer" means until you can see what "Creator" means and say "that's not me."
Results That Mean Something
Instead of spectrum bars, the results show a vertical list of six exemplars per dimension -- real people and fictional characters positioned along the spectrum. Plato at one end, Nietzsche at the other. Your closest match is highlighted in green with a "You" badge.
The roster spans 30 exemplars across five dimensions: Plato, Aquinas, C.S. Lewis, William James, Foucault, Nietzsche on the truth axis. Lee Kuan Yew and Marcus Aurelius on the authority end, Thoreau and Jefferson on the other. Dumbledore and Machiavelli for hidden knowledge. Tony Stark and the Accelerationists for technology. Aristotle and Mr. Rogers next to Sartre, de Beauvoir, and Tyler Durden on identity.
Each exemplar has a face (WSJ hedcut-style portrait), a signature quote, and a Wikipedia link. "You think like Plato" with Plato's face next to his quote "The Forms are more real than shadows" communicates something a dot on a spectrum bar never will.
Below the exemplar list, each question in the results includes a per-question take from your closest exemplar. Not a generic "Plato believes in objective truth" but "Plato would take the red pill instantly -- truth is the highest good, no comfort justifies living in a lie." Specific to the story, specific to the question, specific to the dimension.
data.js. There are 120 unique per-question
takes (4 stories × 5 dimensions × 3 question phases × 2 perspectives). Adding
a new story path requires writing 30 new takes. The code took a day. The content is ongoing.
The Stack
The quiz runs entirely client-side. Zero API calls during the ten questions -- everything lives
in a 555-line data.js loaded at startup. On completion, a single
POST /api/results saves the answers and returns a shareable
/r/{hash} URL. That's the only server interaction.
Backend is FastAPI on a $6/month Digital Ocean droplet. Storage is disk-backed JSON files -- one file per result, named by an 8-character URL-safe hash. No database, no Redis, no ORM. Results are permanent; there are no sessions to expire.
The droplet sits behind a Cloudflare Tunnel. Nginx listens on 127.0.0.1:80 only --
zero inbound ports except SSH. All traffic flows: internet → Cloudflare edge →
tunnel → localhost nginx → localhost uvicorn. The frontend is a Vite-built SPA
cached at Cloudflare's edge. The /r/{hash} route serves an HTML template
with OG meta tags for link previews, then the SPA hydrates with preloaded data.
This is the same "right-size the infrastructure to the problem" thinking from the harness engineering post. No database because JSON files on disk are simpler, faster for this access pattern, and portable. No serverless because a $6 droplet handles the load with room to spare. No Docker because systemd is enough. Boring tech, legible stack.
What Surprised Me
Binary choices produce better signal than multi-option. The Millerman quiz uses four options per question. With two options, there's no reasonable middle to hide in. You have to pick a side. The follow-up is where nuance happens -- it pushes back on whatever you chose and forces you to either commit or soften. Two binary questions per dimension produce a seven-point scale (-3 to +3), which is plenty of resolution.
The exemplar mix matters more than the scoring math. Having Aristotle next to Mr. Rogers next to Remy from Ratatouille on the same spectrum makes philosophy feel accessible in a way that labels alone never do. The fictional characters aren't filler -- they're doing the heaviest pedagogical work. "You think like Remy" is a more effective entry point to Aristotelian virtue ethics than any definition I could write.
Content authoring is the real work. Writing 120 per-question takes that are specific to both the story and the philosophical dimension took longer than building the entire application. Each take needs to sound like the exemplar, reference the specific scenario, and illuminate the philosophical principle -- in two sentences. The code was a day. The content is the thing that will keep improving.
ADRs work for consumer products, not just infrastructure. Eight decision records written before the first line of code. Every one has "Alternatives Rejected" and "Consequences" sections. The same discipline that documents a prompt caching strategy or a NixOS module hierarchy works for quiz design. Document the decision, ship the code, evaluate whether the decision was right.
The quiz is live at whothinkslikeyou.com. Pick a story, answer ten questions, see exactly how your answers map to real philosophical traditions -- and who else throughout history thought the same way.