Here's the full markdown story, ready to paste into "About the project":

## Inspiration

Every note-taking app assumes you'll remember to open it. We don't. The best ideas hit in the shower, mid-commute, or right before sleep — and by the time you "get to it later," they're gone. We wanted an app that meets you at the moment of the thought, not the other way around: talk to it like a person, and it figures out whether that was a task, a memory, or something for your diary. So we built Memo — a small AI companion with a face, living inside Keepi, who actually remembers the conversation instead of resetting every time you open the app.

## What it does

Keepi is an AI-first capture app built around Memo, an animated companion that reacts, blinks, and remembers. Talk or type anything and Memo routes it correctly on its own: a task lands in your real todo list, a passing thought becomes a note, Instagram reels get auto-summarized into searchable notes, and private reflections go into a fingerprint-locked journal Memo never surfaces anywhere else.

Memo also reaches out first. Gentle nudges for your morning todos or evening journal arrive as notifications — and you can just reply to them in natural language. Memo remembers that whole conversation thread, follow-ups included, instead of treating every reply as a cold start.

Because reminders that silently die are worse than no reminders, Keepi runs a hybrid delivery system: a local alarm plus a cloud backup push, so a reminder still lands even if the OS kills the app in the background. And because opening an app just to check a todo is friction, Keepi ships real interactive home screen widgets — tap a checkbox on the widget itself and it's done, no app launch required.

## How we built it

Flutter + Kotlin for a native Android experience, with OpenAI's API doing the actual thinking — function/tool-calling routes every message to the right action (`add_todo`, `save_note`, `start_journal_entry`) instead of a single generic "chat" response, and the Realtime API powers the hands-free voice assistant.

Memo's face is a hand-built custom painter (not a static asset) that blinks, glances, and reacts to touch and phone tilt in real time. Notification replies persist conversation history across turns so Memo has actual memory, not amnesia. Reminders run on a hybrid pipeline: local exact alarms as the primary path, a cloud push as an automatic backup, deduplicated once either one fires. Home screen widgets use Android's native RemoteViews + a background Dart isolate so a todo checkbox toggles instantly with zero app launch.

## Challenges we ran into

Getting AI notification replies to remember context without replaying a stale tool-call turn (which crashes the model) meant redesigning the reply pipeline to carry plain-text history instead of raw conversation state. Android background execution fought us constantly — OEM battery killers silently drop alarms, which is exactly why the hybrid local+cloud reminder system exists. And making a single tap on a home screen widget toggle a todo with no app open took wiring a proper native RemoteViews adapter instead of the simpler (but broken-at-scale) generic click intent.

## Accomplishments that we're proud of

Memo genuinely feels alive — tilt your phone and its eyes follow; tap it and it reacts. Notification replies keep real context across a whole conversation instead of resetting every time. Reminders now survive aggressive OEM app-killing because of the backup delivery path. And every core action (capture, todo, journal, reminders) is reachable straight from the home screen without opening the app once.

## What we learned

Reliability beats cleverness on Android — a beautifully designed reminder is worthless if a manufacturer's battery optimizer silently kills it, so we learned to design for failure first and treat any single delivery path as something that *will* eventually drop. We also learned that giving an AI companion real memory is mostly a discipline problem, not a model problem: the moment you replay stale state back into a conversation, things break, so the fix was architectural (plain-text history, never a raw replayed turn) rather than a bigger prompt. And structuring every AI action as an explicit tool call, instead of parsing free-form replies, turned out to be the difference between "usually works" and "always works."

## What's next for KeepiAI

Deeper voice-first workflows through the Realtime API, smarter proactive nudges that learn your actual routine instead of running on fixed schedules, and iOS support so Memo isn't Android-only.

Built With

  • android
  • android-widgets
  • dart
  • flutter
  • function-calling
  • kotlin
  • openai-api
  • openai-realtime-api
  • remoteviews
  • riverpod
  • sqlite
  • supabase
  • workmanager
Share this project:

Updates