Skip to content

Latest commit

Β 

History

11 Commits

Folders and files

NameName
Last commit message
Last commit date
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

Utho! β€” The Alarm That Talks Back

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.

Utho! Logo

Demo Video

Utho! Demo

Watch the full demo on YouTube


Why Utho?

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.

The Consumer Insight

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.

Who It's For

  • 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

Screenshots

Home Screen β€” AI-created alarms with wallet Alarm Ringing β€” Talk, Snooze, or Dismiss Voice Session β€” Indian Mom persona listening

AI speaking Hindi β€” alarm set for brushing Settings β€” 4 personas + dual AI provider Settings β€” both API keys + voice selection

What you're seeing:

  1. Home screen with AI-created alarms ("Done brushing" at 3:02 PM), wallet balance (β‚Ώ0), and next alarm hero card
  2. Alarm ringing with "Talk to Utho!" button β€” the key interaction that starts a voice session
  3. Indian Mom persona listening for what you'll do next
  4. AI speaking in Hindi β€” "alarm laga diya for brushing... bath lena hai ya kuch aur plan hai?" β€” and setting the next alarm automatically
  5. Settings with 4 persona modes, OpenAI/Gemini provider toggle, and voice selection
  6. API key management β€” both OpenAI and Gemini keys stored securely on-device

The Problem

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.

The Solution

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:

  1. Knows what alarm just fired ("Done brushing? What's next?")
  2. Creates the next alarm based on your answer ("I'll code for an hour" β†’ alarm set for 60 min)
  3. Deletes old alarms when plans change ("Actually, skip breakfast" β†’ deletes breakfast alarm)
  4. Chains through your entire day β€” alarm after alarm, each one a checkpoint in your routine
  5. Rewards or penalizes you with Utho Coins based on your productivity

The Flow

πŸŒ… 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.


Multilingual Voice AI

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.


4 AI Personas + Gamification

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

Utho Coins (β‚Ώ) β€” Gamified Productivity

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.


Dual AI Provider Support

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)

Technical Architecture

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                  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.    β”‚   β”‚                                β”‚
  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Key Technical Decisions

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.

AI Tool Definitions

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

Quick Start

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
  1. Open the app β†’ go to Settings
  2. Enter your OpenAI API key (sk-...) and/or Gemini API key (AIzaSy...)
  3. Choose your AI Provider (OpenAI or Gemini)
  4. Choose your persona (Indian Mom, Best Friend, Boss, Soft)
  5. 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.

Physical Device

adb devices              # verify USB debugging enabled
flutter run -d <device>

Building

flutter build apk --release            # sideload APK
flutter build appbundle --release       # Play Store AAB

Project Structure

lib/
β”œβ”€β”€ 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

How It Helps People

Morning Routine Automation

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.

Accountability Without Another App

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.

Multilingual Accessibility

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.

Emotional Intelligence

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.

Gamified Motivation

The Utho Coins system turns abstract productivity into tangible progress. Boss mode makes procrastination expensive. Friend mode makes every win feel like a celebration.


Team

Built at Cerebral Valley x Gemini 3 Hackathon by jhana.ai 's engineer Sanjay

License

MIT

About

No description, website, or topics provided.

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages