Inspiration
College students get told to set lofty goals, but between classes, the gym, friends, sleep, and actually learning things for fun, no planning app actually models the tradeoffs. Calendars show you when you're busy; to-do apps show you what is undone. Neither helps you decide which domain of your life needs attention today. We wanted a coach that sees all five domains (academics, fitness, social, health, personal growth) at once, knows your calendar, and reshuffles your plan with you through conversation.
What It Does
Decision Buddy turns a goal like "six pack by finals" or "finish senior thesis" into a calendar-aware plan across 5 life domains. It syncs your device calendar and tags every event by domain and urgency, then generates day-by-day task plans with Gemini 2.5-flash that schedule around your real commitments like no tasks at 10am if you have class, no past-time scheduling. It picks time slots that respect your preferred day-half and custom weekday selection.
The app gives you an energy "battery" that drops with fatigue and time of day, plus five domain rings showing streaks and progress. You can chat with an AI coach that can actually modify your plan mid-conversation by completing tasks, adding new ones, merging duplicates, shifting deadlines, or merging an AI task with a calendar event you already have. A daily AI supplement silently adds 3–10 complementary tasks per day based on your active goals, and smart local notifications handle morning briefings, 2-hour event reminders, mid-day nudges, Monday weekly summaries, and domain nudges when you've neglected an area.
How We Built It
Frontend: Expo + React Native (SDK 54) with expo-router for file-based routing, react-native-paper Material Design 3 components, and a custom cream-on-muted light theme with 5 accent presets and 3 font scales. Backend: Firebase Auth + Firestore for persistence, with batched writes for plan generation. AI: Google Gemini 2.5-flash hit directly via REST (no SDK overhead) using four distinct prompts, an ultra-compact plan generator, a conversational coach, a JSON-only mutation emitter, and a 1-word domain classifier. Scheduling: A custom assignNonOverlappingTimes algorithm that takes calendar events, already-scheduled tasks, day windows, 15-minute gaps, and the current time to find non-conflicting slots across a 7-day spill range. Calendar integration is handled via expo-calendar with a keyword-based domain and urgency classifier. Notifications run through expo-notifications with staggered scheduling, auth through email/password plus Face ID via expo-local-authentication and expo-secure-store.
Challenges We Ran Into
The hardest problems were all at the intersection of AI and real-world scheduling. Getting Gemini to produce valid JSON reliably required building a "salvage truncated JSON" parser for when the model hit MAX_TOKENS and trailed off. Scheduling around calendar events without the AI ignoring them meant being militant in the prompt about BUSY intervals and enforcing it again in code. No-past-time scheduling was another issue since Gemini kept creating tasks at 10am when it was already 1pm, solved by computing todayEarliest = max(windowStart, now + 5min) and passing it through to the scheduler. Designing chat that actually mutates state required a mutation manifest that hands Gemini the exact goal, task, and event IDs it can reference, then validating and applying mutations server-side. Compound goals like "six pack" needed to generate both diet tracking and workouts per day, not just one domain. We also had to kill feature creep: we tried integrating ElevenLabs voice mode mid-build, spent real hours on it, then ripped it all out once we realized it wasn't the core story. Finally, stale emotional state was bleeding between chat sessions, so we built a 3-minute freshness window that prunes older messages down to 6 + recent.
Accomplishments We're Proud Of
The full JSON-mutation chat is the thing we're most proud of because the AI can actually do things just by talking to it, with a 3-mutation-per-turn safety limit. Domain auto-classification works well enough that users never need to pick a domain manually. The scheduler respects calendar events, existing tasks, day-half preferences, custom weekdays, and multi-per-day reminders, and can never schedule in the past. Jaccard-similarity merge detection catches overlapping tasks and calendar events across a 2-day window, and the energy model produces a battery percentage that actually correlates with how tired you feel. We shipped 5 full tab screens, 3 goal screens, an auth flow, and a dev diagnostics screen in a hackathon timeframe and the daily AI supplement means users wake up to new tasks without having to think about it.
What We Learned
Gemini's responseMimeType: "application/json" is useful, but you still need a fallback parser for when the model gets chatty and trails off. Prompt compression matters more than prompt length React Native local notifications are far more capable than we expected, with scheduled recurring, event-triggered, and domain-nudge notifications all running offline. Material Design 3's dynamic color system is powerful but fragile, so building our own theme factory gave us much more control. The ElevenLabs detour taught us real scope discipline and how we need to focus on the core problem. And "mutations in chat" is a UX pattern more apps should use; letting users just talk to change state feels dramatically better than clicking through forms.
What's Next for Decision Buddy
The immediate ideas are Google Calendar and Outlook sync (currently device-only), goal templates for common student goals like MCAT prep, thesis, or marathon training, and cross-user accountability so friends can share a goal and see each other's streaks. Further out: weekly AI-generated retrospectives, an iOS home screen widget, Apple Health integration for sleep and activity data feeding the energy model, and a web dashboard.
Built With
- cli
- expogo
- firebase
- geminiapi
- json
- md
- node.js
- terminal
- typescript
Log in or sign up for Devpost to join the conversation.