Inspiration

I wanted to build something for TSOC, but I kept circling back to the same problem every developer knows: the gap between deciding to build something and actually finishing it. That irony — needing consistency to build a habit-tracking app, while struggling with the consistency to finish the app itself — became the seed of StreakSpace. I wanted a tool that made showing up every day feel rewarding instead of like a chore, using something as simple and visceral as a flame that grows brighter the longer you keep a streak alive.

What I learned

Working under a tight time constraint forced me to get ruthless about scope. I learned that a single, well-executed interaction (mark a habit done, watch the streak grow) communicates a product idea far better than five half-finished features. Building with Flutter and Dart also reinforced how powerful a declarative, widget-based UI model is for quickly iterating on small, satisfying interactions — state changes propagate cleanly through the widget tree without extra plumbing. It reinforced a lesson I'd heard but hadn't internalized: constraints sharpen design decisions rather than compromise them.

How I built it

StreakSpace is a mobile app prototype built entirely in Flutter and Dart, designed to demonstrate the core experience of a native habit-tracking app:

  • A StatefulWidget-driven habit list rendered dynamically from a Dart data model
  • A mark-done interaction that increments or decrements streak counts live via setState
  • A color-coded flame system — habits visually "heat up" (gray → amber → red) as their streak grows, giving instant emotional feedback
  • Summary stats at the top (habits done today, best streak) recalculated on every state update
  • An add habit flow to extend the list on the fly using a simple dialog/form widget

The goal was to prove out the core loop — commit, complete, get rewarded — with real working interaction logic rather than static mockup images.

Challenges I faced

The biggest challenge was time. With roughly an hour to design and build, I had to consciously cut anything that wasn't core to the experience — no accounts, no persistence, no notifications. Deciding what not to build was harder than writing the code itself. I also had to think carefully about visual feedback: making the streak flame system communicate progress at a glance, without text explaining it, took a few iterations to get the color thresholds feeling intuitive rather than arbitrary.

What's next for StreakSpace

  • Persistent storage so streaks survive app restarts, using shared_preferences or a local Dart database like sqflite
  • Daily reminder notifications via flutter_local_notifications to nudge users before a streak breaks
  • A calendar/heatmap view of historical completion, similar to GitHub's contribution graph
  • Social accountability — share streaks or pair up with a friend for mutual motivation
  • AI-suggested habit recommendations based on goals the user sets

Built With

Share this project:

Updates

Submission history