-
-
App Icon
-
Your desk cat and your rhythm: 30 min sitting, 8 standing. Standing up pays +10 coins, ignoring the prompt costs 10.
-
The prompt fires and the sensors watch: 60 cm detected, height confirming. No desk? Manual confirm pays the same.
-
Verified, not claimed. The +10 lands only when the standing phase completes — sit down early and it pays nothing.
-
123 standing phases, and a coin ledger saying how each was earned: stood up verified +10, prompt ignored -10.
-
Coins dress the cat. Level rewards like the crown stay earned-only — the shop sells new items, never your prestige.
-
Every desk travels a different distance, so the app measures yours once and scales its thresholds to it.
Inspiration
I own a standing desk. I almost never raise it.
It sits in the sitting position all day, an expensive piece of furniture doing the job of a cheap one. Reminder apps didn't fix that — they nag, you dismiss, nothing changes. Knowing I should stand has never once made me stand.
So I stopped building a reminder and built a reason. Something has to be at stake, and something has to be waiting on the other side.
What it does
StandProof runs your work rhythm: 30 minutes sitting, 8 standing. When the sit phase ends, it asks you to stand — with a real alarm that cuts through Focus, so it isn't a notification you swipe away without reading.
Standing up pays +10 coins. Ignoring the prompt costs 10. Coins go to one place: the cat that lives on your home screen, who wants a scarf, some headphones and a plant for the desk. Nothing is staked to start a session, so coins never stand between you and a prompt to move — they only make it matter whether you answer it.
The phone can also tell whether the desk really went up: put it on the desk and the barometer catches the ~60 cm rise while the motion sensors confirm the phone was lying still rather than in your hand. That's a nice touch, not the point. The point is that you stood up.
How I built it
Flutter, iOS 26+ for AlarmKit. Monetization is RevenueCat end to end: a virtual currency holds the authoritative coin balance, coin packs sell through a dashboard paywall, and the device's balance is a cache plus an outbox syncing through my own server.
Challenges
- Making the alarm unignorable. A local notification is too easy to dismiss, so the end of each phase is an AlarmKit alarm — which set the floor at iOS 26.
- 0.06 hPa. That's what half a metre of desk travel does to air pressure, a few times a barometer's noise floor. Median filter, plus the altitude has to hold for seconds. Desks vary, so the app measures yours on first run.
- Coins that survive a reinstall. A virtual currency balance is non-transferable, so keeping it meant real accounts, a server, and in-app deletion.
What I learned
The design shrank the whole way. I cut a subscription, a streak, a streak shield, a session stake, a daily gift and two bonus tiers — every one of them a number the user would have to think about. What's left is one line: stand up, earn coins, dress the cat.
Also: the sensor work was the fun part and the motivation loop was the important part, and those are not the same part.
What's next
Cash pricing on every cosmetic — earn it, or buy it outright.
Built With
- alarmkit
- coremotion
- dart
- docker
- express.js
- flutter
- ios
- lottie
- node.js
- postgresql
- revenuecat
- riverpod
- sign-in-with-apple
- swift
Log in or sign up for Devpost to join the conversation.