Garrick Tse

All work

Selected work

Gateway Training Tool

A training records platform for coordinators, trainers and students across three provinces, built on my own time to replace a spreadsheet process I was working inside.

Year
2026
Role
Solo. Built on my own time, not as assigned work
Stack
TypeScript, React, Tailwind CSS, Node.js, PostgreSQL, Supabase

The problem

I trained dealers at Gateway. Training progress lived in spreadsheets passed between coordinators, one per cohort, edited by whoever had the file open. That holds up until somebody asks a question the records have to answer: has this person actually been signed off on this game, by whom, and when.

A spreadsheet cannot answer that defensibly. There is no history of who changed a score, nothing stopping a trainer at one property from editing another property's cohort, and no way to confirm a student has met every graduation criterion short of reading every row by hand. Training records are compliance records. They matter most at the moment somebody audits them, which is exactly when a shared spreadsheet is least trustworthy.

What I built

A role-aware platform for coordinators, trainers and students, scoped by province across BC, AB and ON.

Coordinators create cohorts with dates, property, game type and an assigned trainer, then publish schedules students can see. Trainers work on the floor: a built-in drill timer whose result writes straight into the drill log, per student test scores against configurable pass and fail thresholds, attendance marking, and daily report upload by photo or scanned PDF.

The records side turns that into competency sign-offs, a graduation checklist that will not clear until attendance, drills and scores all pass, retraining flags raised automatically on repeat failure, and an audit log of every score entry, sign-off and upload with the user and timestamp attached.

It runs on Supabase over PostgreSQL, with the front end deployed on Vercel. The tool is not a Gateway product and is not affiliated with or endorsed by the company; it is something I built because I was the one using the process.

gatewaytraining.ca. The tool itself sits behind an account, so this is the entry point rather than the application

Decisions

Model the hierarchy in the database, not the interface.

Coordinator, trainer and student is not a display concern, it is the access rule. The hierarchy maps onto a relational model with row-level security in PostgreSQL, so a trainer in Alberta cannot read a British Columbia cohort even if a route is guessed or a request is hand-crafted. Enforcing it in the front end would have been quicker and would have put the rule in the one place an attacker controls.

Make the record append-only.

Sign-offs and score entries are never edited in place. Every change is a new row carrying the user and the timestamp, because the entire value of the system is being able to reconstruct what was true on a given day. A field that can be quietly overwritten is a field an auditor cannot rely on.

Build for a phone held on a casino floor.

Trainers use this standing at a table, one-handed, between rounds. The highest-frequency actions are starting a drill, stopping it, and marking attendance, so those are one tap each and reachable without scrolling. React with TypeScript was chosen partly so the component and data layer could move to React Native later without a rewrite.