Quiz Pool is a web app for authoring validated question banks, generating exam variants, printing OMR-ready PDFs, viewing saved exam sets, and grading completed papers.
- Python
3.12+ uvfor dependency managementlualatexonPATHfor printable PDF exportpdftoppmonPATHfor grading and annotated-PDF workflows
Install Python dependencies:
uv syncInstall the required system tools:
-
TeX Live users should install a LuaLaTeX-capable setup with the standard LaTeX collections used by the templates, at minimum
collection-luatex,collection-latexrecommended, andcollection-latexextra -
Debian/Ubuntu example:
sudo apt install texlive-luatex texlive-latex-recommended texlive-latex-extra poppler-utils- Mac users can install TeX Live with Homebrew:
brew install --cask mactex
brew install popplerAdditional notes:
- The project uses
lualatexto build printable PDFs - Latin Modern text and math fonts are vendored under
tex_templates/fonts, so they do not need to be installed separately - The
omrdependency generates OMR sheets directly, while grading and annotation rasterize PDFs throughpdftoppmfrom Poppler
Run directly from GitHub without cloning the repository:
uvx --from git+https://github.com/CompGenomeLab/quiz-pool.git \
quiz_pool --project path/to/course.quizpoolThe same system tools listed above are still required for PDF export, grading, and annotation.
Run from a local clone:
uv run quiz_pool --project sample_quiz.quizpoolThen open http://127.0.0.1:8000.
Useful CLI flags:
uv run quiz_pool \
--project path/to/course.quizpool \
--host 127.0.0.1 \
--port 8000The app stores normal work in the .quizpool project database: quiz content, generated exam sets,
the exam-generator draft, and uploaded question images. A new project starts empty. Use the
Editor's import action to bulk import a quiz JSON into the active project.
Welcome: choose the active.quizpoolproject DB for the current server sessionEditor: edit quiz metadata, upload quiz JSON for bulk import, learning objectives, questions, choices, points, explanations, and referencesExam Generator: filter the pool, generate saved exam sets, and preview variantsExam Viewer: reopen saved exam sets, edit printable metadata, inspect variants, and download the printable ZIPGrading: upload completed PDFs, runomr-grade, review mismatches, export CSV, and download annotated PDFs generated withomr-annotate
Printable output is built in two parts:
- the shared question-pool document is rendered with
lualatex - each student variant is rendered with
lualatex, then combined with an OMR answer sheet generated byomr
Inline math is written with [math]...[/math].
Examples:
[math]A = \pi r^{2}[/math][math]\hat{p} \approx \mu / s[/math]
The same markup works across the editor preview and the LaTeX printables. Question text, choice text, and explanations can all contain inline math.
Each question supports:
2to5contiguous choices fromAtoE- one or more correct answers
pointsdifficulty- one or more linked learning objectives
- one or more references
- optional explanation
- optional PNG/JPEG images attached to each question
Learning objectives are editable in the Editor and use IDs like LO1, LO2, LO3, ...
The grading workflow checks more than raw OMR output. It validates:
- OMR errors returned by
omr-grade - missing or invalid QR payloads
- unknown variants
- question count mismatches
- invalid marked choices for a variant
- duplicate student IDs across multiple graded PDFs
It also:
- computes earned points and possible points
- exports the student summary table to CSV
- packages annotated PDFs named like
rowIndex-studentId-annotated.pdfinto a download ZIP
For grading and annotation, make sure pdftoppm is installed and available on PATH.
- A new project DB starts with an empty quiz and no generated exams
- Quiz JSON import happens from the Editor and copies the quiz into the active project DB
- Invalid quiz edits are rejected on save and shown in the UI
- The browser shows a native warning for tab close or reload when the Editor has unsaved changes
- If printable export fails with a LaTeX error, check that
lualatexis installed and that the vendored assets undertex_templates/are still present
