Free, open-source, static study tool for the Camunda 8 Certified Developer (C8-CP-DV) exam. Drill against a realistic pool of scenario-style questions with per-option scoring, full review walkthrough, and a mock-exam mode that mirrors the real blueprint (60 questions / 75 minutes / 65 % to pass).
Not affiliated with or endorsed by Camunda Services GmbH. All questions are original, written for personal study, and reference public Camunda 8 documentation. "Camunda" is a trademark of its respective owner. See LICENSE.
- Curated, scenario-style question pool — every question is hand-authored against the Camunda 8.8 blueprint and run through automated content lints (no author tells, no internal references in option text, no markdown leaks) before it ships.
- Per-option scoring (1–10) with verdict + explanation rendered under every option on reveal.
- Deterministic option shuffle — no "answer A is always correct" cheat; same question gets the same shuffle across re-imports so progress is stable.
- Mock exam mode — 60 weighted questions, 75-minute timer, navigator, flag-for-review, confirmation modal before submit, full post-exam walkthrough with wrong-only filter.
- Practice mode — topic-by-topic, instant feedback, doc links per question.
- Review mode — re-study only the questions you got wrong or bookmarked.
- Dashboard — coverage per topic, recent attempts, scores.
- localStorage persistence — no backend, no telemetry.
React 18 · TypeScript · Vite · Tailwind · Zustand · Vitest. Static SPA, deployable to any static host (GitHub Pages, Netlify, S3, plain nginx).
Requirements: Node.js 18+ and npm (bundled with Node). That's it — no Java, no Docker, no Camunda runtime, no database. Works identically on macOS, Linux, and Windows.
npm install # installs dependencies (first time only)
npm run dev # http://localhost:5173npm test # Vitest schema tests
npm run build # production bundle into dist/
npm run preview # serve the production bundle
npm run lint # tsc --noEmit
npm run questions:build # rebuild src/data/questions/pool.json from pipeline/authored/<topic>/*.jsondist/ uses relative paths (base: './') so it can be hosted anywhere, including subpaths.
The repo is fully self-contained. To get someone else up and running:
- Share the source — either
git clonethe repo, or zip it up (excludenode_modules/,dist/,.git/to keep it small — a fresh checkout is ~5 MB).# macOS / Linux zip -r camunda-exam-prep.zip . -x 'node_modules/*' 'dist/*' '.git/*' '.vite/*' 'coverage/*'
- They unzip and run:
cd camunda-exam-prep npm install npm run dev - Open http://localhost:5173 — done. Each developer has their own localStorage progress; nothing is shared.
All paths in the codebase (including the question pipeline) use Node's path.join + import.meta.url, so there are no OS-specific assumptions.
src/
App.tsx HashRouter, routes
main.tsx Entry point
components/ QuestionCard, ResultsScreen, Timer, TopicSelector, ProgressDashboard
modes/ PracticeMode, ExamMode, ReviewMode
store/ Zustand stores (progress + active exam session)
hooks/ useLocalStorage, useTimer
data/
topics.ts Blueprint topic catalog + weights
questions/
pool.json ← generated by the pipeline (full question pool shipped to users)
index.ts Aggregator + weighted exam builder
types/ Shared TypeScript types
pipeline/
build-pool.mjs Node ESM builder: pipeline/authored/<topic>/*.json → src/data/questions/pool.json
blueprint.json Per-topic target counts
authored/<topic>/ Hand-authored question JSONs grouped by blueprint topic
lib/content-lints.mjs Content lint rules (no meta-vocab, no markdown leaks, etc.)
tests/ Vitest schema + lint tests
The pool is hand-authored JSON under pipeline/authored/, one folder per blueprint topic. pipeline/build-pool.mjs reads every *.json file, runs content lints, deterministically shuffles options per question, and writes the result to src/data/questions/pool.json.
npm run questions:buildThe builder prints a per-topic distribution table and rejects any question that fails a content lint. The build fails the run if a topic is below its blueprint target.
- Pick the topic folder under
pipeline/authored/(e.g.configuring-processes/). - Create
q-<short-slug>.jsonmatching the schema below. - Run
npm run questions:buildand fix any lint findings. - Run
npm test.
Each entry in pool.json matches the Question type in src/types/index.ts:
Topic ids and exam weights live in src/data/topics.ts and match the official blueprint (Modeling 15 %, Configuring Processes 22 %, Decisions & DMN 11 %, Forms 5 %, Connectors 6 %, Extensions & Integrations 25 %, Managing Development 15 %, Dev Environment 1 %).
npm test runs the schema validator:
- All question ids are unique.
- Every question has exactly 4 options with ids
a/b/c/d. correctOptionIdresolves to one of the options.- Every doc URL is well-formed.
- Topic weights sum to 100.
Anywhere that can serve static files:
npm run build
# upload dist/ to your hostGitHub Pages: dist/ works as-is because of base: './' and the HashRouter. Just push dist/ to a gh-pages branch or use an action.
The project ships with a sensible .gitignore (node_modules, dist, .DS_Store, *.log, .vite, coverage). To initialise:
cd ~/camunda-exam-prep
git init
git config user.name "Your Name" # one-time, or use --global
git config user.email "you@example.com" # required — commit fails (exit 128) without it
git add .
git commit -m "Initial commit: Camunda 8 exam prep"Optional — push to GitHub:
# create an empty repo on github.com first, then:
git branch -M main
git remote add origin git@github.com:<you>/camunda-exam-prep.git
git push -u origin mainThis repo includes .github/workflows/deploy.yml. After your first push to main:
- On GitHub: Settings → Pages → Build and deployment → Source: GitHub Actions.
- Push to
main(or run the workflow manually) — the action runs tests, builds, and publishesdist/to Pages. - Your site goes live at
https://<you>.github.io/<repo>/.
The Vite config uses base: './' and the app uses HashRouter, so it works on any subpath without further config.
A second workflow (.github/workflows/ci.yml) runs lint + tests + build on every PR.
src/data/questions/pool.jsonis committed so the app works without running the pipeline. Re-runnpm run questions:buildafter editing any file underpipeline/authored/.- No secrets, no telemetry, no analytics — safe to make public as-is.
- See CONTRIBUTING.md for the contribution flow.
MIT-licensed — see LICENSE. Questions are original; documentation links point to public Camunda 8 docs.
This project is an independent, community-built study tool. It is not affiliated with, endorsed by, or sponsored by Camunda Services GmbH. "Camunda" and related marks are trademarks of their respective owners. Use at your own risk for exam preparation.
{ "id": "cp-input-mapping", "topic": "configuring-processes", "subtopic": "I/O mappings", "difficulty": "easy", "style": "scenario", "camundaVersion": "8.8", "scenario": "...", "question": "...", "options": [ { "id": "a", "text": "..." }, { "id": "b", "text": "..." }, { "id": "c", "text": "..." }, { "id": "d", "text": "..." } ], "correctOptionId": "a", "optionExplanations": { "a": { "text": "Correct. ..." }, "b": { "text": "Incorrect. ..." }, "c": { "text": "Incorrect. ..." }, "d": { "text": "Incorrect. ..." } }, "explanation": "Aggregated explanation block.", "docs": [{ "title": "...", "url": "https://docs.camunda.io/..." }] }