DreamCatcher

Dream Catcher

CI Release

Vibe coded replacement for Snore Labs. Does the same thing. Free.

Get it

Download on the App Store

It’s in review right now, so the link goes live once Apple approves it.

Or grab DreamCatcher.ipa from Releases and sideload it with AltStore or SideStore. Or open ios/DreamCatcher.xcodeproj in Xcode and run it on your phone (iOS 17+).

For developers

swift test --package-path ios/Packages/SnoreCore      # snore detector
swift test --package-path ios/Packages/SnoreStorage   # database

To release a new version: add notes to CHANGELOG.md, bump MARKETING_VERSION, then git tag v0.2.0 && git push origin v0.2.0. GitHub builds the .ipa and publishes the release.

Folder What’s in it
ios/ The app (SwiftUI)
spec/ Exactly how snoring gets detected and counted, plus test fixtures
tools/yamnet/ Rebuilds the AI model from Google’s YAMNet
docs/ Design notes, privacy policy, App Store prep
How detection works ### Architecture Each platform's audio stack (AVAudioEngine / AudioRecord + an on-device sound classifier) is reduced to one normalized stream of `ClassifierFrame { tMs, rmsDbfs, peakDbfs, snoreConf, speechConf }` at 16 kHz mono, 1 s window / 500 ms hop. Everything downstream — the adaptive noise-floor gate, the event/episode state machine, metrics, intensity buckets, timeline binning, clip policy, SQLite schema — is specified once in `spec/` and implemented as a pure, platform-free class in Swift and Kotlin, both proven against the same golden fixtures. See `spec/SHARED_BEHAVIOR_SPEC.md`. ### Detection defaults (v1.1) Classifier: YAMNet (AudioSet, 521 classes) as a Core ML program run CPU-only — the one path iOS allows a backgrounded, locked-screen app (Apple's built-in SoundAnalysis classifier dies at screen lock; verified on-device 2026-09-19). Windows are peak-normalized before inference; snore threshold 0.35 / strong 0.55 (Medium). 16 kHz mono · 1.0 s window / 500 ms hop · adaptive noise floor (min-follower +0.05 dB/frame) · gate = floor + 12 dB clamped [-56, -38] dBFS · positive = gated AND snoreConf ≥ threshold AND speech veto · event = ≥2 positive frames (or 1 strong) · episode = events merged ≤ 30 s gaps, confirmed at ≥3 events and ≥30 s span · intensity relative to room noise floor (light < +25 dB, moderate +25–40, loud ≥ +40).

Want something that tracks more than snoring? I’m also building Night Owl, a Raspberry Pi bedside tracker.

MIT licensed. YAMNet is Google’s, under Apache 2.0 (NOTICE).