Inspiration

I've kept a paper diary for years — and loved going back through it, even the hard days. But the habit kept failing for practical reasons: writing takes time, an afternoon's details fade by night, and physical notebooks get lost, damaged, or just forgotten in a drawer. Meanwhile, most AI diary apps on Google Play treat illustration as a bolt-on — a fallback image when there's no photo, buried under mood tracking or AI commentary. The apps that make an illustrated comic page the actual point of the product, like PufferPages, are iOS-only. Once Upon Today started from those two threads: make recording a day nearly effortless, and make revisiting it something you actually want to do — built Android-first, where nothing else is doing this loop.

What it does

Each day is made of short moments — voice, text, or a photo — captured with zero friction throughout the day, up to a daily cap. On the free Remember tier, that's the whole experience: moments are saved locally through an offline-first architecture — no transcription, no cloud processing, nothing leaves the device — a private diary that always works, even offline. Upgrading to Cherish or Treasure adds a "finalize" step that transcribes voice moments and turns each one into an illustrated panel, composed into a single comic page per day — Treasure unlocks a higher daily moment cap and more panels than Cherish. A calendar view lets you flip back through your illustrated days like a graphic diary, each day shown as a small illustrated thumbnail rather than a bare date.

How we built it

Once Upon Today is a Flutter app, using Riverpod for state management and Isar as the offline database. The free Remember tier stores moments offline-first, entirely on-device, with no cloud round-trip. The backend runs on Firebase — Cloud Functions (2nd gen, TypeScript), Firestore, Storage, and Auth — written in a hexagonal architecture that keeps Firebase-specific code behind ports/adapters, so the AI providers (Google Imagen for images, Google Cloud Speech-to-Text for transcription) can be swapped via environment variables without touching business logic. That abstraction also let me test the AI pipeline locally on my own machine during development before wiring up the paid cloud APIs. RevenueCat manages the Cherish and Treasure subscription tiers, which unlock daily moment and illustration limits rather than a credit-refresh system. UI screens, including the comic-panel calendar view, were prototyped end-to-end in Google Stitch before a line of production code was written.

Challenges we ran into

Building the app itself — design and development — went smoothly against the deadline; the harder challenge was doing it solo across three fronts at once: the product, #BuildInPublic, and outreach. Posting progress updates and writing HackerNoon articles was manageable, but starting an Instagram account to share updates meant shooting and editing short videos, which ate far more time than expected. On top of that, I organized two in-person sessions at engineering colleges — demoing the app, talking to students, and raising awareness about Shipaton and the Next Gen award — and just coordinating with the colleges and running those events took a real chunk of time away from building.

On the technical side, two production-only bugs stood out. The first was a Google Sign-In failure that only showed up in production: Google Play Console's App Signing had issued a new upload key and quietly demoted the key I'd actually been using to a secondary "previously used key" slot that isn't shown prominently in the console. My sign-in config pointed at the new key, but Play Store was still signing the app with the old one — so sign-in worked fine in staging (using my local key) and silently failed in production, until I tracked down the demoted key buried in the console. The second was RevenueCat subscription plans not appearing in the production app at all, despite working in staging. I'd initially scoped the app's distribution and pricing to the US only; RevenueCat's docs noted that production requires a real signed build rather than test data, so I moved to a properly signed internal-track release — and the plans still didn't show. Being outside the US myself made it harder to verify whether it was a regional-availability issue. The fix was expanding distribution to all countries, after which the plans appeared correctly.

Accomplishments that we're proud of

With 100+ installs and no marketing budget beyond building in public, Once Upon Today found real early users — and real, specific feedback: people on social media and students at the two college sessions I ran in person both called out the UI and the illustrated-diary concept unprompted, which is the kind of validation that matters most for a design-forward product like this. The #BuildInPublic effort reached further than I expected too — the Instagram video series alone pulled in around 5.5K views, on top of the HackerNoon articles and the college sessions, where I stood in front of students and introduced them to both the app and Shipaton itself.

I'm also proud that the free tier is genuinely private by design, not just a marketing line — moments are stored offline-first with zero cloud dependency unless someone actively chooses to illustrate them, a real product decision rather than a checkbox.

And underneath all of it: I built this solo, end to end — the AI-illustration pipeline, the Firebase backend, RevenueCat subscriptions, the release engineering — and it's something I genuinely wanted to use myself. Once Upon Today isn't an idea I picked because it seemed fundable for a hackathon; it's the diary app I actually wanted to exist.

What we learned

Shipaton pushed me to pick up skills well outside app development. For the #BuildInPublic video series, I learned DaVinci Resolve from scratch — my first time editing in it — and had to get comfortable facing the camera and recording myself for Instagram Reels, which didn't come naturally at first but got easier with repetition.

On the technical side, I went deep on the AI stack across all three layers the app actually uses: speech-to-text, the LLM driving the image prompts, and the image model itself — a big part of that was prompt engineering, tuning prompts to get consistent, on-style output across panels rather than something different-looking every time. On the Flutter side, I learned a lot more about animations, and got the chance to fully explore Google Stitch in depth, well beyond the surface-level UI mockups I started with.

What's next for Once Upon Today

OneSignal is about to be integrated, and RevenueCat Ads integration is in the pipeline as well. A dedicated marketing website is already underway to give the app a home outside the Play Store listing. Beyond that, I want to add custom illustration themes so the app can feel personal to different kinds of people, rather than one fixed art style for everyone — since a diary is inherently personal, the visual identity should be too. And I'll keep the #BuildInPublic momentum going well past the hackathon, sharing real usage and feedback as it comes in rather than stopping once judging starts.

Built With

Share this project:

Updates

Submission history