Run markdown quizzes in the terminal
Project description
quizmd
quizmd runs markdown-based quizzes in the terminal with timers, single/multiple choice support, and answer export.
Install
Install from PyPI (recommended):
pip install quizmd
Install directly from GitHub (latest repo state):
pip install "git+https://github.com/steliosot/quizmd.git"
For a reproducible install, pin a release tag:
pip install "git+https://github.com/steliosot/quizmd.git@v2.1.1"
Then check the CLI:
quizmd --version
If you already installed it and want the latest updates:
pip install --upgrade --force-reinstall "git+https://github.com/steliosot/quizmd.git"
Add it to requirements.txt if you want teammates/students to install from GitHub:
git+https://github.com/steliosot/quizmd.git
Install vs Examples
pip install ...installs thequizmdcommand.git clone ...downloads this repository so you can use the bundled example quizzes.
Run a Quiz
If you want the bundled examples, clone the repo:
git clone https://github.com/steliosot/quizmd.git
cd quizmd
quizmd quizzes/harry-potter-quiz.md
Quickest start for new users:
quizmd init
quizmd --validate hello-quiz.md
quizmd hello-quiz.md
Validate quiz files without running the interactive UI:
quizmd --validate quizzes/harry-potter-quiz.md
Validate and run an essay quiz:
quizmd --validate essays/requirements-txt-essay.md
export GEMINI_API_KEY="your_key_here"
quizmd essays/requirements-txt-essay.md
Optional AI settings for essay mode:
quizmd --ai-provider auto --ai-timeout 30 essays/requirements-txt-essay.md
quizmd --ai-provider gemini --ai-model gemini-flash-latest --ai-timeout 30 essays/requirements-txt-essay.md
quizmd --ai-provider openai --ai-model gpt-4o-mini --ai-timeout 30 essays/requirements-txt-essay.md
quizmd --ai-provider anthropic --ai-model claude-3-5-haiku-latest --ai-timeout 30 essays/requirements-txt-essay.md
--ai-timeout must be greater than zero.
--ai-provider auto (default) checks keys in this order: GEMINI_API_KEY, OPENAI_API_KEY, ANTHROPIC_API_KEY.
If the first provider fails at runtime, auto mode tries the next available provider before falling back to deterministic feedback.
Security notes:
- Never hardcode or commit API keys in source control.
- Use environment variables only:
GEMINI_API_KEYOPENAI_API_KEYANTHROPIC_API_KEY
- If a key is exposed, rotate/revoke it immediately.
Privacy note:
- Essay answers are only saved if you choose
yat the save prompt. - Choose
nto keep answers out of localanswers/files.
Theme options for better readability on light or dark terminals:
quizmd --theme auto quizzes/harry-potter-quiz.md
quizmd --theme light quizzes/harry-potter-quiz.md
quizmd --theme dark quizzes/harry-potter-quiz.md
Windows Setup Notes
Create and activate a virtual environment on Windows:
python -m venv .venv
.venv\Scripts\activate
Install and run:
pip install "git+https://github.com/steliosot/quizmd.git"
quizmd --version
quizmd --validate .\quizzes\harry-potter-quiz.md
quizmd .\quizzes\harry-potter-quiz.md
Example Quizzes Included (No LLM Needed)
quizzes/harry-potter-quiz.mdquizzes/world-geography-quiz.mdquizzes/python-basics-quiz.mdquizzes/math-foundations-quiz.mdquizzes/history-and-civics-quiz.mdquizzes/general-science-quiz.md
Essay Examples (LLM-Based)
Essay files are separate and use Gemini evaluation:
essays/requirements-txt-essay.mdessays/venv-essay.mdessays/pinned-versions-essay.md
MCQ quizzes in quizzes/ do not call LLMs and do not need GEMINI_API_KEY.
Simple Quiz Example
Create a file named my-quiz.md:
# My First Quiz
## Question 1
What is 2 + 2?
- 3
- 4
- 5
Answer: 2
Type: single
Time: 20
Explanation: 2 + 2 is 4.
Run it:
quizmd --validate my-quiz.md
quizmd my-quiz.md
Guide: How to Create a Quiz
- Start with a single
#quiz title. - Add each question as a
##block. - Put the question text on the next line.
- Add answer options using
-bullet lines. - Add required fields:
Answer:(1-based indexes, comma-separated for multiple)Type:(singleormultiple)
- Add optional fields:
Time:positive integer secondsExplanation:any text
- Run
quizmd --validate your-quiz.mdbefore sharing.
Quiz File Rules
- Each question must start with
##. - Text outside the title and
##blocks is rejected. Answer:is required and must be valid indexes.Type:is required and must besingleormultiple.- Duplicate answers like
Answer: 2,2are rejected. Time:(if present) must be greater than zero.
Common Validation Errors
missing required field(s): optionsmissing required field(s): answermissing required field(s): typeduplicate answer indexesunsupported question typeunexpected content outside question blocksno valid questions found
Student End-to-End Check (Clean Environment)
Use these exact steps before class to confirm everything works:
python3 -m venv .venv
source .venv/bin/activate
pip install --upgrade pip
pip install "git+https://github.com/steliosot/quizmd.git"
quizmd --version
git clone https://github.com/steliosot/quizmd.git
cd quizmd
quizmd --validate quizzes/harry-potter-quiz.md
quizmd quizzes/harry-potter-quiz.md
Development
python -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
python -m unittest discover -s tests -q
Releases
- Release tags are immutable.
- Never retag an existing version.
- Publish a new tag for every release (
v2.0.3,v2.0.4, ...). - See CHANGELOG.md and RELEASE.md.
- PyPI publishing is configured via GitHub Trusted Publishing in
.github/workflows/release.yml.
Community
- Contributing guide: CONTRIBUTING.md
- Code of Conduct: CODE_OF_CONDUCT.md
- Security policy: SECURITY.md
- License: LICENSE
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file quizmd-2.2.0.tar.gz.
File metadata
- Download URL: quizmd-2.2.0.tar.gz
- Upload date:
- Size: 36.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
773842c8c6eb9bc94aac9b5a072d9b5ef2d0b75dce407d0cdffd051b096f91bc
|
|
| MD5 |
f1e76145fa3bc4ef46a67da152010e69
|
|
| BLAKE2b-256 |
f559a0f776aa98f4c75922b41bbe855481f627e5bdf4bdb9513af8091d6dee61
|
File details
Details for the file quizmd-2.2.0-py3-none-any.whl.
File metadata
- Download URL: quizmd-2.2.0-py3-none-any.whl
- Upload date:
- Size: 27.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e5849a989570413b3c489c0e86ffd089c6349cefa3adac9f51042ea2d0000163
|
|
| MD5 |
05c296fcf08f7c131b8c3f4a30026a33
|
|
| BLAKE2b-256 |
c88514e134754a1c1060cc892feba6320806d4c8ce5f970fe6794248ed3b2d16
|