← Back to portfolio
Live pilot in production

EduTrack

Multi-tenant attendance & grading platform for teachers — built to scale to a whole school from a single pilot

Pilot client: Colegio Maestras de la Fuente (CMF), SaltilloUsers: Teacher (Physical Education), 3 school levelsType: Multi-tenant SaaS, PWASite: escuela-app-eta.vercel.app
At a glance
3
School levels, each with its own weighted grading rubric
0
Code changes needed to onboard the next teacher — just a new account
1
Database policy per table enforcing teacher-level data isolation
The request — and the bigger opportunity

A Physical Education teacher at a school in Saltillo asked for a simple way to take attendance, capture grades, and generate reports — he was doing all of it by hand across Preschool, Elementary, and Middle School groups, each graded under a different rubric.

A one-off app for a single teacher would have solved his problem and nothing else. Instead, this was built as a multi-tenant platform from the first line of code — every teacher's data isolated at the database level — so the same product could onboard the rest of the school's teachers later with zero re-architecture, just new accounts.

The problems
Rubrics differ by level and subject

Elementary and Middle School weigh attendance at 50% plus three manual criteria. Preschool uses a simpler attendance + participation split. A second subject means a third rubric entirely. A single hardcoded formula could never cover this.

Attendance drives the grade automatically

Attendance is worth half the grade, computed live from daily records — but a justified absence shouldn't count against it, while an unjustified one should, and the student still owes the missed practical activity.

Used from the field, not a desk

Grades and attendance are captured on a phone, mid-class, on the spot — not from a computer at the end of the day. Any screen that assumes a desktop layout is unusable here.

What was built
Rubric editor per level & subject

The teacher adds his own grading criteria and weights per group. Attendance is always automatic and absorbs whatever percentage is left over — it can never be edited or removed by mistake.

Attendance with justified absences

Justified absences skip the attendance penalty but flag the activity as owed; unjustified ones count against the grade automatically.

One-click PDF report cards

Grades captured as 0–100 per criterion (the way the teacher already thinks in percentages) convert automatically to the school's official 6–10 scale on the printed report.

Installable PWA

Added to the home screen like a native app, with a service worker that never caches grade or attendance data — always live, never stale.

The key decision: multi-tenant from day one

Every table — groups, students, attendance, grades — carries the owning teacher's id, enforced by a Postgres Row Level Security policy, not application code. A teacher's queries can only ever return their own data, even if a future bug in the frontend tried to ask for someone else's.

"The pilot teacher costs almost nothing — he's the reference case. The real product is teacher #2 onboarding with a new login and zero new code."

Shaped by real classroom use
Before
  • ✗Designed for 0–10 capture per criterion — teacher naturally typed 90/80/70 instead, breaking the database constraint
  • ✗Edit/delete buttons hidden behind hover — invisible and untappable on a phone
  • ✗Wide grading table unreadable on a vertical phone screen
  • ✗Conduct reports reduced the final grade in a way the teacher felt was too harsh
After
  • ✓0–100 capture per criterion, converted to the official 6–10 scale only at report time
  • ✓Actions always visible with a larger tap target — no hover-dependent UI anywhere
  • ✓Card layout per student on mobile, full table preserved on desktop
  • ✓Conduct stays as a printable record with signature space, decoupled from the grade calculation
Tech stack
Next.js 14TypeScriptSupabasePostgreSQLRow Level SecurityTailwind CSSPWAjsPDF