Streaks: The Habit Tracker That Treats Calendars Like a System, Not a Scoreboard
A Flutter app built around schedule-aware streak logic, local-first storage, and a design language that feels more deliberate than most first-time projects.

Streaks is a simple command-line tool to help you track your daily streaks.
- Streaks is most interesting when it stops treating streaks as a daily binary and starts treating them as schedule-aware rules.
- The app’s local-first architecture is not decorative. It makes the habit logic fast, private, and trustworthy on device.
- Its streak engine protects motivation for non-daily habits by checking the next valid scheduled day instead of punishing missed unscheduled days.
- The UI and theme read like a deliberate product system, which makes the project feel more finished than a typical first app.
A streak should not break because the calendar got in the way
Most habit trackers are really daily checkbox machines. If you miss today, the streak cracks, even when the habit was never meant to happen today. That rule is simple, but it is also wrong for Monday workouts, three-times-a-week reading, or any routine that follows a schedule instead of a calendar fetish.
Streaks is interesting because it changes the unit of measurement. It does not ask only whether you acted yesterday. It asks whether you stayed within the rules of the habit you defined, which is a much better test of consistency.
The trick: a streak that understands schedule, not just time
The heart of the app lives in habit_provider.dart. Research on the codebase shows three streak paths: daily, specific days, and times per week. That is the key design choice, because each mode needs a different definition of continuity.
int calculateCurrentStreak(Habit habit, List<CompletionRecord> records) {
switch (habit.frequencyType) {
case FrequencyType.daily:
return _calculateDailyCurrentStreak(habit, records);
case FrequencyType.specificDays:
return _calculateSpecificDaysCurrentStreak(habit, records);
case FrequencyType.timesPerWeek:
return _calculateTimesPerWeekCurrentStreak(habit, records);
}
}
The daily version is straightforward. The specific-days version is the subtle one. Instead of punishing a Tuesday for a Monday-only habit, it checks whether the previous valid scheduled day was completed. That means the streak follows the habit’s own calendar, not the generic one on your phone.
The times-per-week mode changes the question again. It is not about an uninterrupted chain of dates. It is about whether completions accumulate inside the right weekly window, which is a better match for real-world routines that flex across the week.
Why local-first makes this feel calm instead of complicated
The architecture supports the promise. The app uses Hive for persistence, SharedPreferences for lightweight settings, Provider for state, and local notifications for reminders. That combination is plain, but it is also disciplined: the data stays on device, and the core interaction does not depend on a backend.
That matters because streak logic is only trustworthy when it is predictable. If the app is offline-first and the rules are all local, then every streak decision is explainable by the code the user is actually running.
| Dimension | Streaks | Typical cloud habit app |
|---|---|---|
| Data storage | On-device via Hive and settings storage | Server-backed account sync |
| Latency | Immediate, local reads and writes | Depends on network and sync state |
| Privacy | No cloud account required | Data often leaves the device |
| Failure mode | App logic is transparent and contained | Sync conflicts and account dependencies |
| Best fit | Users who want a simple private tracker | Users who want multi-device sync and social features |
A first app that does not look like a first app
The visual system is doing more work than decoration. The Olive, Sage, and Clay palette signals intention. The custom bottom navigation dot, the restrained typography, and the tidy spacing all suggest someone who thought about the product as a whole, not just the feature list.
How Streaks differs from the usual habit apps
The closest comparison is not one app. It is a spectrum. Habitica turns habits into a game, Loop Habit Tracker turns them into a mature minimalist system, and Streaks sits in a narrower lane: local, calm, schedule-aware, and visually deliberate.
| App | Streak logic | Privacy / storage | Visual density | Gamification | Best fit |
|---|---|---|---|---|---|
| Streaks | Schedule-aware, with separate logic for daily, specific days, and weekly frequency | Local-first on device | Light and restrained | Low | People who want a private tracker that respects non-daily habits |
| Habitica | Task streaks wrapped in game mechanics | Account-based and social | Higher density | High | Users motivated by rewards, avatars, and community |
| Loop Habit Tracker | Classic habit repetition and statistics | On-device and privacy-minded | Minimal | Very low | Users who want a polished, mature tracker with strong charts |
That positioning is why the project works as an editorial subject. It is not trying to out-Habitica Habitica. It is trying to make one part of habit tracking more honest.
What this project gets right about product discipline
The strongest signal here is restraint. There is no cloud dependency to hide problems, no bloated feature list to excuse weak logic, and no visual noise to distract from the core job. The app does one meaningful thing, then builds a careful system around it.
That is a better lesson than any growth hack. If you define the rule correctly, the motivation problem gets easier. Streaks understands that a streak is not a scoreboard. It is a contract between the user and the schedule.