Work · Products · 10

Bud

Habit tracking that borrows from games instead of from spreadsheets.

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

One screen, three states: the app never navigates, it just responds. A fresh day, a streak building, and the day after a miss: decayed but not reset to zero.

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.

  1. 01

    Open

    • Static HTML and JS
    • No build step
    • No auth wall

    The number that matters is time-to-first-interaction.

  2. 02

    State

    • Habits and streaks in browser storage
    • No account, no sync, no server copy

    Yours, on your device.

  3. 03

    Loop

    • Immediate reward on completion
    • Long-arc progress
    • Forgiving decay on a miss

    Where the actual design work is.

  4. 04

    Surface

    • Today's list
    • Streak and progress state
    • History
Local-first by construction. There is no server in this diagram because there is no server in the product: the browser holds the state and the reward loop reads from it directly.

What happens, step by step

In plain language, in the order it happens.

  1. Open it

    No login, no splash, no loading state worth naming. The app is small enough that it is simply there.

  2. 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.

  3. 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.

  4. 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