An innovative alarm app that forces you to wake up by requiring the sound of your running shower to dismiss the alarm.
- 🔔 Smart Alarms - Schedule one-time or repeating alarms with customizable sounds
- 🚿 Shower Detection - Uses Core ML and SoundAnalysis to detect your shower running
- 🎯 Can't Skip It - Alarm only stops when shower sound is confirmed
- 😴 Limited Snooze - 3 snoozes max to prevent infinite delays
- ✨ Beautiful UI - Dark mode with glassmorphism effects and smooth animations
- iOS 17.0+
- Xcode 15.0+
- macOS Ventura+ (for Create ML model training)
- Apple Developer Account (for TestFlight distribution)
Waky/
├── Waky.xcodeproj/
├── Waky/
│ ├── WakyApp.swift # App entry point
│ ├── ContentView.swift # Main navigation
│ ├── Info.plist # Permissions
│ │
│ ├── Models/
│ │ ├── Alarm.swift # Alarm data model
│ │ └── SoundClassification.swift # Sound detection model
│ │
│ ├── ViewModels/
│ │ ├── AlarmViewModel.swift # Alarm management
│ │ └── SoundDetectorViewModel.swift # Sound detection
│ │
│ ├── Views/
│ │ ├── HomeView.swift # Main screen
│ │ ├── AlarmEditView.swift # Create/edit alarm
│ │ ├── AlarmTriggerView.swift # Full-screen alarm UI
│ │ └── SettingsView.swift # App settings
│ │
│ ├── Services/
│ │ ├── AudioCaptureService.swift # Microphone capture
│ │ ├── SoundAnalysisService.swift # ML classification
│ │ ├── AlarmSchedulerService.swift # Notifications
│ │ └── AlarmPlayerService.swift # Audio playback
│ │
│ ├── ML/
│ │ └── ShowerSoundClassifier.mlmodel # Trained model
│ │
│ └── Assets.xcassets/
│
└── TrainingData/
├── shower/ # Shower sound recordings
└── background/ # Background noise samples
Open Waky.xcodeproj on your Mac with Xcode 15+.
- Record 10+ shower sound clips (5-10 seconds each) on your iPhone
- Record 10+ background noise clips (silence, talking, music, etc.)
- Transfer recordings to your Mac:
- Place shower recordings in
TrainingData/shower/ - Place background noise in
TrainingData/background/
- Place shower recordings in
- Open Create ML (comes with Xcode):
- File → New → Sound Classification
- Drag the
TrainingDatafolder - Click "Train"
- Export as
ShowerSoundClassifier.mlmodel
- Drag the exported model into
Waky/ML/
- Select the Waky target in Xcode
- Set your Development Team
- Change Bundle Identifier to your own (e.g.,
com.yourname.waky)
Connect your iPhone and build (⌘+R). The app requires a real device for:
- Microphone access
- Sound classification
- Notification testing
- Create an Alarm: Tap the + button, set time and repeat days
- When Alarm Triggers:
- Full-screen UI appears
- Alarm sound plays (gradually louder)
- Turn on your shower
- App listens and confirms shower sound
- Alarm dismisses automatically!
- Snooze: Up to 3x 5-minute snoozes if needed
- Archive the app (Product → Archive)
- Distribute to App Store Connect
- Add testers in TestFlight section
- Testers receive invite link
- Uses SNAudioStreamAnalyzer with custom Core ML model
- Requires 3 consecutive shower detections to confirm
- Falls back to Apple's built-in classifier (water sounds) if no custom model
- Uses UNUserNotificationCenter with critical alerts
- Background audio mode for continued sound playback
- Audio processing mode for microphone access
- All audio processing happens on-device
- No data is sent to external servers
- Microphone is only active when alarm is triggered
Alarm doesn't sound in background?
- Ensure "Background Modes" is enabled in Xcode capabilities
- Check notification permissions in iOS Settings
Shower not detected?
- Train the model with more samples
- Test detection in Settings → Test Sound Detection
- Ensure microphone permission is granted
Build errors?
- Clean build folder (⌘+Shift+K)
- Ensure iOS 17.0+ deployment target
MIT License - feel free to modify and use!