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
- Hex ID auth — one-click signup, no email, deterministic avatar
- Challenges — 7 to 100 days, public or private, join or watch mode
- Daily tasks — daily/weekdays/custom recurrence, check off individually
- Heatmaps — 5-month GitHub-style visualization with red blinks and green sparkles
- Streaks — per-task streak counter, consistency percentage
- Invite codes — 8-character hex, shareable link, auto-join (public) or request (private)
- Wall — one post per user per day per challenge, visible to all members
- Game of Life — seeded per-user canvas background, task completion injects patterns
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:
- Join: Everyone tracks the same tasks individually. You see each other's heatmaps and streaks. Mutual accountability.
- Watch: Only the owner checks off tasks. Everyone else observes. Good for "watch me do X for 30 days" type challenges.
Simple binary. Covers most use cases without complexity.
What I Deliberately Left Out
- No notifications. If you forget, you forget. The red blink on your heatmap is reminder enough.
- No gamification. No XP, no levels, no badges beyond the streak flame. The heatmap IS the reward.
- No social feed. The wall is per-challenge, one post per day. Not a timeline.
- No password recovery. Trade-off documented in the auth post. Low stakes, minimal friction.
- No realtime sync. Data refreshes on page load. I've got the Supabase realtime tables configured but not wired up yet. Coming when it matters.
- No mobile app. It's a PWA-friendly responsive web app. Works fine on phone browsers.
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.