Skip to content
Sri
All work

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

The Compare tab in dark mode: a line graph of a prototype's cycle time across its test entries

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

The home page listing the season's prototypes with their latest test results
Every prototype and its latest test.
The log-a-test form on a phone, with fields for the test's metrics and a photo or video button
Logging a test from a phone.
A prototype's page showing what it measures and its logged tests
A prototype and what it measures.