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
Log in or sign up for Devpost to join the conversation.