Open-source interview preparation courses that are text-first and interactive.
Reading, not video. Every few paragraphs you have to do something: answer a question, recall a list, predict what breaks, critique some code. Courses are Markdown files in this repo, so anyone can fork one, fix one, or contribute one through a pull request.
Long documents do not get finished. Video courses are slow to skim and impossible to search. This is the middle: dense written explanation with retrieval practice built into the page.
Two processes. The API first:
cd backend
pip install -r requirements-dev.txt
python3 -m pytest -q
uvicorn app.main:app --reloadThat serves http://localhost:8000, with OpenAPI at /openapi.json and docs at
/docs. Then the reader, in another terminal:
cd frontend
npm install
npm run devThat serves http://localhost:5173 and proxies /api to the backend, so there
is no CORS step and no env file to write. If 5173 is taken, Vite picks the next
free port and the proxy follows.
The API client in frontend/src/api/ is generated by orval from the OpenAPI
schema. After changing a route or a schema, regenerate it with the backend
running:
cd frontend && npm run apiSee CLAUDE.md for the plan and the next tasks.
A course is a directory under content/courses/:
content/courses/my-course/
course.yaml
lessons/
01-first-lesson.md
Lessons are Markdown with YAML front matter. Interactive elements are fenced directives:
Prose explaining the idea.
:::quiz id=example
question: What does this actually do?
options:
- text: The wrong but tempting answer
explain: Why it is tempting and why it is wrong.
- text: The right answer
correct: true
explain: The reason.
:::Block types are quiz, recall, answer, code and note. The full spec,
with the fields each one takes, is in CLAUDE.md.
Quiz answer keys never reach the browser. The lesson endpoint strips correct
and explain from the options, and grading is a POST that returns the correct
keys along with the explanations for whatever was picked.
MIT. See LICENSE.