TutorLoom
The learning platform for companies, colleges and training institutes. Free and open source, with an Enterprise edition.
Interactive reviews, quizzes and tests for the classroom.
EducationGitHub @tresterling003OnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
Repository information has not been collected yet.
No updates detected yet. GitHub releases will appear here.
The maker's introduction consists of the line above. Read the repository README for more details. Repository README ↗
Loading the full README.
Read the full README ↗An interactive review, quiz and test platform for the classroom. It supports many classes and unlimited assignments, grades automatically, and lets students progress section by section.
The platform comes preloaded with Economics Unit Review — Markets, Circular Flow, Supply & Demand (40 questions), ready for you to inspect and publish.
| Guide | For |
|---|---|
| docs/SETUP.md | Putting the site online (step by step, no coding) |
| docs/TEACHER_GUIDE.md | Using it every week: classes, questions, assignments, grading |
| docs/question-template.csv | Spreadsheet template for importing questions |
You need Node.js 20 or newer (the "LTS" download). Then, in a terminal inside this folder:
npm install
npm run dev
Open http://localhost:3000/teacher. On first visit you'll create your teacher account (no setup code is needed locally). Your data is stored in a .pfl-classroom folder in your home directory; nothing else needs to be installed.
Student join page: http://localhost:3000. Use the code shown after you publish an assignment.
| Piece | Choice | Why |
|---|---|---|
| App | Next.js 16 + TypeScript | One codebase for pages and the server API; huge community; free hosting on Vercel |
| Styling | Tailwind CSS | Consistent, accessible design without extra libraries |
| Database | PostgreSQL via Drizzle ORM | Reliable, standard SQL with real constraints and transactions. In production it uses Neon (free tier) or any Postgres. Locally it uses an embedded Postgres (PGlite), so there's nothing to install. |
| Hosting | Vercel | Connect GitHub and every push deploys. Free tier is plenty for a classroom. |
| Teacher auth | Built-in email + password (bcrypt, httpOnly session cookies) | No extra service to configure; works offline locally |
| Short-answer AI (optional) | Anthropic Claude, server-side only | Off by default; falls back to rubric grading |
Teacher ─┬─ Course (class) ─┬─ Period
│ ├─ Unit
│ ├─ Question (question bank)
│ └─ Assignment ─┬─ Section ── SectionQuestion → Question (editable draft)
│ ├─ AssignmentPeriod
│ └─ AssignmentVersion (frozen snapshot on publish)
│ └─ Attempt (one per student) ─ SectionRun (each try) ─ Response
TEACHER_SETUP_CODE, so a stranger can't claim your new site.$/units on numbers, and small typos on long words. It never fuzzes numbers or opposite words (increase/decrease, upward/downward). You can block specific wrong answers and "accept for everyone" after the fact.| Command | What it does |
|---|---|
npm run dev | Run locally at http://localhost:3000 |
npm test | Grading, scoring, security and full-flow tests (in-memory database) |
npm run test:e2e | Browser tests: teacher setup → publish → students on Chromebook-size screens → results → CSV |
npm run build | Apply database migrations, then build for production (Vercel runs this) |
npm run db:migrate | Apply database migrations to DATABASE_URL |
npm run teacher:reset-password -- [email protected] | Reset a forgotten password |
npm run lint / npm run typecheck | Code checks |
src/
app/ pages + API routes
teacher/… teacher dashboard (classes, bank, builder, results, review, settings)
join/, play/ student join + player
api/ server endpoints (teacher/*, s/[code], join, auth/*)
components/ UI (player/, teacher/, shared ui.tsx)
db/ schema.ts (tables) + connection
lib/
grading/ normalize, objective (FIB/MC/matching), rubric, ai
scoring.ts pass/fail, best/latest/first, section weights
services/ all server logic with ownership checks
seed/ the built-in Economics review
drizzle/ SQL migrations
tests/ unit, integration, e2e
Edit src/db/schema.ts, run npm run db:generate to create a migration in drizzle/, and commit it. Migrations run automatically on the next deploy.