skills/ui-audio-theme/SKILL.md
This skill should be used when the user asks to "generate a UI sound theme", "create button click sounds for my app", "design notification sounds", or "build a coordinated audio theme for my dashboard or wallet app", "make game menu sounds", "create HUD feedback sounds", "design TV navigation sounds", "audit the sounds on my existing site", "check that transaction sounds are wired", "review UI audio wiring", or "edit a generated UI sound". Generates, audits, edits, and wires cohesive UI audio themes mapped to semantic interactions via ElevenLabs and ffmpeg, with an interactive local picker for auditioning, revising, reassigning, and accepting candidates. Also covers a synthesized web micro-interaction delivery path via cuelume and a production-agnostic interaction taxonomy for choosing a distinct sound per named moment.
npx skillsauth add b-open-io/prompts ui-audio-themeInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Generate cohesive sets of subtle, minimal UI sound effects using ElevenLabs text-to-sound-effects API. Create "audio themes" — coordinated sets of sounds that share a common aesthetic and map to standard UI interaction constants.
Requires ELEVENLABS_API_KEY set in the environment. See README.md for setup instructions.
This skill produces UI audio two ways, chosen per event rather than per app:
.mp3/.wav
files for bespoke or branded cues, ambient and voice audio, and any target that
needs a shippable file (game/TV/desktop, per design-game-ui).references/cuelume-web-delivery.md for when to reach for it and how to wire it,
and assets/cuelume-event-map.json for the per-event fit.Before choosing sounds for any event on either path, pick a named moment from
references/interaction-taxonomy.md. Its 14-moment vocabulary and restraint rules —
a distinct sound per moment, the hover throttle, paired press/release, silent fallback —
are production-agnostic and apply whether the clip came from ElevenLabs or cuelume.
This skill is the single owner of existing-product audio audits, semantic
event-to-sound maps, UI-sound candidate generation, visual audition,
non-destructive editing, normalization, accepted asset manifests, and reusable
sound-slot or picker improvements. design-game-ui owns the upstream semantic
feedback-event map for purpose-built game/TV interfaces: what each event means,
exactly when it fires, its required visual equivalent, repetition policy,
accessibility, and acceptance criteria.
When invoked from design-game-ui, consume that event map rather than
redesigning navigation or inventing raw-key-triggered sounds. Frames owns audio
production; the application engineer owns runtime playback lifecycle; the
game-UI lead accepts the integrated behavior. voice-clone is separate and
should be used only when the requested asset is spoken voice.
cuelume-backed web micro-interactions (references/cuelume-web-delivery.md) are
web-only — they play through the browser's Web Audio API and never produce a file, so
they are out of scope for the game/TV/desktop file targets this section describes.
Those targets stay on the ElevenLabs pipeline, which writes files.
When an application already exists, or a new auth/payment/blockchain feature
landed after its theme was created, run the existing-app audit before generating
or rewiring sounds. Follow references/audit-and-wiring.md, copy
assets/event-map-template.json, and validate the completed map:
python scripts/audit_theme.py ./audio-event-map.json \
--theme ./public/audio/ui/theme.json
Inventory semantic state transitions across routes, overlays, async work, auth, payments, blockchain operations, keyboard, and gamepad input. Map each event to a sound or documented intentional silence. Treat unused theme slots as information, not a reason to invent noisy wiring. Require both source evidence and audible browser evidence. Fix event boundaries before judging the assets.
Before generating sounds, understand the application's aesthetic:
Application Context:
Audio Direction:
Available presets in assets/vibe-presets.json:
| Preset | Tone | Best For |
|--------|------|----------|
| corporate-trust | Warm, professional | Banking, finance |
| crypto-modern | Digital, clean | Wallet apps, trading |
| playful-delight | Bright, friendly | Social, consumer |
| minimal-focus | Ultra-subtle | Productivity, tools |
| retro-digital | 8-bit inspired | Games, nostalgic |
| pixel-minimal | Quiet 8-bit | Pixel-art sites, retro dashboards |
| premium-luxury | Rich, refined | High-end apps |
# Using preset vibe
python scripts/generate_theme.py \
--vibe "crypto-modern" \
--output-dir "./audio-theme"
# Using custom vibe description
python scripts/generate_theme.py \
--vibe-custom "warm organic subtle wooden interface sounds" \
--output-dir "./audio-theme"
# Generate specific categories only
python scripts/generate_theme.py \
--vibe "crypto-modern" \
--categories buttons feedback transactions \
--output-dir "./audio-theme"
# List available presets
python scripts/generate_theme.py --list-vibes
# List all sound names
python scripts/generate_theme.py --list-sounds
python scripts/generate_theme.py \
--regenerate "button-click-primary,notification-success" \
--vibe "crypto-modern" \
--output-dir "./audio-theme"
Taste can't be automated — after generating a baseline, let the user audition each slot and iterate. Two strategies; pick by runtime:
A. Local picker server (default — works in Claude Code AND Codex):
python scripts/sound_picker.py --vibe pixel-minimal --output-dir ./audio-theme
# → http://127.0.0.1:7777
Serves a local page with, per sound slot: a play button for the current file, an editable generation prompt (pre-filled from the vibe), "Generate next" for unlimited fresh candidates via ElevenLabs (auto-normalized), and compact always-open waveform cards. The selected take uses a persistent visual state, and clicking any card's waveform opens the shared editor. Compact icon controls support:
Every edit creates a new revision. Accepting a replacement snapshots the prior
accepted file into picker history first, so returning to an earlier version is
an ordinary audition-and-accept operation. The picker records prompt, source
slot, edit recipe, assignment provenance, and history in theme.json. Run it
in the background, hand the user the URL, and continue only after explicit
per-slot acceptance. No CSP constraints apply because it binds to localhost.
The picker is the default review interface, not an optional polish step. Give the user the local URL and wait for explicit per-slot selections. Do not treat the first generated baseline as accepted, and do not substitute filenames or a written description for listening. After acceptance, return the recorded winning prompts and event-to-file manifest to Frames or the implementation owner.
B. Artifact audition board (Claude Code only, when a hosted page is
preferred): hosted Artifacts enforce a strict CSP — no external requests, so
live generation inside the artifact is impossible. Instead: pre-generate 2-4
candidates per slot with --regenerate, embed each mp3 as a base64 data: URI
in an HTML page with play buttons and the prompt shown per candidate, publish
via the Artifact tool, and let the user reply with picks and prompt tweaks for
the next batch round. Iterative rounds instead of infinite Next; keep
candidate counts small — base64 audio inflates page size ~33%.
ElevenLabs SFX loudness tracks the prompt wording — "quiet"/"subtle" vibes can
come back peaking at -31 dBFS, inaudible once an app applies its own 20-40% UI
volume. The generator therefore peak-normalizes every file to -3 dBFS by
default (requires ffmpeg; pass --no-normalize to keep raw output). Keep
the vibe words for timbre; let the app's volume setting control loudness.
nav-item-hover for primary navigation/menu browse,
item-hover for other interactive items, and tooltip-show only when a real
tooltip becomes visible. Do not make tooltip audio the global hover sound.tx-sent after a wallet/network returns a broadcast
transaction id, tx-pending on the transition into a meaningful waiting
state, tx-confirmed on the first confirmed/fulfilled transition, and
tx-received only in a receiver-facing UI. Never fire them on the button
click that merely starts the operation.shell=True, leave output headroom, and retain
a previous accepted snapshot before replacement. Never normalize an edited
file in a way that cancels intentional gain changes.audio.play() resolving proves
playback, not perceptibility. Check peaks with
ffmpeg -i file.mp3 -af volumedetect -f null - and listen at the app's
actual volume multiplier before shipping.Each constant below maps to a named moment in references/interaction-taxonomy.md,
which defines its intended character and keeps press vs release and toggle vs
tick genuinely distinct. Note: press/release as a pointerdown/pointerup pair are
folded into the button-click-* constants today; the taxonomy names them explicitly so
a future generator or a cuelume-backed wiring can split them.
| Constant | Description |
|----------|-------------|
| button-click-primary | Main action buttons |
| button-click-secondary | Secondary/ghost buttons |
| button-click-destructive | Delete/cancel actions |
| Constant | Description |
|----------|-------------|
| item-hover | General interactive item hover/focus |
| nav-item-hover | Primary navigation/menu item hover/focus |
| nav-tab-switch | Tab navigation |
| nav-back | Back button/gesture |
| nav-forward | Forward navigation |
| nav-menu-open | Menu drawer open |
| nav-menu-close | Menu dismiss |
| Constant | Description |
|----------|-------------|
| notification-success | Success confirmation |
| notification-error | Error alert |
| notification-warning | Warning indicator |
| notification-info | Information notice |
| notification-badge | Badge/counter update |
| Constant | Description |
|----------|-------------|
| toggle-on | Switch enabled |
| toggle-off | Switch disabled |
| checkbox-check | Checkbox selected |
| checkbox-uncheck | Checkbox deselected |
| loading-start | Loading initiated |
| loading-complete | Loading finished |
| Constant | Description |
|----------|-------------|
| modal-open | Modal appearance |
| modal-close | Modal dismissal |
| tooltip-show | Tooltip reveal |
| dropdown-open | Dropdown expand |
| dropdown-close | Dropdown collapse |
| Constant | Description |
|----------|-------------|
| tx-sent | Transaction sent |
| tx-received | Payment received |
| tx-pending | Transaction waiting |
| tx-confirmed | Confirmation success |
audio-theme/
├── theme.json # Theme manifest
├── constants.ts # TypeScript constants
├── .picker/ # Immutable candidates, revisions, and history
├── buttons/
│ ├── button-click-primary.mp3
│ ├── button-click-secondary.mp3
│ └── button-click-destructive.mp3
├── navigation/
├── feedback/
├── states/
├── modals/
└── transactions/
--vibe NAME Preset vibe name
--vibe-custom DESC Custom vibe description
--output-dir PATH Output directory (default: ./audio-theme)
--format FORMAT mp3 or wav (default: mp3)
--categories CATS Specific categories to generate
--regenerate SOUNDS Comma-separated sounds to regenerate
--prompt-influence N 0-1, higher = stricter prompt adherence (default: 0.5)
--list-vibes Show available presets
--list-sounds Show all sound names
scripts/generate_theme.py — CLI tool for generating themesscripts/sound_picker.py — Local audition, assignment, editing, and history UIscripts/audit_theme.py — Validate an existing app's semantic event map against its themereferences/audit-and-wiring.md — Existing-product inventory, wiring, and evidence workflowreferences/sound-design-guide.md — Detailed sound design best practicesreferences/interaction-taxonomy.md — The 14-moment vocabulary + restraint rules (production-agnostic)references/cuelume-web-delivery.md — Synthesized web micro-interaction delivery via cuelumeassets/vibe-presets.json — Predefined vibe configurationsassets/cuelume-event-map.json — Our semantic events mapped onto cuelume's 14 soundsassets/theme-template.json — Example output manifestassets/event-map-template.json — Auditable interaction-to-sound map templateREADME.md — Prerequisites, design philosophy, integration examples (React hook, Howler.js), accessibility guidancetools
This skill should be used when a Claude Code session needs to keep working after Anthropic usage runs out, or when the user asks to run the Claude Code harness on GPT-5.6 Sol. Trigger phrases include "my Anthropic usage ran out", "I'm out of Claude usage", "usage limit reached, what now", "keep working on another model", "run Claude Code on GPT-5.6 Sol", "use GPT-5.6 Sol as the model", "set up claudex", "claudex isn't working", "route the harness through CLIProxyAPI", or "bill against my ChatGPT/Codex subscription". It stands up a local proxy so the Claude Code CLI runs on OpenAI's Codex backend as an escape hatch, and diagnoses that setup when it drifts. macOS + Homebrew.
testing
This skill should be used when the user asks to "open Visual Wayfinder", "answer a Wayfinder ticket visually", "turn this decision into a configurator", "show Wayfinder choices as a dashboard", "prototype the Wayfinder questionnaire", or wants interactive choice cards, tradeoff controls, rankings, ranges, toggles, and consequence previews for one active Wayfinder decision. It wraps the Wayfinder skill and JSON Render; it never replaces the tracker or resolves more than the active decision.
development
This skill should be used when the user asks to "make a visual proposal", "write this up so I can share it", "present these options visually", "diagram the trade-offs", "turn this plan into something reviewable", or requests a shareable design pitch, architecture proposal, RFC, options comparison, or visual roadmap for work that has not been built. It produces one self-contained, theme-aware HTML page led by grounded diagrams. Use visual-review instead for completed code changes; do not use this skill for internal task tracking.
tools
This skill should be used when the user asks to "add plugin settings", "make a plugin configurable", "store per-project plugin configuration", "use settings.local.json", "create a plugin state file", "expose skill settings in Agent Master", or "add a skill interface". Distinguishes official Claude Code settings from project-owned configuration and documents bOpen Agent Master skill interface discovery.