Inspiration
What it does
How we built it
Challenges we ran into
Accomplishments that we're proud of
What we learned
What it is
Das Verhör ("The Interrogation") is a daily deduction game for iPhone, in German.
Each day one new case lands on the table: one location, three suspects, fourteen questions — and a single contradiction that decides everything. You question the suspects in free text, weigh what they say against the facts from the crime scene, and accuse. An accusation needs two things: the culprit and the piece of evidence that breaks their story. Get either wrong and the case is lost.
The problem it solves
Daily puzzle games have a content problem. Wordle works because a word list is cheap. A detective case is not cheap — it needs a culprit, a timeline, alibis that interlock, and exactly one contradiction that resolves it. Hand-writing one a day does not scale. Generating one with an LLM produces cases that are unsolvable, ambiguous, or quietly spoiled by the model.
So the interesting question was not "can an LLM write a mystery". It was: how do you ship a provably fair one, every day, forever.
How it works
The answer was to give the model the smallest possible job.
A deterministic Swift engine owns everything that matters — the facts, the timeline, every contradiction, the verdict. A solver runs over each generated case before it ships and proves that exactly one suspect can be convicted on the evidence available. Cases that fail are thrown away, not patched.
Apple's on-device Foundation Models only phrase what the engine has already decided. The model never receives the solution. Its context literally cannot contain it — so it cannot leak it, hallucinate it, or be talked out of it. If the model is unavailable, every line falls back to pre-written text and the game stays fully playable.
Every case passes eight automated gates before it ships. One of them, the solve-rate gate, plays the case 500 times in simulation and rejects anything outside a 0.50–0.78 band — too easy and too hard both fail.
How I built it
Solo, in German, over four months. Swift and SwiftUI, iPhone only, iOS 26.
The case pipeline is a separate Swift CLI: generate, verify, simulate, bundle, sign. Every case file is signed with Ed25519 and verified at runtime, so a case cannot be tampered with between build and play. Artwork is a single consistent hand-drawn ink style — 690 images across 69 cases, ten per case.
RevenueCat powers the Detective Pass. The purchase layer is architecturally isolated: it has no access to case logic at all, by design, so a paywall bug can never affect fairness.
No account. No login. No backend. No tracking. Nothing leaves the device.
What I learned
Two things, both the hard way.
The gate is worth more than the generator. Roughly 40% of generated cases were being burned on a single failing condition. My instinct was to loosen the gate. I measured instead, and found that two of my own prompt files contradicted each other — one described a rule, the other demonstrated the opposite. Fixing the worked example took the error from 16 in 20 candidates to 0 in 22. No gate was weakened. The lesson: when the output is bad, suspect the instructions before you suspect the standard.
A deterministic core makes an LLM safe to use. Every scary property of shipping generative content — leaking answers, inconsistency, unplayability — disappears once the model is downstream of the truth instead of upstream of it.
What's next
The new season: 39 cases, one a day, 23 September through 31 October 2026. https://apps.apple.com/de/app/id6797754222
Log in or sign up for Devpost to join the conversation.