← Back to projects
Summary

A flying club is also a school, and the school half has its own object model. Staff author syllabus templates made of ordered lessons, instructors record progress lesson by lesson and grade assessments, and students see a live ladder of where they stand alongside the courses they are enrolled in. It hangs off the same org-scoped, capability-gated, soft-deletable foundation as the rest of the platform, and it is the schema the later assessment features (stage checks, checkrides, exam grading) are built on.

Stack

What it's built with.

Next.js 16React 19 Server ComponentsTypeScriptPostgreSQLDrizzle ORMCapability-Based RBAC
Details

How it works.

Deliberately informational first

The first version of curriculum progress was explicitly not a gate. Recording that a student has completed a lesson did not authorize a solo or unlock a dispatch, and that restraint was the right starting point: the club's existing judgement about who may fly what was not something to encode from a standing start, and getting it wrong in that direction has consequences that a scheduling bug does not.

What it did establish was the schema everything else hangs off, which is why the assessment features that followed (delivery and gradesheets, stage checks, checkrides, exam grading) could be built as layers on top rather than as parallel systems with their own idea of what a lesson is.

Highlights

The things I'm proudest of.

  • ▹Syllabus templates as authored curricula of ordered lessons, with per-student progress recorded against them, giving both the instructor and the student a shared view of position in the course.
  • ▹Assessment surfaces layered on that backbone: in-cockpit lesson delivery and gradesheets, exam grading, stage checks, and checkride records, plus aircraft checkouts and checkrides as their own workflow.
  • ▹Student-facing and instructor-facing views of the same data, so a member sees their courses and standing while an instructor works a roster.
  • ▹Instructor availability and time-off modelled explicitly, since a lesson is a booking against a person as well as an aircraft.
  • ▹Curriculum access is its own capability group (read, write, manage) separate from membership administration, so a club can let an instructor teach a syllabus without letting them author one.
  • ▹Every training table is org-scoped, soft-deletable, and row-level-security enabled like the rest of the schema, so the school data inherits the platform's tenant isolation rather than restating it.