Admit OneIndependent Product

Independent Product

Admit One

A concert-history dashboard backed by a real database, heatmaps, tour maps, and a memory wall.

Type
Independent product
Role
Design + full-stack build
Platform
Web PWA
Data source
Postgres (Supabase)
Admit One

A concert history, backed by a real database

Every concert I've been to lives as a row in a Postgres database, artist, venue, date, who I went with. Admit One turns that history into a personal, Spotify-Wrapped-style retrospective: total shows, a shows-per-year chart, home-turf venue rankings, a genre leaderboard, a "dive bar → stadium" venue-size breakdown, a GitHub-style monthly heatmap, streaks, a setlist deep-dive, a photo memory wall, and an interactive tour map with a "relive the tour" route replay. I designed and built the whole thing, backend included.

01Outgrowing the spreadsheet

Admit One started with a Google Sheet as its database, read live via the Google Visualization API to avoid running a server. That worked until the dataset and the feature list both outgrew it: no real schema, no real auth beyond a shared passphrase, and no good way to enforce data integrity as more shows, venues, and photos piled in. The Sheet has since been retired for Postgres on Supabase, with Vercel serverless functions as the API layer in front of it, and real sign-in (Google OAuth or a magic link) replacing the old passphrase-protected write flow.

The spreadsheet retired for Postgres, with a real API in between

02Retrospective, not a ticket tracker

The point isn't logging tickets, it's looking back. Shows-per-year and monthly-heatmap views surface patterns I'd never have noticed manually (which months I actually go out, which years were dry spells), and the venue-size breakdown turns "dive bar to stadium" into an actual chart instead of a vague memory.

A GitHub-style heatmap of every show attended

03Enrichment stays external

Setlist.fm, Last.fm genre data, Deezer artist photos, and Google Photos album previews all get pulled in through the same Vercel serverless functions that handle reads and writes against Postgres, one lightweight API layer doing double duty instead of standing up separate services for each source.

Four external sources, one API layer

04An update flow that respects the session

The service worker deliberately never force-activates a new version, instead of silently reloading mid-scroll, it surfaces an "Encore Available" prompt so I choose when to update, avoiding lost state in the middle of browsing my own concert history.

"Encore Available" instead of a silent reload

05Built for real use
Vanilla JSSupabase PostgresVercel Serverless FunctionsService Worker / PWA

No framework, no build step on the frontend, plain HTML/CSS/JS shipped as an installable PWA with a hand-written service worker, backed by Vercel serverless functions talking to Supabase Postgres. It's deployed on Vercel with a small CI workflow that bumps the service-worker cache hash on every push, and it's under active, ongoing development.