Brush up on a skill or topic right before a test, so the material is fresh in your mind. Pick a module, pick a mode, work through a quick session.
The home page lists available modules with your last score on each.
Each module page lets you choose a mode (multiple choice, flashcards, recap) and a session size before you start.
Quiz sessions track progress and let you save and exit at any time.
18 modules across four categories:
- Driving licensing — G1 (Ontario)
- Programming languages — JavaScript, TypeScript, Python, C, C++, Java, C#, SQL, Go, Rust
- Test prep — Real Estate License
- Languages — English, Spanish, French, Japanese, Italian, Portuguese
Each module supports three modes:
- Multiple choice — pick from four options, instant feedback.
- Flashcards — front prompts, flip to reveal, self-grade.
- Recap — think your answer, reveal the canonical one, self-grade.
Dynamic modules let you choose a session size (10, 20, 50, or all); static modules always use the full question bank.
Bun · Vite · React + TypeScript · wouter · zustand · CSS modules · Supabase (Postgres + Auth + RLS) · Vitest.
-
Install dependencies:
bun install -
Create a Supabase project at https://supabase.com/dashboard.
-
Create
.env.localat the repo root with:VITE_SUPABASE_URL=https://xxxx.supabase.co VITE_SUPABASE_ANON_KEY=<anon key> SUPABASE_DB_URL=postgres://postgres.<ref>:<password>@<host>:5432/postgresSUPABASE_DB_URLcomes from Dashboard → Project Settings → Database → Connection string (URI, with password). Only needed forbun run db:apply. -
Apply migrations. Three options, pick one:
bun run db:apply— runs everysupabase/migrations/*.sqlviapsqlin sort order. Requirespsqlon PATH (brew install libpqand add to PATH, orbrew install postgresql). Pass file paths to apply a subset, e.g.bun run db:apply supabase/migrations/001_init.sql.- Supabase SQL Editor — paste each file manually. Useful if you only
want a subset of seeds; each
_seed_*.sqlis independent. bun run db:push— uses the Supabase CLI. One-time setup:brew install supabase/tap/supabase && supabase login && supabase link --project-ref <ref>. Migration filenames must be renamed toYYYYMMDDHHMMSS_name.sqlfor the CLI to detect them.
For a fresh project, apply
001_init.sqland005_module_requests.sqlplus any_seed_*.sqlmodules you want. -
Run the dev server:
bun run dev
bun run dev— start Vite dev serverbun run build— production buildbun run preview— preview the production buildbun run typecheck—tsc --noEmitbun run lint— ESLintbun run test— run Vitest oncebun run test:watch— Vitest in watch modebun run check— lint + typecheck + testbun run db:apply— applysupabase/migrations/*.sqlviapsql(usesSUPABASE_DB_URL)bun run db:push— apply migrations via the Supabase CLI (supabase db push); requiressupabase init+supabase linkfirst
scripts/capture-screenshots.ts drives Chromium (Playwright) against the dev
server and writes PNGs to docs/screenshots/. It bypasses Supabase by
injecting a synthetic auth session and mocking PostgREST responses, so it
works without real credentials.
bun run dev # in one terminal
bun run scripts/capture-screenshots.ts # in another


