ClassPath
For teachers who run classwork through general-purpose form tools and need grading, classes, timed tests and live sessions built in, and for students who should be able to answer from a code or a link without making an account.
- Category
- Web app
- Status
- In development
- Role
- Design and development
- Year
- 2026
Not public yet. ClassPath is still being built.


Overview
ClassPath is a web app for quizzes, tests and surveys in school. Teachers build forms with twelve question types, publish them as fixed versions, grade the answers and release results when they are ready. Students answer from a link with no account, or sign in to see their classes, work and results in one place.
Around the forms it runs live sessions with a join code, timed tests with deadlines kept on the server, classes with rosters and due dates, and a study area where students turn the questions they missed into flashcards.
The design treats a worksheet as a route: questions are numbered stops down the page margin, set in Atkinson Hyperlegible for legibility, with light and dark themes checked for contrast. ClassPath is a working name, and the project is still in development.
What it does
A form builder for classwork
Twelve question types, from multiple choice and short answer to number with a tolerance, ordering, matching and file upload. Points, answer keys, sections with go-to rules, pictures, autosave, undo and redo, and a live student preview.
Grading and released results
Choice, short-answer, number, ordering and matching questions grade themselves; paragraphs and files wait in a grading queue with Save and next. Teachers release results when ready and export CSV files of responses and grades.
Live sessions
A teacher opens a lobby with a six-character code and a QR code, then lets the class work at its own pace or moves everyone one question at a time. The control room shows who has joined and their progress, never their answers.
Timed tests that survive a refresh
The server records each start and deadline, so a reload or a wrong device clock doesn't reset the timer. Answers are handed in automatically at zero, and a private extra-time link covers accommodations.
Classes and rosters
Each class has a seven-character code. Teachers import a roster from a spreadsheet with a preview of every row before anything is saved, set forms and due dates for the class, and see each student's status per form.
Answers saved as students go
Every change is saved to the server with a visible Saving, Saved or Offline state, and a student can pick up on another device after a crash or a reload.
Study tools for students
Flashcard sets reviewed in Leitner boxes (due again after 1, 3, 7 or 14 days), practice tests, and a Mistakes page that turns missed questions from released results into cards.
Analytics that protect individuals
Score summaries, answer breakdowns and the hardest questions, with statistics hidden until at least five responses are fully graded so no single student's score can be picked out.
Screens
How it was built
Real PostgreSQL everywhere, including tests
Repository code talks to one small database interface with two drivers: node-postgres in production and PGlite, PostgreSQL compiled to WebAssembly, for local work and tests. The same SQL and numbered migrations run everywhere, with no database server needed to develop.
The answer key never reaches a student
Before a form is sent to a student's browser, correct answers, points, accepted answers and explanations are stripped out. Ordering items and matching options are shuffled uniformly and carry their own ids so the order gives nothing away, and in teacher-paced live sessions the server sends only the current question.
Attempts that can't lose or overwrite work
Every attempt is a server row from its first saved answer. Saves are numbered, a tab that fell behind another is refused and shown the newer answers, hand-ins are idempotent, and attempts past their deadline are handed in by the server with what was saved. End-to-end tests cover refreshes, time offline across a deadline, two tabs and simultaneous submits.
Rate limits sized for a school network
Limits are counted in PostgreSQL with an atomic upsert so they hold across server instances. Wrong passwords and wrong join codes count only failures, which stops guessing without locking out a whole class sharing one address.
Built with
- Next.js 16 (App Router)
- React 19
- TypeScript
- PostgreSQL
- PGlite
- node-postgres
- Zod
- CSS Modules
- Resend (account email)
- Google sign-in (OpenID Connect with PKCE)
- node:test
- Playwright
- axe-core
Want something like ClassPath?
Tell me what you are building and what it needs to do. rowenapichardo@gmail.com