Every habit tracker I have ever used fails the same way. You build a streak. Forty-three days of meditation, or pushups, or not-checking-your-phone-first-thing. Then one ordinary bad day happens, you miss, and the app resets the number to zero. The figure that motivated you yesterday is now a small accusation. Most people, me included, quietly stop opening the app a week later.
So I finally built the one I actually wanted. It is called Vana — vana is Swedish for 'habit' — and it is an iOS app. The entire pitch fits on one line, and it is the line I kept coming back to whenever a design decision got hard: a missed day is a dip, not a defeat.
The number that mocks you
A streak is a binary dressed up as progress. You are either on it or you are not. There is no state for 'mostly consistent for two months with one rough week', which is what every real habit actually looks like. The counter cannot represent the truth, so it lies in the most demoralising direction available: it throws the two months away to punish the one week.
Vana replaces that with a continuous habit-strength score. It rises a little each time you show up and eases off gently when life gets in the way. It never slams to zero. Miss a day and your strength barely dips. The very next time you complete the habit, you are visibly back on track instead of starting a sad new climb from one.
Consistency is a slope, not a switch. Once I actually believed that, the streak counter had to go.
Forgiving is harder to build than punishing
Here is the thing nobody warns you about. A streak is trivial to implement. Count consecutive completed days, reset to zero on any gap, ship it before lunch. It is cheap precisely because it refuses to think about nuance.
A strength model has to answer all the questions the counter dodges. How much should one miss actually cost? Does missing a weekday habit on Sunday count at all? For a habit you only do three times a week, what even is a 'missed' day? How fast should strength decay when you disappear for a week, and how fast should it recover when you come back? There are ten real design decisions hiding inside 'be forgiving', and a streak has exactly zero.
The hardest part was drawing the curve so it feels fair rather than exploitable. Too generous and the score becomes meaningless, a participation trophy that never moves. Too stingy and you have just rebuilt the streak with extra steps. Most of the work on Vana was not screens or animations. It was tuning that one curve until a missed day felt survivable and a good week still felt earned.
No red. Anywhere.
I gave myself one hard visual rule and never broke it: nothing in the app is red. A missed day is not an alarm. Rest is not an error. The whole point is that taking care of yourself should never render as failure, so the moments other apps paint in alarm-red, Vana paints in calm blue or simply lets dip.
That rule forced a feature I now think is the best part of the app. Skip and Freeze. You can mark a day as a deliberate pause, and freezing bridges your progress across it instead of breaking it. A planned rest day is a decision, not a lapse, and the app finally treats it that way.
- A missed day dips your strength; it never zeroes it.
- Skip and Freeze let you rest on purpose without breaking anything.
- Rest days are blue. Nothing in the app is red.
- A logged day is sacrosanct — the app never silently undoes it behind your back.
Pay once. No account. Your data stays yours.
I did not want to run a habits subscription. A subscription habit tracker has a slightly perverse incentive: it is quietly better for the business if you stay a little anxious and a little dependent. So Vana is a single one-time purchase. No auto-renew, nothing to cancel, and a free tier that is genuinely useful on its own rather than a trial in disguise.
It also collects nothing. No account, no sign-up, no analytics SDK, no ads. Your habits live on your device and only sync through your own private iCloud if you turn it on. Apple Health, if you link it, is read-only and never leaves the phone. This is the same stance I have taken on everything I ship, and it matters more here than anywhere: a habit tracker sees your most honest data, so the right amount of it for me to hold is none.
I do not want a relationship with your calendar and your wallet. I want to sell you a good tool once and then get out of the way.
Built solo, the usual way
Vana is Swift 6 and UIKit, with SwiftData for storage, CloudKit for the optional sync, and StoreKit for the one purchase. Solo build, schema to App Store, agents doing the typing and me doing the judgment — the same split I have written about before. The actual App Store submission ran through the agent-native asc workflow I described a few weeks ago, which is the only reason shipping it on a weekend did not ruin the weekend.
It is the third thing I have live now, after Jobado and Lovio, and the most opinionated small product I have shipped. There is a fuller tour — the strength model, Skip and Freeze, the privacy details, the pricing — over at /apps/vana if you want it.
It started as a fix for one demoralising number in my own life. It turned into a whole little philosophy with an app wrapped around it. A missed day is a dip, not a defeat — I just needed something on my phone that actually believed that.