US Citizenship Civics Test Data Bank

Static JSON question bank for the US Citizenship exam app. Served from Cloudflare Pages.

Manifest

Read this first: it lists the available languages, domains (civics / reading / writing), editions, test rules (including the 65/20 exemption), and states. Every other path is derived from it.

Dynamic data (language-neutral)

Proper nouns are identical in every language, so they live once here and carry an as_of date. Election updates touch only these files.

Question skeletons (language-neutral structure)

Structure only — ids, types, categories, the senior (65/20) flag, num_required, and references into the data files. No translatable text.

Translations (text overlays)

Each language adds only translatable text: UI labels plus civics overlays keyed by question id. Reading/writing content is English-only; only its instructions are translated (in ui.json).

Path convention

Files follow a predictable pattern, so the app builds URLs from the manifest:

At load the app merges a skeleton with the selected language's overlay. Anything missing for a language falls back to the manifest's default_language. Run node schema/validate.mjs to check cross-file integrity.