Inspiration

Before I wrote a line of code, I was a professional snowboarder. That life teaches you one thing above everything else: results don't come from the big days. They come from showing up on the ordinary ones — the cold mornings, the sessions nobody watches, the days you'd rather skip.

When I stopped competing, I noticed that discipline doesn't transfer by itself. On the mountain I had a coach, a schedule and a season to answer to. In everyday life I had none of that. So I built a small tool for myself: pick the things that matter, check them off once a day, don't break the chain. Then friends started asking for it — and a private tool became Streak.

What it does

Streak turns discipline into something you can see and don't want to lose.

Challenges, not just habits. Create your own — read, run, gym, stay sober, ship a side project — keep them private or make them public for others to join. One check-in a day builds the streak. Miss a day and it costs you; freezes cover the days life gets in the way, and a lost streak can be bought back within 48 hours. Proof, not taps. Activity challenges can be verified through Apple Health, Health Connect or Strava, so a 5 km run is a 5 km run. Sparks. Every kept day earns an in-app currency you spend on freezes and rewards. Community. Events on a map, a feed where people post the day they just kept, and story cards — several designs — that turn a kept day into something worth sharing. An honest mirror. A 90-day heatmap, a discipline score, and an AI coach that reads your real numbers instead of cheering blindly.

How we built it

One codebase in React Native + Expo (TypeScript, Expo Router, TanStack Query, Zustand), shipped to both stores with EAS and updated over the air.

The backend is Supabase: Postgres with row-level security on every table, Edge Functions, and scheduled jobs. The part we care most about — the streak — is server-authoritative: a check-in is a single database transaction that validates the day, writes the entry, advances the streak, spends or earns freezes and pays Sparks. The client never writes a streak itself.

Around that: RevenueCat for subscriptions, HealthKit / Health Connect / Strava webhooks for verified activity, Gemini for the coach and weekly insights, PostHog and Sentry for seeing what actually happens. The logic is covered by 1,488 unit tests plus a SQL test harness that runs the streak rules against a real database.

Challenges we ran into

"A day" is harder than it sounds. A streak is counted in the user's local calendar day, not in UTC. A check-in at 00:30 in Prague must not land on yesterday, and a weekday-only challenge must not break every weekend. Verification without becoming a fitness police. Rejecting implausible speeds, overlapping workouts and duplicates — while never punishing an honest user whose watch synced late. Silent failures. Our hourly streak job was answering "unauthorized" for weeks while the scheduler logged every run as a success. Nothing crashed; streaks just stopped being evaluated unless you opened the app. Finding it meant reading the data instead of trusting the dashboard — and it changed how we verify anything that runs unattended. Old app versions never die. A database change that is correct for today's build can lock out the build people installed two months ago. We learned that the hard way, once.

Accomplishments that we're proud of

Live on the App Store and Google Play, with 192 registered users — every one of them earned without paid acquisition. A streak engine we trust: one code path, in the database, tested against the edge cases that used to bite us. Check-ins you can believe, backed by real health data. A product that started as one athlete's private tool and is now used by people we have never met.

What we learned

The feature is not the streak; it's the cost of breaking it. Everything that works in Streak makes a missed day mean something. Put the rules where they cannot be bypassed. Moving streak logic from the client to the database removed a whole class of bugs. "It ran" is not "it worked". Measure outcomes, not job statuses. Ship small, read what happened, fix it the same day.

What's next for Streak - challenges and habits

Sleep as a verified habit — through Oura and health platforms, so rest counts like training does. Rewards from real partners — Sparks you earned by showing up, spent on things that exist outside the app. More reasons to share — new story-card designs and richer public challenges and events. Growing the community beyond Slovakia and Czechia — the product is already in English and Polish; the people come next.

Built With

Share this project:

Updates

Submission history