HabitForge
com.aoneahsan.habitforge
HabitForge is a behaviour-design habit-tracking workspace with visual habit-strength scoring, multi-cadence consistency tracking, and offline-first sync โ shipped across web/PWA and Capacitor Android on a strict free-tier Firebase architecture.
At a glance
- Category
- mobile-app
- Status
- Live
- Started
- Jan 2025
- Last updated
- 4 days ago
Identifier
com.aoneahsan.habitforgePreview
Take a look before you go
The still below is painted first, then the running site loads behind it โ so the dialog is never an empty rectangle waiting on a network round trip. Where a site allows framing the live app takes over; where it refuses, the still stays and says so. Nothing is requested until you press.
About
What this actually is
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.
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.
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.
Worth knowing
- Visual habit-strength model is the differentiator โ most trackers stop at streak counters; HabitForge models strength as a rope of threads that erodes gradually.
- Offline-first via Firestore IndexedDB cache โ completions logged offline are never lost; they queue and sync on reconnect.
- Two production surfaces from one service layer โ web/PWA + Capacitor Android share core services.
- Strict zero-cost discipline โ Firebase Functions and Firebase Storage are explicitly banned in project rules; uploads go to FilesHub, local storage uses `@capacitor/preferences`.
- React Compiler enabled โ `babel-plugin-react-compiler` is wired into the Vite build for automatic memoization.
- AEO/SEO depth without a CMS โ semantic prerendered HTML so non-JS AI crawlers (GPTBot, ClaudeBot, PerplexityBot) see the same content as users, plus machine-readable `llms.txt` / `pricing.md` / IndexNow.
- Accessibility discipline โ one `<h1>` per page, `aria-label` on every icon-only control, global `prefers-reduced-motion` guard.
- Custom build pipeline โ `tsc -b` โ `vite build` โ a hand-written `postbuild-seo.ts` that injects per-route static HTML and crawler bodies.
Built with
- React 19
- TypeScript
- Vite 8
- TanStack Router
- TanStack Query
- Radix Themes
- Firebase
- CapacitorJS
- D3.js
Key features
What it does, and what that costs to build
Each of these is a capability the stack genuinely provides. None of them is an outcome nobody measured โ there is no "cut onboarding by 40%" on this page, because no one measured onboarding.
- 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
- Google Play in-app updates, app shortcuts, badges
- Full 7/7 Radix theme customizer + cross-device sync
Screenshots
5 slots, 2 of them filled in
These are designed frames, not pictures. Each one records what belongs in the slot and at what width; the capture itself is taken from the running app. Drawing a fake screenshot here would put an image on the site that no build has ever produced.
Timeline
Still being worked on
Jan 2025
Work started
The earliest month on record for HabitForge.
Oct 2026
Last change
Status is completed โ 4 days ago. Ongoing, so this row moves whenever something lands.
Questions
Common questions
The questions that actually arrive, answered in the first sentence.
- 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 and the Android packaging are all the same person's work.
- 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.
- How does HabitForge measure a habit?
- With a strength score rather than a streak. Every habit is drawn as threads forming a rope, in D3, and a missed day thins the rope instead of cutting it. Streaks are counted at the cadence the habit was set for, daily, weekly or custom, so a habit meant for three days a week is not marked as missing the other four. The record of the weeks behind it stays.
- Is HabitForge on Android?
- Yes. 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.
Keep looking
More mobile work
- SM
SMS Mobile App
com.aoneahsan.smsapp
Android-first SMS automation that dispatches campaigns through the phone itself.
- PR
PregnancyPal
com.aoneahsan.pregnancypal
Week-by-week maternal wellness, nutrition, vitals and prenatal exercise.
- CA
CallVault
com.aoneahsan.callvault
Offline-first Android app that records your own calls and backs them up to storage and a database you control.