DEV Community

Thedolceway
Thedolceway

Posted on

Building a Minimalist Habit Tracker — Why I Stopped Using Streaks and Forest

I have tried, without exaggeration, every popular habit tracker on the App Store. Streaks. Forest. Habitica. Fabulous. Productive. Way of Life. Done. I used each of them for between a week and three months. Then I stopped. Then I tried the next one. Then I built my own.

This is a post about why all of them eventually annoyed me, what I wanted instead, and the iOS app I ended up writing over about four evenings. It is called SimpleStreaks and it is about as boring as the name suggests, which is the entire point.

The pattern I kept hitting

Every habit app I tried started the same way. Clean. Promising. I would set up three habits — meditate, read, stretch — and feel vaguely virtuous about my new system. Then, reliably, one of these things would happen:

  • The app asked me to subscribe. Usually on day three, sometimes on day one, occasionally hidden inside the "advanced" features I actually wanted.
  • The gamification got in the way. A tree dies. A pet is sad. A little warrior loses XP. I am a grown adult and I do not need a guilt trip from a pixel owl because I skipped yoga on a Tuesday.
  • The UI got too clever. Charts inside charts. Swipe gestures for everything. Settings nested four screens deep.
  • The data model broke my brain. Some apps let you check a habit off multiple times per day. Some don't. Some treat skip and fail differently. Some have "rest days". By the time I understood the rules I had already lost the streak.

I do not think these are bad apps. Several of them are great. They are just not what I wanted, which is a thing that shows me seven circles, lets me tap each one once a day, and leaves me alone.

What I actually wanted

I wrote the requirements on a napkin before I opened Xcode. I still have the napkin. It says:

  1. Home screen shows all my habits at once.
  2. One tap marks a habit done for today.
  3. A streak counter next to each habit. That is the only number.
  4. No accounts. No cloud. No subscription. No ads.
  5. Can I open it, check three things, and close it in under five seconds? That is the only UX test.

Everything that did not serve those five lines got cut.

The build

SimpleStreaks is a SwiftUI app with a Core Data backend. That is almost the entire architecture. A habit is a row with a name, an emoji, a colour, and an ordered list of completion dates. The streak is computed, not stored — walk backwards from today until you hit a gap.

The bits that were harder than expected:

  • Reordering. SwiftUI's List reorder works, but persisting the order to Core Data in a way that survives undo, redo, and iCloud sync took longer than the rest of the app combined. I dropped iCloud sync for v1 because of this.
  • "Today" logic. What counts as "today" in a timezone-changing world? I went with device-local midnight. It is not perfect but it is predictable.
  • Haptics. The difference between a habit tracker that feels good and one that feels sterile is one line of UIImpactFeedbackGenerator. Do not skip haptics on the check tap. It is the entire reward loop.
  • Widget. I wanted the widget to be the app. You should be able to tap habits on your home screen without ever opening SimpleStreaks. AppIntents made this possible in an afternoon, which felt like cheating.

Total code: about 1,800 lines of Swift. No external dependencies. No analytics SDK. No SDK anything, actually.

The things I deliberately did not build

This list was longer than the feature list.

  • Streak recovery. Every app has this. Pay us and your broken streak comes back. No. If the streak broke, the streak broke. Start again on Monday. It is fine.
  • Social feeds. The worst thing you can do to a habit tracker is turn it into a feed. The moment I have to perform my habits for strangers, they stop being habits.
  • XP, levels, achievements. If the streak number itself is not enough reward, no amount of confetti will save the product.
  • AI coaching. Several people have asked me for this. I am not ruling it out but I am ruling it out for now. The app is small on purpose.
  • Categories, tags, folders. If you have so many habits that you need folders, the problem is not your habit tracker.

Cutting things is the actual work of a minimalist app. Writing code is easy. Saying no to features that sound reasonable is the hard part.

Who it is for

If you used Streaks and found it a bit over-engineered, you will probably like SimpleStreaks. If you used Forest for studying and wanted something that stuck around for non-study habits, same answer. If you loved Fabulous but fell off when the subscription kicked in, this is the free version of that itch.

If you are the kind of person who likes charts, analytics, mood journals, and deep customisation — this is honestly not your app. Use Productive. Use Way of Life. Those are good tools for that job.

Where to find it

I would love to hear what you think, especially if you bounce off it, because "why did this not stick" is more useful feedback than "nice work". The contact is on the landing page.

Lessons for the next small app

A few things I am taking into the next build:

  • Write the napkin first. Five lines. If a feature does not serve a line on the napkin, it does not go in.
  • Ship the ugly version. I spent a full evening on the settings screen. Nobody has used the settings screen. I should have shipped without one.
  • Haptics and animation are 80% of "feel". The actual logic of a habit tracker is trivial. The reason people keep opening it is how the check button feels under your thumb.
  • Minimalism is a promise, not an aesthetic. It is fine to have lots of colours and big emojis if the app still opens, does one thing, and closes. Minimal means "no wasted steps", not "black and white".

Top comments (0)