CareLingua // Bilingual FSP exam-prep platform for nurses
A CMS-backed exam-prep platform for internationally-trained nurses
The Fachsprachprüfung Pflege is the oral and written language exam required for internationally-trained nurses to get licensed in Germany. CareLingua turns preparation for it into a structured, bilingual (German/English) training platform with two main tracks: Üben (self-paced practice across thematic modules) and Prüfung (exam-format simulation of the real oral exam).
Our engineering focus was building a content platform that cannot silently break. Every piece of exam content flows through a shared canonical schema and a Zod validation gate that enforces exam-scoring rules — like “exactly one correct answer per question” — at build time and at every CMS publish. That’s what lets a non-technical product owner safely edit exam-relevant content live, without a developer.
The product surface
The entire editorial surface — module catalogue, all four exercise types, exam scenarios and dialogue turns, portraits, and every UI string — was migrated from static developer-owned files into Sanity, with an embedded Studio the product owner uses directly.
Üben — Practice
12 thematic modules → module detail → exercise chooser → 4 exercise players. Self-paced training with flashcards, collocation matching, register-switch, and a branching AI-voiced guided chat.
Prüfung — Exam simulation
Exam-part selector → difficulty → guided-chat exam run → scored result card, mirroring the real exam’s format rather than teaching in the abstract.
Embedded Sanity Studio
Content management for the product owner: modules, exam sims, UI copy, and a JSON bulk-import tab for LLM-assisted authoring — no engineering time required.
Text-to-speech (/api/tts)
Server-streamed German neural text-to-speech for any exam-relevant term or dialogue line, cached with a long immutable header since (text, voice) pairs are deterministic.
Live-publish webhook (/api/revalidate)
Signature-verified webhook that pushes a CMS publish live in seconds, no rebuild — selectively invalidating only the affected cache tags.
Landing page
Public marketing page, bilingual, with waitlist capture feeding a Postgres-backed signup list.



Decisions, not just dependencies.
The content pipeline runs Sanity (GROQ projection) → Zod validation gate → canonical TypeScript types → exercise players. Every fetch is validated against correctness invariants: exactly one correct answer per question, collocation sets with at least one correct verb and one distractor, complete required fields. A CMS edit that violates one of these throws a labeled error at build time — and is caught live in Studio’s own validation before the product owner can even publish.
Deployment is Vercel-style Next.js hosting with Sanity Studio embedded in the same app. GitHub Actions auto-deploys Supabase migrations on every push to main. Strict TypeScript, ESLint/Prettier, and a standalone content:check script validate the live CMS dataset through the same Zod gate used at request time, plus DE/EN key-parity checks.
What was hard, and how we shipped it.
- 01
A CMS-first content platform a non-technical product owner fully operates
Every module, exercise, and UI string is edited and published without a developer, while a shared validation gate makes it structurally impossible to publish exam content that would silently mis-score a learner.
- 02
Live content updates without redeploys
A signature-verified webhook and tag-scoped cache invalidation take a CMS publish live in seconds.
- 03
A reusable exercise engine, not four one-off screens
The same engine powers both practice and exam simulations, and will power Phase 2’s voice roleplay without a rebuild.
- 04
A validated, staged AI roadmap
Deterministic mechanics shipped first, with every future capability already architected against the shipped content pipeline.
- 05
Bilingual from day one, multilingual by design
International expansion is a content operation, not a re-engineering effort.
Looking at a project that sits at this kind of seam?
Bring us the architecture, the constraints, and the ship date. We will bring the rest.

