Inspiration

I kept losing tasks in the gap between thinking them and writing them down — every task app turns capture into form-filling, so in the moment I'd skip it. I wanted an assistant I can just talk to, in any language, that keeps my real Notion board in order and keeps working when I'm not looking: reminding me on time, reviewing the board on schedule, never inventing what I didn't say.

What it does

You talk to it — typed or by voice, in any language — and it keeps your own Notion board in order:

  • One-line capture. "Remind me to call the dentist at 10" becomes a board row with a real reminder. No forms, nothing invented — empty fields stay empty.
  • Reminders that ring your phone by Web Push, app closed or not.
  • A live voice agent that reads the board, searches the web for any question, and hands board work to the chat — you watch it play out on screen in real time.
  • Background automations on structured schedules, using the same gated tools as the chat — including a weekly board review that proposes cleanups but never changes anything.
  • Everything editable in-app — prompts, schedules, memory, even which Notion board it writes to. The agent can only ever see the one board you share.

How we built it

FastAPI on Cloud Run serves a no-build PWA, streams chat over SSE, and carries live voice audio over a WebSocket. Two Google ADK LlmAgents run on Vertex AI: the task organizer on Gemini 3.7 Flash and the voice navigator on Gemini Live 2.5 Flash, with Google Search grounding for world questions. The organizer works through fourteen typed, channel-gated board tools plus memory, web search, notify, and automation tools. Notion is reached only through a pinned local MCP server exposing a compiled ten-operation allowlist against one database — startup validates the exact tool set and fails closed on drift. Firestore stores channels, automations, and settings; Cloud Scheduler ticks the app every few minutes to fire automations and reminders; the Notion token arrives by Secret Manager reference; Web Push runs on the app's own VAPID identity through the service worker.

Challenges we ran into

Notion's API can't set native reminders at all, so we built our own delivery: a Reminder date column plus Web Push from the app itself. And one deploy shipped mismatched files mid-edit, which taught us: commit, test, then deploy — every time.

Accomplishments that we're proud of

Two agents that genuinely cooperate — the voice navigator hands work to the chat and you watch it happen on screen. Reminders delivered by the app itself, phone closed or not. A security posture that's a feature: one board, a ten-operation allowlist that fails closed, and keys the server never stores. Nothing hardcoded — every prompt, schedule, and even the target board is editable in-app. And 165 unit tests plus a browser suite across both themes and viewports keeping it all honest.

What we learned

Put deterministic code around the model, not inside it: schedules, permissions, and defaults live in code, while the model does the genuinely linguistic work. Saying less is a feature — a one-line reply is what makes capture feel instant. Read-only is sometimes the right power level: a review that only proposes can safely run forever. And on platform limits (Notion reminders, Live API models), building your own path beats fighting the API.

What's next

Speaker focus for the voice agent — locking onto the user's voice so background conversations can't distract it. Beyond that: one-tap fixes from the board review (applied only on confirmation), richer hands-free voice flows, and more user automations on the same structured trigger model.

Built With

Share this project:

Updates

Submission history