- Type
- Products
- When
- 2026 · shipped
- Role
- Sole designer and developer.
- Scale
- No account, no backend, no build step. The whole app loads before a framework would have finished booting.
In plain language
Bud is a habit tracker that borrows the parts games already solved: visible progress, a reward that lands immediately, and a cost for slipping that does not wipe out your history. There is no account and no sign-up: it opens instantly and your streak lives in your own browser. It exists because the honest problem with habit trackers is not that they lack features, it is that opening them is itself a habit most people fail at.
The question
Why do people abandon habit trackers in the second week, and can the tracker's own design be the fix rather than the cause?
Rough sketch
Where things sit on the screen, and in what reading order. Drawn, not screenshotted, so it stays true when the styling moves on.
A fresh day
Streak building
After a miss
The problem with habit trackers
They are a to-do list with a streak counter bolted on. Honest about what you did, silent about why you would come back tomorrow. The tracker itself becomes the habit you fail at.
The idea
Borrow the loop games already solved: a reward you can see immediately, a longer arc you can measure progress against, and a cost to breaking the chain that registers without punishing. The point is that the feedback arrives before the habit has paid off in real life, which is the gap where most habits die.
Decisions
No framework. Plain JavaScript, no build step. A habit tracker that takes four seconds to open is a habit tracker you stop opening, and the whole app is smaller than a typical framework runtime.
Local-first state. Your streak lives in your browser. No account, no sign-up wall between you and the first use.
Forgiveness over punishment. Breaking a streak costs progress but does not reset it to zero. A tracker that erases three weeks of work for one missed day teaches you to stop opening the tracker.
Honest status
Shipped and live. The engineering is deliberately unremarkable; the design work is in the reward loop.
How it is put together
Left to right, the path a request or a record takes through the system.
01
Open
- Static HTML and JS
- No build step
- No auth wall
The number that matters is time-to-first-interaction.
02
State
- Habits and streaks in browser storage
- No account, no sync, no server copy
Yours, on your device.
03
Loop
- Immediate reward on completion
- Long-arc progress
- Forgiving decay on a miss
Where the actual design work is.
04
Surface
- Today's list
- Streak and progress state
- History
What happens, step by step
In plain language, in the order it happens.
Open it
No login, no splash, no loading state worth naming. The app is small enough that it is simply there.
Mark something done
The reward fires at the moment of completion, not at the end of the week, and not once the habit has paid off in real life. That gap is where most habits die.
Watch the long arc
A second, slower progression runs underneath the daily one, so a good week is visible as something other than a bigger number.
Miss a day
Progress decays. It does not reset. Losing three weeks of work for one missed Tuesday teaches you to stop opening the tracker, which is the opposite of the goal.
Decisions, and what they cost
Every choice worth recording has a road not taken. Both are here.
No framework, no build step
instead ofReact or Svelte with a bundler
A tracker that takes four seconds to open is a tracker you stop opening. The entire application is smaller than a typical framework runtime, and the cost of that choice, hand-written DOM updates, is one I actually pay, in a codebase this size, willingly.
Local-first state
instead ofAccounts and a hosted database
A sign-up wall in front of a habit tracker asks for commitment before the product has earned any. The trade is real: no cross-device sync, and clearing site data clears your streak. For this product that is the right side of the trade.
Decay instead of reset
instead ofThe standard streak counter that zeroes
A zeroing streak is a punishment mechanic aimed at exactly the moment someone is most likely to quit. Decay keeps the sunk cost intact, which is the thing actually bringing them back.
Reward before the payoff
instead ofReporting real-world outcomes
Real habits pay off in months. Feedback that arrives on that schedule cannot maintain a behaviour. The game layer exists to bridge exactly that lag, and pretending otherwise would make it decoration.
What came out of it
- Shipped and live, with no account required to use it.
- Opens instantly on a cold cache, the design constraint that drove every other choice.
- The engineering is deliberately unremarkable. The design work is all in the reward loop.
Still open
- No sync across devices, by design, but that is the most common thing anyone asks for.
- The forgiveness curve is tuned by feel rather than by data. It would be better with real retention numbers behind it.
Built with
- JavaScript
- Local-first state
- Vercel