HabitForge โ a project by Ahsan Mahmood
Habit tracking with visual strength scoring and offline-first sync.
You did the thing for weeks. Then a Tuesday went wrong.
One missed day, and the counter holding all of those weeks reads zero.
Nothing about the work you actually did has changed. The record of it has.
That is a modelling decision, and most habit trackers make the brutal version of it because a binary streak is the easiest thing to draw and the easiest number to put in a notification.
HabitForge runs client-side on the Firebase free tier, with FilesHub for uploads and no paid backend anywhere in it.
It also has to work with no signal at all, because the moment somebody records a habit is very rarely a moment they have a good connection, and a tracker that refuses at the kerb is a tracker people stop opening.
Those two constraints settle the data model before any screen exists.
Every habit carries a visible strength score, modelled as threads forming a rope and drawn with D3.
A missed day thins the rope. It does not cut it.
Streaks are tracked at several cadences, so a habit meant for a few days a week is measured that way instead of registering as a run of missed days against a daily target it never had.
Offline, data already loaded stays readable and new completions queue locally, syncing on reconnect through Firestore's persistent local cache.
A WXT browser extension adds check-ins from whatever tab you are in, along with a Focus Mode that blocks the sites you decided in advance were not for this part of the day.
The Capacitor build brings the same product to Android, with Play in-app updates, app shortcuts and badges. Cross-device sync means the phone and the browser hold one record between them rather than two versions of it.
The theme customiser covers all seven axes and belongs to the person using the product rather than to me, and the search and answer-engine depth is generated at build time rather than managed through a CMS.
So much for what it does. The rest of this page is what it cost.
A strength score is a model, and a model is an opinion with arithmetic attached to it.
Somebody will disagree with how quickly the rope thins. They will be right about their own habit and wrong about somebody else's, and no amount of tuning makes that disagreement go away.
A drawing is a promise about what the data means. Threads invite a reader to look for fibres that are not being counted, so the picture has to stay simple enough to stay honest.
Offline changes what honesty means on a screen.
Data already loaded is readable; data that never arrived is not, and the interface has to say which of the two it is showing rather than presenting an empty list as if it were a fact about your week.
Focus Mode blocks sites, which means it can block a site you turn out to need. So the control has to be easy to switch off, and easy to switch off is precisely what a blocker is not supposed to be.
The app records what you did. It does not know whether it helped.
No iOS build exists. There is no Apple Developer account behind this work, so the web and Android are where this actually exists.
The rope is the whole argument. A record that survives a bad week is the only kind anybody keeps for long enough to be worth looking at.
What it does, and what that costs to build
- Visual habit-strength scoring (D3 thread/rope viz)
- Multi-cadence tracking (daily/weekly/custom)
- Resilient progress (missed day weakens, not breaks)
- Offline-first via Firestore IndexedDB cache
- Focus Mode site blocker in browser extension
- Google Play in-app updates, app shortcuts, badges
- Full 7/7 Radix theme customizer + cross-device sync
Built with
- React 19
- TypeScript
- Vite 8
- TanStack Router
- TanStack Query
- Radix Themes
- Firebase
- CapacitorJS
- WXT
- D3.js
Worth knowing
- productivity
- habits
- self-improvement
- mobile
- offline-first
- extension
Who built HabitForge?
Ahsan Mahmood built it alone, and it is live at habitforge.aoneahsan.com. The strength model, the D3 visualisation, the offline sync path, the browser extension and the Android packaging are all the same person's work. That is also why the extension and the app agree about what a completion is.
What happens if I miss a day?
Your habit weakens rather than resetting to zero โ the strength score thins, and the record of the weeks behind it stays. Missing several days in a row weakens it further, so the model still registers that something changed. The design choice is deliberate: a counter that erases a month of work for one bad Tuesday is measuring the wrong thing.
Does HabitForge work on iPhone?
No. It runs on the web and ships an Android build, and there is no iOS version because there is no Apple Developer account behind this work. The web application works in Safari on an iPhone, which is as close as it gets.
Does HabitForge work without a connection?
Yes for the parts that matter. Data already loaded stays readable, and new completions queue locally and sync when the connection returns, through Firestore's persistent local cache. What it cannot do offline is show you something it never downloaded, and the interface says that rather than showing an empty list as though it were the truth.
What does the HabitForge browser extension add?
Check-ins from whatever tab you are already in, plus a Focus Mode that blocks distracting sites. It exists because the moment you remember a habit is usually a moment you are in a browser rather than holding your phone. It is a WXT extension built to the same no-remote-code rule as every other extension here.
https://aoneahsan.com/projects/com.aoneahsan.habitforge