Cerebral Valley x Gemini 3 Hackathon | Built by jhana.ai 's engineer Sanjay | MIT License
An AI-powered productivity alarm clock that doesn't just wake you up β it plans your entire day through voice conversations in English, Hindi, and Kannada, chaining alarms section by section as you move through your routine. Choose between OpenAI Realtime and Gemini 2.5 Flash Native Audio as your voice backend.
Watch the full demo on YouTube
1.4 billion people use alarm clocks daily. Every single one has the same experience: ring β snooze β ring β doom scroll. There's zero intelligence between alarms. No one asks "what are you doing next?" or nudges you through your morning.
Utho turns the humble alarm clock β something everyone already uses β into an AI-powered daily routine assistant. It's not another productivity app you forget about. It's your alarm clock, upgraded.
Alarm clocks are the most universal app on every phone. By embedding AI inside the alarm interaction, we reach users at their most critical decision point: "What should I do next?" This is the moment between scrolling Instagram and actually getting things done.
- Students struggling with morning routines and study schedules
- Remote workers who need structure without an office
- Parents managing chaotic mornings for themselves and kids
- Anyone who sets alarms but has no system to chain their day
What you're seeing:
- Home screen with AI-created alarms ("Done brushing" at 3:02 PM), wallet balance (βΏ0), and next alarm hero card
- Alarm ringing with "Talk to Utho!" button β the key interaction that starts a voice session
- Indian Mom persona listening for what you'll do next
- AI speaking in Hindi β "alarm laga diya for brushing... bath lena hai ya kuch aur plan hai?" β and setting the next alarm automatically
- Settings with 4 persona modes, OpenAI/Gemini provider toggle, and voice selection
- API key management β both OpenAI and Gemini keys stored securely on-device
Alarm clocks are dumb. They ring, you snooze, they ring again. There's no intelligence, no context, no understanding of what comes next. You end up doom-scrolling because nothing is nudging you forward.
The gap: Between your alarm ringing and you starting your day, there's a critical 30-second decision window. Today, that window is filled with nothing. Utho fills it with a conversation.
Utho! is an AI voice assistant disguised as an alarm clock. When your alarm rings, you tap "Talk" and have a real-time voice conversation with one of 4 AI personas. The AI:
- Knows what alarm just fired ("Done brushing? What's next?")
- Creates the next alarm based on your answer ("I'll code for an hour" β alarm set for 60 min)
- Deletes old alarms when plans change ("Actually, skip breakfast" β deletes breakfast alarm)
- Chains through your entire day β alarm after alarm, each one a checkpoint in your routine
- Rewards or penalizes you with Utho Coins based on your productivity
π
7:00 AM β Wake-up alarm rings
ββ Talk to Utho: "I'll brush my teeth"
ββ AI sets alarm: "Done brushing" at 7:10 AM
ββ +βΏ20 "Good morning! On time!"
πͺ₯ 7:10 AM β "Done brushing" alarm rings
ββ Talk to Utho: "Taking a bath now"
ββ AI deletes "Done brushing", sets "Bath done" at 7:40 AM
π 7:40 AM β "Bath done" alarm rings
ββ Talk to Utho: "1 hour of coding"
ββ AI sets "Coding break" at 8:40 AM
π» 8:40 AM β "Coding break" alarm rings
ββ Talk to Utho: "Plans changed, I'll sketch instead"
ββ Boss: -βΏ40 "That's the third plan change today."
ββ AI deletes coding alarm, sets "Sketch break" at 9:50 AM
π¨ ... and so on, all day
Every alarm is a checkpoint. Every conversation is a planning session. Your day unfolds as a chain of productive blocks.
Utho speaks the way you do. The AI automatically matches your language and code-switches naturally:
- English β default, clean, professional
- Hindi β "Beta, uth ja! Alarm laga diya brushing ke liye. Paani peelo!"
- Kannada β "Yella sari ide, next alarm set maadtini"
- Natural code-mixing β "Chalo, theek hai, brush ke baad bath ka plan hai ya kuch aur?"
This isn't translation β it's native-sounding multilingual audio. The AI persona speaks like a real Indian mom, friend, or boss would. When you switch to Hindi mid-sentence, Utho switches too.
Both OpenAI Realtime and Gemini 2.5 Flash support multilingual audio natively, making this seamless across providers.
Choose your accountability partner. Each persona has a unique carrot & stick approach with Utho Coins (βΏ):
| Persona | Vibe | Rewards | Penalties |
|---|---|---|---|
| π«Ά Indian Mom | Caring + guilt-trippy | +βΏ25 "So proud! Making halwa tonight!" | -βΏ15 "Not angry, just disappointed..." |
| π₯ Best Friend | Hype + supportive | +βΏ30 "You crushed it! Order Swiggy tonight!" | Never penalizes. Only hype. |
| πΌ Boss | Crisp + ruthless | +βΏ15 for on-time delivery only | -βΏ50 "Time is money. You just lost both." |
| π Soft | Gentle + calming | +βΏ20 "Proud of you. Take a break." | -βΏ5 max, and only if truly procrastinating |
A fake in-app currency that makes productivity tangible:
- Boss runs a tight ship β penalizes missed deadlines, plan changes, and procrastination. Rewards are modest and earned.
- Best Friend is all carrot, no stick. Celebrates every win, suggests spending rewards on treats.
- Indian Mom uses guilt as the ultimate motivator. Rewards come with love ("Making your favorite halwa tonight!").
- Soft barely penalizes. Gentle rewards and self-care reminders.
The wallet balance persists across sessions and is visible on the home screen and during voice sessions. Full transaction history in the Activity Log.
Switch between OpenAI and Gemini in Settings β same tools, same personas, same experience.
| Provider | Transport | Model | How Audio Works |
|---|---|---|---|
| OpenAI | WebRTC (SDP exchange) | gpt-4o-realtime-preview | Opus codec, bidirectional audio via WebRTC peer connection |
| Gemini | WebSocket (BidiGenerateContent) | gemini-2.5-flash-native-audio-dialog | PCM 16kHz mono streaming via record package + WebSocket |
Both providers use identical tool definitions and system prompts (shared via BaseVoiceService). The VoiceSessionScreen is provider-agnostic β it just listens to transcriptStream and toolCallStream.
BaseVoiceService (abstract β shared prompt, tools, streams)
βββ VoiceService β OpenAI Realtime (WebRTC + DataChannel)
βββ GeminiVoiceService β Gemini Live (WebSocket + PCM audio)
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Flutter App β
β β
β βββββββββββββββ ββββββββββββββββ ββββββββββββ β
β β HomeScreen β β VoiceSession β β Ringing β β
β β (alarms, β β (WebRTC or β β Screen β β
β β wallet βΏ, β β WebSocket, β β (audio, β β
β β tasks) β β transcript, β β vibrate) β β
β ββββββββ¬ββββββββ β action log) β ββββββ¬ββββββ β
β β ββββββββ¬ββββββββ β β
β ββββββββ΄ββββββββββββββββββ΄ββββββββββββββββ΄ββββββ β
β β AlarmProvider (ChangeNotifier) β β
β β addAlarm / removeAlarm / schedule β β
β βββββββββββββββββββββββββ¬ββββββββββββββββββββββββ β
β β β
β βββββββββββββββββββββββββ΄ββββββββββββββββββββββββ β
β β SQLite + AlarmScheduler + Wallet β β
β β alarm_history β wallet β android_alarm_mgr β β
β βββββββββββββββββββββββββ¬ββββββββββββββββββββββββ β
β β β
β βββββββββββββββββββββββββ΄ββββββββββββββββββββββββ β
β β Background Isolate (alarm fires) β β
β β β FlutterLocalNotificationsPlugin.show() β β
β β β IsolateNameServer β main isolate β Ringing β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββ β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β
WebRTC (audio) WebSocket (PCM audio)
β β
βββββββββββββ΄βββββββββββ βββββββββββββββββ΄βββββββββββββββ
β OpenAI Realtime API β β Gemini Live API β
β gpt-4o-realtime β β gemini-2.5-flash-native β
β β β -audio-dialog β
β 9 tool calls: β β Same 9 tool calls: β
β create_alarm, β β (Gemini function_declarations β
β delete_alarm, β β format, auto-converted) β
β reward_user, etc. β β β
βββββββββββββββββββββββββ ββββββββββββββββββββββββββββββββββ
| Decision | Why |
|---|---|
android_alarm_manager_plus over zonedSchedule |
zonedSchedule silently fails on Android 14+/16 (Nothing OS). Background isolate + show() is reliable. |
Top-level @pragma('vm:entry-point') callback |
Required by android_alarm_manager_plus for background isolate invocation. |
| DataChannel open wait | Session.update (with tools) sent only after WebRTC data channel opens β prevents silent tool drops. |
BaseVoiceService abstraction |
Both OpenAI and Gemini implement the same interface. Screen is provider-agnostic. |
record package for Gemini mic |
Gemini Live needs raw PCM over WebSocket. flutter_webrtc can't stream raw PCM on mobile. record provides startStream() for 16kHz mono. |
| Per-persona gamification | Reward/penalty behavior baked into system prompt per persona. Boss penalizes hard, Friend never penalizes. |
| BYOK (Bring Your Own Key) | No backend β API keys in Android Keystore via flutter_secure_storage. |
| Tool call deduplication | OpenAI sends tool calls via both response.function_call_arguments.done AND response.output_item.done. Dedup via _handledCallIds set. |
The voice AI has access to 9 tools during every conversation:
| Tool | What it does | When the AI uses it |
|---|---|---|
create_alarm |
Set alarm at absolute time | "Set alarm for 7:30" |
create_alarm_relative |
Set alarm N minutes from now | "Remind me in 10 minutes" |
delete_alarm |
Delete alarm by label (fuzzy match) | "Cancel the brushing alarm" |
list_alarms |
Check existing alarms | Before creating, to avoid duplicates |
create_reminder |
One-shot notification | "Remind me to take medicine" |
add_task |
Add to today's focus list | "Add 'review PR' to my tasks" |
list_todays_tasks |
Read back tasks | "What do I have today?" |
reward_user |
Award Utho Coins | User completes task on time |
penalize_user |
Deduct Utho Coins | User misses deadline, changes plans |
git clone https://github.com/sanjuhs/utho-alarm-cerbral-valley-gemini-3-hackathon.git
cd utho-alarm-cerbral-valley-gemini-3-hackathon
flutter pub get
flutter run- Open the app β go to Settings
- Enter your OpenAI API key (
sk-...) and/or Gemini API key (AIzaSy...) - Choose your AI Provider (OpenAI or Gemini)
- Choose your persona (Indian Mom, Best Friend, Boss, Soft)
- Set an alarm and tap "Talk to Utho!" when it rings
API keys are stored in secure storage (Android Keystore). Never bundled in builds. .env is gitignored.
adb devices # verify USB debugging enabled
flutter run -d <device>flutter build apk --release # sideload APK
flutter build appbundle --release # Play Store AABlib/
βββ main.dart # Permissions, global navigator key
βββ models/
β βββ alarm.dart # Alarm model + nextFireTime logic
β βββ preferences.dart # AssistantMode, AIProvider enums
βββ providers/
β βββ alarm_provider.dart # Alarm CRUD + scheduling
β βββ preferences_provider.dart # BYOK key management, provider selection
βββ screens/
β βββ home_screen.dart # Alarm list, next-alarm hero, wallet βΏ
β βββ alarm_ringing_screen.dart # Audio, vibration, dismiss/snooze/talk
β βββ voice_session_screen.dart # Provider-agnostic voice + action feed
β βββ alarm_history_screen.dart # Audit log + wallet transactions
β βββ settings_screen.dart # Personas, provider, keys, voice
βββ services/
β βββ alarm_service.dart # android_alarm_manager + background isolate
β βββ base_voice_service.dart # Abstract interface + shared prompt/tools
β βββ voice_service.dart # OpenAI Realtime via WebRTC
β βββ gemini_voice_service.dart # Gemini Live via WebSocket + PCM
β βββ database_service.dart # SQLite (alarms, tasks, history, wallet)
βββ utils/
β βββ theme.dart # Dark theme, accent colors
βββ widgets/
βββ alarm_card.dart # Swipe-to-delete alarm tile
βββ task_chip.dart # Horizontal task pill
Instead of 5 separate alarms with no context, set one wake-up alarm and let Utho chain the rest through conversation. "I'll brush" β 10 min alarm β "Bath next" β 25 min alarm β "Time to code" β 60 min alarm.
Your alarm clock is already on your phone. Utho adds accountability inside the alarm interaction β no new habits to build, no new app to remember to open.
For India's 1.4 billion people who switch between English, Hindi, and regional languages naturally, Utho speaks the way they do. No awkward English-only interfaces.
Different days need different energy. Pick Boss when you need to crush deadlines. Pick Soft when you're having a low day. Pick Indian Mom when you need love and guilt in equal measure.
The Utho Coins system turns abstract productivity into tangible progress. Boss mode makes procrastination expensive. Friend mode makes every win feel like a celebration.
Built at Cerebral Valley x Gemini 3 Hackathon by jhana.ai 's engineer Sanjay


.jpeg)


.jpeg)

.jpeg)