A Next.js gradebook for individual instructors that holds grading periods, classes, students, assignments, and scores in Postgres via Prisma. The headline feature is a CSV import / export bridge between two real-world teacher gradebook formats, including fuzzy student-name matching during import. Self-hosted on a single Ubuntu VM with Nginx, PM2, and Let's Encrypt.
// features
- CSV import detects two teacher-platform formats automatically
- Levenshtein fuzzy match for "Last, First" vs "First Last" names
- Round-trip CSV export back to either source format
- Grade engine separates earned, projected, and final percentages
- Top-5 assignment impact ranking per student
- Admin role can provision additional instructor accounts
- Single-script deploy to Ubuntu with Nginx and PM2
// interesting details
- Three distinct grade metrics computed in one pass: earned (past-due only), projected (against class max), and final (includes future scored work) — with excused and missing handled as separate branches.
- Import name matching generates multiple variants per name (first-last, last-first, normalized) then accepts a fuzzy hit when Levenshtein distance is within 30% of the longer string.
- CSV writer is explicitly designed to round-trip with the parser — same metadata header layout, same fraction-style multi-cell scores, same en-US timestamp format down to AM/PM.
- Route groups split the Next.js app into (auth) and (app) shells, with the Prisma client emitted into src/generated/prisma for direct typed imports.
// tech stack
TypeScript
Next.js 16 (App Router)
React 19
Prisma 7 + PostgreSQL
NextAuth + bcrypt + JWT
Tailwind CSS v4 + shadcn/ui
Recharts
fast-csv
@react-pdf/renderer
Jest + Supertest
PM2 + Nginx + Let's Encrypt
Want to collaborate on qubicgrade?
The repo is private — drop a note and tell us what brought you here.