The AI Agent for Boring Situations. Also, somehow, a pocket-sized snoring coach.
OpenSnoRE is a small, weird, useful React app that does two things:
- It generates theatrical synthetic snoring for moments of maximum boredom.
- It gives you guided, evidence-inspired myofunctional exercises that may help reduce real snoring over time.
It is part toy, part wellness experiment, part audio sandbox, and part invitation to build the world's friendliest open-source snoring lab.
If that sentence made you smile, please star the repo. If it made you think "I can make this better," please fork it.
- Web app: https://opensnore.newaiyork.com
- Latest Mac build: https://github.com/amolsarva/OpenSNORE/releases/latest
- iPhone/PWA install: open the web app in Safari, tap Share, then Add to Home Screen.
Press the big button and OpenSnoRE becomes your personal anti-productivity assistant.
Current snore personalities:
- The Gentleman: subtle, dignified, almost apologetic.
- The Chainsaw: industrial, relentless, emotionally unavailable.
- The Harmonist: musical enough to be suspicious.
- The Freight Train: deep, low, tectonic.
Under the hood, these are generated live with the Web Audio API. No snore files are shipped. The app synthesizes pink noise, shapes it through filters, adds envelopes, sweeps resonances, applies optional distortion, and occasionally gets a little too proud of itself.
Choose what you are suffering through:
- team standup
- quarterly review
- mandatory HR training
- terms and conditions
- NFT pitch meeting
- synergy discussion
- and other tragic modern experiences
The app tracks your endured time, snore count, and boredom level. This is not science. This is office anthropology.
OpenSnoRE also includes guided exercises for the throat, tongue, jaw, soft palate, and breathing patterns.
Current exercise categories:
- Tongue: tongue slides, tongue presses, posture training.
- Throat & Jaw: vowel articulation, singing scales, jaw release.
- Breathing: 4-7-8 breathing, belly breathing, humming breath.
Current guided programs:
- The First Timer
- Morning Protocol
- Pre-Sleep Wind-Down
- The Full Treatment
- The Choir Method
Each exercise has timed steps, reps, progress UI, completion state, and short science notes so the app feels less like a checklist and more like a coach with a timer.
OpenSnoRE is not a medical device, diagnostic tool, or replacement for clinical care.
Snoring can be harmless, annoying, relationship-damaging, or a symptom of obstructive sleep apnea. If snoring is loud, chronic, associated with choking/gasping, daytime sleepiness, morning headaches, high blood pressure, or witnessed breathing pauses, please talk to a qualified clinician or sleep specialist.
The exercises here are inspired by myofunctional therapy research, but the app does not diagnose conditions or guarantee outcomes.
- React 18
- Vite 5
- Web Audio API
- Progressive Web App manifest + service worker
- Electron 32 for the desktop build
- GitHub Actions for Pages deploys and Mac release builds
There is intentionally no backend today. Everything runs locally in the browser or Electron shell.
opensnore/
electron/
main.js # Electron window wrapper
public/
manifest.json # PWA metadata
sw.js # tiny service worker
icon-192.png
icon-512.png
apple-touch-icon.png
CNAME # custom GitHub Pages domain
src/
App.jsx # main app shell, tabs, snore mode
main.jsx # React entrypoint
index.css # app styling
audio/
snoreEngine.js # procedural snore synthesis engine
components/
ExercisePlayer.jsx # guided timed exercise modal
SituationPicker.jsx # boredom scenario picker
SleepingCharacter.jsx # sleepy character UI
StopSnoringPage.jsx # exercise library and programs
data/
exercises.js # exercise and program content
.github/workflows/
deploy.yml # GitHub Pages deployment
build-mac.yml # tagged Mac DMG release build
Requirements:
- Node.js 20 or newer is recommended.
- npm
Install dependencies:
npm ciStart the web app:
npm run devVite will print a local URL, usually:
http://localhost:5173
Build the web app:
npm run buildPreview the production build:
npm run previewRun the Electron app in development:
npm run electron:devBuild the Mac desktop app:
npm run electron:buildThe Electron output is written to:
dist-electron/
The snore engine lives in src/audio/snoreEngine.js.
At a high level:
- Create a pink-noise buffer.
- Route it through one or more bandpass filters.
- Add a low shelf for body and rumble.
- Shape the amplitude with a breathing-like envelope.
- Sweep filter frequencies during the snore.
- Optionally add distortion.
- Optionally layer a pitched oscillator for musical snores.
- Loop the result according to the selected personality.
This gives contributors a fun place to experiment. You can add a new snore personality by extending the PERSONALITIES object with different frequency ranges, gain, duration, pause, Q value, distortion, and tone settings.
Example shape:
{
id: 'new-personality',
name: 'The Dramatic Example',
emoji: '🎭',
description: 'A description with personality.',
color: '#14b8a6',
filterFreq: [120, 420],
gain: 0.7,
q: 2.4,
duration: 2.5,
pause: 500,
distortion: 15,
addTone: false,
}Exercises live in src/data/exercises.js.
An exercise has:
- an
id - a display
name - an
emoji - a
category - a
difficulty - a user-facing
benefit - a short
sciencenote - timed
steps - a
repscount
Programs are just curated lists of exercise IDs.
If you add exercises, keep them:
- clear enough to do without a coach standing nearby
- timed in practical chunks
- honest about evidence
- gentle about discomfort
- careful not to imply medical diagnosis
The web app deploys to GitHub Pages from the website branch using .github/workflows/deploy.yml.
Tagged releases matching v* can trigger the Mac app workflow in .github/workflows/build-mac.yml, which builds a DMG and uploads it to the GitHub release.
This is where forks can get interesting.
Let users upload a sleep audio recording and get a useful, privacy-respecting analysis of what is happening.
Possible first version:
- upload an audio file locally
- decode it in the browser
- detect likely snore events
- show a timeline of snoring intensity
- estimate snore frequency bands
- cluster snores into types, such as nasal, palatal, tongue-base, or irregular patterns
- flag moments that may deserve medical attention, without pretending to diagnose
- generate a "what to try next" exercise plan
Technical ingredients we may need:
- Web Audio decoding
- spectral analysis / FFT
- onset detection
- amplitude envelope tracking
- band energy ratios
- optional ML model for snore classification
- careful privacy design so recordings can stay local by default
- clear disclaimers around sleep apnea and medical risk
Stretch version:
- compare recordings before and after exercise programs
- nightly snore score trends
- exportable sleep report
- anonymized open dataset tooling for people who opt in
- model cards and evaluation notes for any classifier
Add new procedural snore characters:
- The Espresso Machine
- The Harbor Fog Horn
- The Haunted Accordion
- The Startup Founder Breathing Through A Pitch Deck
- The Tiny Polite Nap
- The Subwoofer Under A Mattress
Bonus points for personalities that are funny in the UI and meaningfully different in the audio graph.
Ideas:
- daily streaks
- reminders
- adaptive programs
- form tips
- voice-guided exercise mode
- "quiet mode" for doing exercises near sleeping people
- progress journal
- before/after self-ratings
- partner feedback mode
Make the science more transparent:
- cite the studies behind myofunctional therapy
- separate strong evidence from promising evidence
- add plain-English summaries
- link each exercise to the mechanism it targets
- include "what this does not prove" notes
OpenSnoRE should be easy to use when tired, in bed, on a phone, or half-awake.
Wishlist:
- reduced-motion mode
- stronger keyboard navigation
- screen-reader review
- high-contrast theme
- larger timer mode
- captions for voice-guided exercises
- haptic cues on mobile where supported
The current service worker is tiny. It can become much better.
Ideas:
- richer offline caching
- install prompts
- update notifications
- offline exercise history
- local-only settings persistence
Electron wishlist:
- menu items
- app icon build resources
- signed and notarized Mac builds
- Windows and Linux builds
- auto-update flow
- local recording analysis with desktop file handling
Make the repo friendlier for new contributors:
- tests for the snore engine helpers
- component tests for exercise flows
- linting and formatting scripts
- issue templates
- PR template
- contributor guide
- architecture notes
- visual regression snapshots
Things that would be delightful:
- community-submitted snore personalities
- "snore jam" audio presets
- leaderboard for most ridiculous synthetic snore
- open exercise packs for singers, wind-instrument players, mouth breathers, and CPAP users
- local-first sleep diary
- generated bedtime soundscapes that respond to snore patterns
- a "make my meeting survivable" mode that keeps the joke but lowers the chaos
Looking for a manageable first fork? Try one of these:
- Add a new snore personality in
src/audio/snoreEngine.js. - Add one new boring situation in
src/components/SituationPicker.jsx. - Add a new guided exercise in
src/data/exercises.js. - Improve mobile spacing in
src/index.css. - Add persistent settings for the selected snore personality.
- Add a reduced-motion preference.
- Add a simple test setup.
- Improve the service worker cache list.
OpenSnoRE is playful, but good contributions should still be careful.
Please aim for:
- small, focused pull requests
- clear descriptions of what changed
- screenshots or screen recordings for UI changes
- honest wording around health claims
- local-first privacy for audio features
- no surprise backend requirements
- no dark patterns
If you are changing audio behavior, describe what changed and why. A snore can be funny and still have an implementation rationale.
- Funny first, useful second, misleading never.
- Local by default. Especially for future audio recording analysis.
- Tiny surface area. The app should stay easy to run and fork.
- No fake diagnosis. Helpful signals are welcome; medical claims need evidence.
- Make it inviting. A contributor should be able to add a personality, exercise, or UI polish without needing a week-long onboarding.
npm run dev # start Vite
npm run build # build web app
npm run preview # preview production build
npm run electron:dev # run Electron + Vite together
npm run electron:build # build Mac DMGNo license file is currently included. If you plan to reuse, redistribute, or build on this project publicly, add a license first so contributors know the rules.
If OpenSnoRE made you laugh, helped you think about sleep, or gave you a strange urge to write Web Audio filters, please:
- star the repo
- fork it
- open an issue with an idea
- send a tiny PR
- build the audio-analysis future
The dream is simple: make snoring less mysterious, make boring situations more survivable, and make the codebase welcoming enough that a curious developer can land a contribution before their tea gets cold.