Skip to content

Case file 05 · Experience

GYM VANCOUVER

A school platform that gives administrators, teachers, students and families one shared source of truth.

  • SvelteKit
  • TypeScript
  • Prisma
  • PostgreSQL
  • Tailwind CSS
  • AVIF

The challenge

A school does not have one generic user: administrators configure the academic year, teachers publish and assess, students follow their work, and families need timely information. The rebuild had to connect those journeys without turning the interface into an enterprise maze.

Public home page for the Gym Vancouver school platform
Real public home page captured from the local application; no student records are shown.

The approach

I rebuilt the system as one full-stack SvelteKit application with server-side authorization and a typed Prisma model over PostgreSQL. Role-specific navigation keeps each surface focused, while media processing, reports and document generation live behind explicit server boundaries.

Key decisions

  1. Use one identity with multiple roles instead of duplicating people across separate portals.
  2. Enforce school boundaries and authorization on the server for every read and write.
  3. Treat academic history, media and PDFs according to their different retention and processing needs.

Technical architecture

Full-stack architecture designed and built end to end by me.

  1. 01 Role experiences SvelteKit · TypeScript

    Focused navigation for admins, teachers, students and families.

  2. 02 Server boundary SvelteKit server

    Authentication, authorization and school-scoped actions.

  3. 03 Academic model Prisma · PostgreSQL

    People, groups, periods, grades, attendance and finance.

  4. 04 Media and reports AVIF · PDF

    Optimized images, report cards and school documents.

Modules

What the product is made of, as its own screens divide it.

  • 01 Students & groups

    Enrolment, groups and the family behind each student.

  • 02 Academics

    Subjects, grades and the academic calendar.

  • 03 Attendance

    Daily attendance per group, with reports.

  • 04 Report cards

    Report cards rendered to PDF from the same records.

  • 05 Fees & payments

    Balances, payments and what each family owes.

  • 06 Circulars & posts

    School circulars and publications for families.

  • 07 Files

    Images normalised to AVIF and documents in blob storage.

Before → after

  • Before

    Separate portals and duplicated identities.

    After

    One identity that can carry multiple roles.

  • Before

    Families learning about schoolwork too late.

    After

    Activities, attendance and grades in one place.

  • Before

    Authorization implied by the interface.

    After

    Every read and write enforced on the server.

Technologies

  • SvelteKit
  • TypeScript
  • Prisma
  • PostgreSQL
  • Tailwind CSS
  • AVIF
  • PDF

The wider toolkit

  • Zod
  • Paraglide
  • sharp
  • React PDF
  • Resend
  • Azure Blob
  • argon2
  • Lucide
  • Playwright
  • Vercel

Brand marks from Simple Icons; concepts without one are drawn in-house.

Project log

Aug 2026 → Sep 2026 · 2 active months

80 commits
1 repository
2 active months
Aug 2026 Busiest month: Sep 2026 · 46 commits Sep 2026
  • app app · 80 commits Aug 2026 → Sep 2026

In the tree

  • 32 routes
  • 30 data models
  • 12 migrations
  • 29 test files
  • 448 tracked files

Read from the local Git history on Oct 6, 2026. Aggregates only.

The outcome

The working rebuild already demonstrates the four role journeys with seeded, fictional data across academics, attendance, communication and finance. Its current snapshot includes 31 product routes and a documented capture set used to review the experience without touching production records.

Private codebase — this file shares the thinking, not the source.