All projects Work

Headington Portal

Replaced a spreadsheet with a system, and cut check-in time by 67%.

At a glance

Role
Solo engineer, end to end
Timeline
Jun 2023 to Jan 2026
Status
Shipped and used in production
Stack
  • React
  • Redux Toolkit
  • Node.js
  • Express
  • MongoDB
  • Render
faster check-in (60s to 20s)
67%
returning visitor check-in
<10s
peak batch checkout
<7s
Headington Portal dashboard showing current check-ins and visitor search

Staff dashboard. Current check-ins, fast visitor lookup, and batch checkout in one view.

Overview

A full-stack visitor management platform for university housing, replacing paper forms and scattered spreadsheets.

This one ran in production with real staff depending on it. Nothing teaches you about edge cases like a front-desk clerk using your software at 2am during move-in weekend.

The problem

Guest registration ran on paper forms and disconnected spreadsheets. A question as basic as "who is currently checked in?" meant digging through several systems, and peak traffic turned that into a queue at the desk.

What I built

  • REST APIs with role-based access control separating staff and clerk permissions.
  • React and Redux Toolkit front end that eliminated redundant data entry between check-in steps.
  • Data models with optimized search paths so returning visitors resolve from a single lookup.
  • Production deployment and operations on Render. I owned it from schema to uptime.

Notes

Things that surprised me, or that I got wrong first.

Optimizing for the returning visitor

Most guests are not new. Indexing and pre-resolving returning visitors is what turned a 60-second form into a sub-10-second confirmation, which is where nearly all the real-world time savings came from.

Batch operations for peak load

Checkouts cluster, because everyone leaves at once. A batch checkout path handles the whole group in under 7 seconds rather than forcing the clerk through one record at a time.

Say hi

If you want to talk about Headington Portal, or anything on this page, I'd love to hear from you. Email me or use the contact page.