Shipping StreakSync

May 27, 2026 · blog

It's live at streak-sync-dusky.vercel.app. The challenge tracking app I've been writing about all week — I'm calling it StreakSync. Deployed on Vercel, backed by Supabase, and my friends are already using it for a 30-day reading challenge.


What Shipped


The Invite Flow

Public challenges: paste the invite code, you're in immediately.

Private challenges: paste the code, your request goes to the challenge owner. They see it in the "People" tab and approve or deny. You see "Request sent. Waiting for approval."

The invite code is generated on challenge creation — 8 random hex characters from gen_random_bytes(4) in Postgres. Short enough to paste in a message, unique enough to not collide.


Join vs Watch

Two modes when creating a challenge:

Simple binary. Covers most use cases without complexity.


What I Deliberately Left Out


Tech Stack

Layer Choice
Framework Next.js 16 (App Router)
UI React 19 + Tailwind + shadcn/ui
Backend Supabase (Postgres + Auth + RLS)
Hosting Vercel
Auth Hex ID + password (no email)
Avatars DiceBear Identicon

Total dependencies: minimal. No state management library (React Context + hooks). No CSS framework beyond Tailwind. No analytics. No error tracking. Ship first, instrument later.


Built in a Week

This whole thing — auth, database schema, migrations, UI, Game of Life, heatmaps, invite system, wall — shipped in about a week of focused work with Codex handling the boilerplate. The RLS policies took longer to get right than the actual UI.

It's not a startup. It's a tool for me and my friends to keep each other honest during challenges. And that's exactly what it does.


← back to blog