◆  A. Lech Schiedam  51.92°N 4.39°E

Smoke Free

A quit-smoking tracker that works with the aeroplane mode on. No account, no ads, nothing to buy, and no way for it to talk to me about you.

Everything else wanted my money

I tried to quit smoking, and did what everyone does: went looking for an app to count the days. Every one I found either cost money up front or handed me the counter for free and then sold the useful parts back to me one micropayment at a time — the timeline, the milestones, the thing that tells you why day three feels like that.

Charging someone for help quitting a substance that is actively killing them is a business model I want no part of. So I wrote the version I wanted: free, complete, no account, no upsell, no ads. It exists because the alternative made me angry, which turns out to be a decent reason to build something.

A promise you don’t have to take my word for

Every app claims it respects your privacy. This one removes the ability to break the promise: android.blockedPermissions strips INTERNET out of the manifest, so the installed app physically cannot open a network socket. Not "doesn't", not "we don't sell your data" — cannot. Anyone suspicious enough can pull the APK apart and verify it in about a minute, which is the point. A privacy claim you can check beats a privacy policy you have to trust.

The other decision I’m glad about is refusing to make things up. Every physiological claim in the recovery timeline resolves to a real source. Two milestones that appear in nearly every quit-smoking timeline online — nerve endings regrowing at 48 hours, lung capacity jumping at 72 — are deliberately absent, because I couldn’t trace either one to a primary source. And when someone slips, the app doesn’t invent a number of "days of healing lost". Markers driven by a single exposure restart; markers driven by years of cumulative exposure don’t. Where the honest answer is "nobody knows", it says nothing rather than something comforting and false.

The domain layer is pure functions with the clock passed in as an argument, which is why 102 tests can run in Node with no emulator anywhere in sight.

Expo SDK 57 expo-router TypeScript SQLite Vitest 102 tests

←  All work