Local-first exam trainer. Import any question bank, study offline, track mastery.
No backend. No account. Everything stays in your browser.
Try the live demo | Get started | Create a question bank
Study modes — Drill with instant feedback. Simulate timed exams. Review mistakes. Schedule with SM-2 spaced repetition. Revisit flagged questions.
Analytics — Per-category radar, per-topic mastery, weak-area detection, readiness tracking. Know exactly where you stand.
AI second opinion — Banks can carry an optional AI analysis per question: a recommended answer and a short explanation in its own section, flagged where it disagrees with the source key. Grading always uses the source answer.
简体 / 繁體 — Chinese banks can be shown in Simplified or Traditional characters (character-level conversion, exam terms unchanged).
Offline-first — Full PWA with service worker. Install to home screen, study on a plane. New versions install themselves, with a short What's new note.
Private by default — Zero telemetry, no third-party requests. The only later fetches are update checks and, for Chinese banks, the app's own script dictionaries. Your progress never leaves your device.
Load the demo bank and start drilling in seconds. Works on desktop and mobile.
No install, no sign-up, no data leaves your device.
Install as an app on your phone
Quizer is a PWA — it works offline and feels native once installed.
- iOS — Open the link in Safari, tap the Share button, then Add to Home Screen.
- Android — Open in Chrome, tap the three-dot menu, then Add to Home Screen (or accept the install banner).
Once installed, it launches fullscreen with its own icon — no browser bar, no tabs.
You don't need this to use Quizer — the hosted demo above is the full app. This section is for running it locally or self-hosting your own copy (development, private deployment, or contributing).
Requires Node ^20.19.0 || >=22.12.0.
git clone https://github.com/sayre4ux/quizer.git
cd quizer/app
npm ci
npm run dev # local dev server — open the printed URLThen Add a question bank and select a .quizbank.json or .quizbank.zip
file, or load the bundled demo bank to look around.
Quizer is a fully static PWA — no server, no env vars, no database. Build it and
serve the app/dist/ folder from any static host (Vercel, Netlify, Cloudflare
Pages, GitHub Pages, nginx, …):
cd app
npm run build # outputs static assets to app/dist/
npm run preview # preview the production build locally| Command | What it does |
|---|---|
npm run dev |
Start the local dev server |
npm run build |
Type-check + production build (outputs app/dist/, generates PWA service worker) |
npm run preview |
Serve the production build locally |
npm test |
Run the test suite (vitest) |
npm run lint |
ESLint |
Have your own question set (CSV, Anki export, docs, slides, markdown, even screenshots)? Turn it into an importable bank.
quizbank-author ships as a Claude Code plugin. Install it once, then just ask
your agent to convert your file — it handles the interpretation, validation, and
packaging for you:
/plugin marketplace add sayre4ux/quizer
/plugin install quizbank-author@quizer
Then: "Convert my questions.csv into a Quizer bank." The agent extracts answers
from your source (it never invents them), validates the structure, and produces a
.quizbank.json/.quizbank.zip you can import.
Want a second opinion on the answers? The format has an optional per-question ai
field (see SCHEMA.md). It is added in a
separate step you ask for explicitly, never during conversion, and never changes
the source answer.
Prefer to do it yourself? The same tooling runs standalone:
cd quizbank-author
npm ci
# validate
node scripts/validate-quizbank.mjs quizbank.json --assets assets --report conversion-report.json
# package
node scripts/pack-quizbank.mjs quizbank.json --assets assets --report conversion-report.json --out mybank.quizbank.zipSee quizbank-author/README.md for the full
workflow and references/SCHEMA.md for
the format spec.
quizer/
app/ Vite + React 19 + TypeScript + Tailwind v4
quizbank-author/ Standalone bank conversion + validation tool
The authoritative quizbank v1 spec lives in app source:
format.ts (types + limits) and
validate.ts (rules). The authoring tool's
validator is a faithful port, kept in lockstep by a
parity test.
Contributing with an AI coding agent? See AGENTS.md for build/test commands, conventions, and the security boundary to respect.