Tabletop RPG game masters spend hours curating playlists and manually triggering sound effects mid-session. It breaks immersion, splits focus, and most groups just skip audio entirely.
SuiteRhythm listens to what’s happening at the table and automatically plays the right sounds at the right time — no manual input needed.
The GM stays in the story. The players stay immersed. The audio just works.
SuiteRhythm uses speech recognition to capture live conversation, sends it through an AI analysis layer (GPT-4o-mini), and maps the output to a curated library of 450+ sound effects and ambient tracks — all in real time.
Voice Input → Speech Recognition → AI Context Analysis → Sound Matching → Playback
| Feature | Description |
|---|---|
| Auto-Detect Mode | Listens to live speech and triggers sounds automatically via AI |
| Story Mode | Pre-written narrative scenes with timed audio cues |
| Sound Library | 450+ categorized sounds — ambient, combat, weather, creatures, music |
| Control Board | Manual triggers for GMs who want direct control alongside auto-detect |
| Smart Layering | Multiple sounds play simultaneously with intelligent volume balancing |
| Instant Response | Sub-second latency from spoken word to audio playback |
The tabletop RPG market has grown into a $2B+ industry (2025), fueled by actual-play content (Critical Role, Dimension 20) and the mainstreaming of D&D. Supporting tools — VTTs, digital maps, audio — are a fast-growing adjacent segment.
No product on the market offers real-time, voice-reactive audio.
Current alternatives require manual playlist management (Syrinscape, Tabletop Audio) or pre-configured triggers. SuiteRhythm is the first to close the loop between spoken narrative and dynamic audio — zero-touch.
| Layer | Technology |
|---|---|
| Frontend | Next.js 15, React 19 |
| Audio Engine | Howler.js — custom engine with layering, fading, preloading |
| AI Analysis | OpenAI GPT-4o-mini (server-side) |
| Speech Recognition | Web Speech API (native browser) |
| Database | Supabase (PostgreSQL) |
| Media Storage | Cloudflare R2 (450+ audio files via CDN proxy) |
| Hosting | Vercel (serverless, edge-optimized) |
┌──────────────────────────────────────────────────┐
│ Browser Client │
│ │
│ ┌──────────┐ ┌──────────┐ ┌────────────────┐ │
│ │ Speech │→│ AI │→│ Sound Engine │ │
│ │ Input │ │ Director │ │ (Howler.js) │ │
│ └──────────┘ └──────────┘ └────────────────┘ │
│ ↕ │
└──────────────────────┼─────────────────────────────┘
│ API
┌────────────┼────────────┐
│ │ │
┌─────▼─────┐ ┌───▼────┐ ┌───▼────┐
│ OpenAI │ │Supabase│ │ R2 │
│ GPT-4o │ │ (DB) │ │ (CDN) │
└───────────┘ └────────┘ └────────┘
| Tier | Price | Features |
|---|---|---|
| Free | $0 | Core auto-detect, limited sound library |
| Pro | $10/mo | Full library, story mode, custom sounds, priority AI |
| Table License | $20/mo | Multi-device sync, shared sessions, commercial use |
window.SuiteRhythm)SuiteRhythm exposes a small, stable command surface for external controllers — Stream Deck plugins, OBS browser sources, bookmarklets, webhooks, and anonymous Twitch chat. Every channel funnels into the same rate-limited handler, so your integration never depends on engine internals.
// 1. Direct JS (same-page integrations / devtools)
await window.SuiteRhythm.trigger('thunder'); // by name or id
await window.SuiteRhythm.trigger('rolling thunder', { volume: 0.8 });
await window.SuiteRhythm.stopAll();
await window.SuiteRhythm.scene('Combat');
window.SuiteRhythm.status(); // { mode, mood, listening, music, activeSounds, twitch }
// 2. CustomEvent (for modules that load before window.SuiteRhythm is attached)
window.dispatchEvent(new CustomEvent('suiterhythm:command', {
detail: { type: 'trigger', query: 'thunder' }
}));
// 3. postMessage (OBS browser sources / iframes — origin-gated)
window.postMessage({ suiterhythm: 'trigger', query: 'thunder' }, '*');
All trigger calls resolve to { ok, name, soundId, url, source } so you can later stop a specific instance with the engine API.
window.SuiteRhythm.twitch.connect('aaronc1992');
// Viewers can now type in chat:
// !sfx thunder → plays a thunder SFX
// !stop → stops all audio
// !scene Combat → applies the Combat scene preset
window.SuiteRhythm.twitch.disconnect();
SuiteRhythm joins as an anonymous justinfan* user over Twitch’s WebSocket IRC gateway — read-only, no tokens, no chat writes. Unknown bang-commands are ignored. Commands are rate-limited (500ms per type:query pair by default) so a chat flood can’t thrash the audio graph.
postMessage commands from cross-origin pages are rejected unless the origin is in allowedOrigins (set when constructing the bridge). Same-origin messages always pass.{ ok: false, error: 'unknown command' } rather than throwing, so older clients don’t crash when a newer bridge adds commands.Interested in SuiteRhythm? Reach out: