Every product in shared finances is built on asymmetric disclosure. To get a shared picture, someone has to connect their accounts or open up first — and going first feels like conceding, so it never happens, so both people argue from partial pictures forever.

Ours inverts it. Each partner answers six open questions alone, in their own words. The reveal does not exist until both are sealed. Then they open the same page, and it tells them what they are actually disagreeing about — something they never had to say out loud.

You're both carrying it alone. Neither of you has said that out loud. You each think you're the one holding it.

The kernel: nobody goes first

This is the whole product. If you deleted it and replaced it with a shared dashboard, this would be commodity, and everyone would build it that way. The consequence that makes it feel like magic: you learn something true about your partner that they never had to say out loud.

When the page is built, both sets of words are deleted in the same transaction that stores it. Your partner's answers can't be shown to you because they no longer exist. The words under your own findings come from your own browser, which is why the promise survives. pnpm e2e verifies this from outside by reading the database directly.

The technical decision: there is no language model in the product

TypeSafe's System One returns calibrated probabilities, not text. Code decides what they mean and writes the sentence. There is no path by which a sentence reaches the screen except by clearing a threshold in one file.

A finding below the bar is absent, not softened. On a deliberately aligned couple the page comes back nearly empty, and that's the correct outcome, not a failure state. The thresholds were set from measured numbers, not from taste, and pnpm seed re-runs the whole matrix as a regression guard — if the aligned pair ever produces a finding, the build has drifted.

target pair same worry aligned dismissive
both carrying it alone 0.82 0.95 0.06 0.00
both feel unseen 0.70 0.06 0.02 0.00
enjoy vs. control 0.85 0.10 0.04 0.00
shown 3 movements short page nothing short page

Design

One idea runs through the interface: the human voice is typeset like a letter, and the machine's judgments are typeset like evidence. Ink serif for anything a person said; a small ochre mono for anything a model measured. The division of labour is visible without a word of explanation.

Built with the Devpost Learn Skill Pack

npx skills add challengepost/learn-ai-basics --all -y, then 1-start → 6-ship. The planning documents it generated are in the repo, because they are the more interesting part of the artifact:

  • devpost/scope.md — the competitive analysis, the kernel, and what was deliberately cut, with reasons.
  • devpost/prd.md — the journey, every state including the ones nobody wants, and the measured numbers behind each finding.
  • devpost/spec.md — architecture, data model, and the plain-language version you could read aloud to someone.
  • devpost/checklist.md — the build sliced so each step was usable, with the revisions recorded where reality contradicted the plan.

The planning was not decoration before the code. It changed the code — including one revision that matters: the pair code was never surfaced anywhere after creating a pair. The PRD's core journey says two people join the same code, but the app generated one and then never showed it to anybody. Found by using the app, not by any check.

On cognitive debt, the stated problem with AI-built apps being code you can't explain or maintain: the countermeasure here is structural rather than a promise. Every English sentence in the product is in one file, src/lib/compose.ts, which imports nothing and does no I/O. You can read the product's entire voice top to bottom in about a minute.

Live and open source

Live at https://ours.kiter0211.workers.dev (Cloudflare Workers + D1). Source at https://github.com/PhiBao/ours, MIT licensed, licence detectable on the repo page. pnpm seed and pnpm e2e run the measurement and the full loop; pnpm e2e:live runs the whole thing against the deployed URL.

Built With

  • cloudflare-d1
  • cloudflare-workers
  • next.js
  • playwright
  • tailwindcss
  • typesafe
  • typescript
Share this project:

Updates

Submission history