Skip to main content
Back to projects

Afterlight

Recover a concert history without surrendering it

2025 — Present
Solo Designer & Developer
Live site
React NativeExpoTypeScriptAsyncStorage

Ownership

Solo Designer & Developer

Team

Solo / small team

Primary proof

Web + iOS + Android

Afterlight

Overview

Afterlight is a local-first concert diary with a Recovery Desk for the history people already have. It turns ticket files, incoming shares, calendars, photos, Gmail receipts, Setlist.fm attendance, and listening history into reviewable clues on-device. A clue never becomes a claimed night until the person confirms it.

The Challenge

Concert memories are distributed across camera rolls, ticket receipts, calendar events, Wallet passes, files, setlists, and half-remembered nights. Those sources have very different confidence: a Spotify play is a hint, while a ticket and dated venue photo together are stronger evidence. The product problem was not merely importing data; it was reconciling ambiguous evidence without letting software invent attendance.

Constraints

  • The canonical diary and recovery queue must work on-device; optional connected services cannot become the source of truth.
  • Low-confidence evidence can suggest a night but can never auto-confirm attendance.
  • Calendar, photo, and email access must be permission-gated, purpose-limited, and reduced to concert fields rather than retained source content.
  • Solo build — every feature competes with finishing.

Decision Log

Problem

Each import source originally behaved like its own workflow, and some hints could move too close to diary creation.

Decision

Put every source behind one versioned candidate model with provenance, confidence, deduplication, dismissal, editing, and explicit confirmation.

Tradeoff

Every integration has to translate into the shared evidence vocabulary instead of taking a shortcut to the diary.

Impact

The app can add new recovery sources without weakening the trust boundary: evidence proposes, the person decides.

Problem

Music apps default to streaming-service aesthetics — gradients, glass, glow.

Decision

Authored a design system from gig poster modernism instead: Factory Records palette, Swiss type discipline, grain, true black.

Tradeoff

A strong aesthetic position will alienate some users.

Impact

The app feels like the objects it's about — posters, tickets, the printed ephemera of going out.

Problem

Spring animation invites spectacle.

Decision

Built a small motion grammar — a handful of springs used consistently, nothing animating from scale(0), nothing over 300ms.

Tradeoff

Restraint reads as less impressive in a screen recording.

Impact

Motion clarifies state instead of performing for the user.

Approach

1. One desk for scattered evidence

Shares, uploads, calendar scans, photo clusters, Gmail receipts, Setlist.fm attendance, and Spotify hints all land in the same Recovery Desk. Provenance survives merging, so a candidate can explain why it exists.

2. Confirmation is the write boundary

Recovery candidates remain separate from confirmed concerts. People can review, correct, dismiss, or complete them; only completion calls the existing local concert-creation path.

3. Native reach, local core

iOS and Android share targets, calendar and photo access, and native Gmail OAuth reach evidence where it already lives. The canonical diary and candidate queue stay on-device, while optional network lookups enrich rather than own the record.

4. Gig poster modernism

The interface borrows from the printed history of live music — FAC blue, true black, grain textures, and Swiss type discipline — with a restrained motion grammar used to clarify state.

Outcome

A shared recovery system now spans web and native entry points, with a signed iOS share extension, Android share configuration, explicit privacy disclosures, and regression coverage around evidence parsing and confirmation. The web Recovery Desk is deployed while the next native release remains in development.

Proof points

Web + iOS + Android

Platforms

User-confirmed only

Diary writes

On-device

Canonical data

Learnings

  • Import is a trust problem before it is a parsing problem; provenance and confirmation belong in the data model.
  • Local-first does not mean banning the network. It means connected services can enrich the product without owning its canonical record.
  • Native extensions fail in platform-specific ways, so simulator compilation is not enough; the share handoff itself needs end-to-end exercise.

Anti-Patterns Avoided

  • ×Treating listening history, a photo cluster, or a ticket receipt as proof of attendance.
  • ×Retaining Gmail message bodies or calendar content after extracting candidate fields.
  • ×Making a hosted database the canonical source for a private concert diary.

Next Iterations

  • Complete Google restricted-scope verification before broad Gmail recovery access.
  • Ship the updated native targets after same-build physical-device verification.
  • Expand the versioned archive into a plain, durable export and restore workflow.

Get In Touch

If you want to talk about similar work, email me.

Contact is the simplest place to start.

Next project

Ch'lita