back to home

Spaces

Booking platform at UBC Medicine. Sole engineer, empty repo to production in six months.

Sole application engineer · UBC Faculty of Medicine · Feb 2026 – present

Next.jsTypeScriptPrismaMySQLAWS ECSLambdaKeycloak
6 mo
empty repo to production
1
engineer
4
sites across BC
3
systems replaced
48
test suites

♦ the problem

For twenty years, UBC Medicine booked teaching rooms, clinics, and equipment on a hotel-reservation product plus two in-house apps built to cover the gaps. The vendor was acquired, support ended, and the coordinating team was stuck paying for software nobody maintained.

Nothing off-the-shelf fit a faculty spread across Vancouver, Victoria, Prince George, and Kelowna - the approval chains and contested teaching spaces are too specific. A real rebuild had always been priced as a multi-engineer, multi-year project. My manager asked me to prototype it instead. The prototype became the product.

♦ the hard parts

Correctness under concurrency

Conflict detection across rooms, setup/cleanup buffers, maintenance blocks, and rooms that physically cannot be occupied together - including pooled Zoom licences and equipment. Writes use optimistic concurrency so batch approvals degrade instead of deadlocking.

A recurrence engine, written from scratch

I didn't use RRULE. Faculty scheduling needed nth-weekday rules, per-occurrence overrides, and partial series cancellation. All of it is pinned to America/Vancouver, including BC's shift to permanent UTC-7, and the tests run in that timezone.

Approvals as a state machine

Configurable approval chains, snapshotted at submission so editing a chain cannot corrupt requests already in flight. Nine-state lifecycle, plus booking rounds for contested teaching spaces.

Accessible on the hard surfaces

Keyboard and screen-reader support on a multi-step wizard and a drag-to-create calendar - the parts that are usually mouse-only - plus QR availability pages that work in a hallway on a phone.

Email that actually arrives

Transactional outbox: the email commits with the booking, then SQS to Lambda/SES, with retries, bounce handling, and admin replay.

♦ six months, one engineer

The timeline only works because I treat AI-assisted development as a practice: rules and conventions in the repo, then mechanical guardrails - typecheck, lint, 48 test suites on conflicts and timezones, container scanning in CI, and a pass through UBC's security review. Iteration speed is the point - feedback on Tuesday, in front of the team the next week.

♦ outcome

Spaces is in production at UBC Medicine, live with 400+ staff and students in its first department and rolling out Faculty-wide across BC in 2027. It replaces the twenty-year-old vendor system and the two in-house apps. Coordinators get workflows that match how they actually work; people booking a room no longer need the workarounds. The Faculty has offered me a continuing part-time role to carry it forward.