Manitoba Métis Federation • Shipped 2025
Graduation Ceremony Portal
Scan a student card to check a gown out or back in, and scan again at the stage to put their name on the projector. Handled over 150 graduates across two ceremonies, and built to keep working if the venue Wi-Fi drops.
- Role
- Sole developer
- Timeline
- Two consecutive graduation ceremonies
- Team
- Solo, built for the department that runs the ceremony and run on-site with their staff
- Stack
- SvelteKit, Convex, Service Worker
Context
Louis Riel College, one of the Manitoba Métis Federation's affiliates, holds a graduation every year. Gowns go out beforehand and have to come back after, and during the ceremony someone has to get each graduate's name and program on the projector at the right moment.
The college asked IT for help, so I built the app that tracks the gowns and runs the projector, and I ran it on the night. It's SvelteKit with Convex behind it. Two years in a row now, 2025 and 2026.

Problem
Two things could go wrong, and both had before.
- Gowns went missing. Without a record of who took which size, there was no way to know what was still out after the event.
- The ceremony could stall. You can't count on venue Wi-Fi. If the projector needs a live connection, one dropout stops the ceremony in front of a few hundred people.
Approach
- SvelteKit
- Convex
- Service Worker
- Barcode scanning
Gown check-out and check-in. Staff scan a student's card. That records the gown size going out and marks it returned when it comes back, so at the end of the night every gown is accounted for.

Getting the list in. The college sends the graduate list as a CSV. The import page takes the file, lets staff add or remove someone by hand, and exports the current list back out.

The stage station. A second scanner runs the ceremony. As each student walks up, one scan puts their name and program on the projector. No typing, no searching.

Works offline. The stage station pulls the full graduate list into the browser whenever it's online and looks every scan up from that local copy, so if the venue connection drops mid-ceremony the projector keeps going. A service worker keeps the app itself loaded. Gown check-out needs a connection, but that happens before the event, not during it.
Access control. Every station is locked behind an access code that the Convex backend checks on every call, so a laptop left open on a table can't change anything.

Decisions
- The stage station looks every scan up from a local copy of the list instead of asking the backend, so a Wi-Fi drop mid-ceremony doesn't stop the projector. A service worker keeps the app itself loaded.
- Gown check-out still needs a connection. That happens before the event, not during it, so it wasn't worth making offline.
- The access code is checked by the Convex backend on every call, not just hidden in the page.
- The roster comes in as a CSV and goes back out the same way, since that's what the college already sends.
- The station listens for the scanner on its own, so nobody has to click into a field between graduates.
Outcome
Both ceremonies ran on it start to finish. Over 150 graduates went through it across the 2 nights, and every gown came back.