LiD Prep
Learn why each answer is right, in German and English, then sit a mock exam.
LiD Prep is a free study app for Germany's Leben in Deutschland and naturalisation tests. It teaches the 460 official questions as 44 chapters of civics in German and English, and explains the law or event behind an answer instead of drilling the letter.
- Status
- Live
- Category
- Learning app
- Platform
- Web app
- Price
- Free, no ads
- Built with
- Claude Code
- Context model
- Gemini 2.5 Pro
The narrated tour, 56 seconds. Captions are available.
- official questions, federal and state
- 460
- chapters, each in German and English
- 44
- questions explained so far, in both languages
- 231
- graded test sets of 33 questions
- 10
- correct out of 33 to pass, as in the real test
- 17
What it does
Four parts of the app, each shown in the states it really has. Pick a state to see it.
Practice
Practise every official question
Work through all 460 questions, one chapter at a time or the whole pool. Each answer is checked as you go, and a wrong pick shows the right one beside it. Before you answer, you can open the context that explains the question.
FROM THE CODE
Each explanation highlights its key phrases by kind: date, event, concept, person, place or law. Each kind has its own treatment, so a date never looks like a law.

Bilingual mode
Read the German with English beside it
Turn on Bilingual and every question and option shows both languages. Switch which one leads when you are ready to read the German first. It only changes the display, never the scoring.
FROM THE CODE
The whole question card opts out of browser auto-translate, so Chrome can never rewrite half of it and leave you unsure which language you are studying in.

Learn
A civics book in 44 chapters
Every question belongs to a chapter that tells the history or explains the institution behind it. Listen to a section while you read, and hover or tap a German term for its English meaning.
FROM THE CODE
Narration comes from Google Cloud text-to-speech with a timestamp for every sentence, so the sentence being read is highlighted and kept in view. One glossary file holds a single gloss per German term across all chapters.

Mock exam
Sit the real format, then see where you stand
33 questions in German, 60 minutes and no feedback until the end, as in the real test. Nine test sets cover your whole pool of 310 questions and a tenth reviews the high-yield ones. The dashboard then shows your readiness and the topics to restudy.
FROM THE CODE
Readiness waits until three sets are done. From there, 60 percent accuracy reads as On track and 80 percent as Well positioned. Two idle minutes bring a prompt, and a minute without a reply pauses the run.

How I built it
I designed and built LiD Prep with Claude Code, about 100 commits so far, working from my own product spec, a chapter taxonomy and a design token sheet. The questions come from the official BAMF catalogue, extracted from its PDF and seeded into Postgres. These are the calls that shaped it.
5 DECISIONS SCROLL
AI explanations pass a gate
A model writes the context behind each answer, and a confident wrong explanation of constitutional law is worse than none. Generation runs in batches of ten, stops after the first batch for my review, and every five batches compares summary length and highlight density with that first batch. Drift above 50 percent halts the run.
The server owns a graded run
The server picks the questions, holds the clock and scores from stored answers. The commit history keeps the reason: a stale closure in the browser once saved only the last answer, so a full run scored 1 out of 33. It is also what lets you pause on one device and resume on another.
Everyone gets the same test sets
The set builder is deterministic and could seed per learner, but the product uses one global seed on purpose. Every learner sees the same ten sets, so scores compare fairly and a question about set four means the same thing to everyone.
Rules the AI has to pass
Chapters follow an authoring contract that a pre-commit hook and CI both check. Themes are JSON compiled to CSS variables, components never hardcode a colour, and a contrast check runs on every pull request. That kept Claude Code's output consistent across the library.
A feature that waits for a crowd
Community Insight shows how other learners do on each question, as aggregates with no names and no ranking. It stays dark until ten learners have data, and answers given within five seconds of the previous one are dropped as click-through.
Why I built it
Anyone applying for permanent residence or citizenship in Germany sits a 33-question test drawn from a public catalogue of 460. Most prep apps treat that catalogue as flashcards: see the question, memorise the letter, repeat. You can pass that way and still know nothing about why the Bundesrat exists or what happened in 1953.
I wanted a prep tool that teaches the civics behind each answer, with English next to the German, because reading legal German is its own hurdle while you are still learning the language. So I treated the catalogue as a curriculum. The goal is a learner who finishes having read a coherent German civics book, not 460 isolated flashcards.
What I learned
- Restructuring the content changed the product more than any interface work. The same 460 questions teach something else when they are ordered as a story.
- AI-written explanations need a gate, not a spot check. Reviewing the first batch by hand and checking for drift on a schedule caught what sampling at the end would have missed.
- Write the rules down for the AI. Two contracts enforced in CI kept about 100 commits of Claude Code output consistent.
- Deciding what not to show is design work. The ten-learner floor on Community Insight is a fairness decision, written as a feature flag.
STACK
- Next.js 15
- React 19
- TypeScript
- Tailwind 4
- Drizzle ORM
- Supabase Postgres
- Playwright + axe-core
- Gemini / Claude (content pipeline)