610 Design App (WIP)
A phone-first web app for logging robot prototype tests with photos and video, then comparing iterations. Drafts save offline and roles are enforced on the server.
Sole developer · 2026

Overview
A tool for Team 610's design process. Each test of a prototype is logged with its metrics, notes, and media, and later iterations can be compared against earlier ones.
It's built as a phone-first PWA, since tests happen next to the robot, with Google sign-in and a People panel where the owner assigns roles.
Problem
Test results lived in a spreadsheet, with photos and video in a separate Drive folder, so linking a result to its footage meant renaming files by hand. Here every entry, metric, note, and file is linked automatically and media is named for you.
What I did
Everything in the repository: the app, the data layer, the permission model, the tests, and the user guide.
Built with
- TypeScript
- Next.js
- React
- Tailwind CSS
- Couchbase
- Auth.js
- Zod
- S3 / R2
- Vitest
- Playwright
Architecture
Next.js App Router. Routes stay thin and call a per-feature service layer; the only code that talks to Couchbase is the repository layer, which uses parameterized SQL++ and key-value access. Every query is checked against the index file by a script that runs EXPLAIN.
Roles run viewer, logger, editor, admin, owner. The role in the session is only a hint: server code re-reads the user on each request, so deactivation and role changes apply immediately. Individual metric fields can carry their own edit lock that overrides the role default.
Media bytes go from the browser to S3-compatible storage; Couchbase stores only metadata. Reads use short-lived signed URLs and the bucket is never public.
The challenges
Old data that still renders
Editing a metric inserts a new version instead of changing the old one, and each entry stores a snapshot of the definitions it was logged against. Past seasons render without joins and never change under you.
Two people saving at once
Concurrent edits use compare-and-swap, and a new metric version is claimed with an atomic slot insert, so two simultaneous saves can't fork a metric's history.
Logging with a bad connection
Drafts are kept on the device and restored on return. Entry ids are generated on the client, which makes a retried create harmless.
Screenshots


