DID I?
Inspiration
The idea came from a phrase I catch myself saying almost every day: "Did I...?"
I'm not a forgetful person, but small daily tasks have a way of blurring together. Did I lock the gate tonight, or is that yesterday I'm remembering? Did I actually change the oil last month, or did I just mean to? None of these are big failures of memory. They're moments of second-guessing. The action probably happened, but the certainty didn't stick.
I wanted something that could hold that certainty for me. Not a generic to-do list, and not a calendar full of alerts, but something built specifically around that "Did I...?" moment, so I could ask it a question and get a real answer instead of just relying on a fuzzy memory.
What it does
DID I? lets you log things you did, or things you're supposed to do, and then check back on them with confidence instead of guesswork.
- Set a recurring check-in. Need to lock the gate every night at 22:00? DID I? reminds you at the right time and lets you confirm it's done.
- Log a one-off memory. Lent a friend some money? Changed the oil? Log it once, and DID I? holds onto that memory so you don't have to.
- Ask it later. The interaction is built around the question itself, like "Did I lock the gate?" or "Did I lend money to Joe?", so checking in feels natural, not like digging through a list.
- Everything stays on your device. No accounts, no cloud sync, no analytics pipeline quietly logging your habits. Full privacy, offline and private by design.
How I built it
DID I? is built with Flutter and Dart, which let me target both iOS and Android from a single codebase. Android is shipped; iOS is still on the way.
The core of the app is a lightweight local data model: each entry is either a recurring check-in (tied to a time or schedule) or a logged memory (a one-time note tied to a date). Because everything needed to run offline, I kept storage entirely on-device, with no backend or network calls involved. That constraint shaped a lot of the architecture early on: notifications, storage, and state all had to work without ever assuming connectivity.
On the design side, I focused on making the core interaction (asking "Did I...?" and getting an answer) feel as close to a natural thought as possible, rather than another list-based habit tracker.
Challenges I ran into
- Designing around a feeling, not a feature. It's easy to build "another reminder app." The hard part was keeping the product centered on that specific moment of self-doubt, and not letting it drift into generic to-do-list territory.
- Offline-first from day one. Committing to full privacy and local-only storage meant giving up conveniences like cross-device sync, but it kept the app honest to its promise: nothing leaves your phone.
- Making the interaction feel conversational. Getting the phrasing and flow to actually read like "Did I lock the gate?" rather than "Reminder: Gate Lock 10:00 PM" took several iterations. Small wording choices ended up mattering a lot for how the app felt to use.
- Cross-platform quirks in Flutter. Local notifications and background scheduling behave differently on Android versus iOS, which took real work to get right on Android and is part of why the iOS build is still in progress.
What's next
Android is shipped and working. iOS support is next on the roadmap, mainly finishing platform-specific notification handling to make sure "Did I...?" check-ins fire reliably within Apple's background execution limits.
What I learned
Building DID I? taught me that the smallest daily anxieties, the "did I already do that?" moments, are worth designing for directly, instead of solving indirectly with a generic productivity tool. I also learned a lot about building fully offline-first mobile apps, and how much architectural discipline that requires compared to leaning on a backend.
Mostly, I learned that a good product doesn't need a complicated pitch. Sometimes it just needs a phrase everyone already says to themselves, and a way to finally answer it.
Log in or sign up for Devpost to join the conversation.