EduTrack
Multi-tenant attendance & grading platform for teachers — built to scale to a whole school from a single pilot
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.
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 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.
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.
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.
Justified absences skip the attendance penalty but flag the activity as owed; unjustified ones count against the grade automatically.
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.
Added to the home screen like a native app, with a service worker that never caches grade or attendance data — always live, never stale.
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."
- ✗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
- ✓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