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.

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
- Use one identity with multiple roles instead of duplicating people across separate portals.
- Enforce school boundaries and authorization on the server for every read and write.
- 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.
- 01 Role experiences SvelteKit · TypeScript
Focused navigation for admins, teachers, students and families.
- 02 Server boundary SvelteKit server
Authentication, authorization and school-scoped actions.
- 03 Academic model Prisma · PostgreSQL
People, groups, periods, grades, attendance and finance.
- 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.
AfterOne identity that can carry multiple roles.
- Before
Families learning about schoolwork too late.
AfterActivities, attendance and grades in one place.
- Before
Authorization implied by the interface.
AfterEvery read and write enforced on the server.
Technologies
- SvelteKit
- TypeScript
- Prisma
- PostgreSQL
- Tailwind CSS
- AVIF
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
- 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.
