GlowUp Buddy

Turning your morning voice note into a mood-aware plan — before you've had your coffee.


Inspiration

Most productivity tools treat every day the same. They hand you a static to-do list and expect you to perform — whether you slept 4 hours or 8, whether your calendar is packed or clear, whether you're anxious or energized.

We wanted to build something different. An AI companion that listens first, then plans — one that understands how you're actually feeling before telling you what to do.


What It Does

GlowUp Buddy is a voice-first AI agent that turns your morning check-in into a personalized daily plan — then follows you through the rest of the day.

Morning: Send a voice note or text to the Telegram bot. The agent transcribes your audio, extracts your mood, tasks, and ideas, pulls your calendar and active projects, and composes a plan tailored to your energy that day. Tired? Lighter list. Energized? More ambitious. The plan lands in your chat and on your dashboard within 15 seconds.

During the day: Send quick updates — "finished my run," "swap gym for a walk," "idea: try journaling before bed." The agent classifies each one, marks tasks complete, captures ideas, and updates your plan in real time.

Evening: After 7 PM, any message triggers a gentle 3-question reflection. Gemini summarizes your wins, lessons, and tomorrow's intention — and saves it to your journal.

Dashboard: A React web app shows your plan, bingo board, reflection journal, and captured ideas — updated every 10 seconds as your day unfolds.


How We Built It

Agent Pipeline

Every morning voice note runs through a 3-stage multi-agent pipeline built on Google ADK:

Voice / Text
      ↓
VoiceIntakeAgent       — transcribes audio via Gemini, extracts mood + tasks + ideas
      ↓
ParallelAgent fan-out  — 4 agents run concurrently:
                         CalendarFetch · ObsidianFetch · BingoFetch · ProfileFetch
      ↓
PlanComposerAgent      — Gemini builds a mood-aware DailyPlan, saves to MongoDB

Alongside the morning flow, two more flows handle the full day:

  • LiveUpdateFlow — VoiceIntake → LiveUpdateAgent (classifies updates, calls tools)
  • ReflectionFlow — ReflectionAgent (multi-turn state machine: q1 → q2 → q3 → done)

Tech Stack

Layer Technology
Agent framework Google ADK (SequentialAgent, ParallelAgent, BaseAgent)
AI model Gemini via Vertex AI (service account auth — no API key)
Backend FastAPI · Python 3.12
Compute Google Cloud Run (--min-instances=1, --no-cpu-throttling)
Database MongoDB Atlas (GCP us-east1)
Secrets Google Secret Manager
Messenger Telegram Bot API (webhook) + Telegram Mini App
Frontend React 18 · Vite 6 · Tailwind CSS 4
Auth Telegram Login Widget + initData HMAC-SHA256

Challenges We Ran Into

State across agents — ADK's InMemoryRunner doesn't surface mutated session state after run_async(). We bypassed the runner entirely and called agent._run_async_impl(ctx) directly with a plain state dict, which gave us full control over what each agent reads and writes.

Mood-aware plan sizing — Getting Gemini to consistently respect hard rules (max 4 tasks when tired, always include a bingo pick) required pulling the trimming logic out of the prompt and enforcing it in Python code after generation. Prompt rules alone weren't reliable enough.

Fuzzy task matching — When a user says "I finished my run," there's no exact match to "30-min morning jog" in the plan. We built a matcher using SequenceMatcher + substring overlap + word intersection to reliably link voice-reported completions to the right plan item.

Timezone-aware planning — MongoDB stores dates as ISO strings. A user in PST asking for "today's plan" at 11 PM would get tomorrow's plan in UTC. We built a get_user_today(user_id) service using zoneinfo.ZoneInfo that all date queries go through.


Accomplishments We're Proud Of

  • A complete voice-in → plan-out → reflection loop running end-to-end in production
  • 9 specialized agents, each with a single clear responsibility, composing into a coherent system
  • Bingo board with optimistic local state that merges cleanly with server state on every 10-second poll
  • Swipeable reflection journal cards with a card-stack shuffle effect — built entirely with touch events and CSS transforms, no library
  • The whole thing runs on a single Cloud Run instance and responds within 15 seconds of a voice note

What We Learned

Context matters more than model quality. A great model with bad context produces generic advice. The parallel fetch stage — calendar, projects, bingo board, user profile, all in one round trip — is what makes the plan feel personal rather than generic.

Multi-agent systems need clear ownership. The hardest bugs came from agents reading state they shouldn't or writing in unexpected formats. Strict input/output contracts per agent fixed most of them faster than any debugging session.

Human-in-the-loop beats fully autonomous. The 👍 confirmation step for captured ideas, the admin approval gate for new users, the evening reflection questions — every place we kept a human in the loop produced better outcomes than letting the agent decide alone.


What's Next

  • Habit analytics — streak tracking, completion rates, pattern recognition across weeks
  • Burnout detection — flag when task load consistently exceeds energy signals
  • Long-term goal planning — weekly and monthly intention setting layered on top of daily plans
  • Wearable integration — sleep and HRV data from Apple Health as mood signals
  • Personalized coaching styles — gentle / direct / accountability partner modes
  • Onboarding for new users — 5-card React wizard + Telegram routine setup, already designed

Tagline

GlowUp Buddy turns your daily thoughts, goals, and mood into a realistic plan — so you stop starting over and start showing up.

Built With

  • cloudrun
  • fastapi
  • gemini
  • google-calendar
  • googlecloudplatform
  • mongodbatlas
  • obsidiansync
  • react
  • secret-manager
  • tailwind-css
  • telegramapibot
  • vertex-ai
  • vite
Share this project:

Updates