{"id":"fe98208f-ebda-4898-bd6d-eabf4a3c2827","shortId":"szncJJ","kind":"skill","title":"ui-sound-design","tagline":"Programmatic UI sound design using Web Audio API and Tone.js. Use when creating click sounds, notification chimes, toggle feedback, hover sounds, success/error audio, whoosh effects, or building a sound library for UI interactions. Provides an iterative describe-generate-listen-r","description":"```\n  ▁ ▃ ▅ ▇ ▅ ▃ ▁     ▁ ▃ ▅ ▇ ▅ ▃ ▁     ▁ ▃ ▅ ▇ ▅ ▃ ▁\n██╗   ██╗██╗    ███████╗ ██████╗ ██╗   ██╗███╗   ██╗██████╗\n██║   ██║██║    ██╔════╝██╔═══██╗██║   ██║████╗  ██║██╔══██╗\n██║   ██║██║    ███████╗██║   ██║██║   ██║██╔██╗ ██║██║  ██║\n██║   ██║██║    ╚════██║██║   ██║██║   ██║██║╚██╗██║██║  ██║\n╚██████╔╝██║    ███████║╚██████╔╝╚██████╔╝██║ ╚████║██████╔╝\n ╚═════╝ ╚═╝    ╚══════╝ ╚═════╝  ╚═════╝ ╚═╝  ╚═══╝╚═════╝\n      ░ ▒ ▓ █ ▓ ▒ ░     ░ ▒ ▓ █ ▓ ▒ ░     ░ ▒ ▓ █ ▓ ▒ ░\n       ██████╗ ███████╗███████╗██╗ ██████╗ ███╗   ██╗\n       ██╔══██╗██╔════╝██╔════╝██║██╔════╝ ████╗  ██║\n       ██║  ██║█████╗  ███████╗██║██║  ███╗██╔██╗ ██║\n       ██║  ██║██╔══╝  ╚════██║██║██║   ██║██║╚██╗██║\n       ██████╔╝███████╗███████║██║╚██████╔╝██║ ╚████║\n       ╚═════╝ ╚══════╝╚══════╝╚═╝ ╚═════╝ ╚═╝  ╚═══╝\n  ▇ ▅ ▃ ▁ ▃ ▅ ▇     ▇ ▅ ▃ ▁ ▃ ▅ ▇     ▇ ▅ ▃ ▁ ▃ ▅ ▇\n```\n\nDescribe what your UI should sound like.\nPreview it, tweak it, and download it from the browser.\n\n# UI Sound Design\n\nTranslate plain-English sound descriptions into working Web Audio API code. No audio engineering background needed — describe what you want to hear, and this skill provides the synthesis knowledge to make it real.\n\n## Workflow\n\nEvery sound follows this loop: **Describe → Generate → Listen → Refine** (with optional **Review** for auditing existing code)\n\n### 1. Describe\n\nThe user describes the sound in plain language. Ask clarifying questions using this framework:\n\n**Four questions before generating any sound:**\n\n1. **What triggers it?** (click, hover, toggle, notification, transition, success, error)\n2. **What's the emotional tone?** (satisfying, subtle, urgent, playful, professional, minimal)\n3. **How prominent should it be?** (barely perceptible, noticeable, attention-grabbing)\n4. **Any reference points?** (iOS keyboard, Slack notification, macOS trash, game UI, \"like a bubble popping\")\n5. **Have an audio reference file?** If the user has a .wav or .mp3 file they want to match, direct them to run the analyzer:\n\n   ```\n   node skills/ui-sound-design/tools/analyze-sound.mjs path/to/reference.wav\n   ```\n\n   Then paste the output back. When a sound profile is provided:\n   1. Load `references/audio-file-references.md` for interpretation guidance\n   2. Read the `synthesis_suggestion` block for initial parameters\n   3. Match to the closest **sound category** using `recipe_starting_point`\n   4. Load that recipe from `references/sound-recipes.md`\n   5. Override recipe defaults with the profile's suggested parameters\n   6. Apply any vocabulary bridge terms from the profile's `VOCABULARY MATCH` section\n   7. Proceed to Generate as normal\n\nIf the user gives a vague request like \"make a click sound\", use sensible defaults from the recipes and generate immediately — don't over-ask.\n\n### 2. Generate\n\n1. Match the description to a **sound category** (see quick reference below)\n2. Load the recipe from `references/sound-recipes.md`\n3. Apply the **vocabulary bridge** to translate adjectives into parameter changes\n4. For novel sounds not covered by recipes, compose from building blocks in `references/web-audio-api.md`\n5. Output format: **HTML preview** by default (adapt `assets/sound-preview.html`), or ES module / React hook / class if requested\n\n### 3. Listen\n\nProvide the HTML preview file so the user can open it in a browser and hear the sound immediately. Each sound includes a download button that exports a .wav file for use in production code or handoff to developers. Include labeled buttons for each sound variation. The preview must:\n- Handle AudioContext suspension (user gesture to start)\n- Use the singleton AudioContext pattern\n- Include visual feedback on play (the template handles this)\n\n### 4. Refine\n\nWhen the user gives feedback, translate it using the vocabulary bridge and adjust parameters. Common refinement patterns:\n- \"I like it but...\" → tweak 1-2 parameters\n- \"Completely wrong\" → try a different recipe/approach\n- \"Too much/little\" → scale the relevant parameter up/down\n- \"More like X\" → identify what makes X distinctive and match those characteristics\n\n### 5. Review (optional)\n\nEnter review mode when the user says \"review\", \"audit\", or \"check my sound code\", or pastes existing Web Audio code for evaluation.\n\n**Steps:**\n1. Load rules from `references/audio-rules.md`\n2. Scan the code against each rule, starting with Critical priority\n3. Report findings using the format in `audio-rules.md` — one line per violation with `file:line — [rule-id] description`\n4. Provide a summary table (pass/fail counts by priority)\n5. Suggest concrete fixes for each failing rule\n\n**When to stay in generate mode:** If the user's request is ambiguous (e.g., \"here's my click sound\" without asking for review), default to the generative workflow. Only enter review mode when the intent to audit is clear.\n\n## Vocabulary Bridge\n\nThis is the core translation layer. When the user uses subjective language, map it to synthesis parameters:\n\n| User Says | Parameter Change | Example |\n|-----------|-----------------|---------|\n| \"Brighter\" | Raise frequency or filter cutoff | Filter cutoff 1500 → 3000 Hz |\n| \"Warmer\" | Lower filter cutoff, use sine/triangle wave | Switch sawtooth → sine, cutoff 3000 → 1200 |\n| \"Darker\" | Lower frequency, reduce high harmonics | Add lowpass filter at 800 Hz |\n| \"Snappier\" | Shorter attack and decay | Decay 0.15 → 0.05s |\n| \"Softer\" | Lower volume, longer attack, gentle envelope | Volume 0.3 → 0.15, attack 0 → 0.01s |\n| \"Louder\" / \"More prominent\" | Raise volume (max 0.8) | Volume 0.2 → 0.4 |\n| \"Fuller\" / \"Richer\" | Layer oscillators, add detune | Add second osc detuned +7 cents |\n| \"Thinner\" | Remove layers, use sine wave, raise highpass | Single sine, highpass at 500 Hz |\n| \"More metallic\" | FM synthesis, inharmonic ratios | Mod ratio 1.4, increase mod depth |\n| \"More organic\" / \"Natural\" | Use noise components, subtle randomness | Mix in filtered noise burst |\n| \"Shorter\" / \"Crisper\" | Reduce total duration | Duration 0.15 → 0.06s |\n| \"Longer\" / \"More sustained\" | Increase duration and sustain | Duration 0.1 → 0.3s, add sustain phase |\n| \"More playful\" | Higher pitch, bounce/overshoot | Frequency +200 Hz, add pitch overshoot |\n| \"More professional\" | Subtle, clean, minimal | Lower volume, sine wave, short duration |\n| \"Retro\" / \"8-bit\" | Square wave, quantized pitch | Switch to square, use note frequencies |\n| \"Bubbly\" | Rapid pitch drop, sine wave | startFreq 2000, quick exponential drop |\n\n## Sound Categories — Quick Reference\n\n| Category | Duration | Recipe | Trigger | Key Character |\n|----------|----------|--------|---------|---------------|\n| Click | 10–80ms | `references/sound-recipes.md#click` | Button press, tap | Noise burst, bandpass filtered |\n| Toggle | 80–200ms | `references/sound-recipes.md#toggle` | Switch on/off | Rising/falling pitch sweep |\n| Hover | 30–80ms | `references/sound-recipes.md#hover` | Mouse enter | Gentle, nearly subliminal |\n| Success | 200–500ms | `references/sound-recipes.md#success` | Task complete, save | Ascending major third |\n| Error | 150–400ms | `references/sound-recipes.md#error` | Validation fail, rejected | Descending, buzzy |\n| Warning | 150–350ms | `references/sound-recipes.md#warning` | Caution state | Double pulse, mid-range |\n| Notification | 200–800ms | `references/sound-recipes.md#notification` | New message, alert | Bell-like FM synthesis |\n| Whoosh | 100–400ms | `references/sound-recipes.md#whoosh` | Page transition, slide | Filtered noise sweep |\n| Pop | 30–80ms | `references/sound-recipes.md#pop` | Add item, bubble, appear | Sine with pitch drop |\n| Custom | varies | `references/web-audio-api.md` | Anything else | Compose from building blocks |\n\n## Critical Implementation Rules\n\n### AudioContext user-gesture requirement\nBrowsers block audio until a user interaction (click, tap, keydown). Always initialize or resume the AudioContext inside an event handler. The singleton pattern in `references/web-audio-api.md` handles this.\n\n### Never ramp gain to zero\n`exponentialRampToValueAtTime(0, ...)` throws an error. Always ramp to `0.001` — it's inaudible but mathematically valid. This applies to every sound. No exceptions.\n\n### Node cleanup\n- OscillatorNodes auto-disconnect after `stop()` — no manual cleanup needed\n- BufferSourceNodes are one-shot — create a new one each play\n- For long-lived filter/gain nodes, call `disconnect()` when done\n- Never create a new AudioContext per sound — use the singleton\n\n### Volume safety\n- Default volume: `0.3` (gain value)\n- Maximum volume: `0.8` — never exceed this\n- Hover sounds: `0.03–0.08` (barely perceptible)\n- UI sounds should complement, not dominate — err on the side of quiet\n\n### Scheduling precision\nCapture `const now = ctx.currentTime` once at the start of each sound function. Derive all scheduling times from `now`. Never read `currentTime` multiple times.\n\n### Use exponential ramps by default\n`exponentialRampToValueAtTime` sounds natural for both volume and frequency. `linearRampToValueAtTime` sounds mechanical. Only use linear for sub-50ms transitions.\n\n## Output Formats\n\n### HTML Preview (default)\nAdapt `assets/sound-preview.html`. Self-contained, no dependencies, opens in any browser. Best for the iterative listen-refine loop. Includes WAV download — click the download button on any sound to get a .wav file. Sound functions must use `(ctx, dest)` parameters with fallback defaults for download support, and each sound needs a matching entry in the `durations` map.\n\n### ES Module\n```javascript\n// ui-sounds.js\nexport function playClick(options) { /* ... */ }\nexport function playSuccess(options) { /* ... */ }\n```\n\n### React Hook\n```javascript\n// useUISound.js\nexport function useUISound() {\n  const ctxRef = useRef(null);\n  const getCtx = useCallback(() => { /* singleton */ }, []);\n  return { playClick, playSuccess, /* ... */ };\n}\n```\n\n### Sound Library Class\nUse the `UISoundLibrary` class from `references/sound-recipes.md`. Bundles all sounds with enable/disable and master volume control.\n\n## Resources\n\n### references/\n- **`web-audio-api.md`** — Core Web Audio API building blocks: oscillators, envelopes, filters, noise, FM synthesis, factory patterns, common mistakes. Load when building custom sounds or understanding low-level mechanics.\n- **`sound-recipes.md`** — Complete working implementations for all 9 sound categories plus a bundled `UISoundLibrary` class. Each recipe includes parameters, code, tuning guide, and variations. **Start here for most requests.**\n- **`audio-rules.md`** — Formal validation rules with IDs, priorities, and pass/fail examples. Load when reviewing existing code or when you need to verify generated output against best practices.\n- **`tone-js.md`** — Tone.js abstractions for faster prototyping. Simplified synth types, recipe equivalents, effects, and a conversion guide to vanilla Web Audio. Load when the user prefers Tone.js or wants rapid iteration.\n- **`audio-file-references.md`** — How to interpret sound profiles from the `analyze-sound.mjs` CLI tool. Maps audio analysis metrics to synthesis parameters and recipe selection. Load when the user provides a sound profile from an audio file reference.\n\n### assets/\n- **`sound-preview.html`** — Self-contained HTML template with all 10 default sounds, visual feedback, and AudioContext handling. Adapt this for every preview output.\n\n### tools/\n- **`analyze-sound.mjs`** — CLI script that analyzes .wav/.mp3 files and outputs a sound profile. Run with `node tools/analyze-sound.mjs <file>`. Zero dependencies — works with any Node.js installation. Supports .wav natively; other formats require ffmpeg. Outputs duration, envelope, spectral content, tonality, and a synthesis suggestion that maps directly to recipe parameters.","tags":["sound","design","skill","dannyjpwilliams","agent-skills","claude-code","sound-design","tone-js","ui-sounds","web-audio-api"],"capabilities":["skill","source-dannyjpwilliams","skill-ui-sound-design","topic-agent-skills","topic-claude-code","topic-sound-design","topic-tone-js","topic-ui-sounds","topic-web-audio-api"],"categories":["ui-sound-design-skill"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/dannyjpwilliams/ui-sound-design-skill/ui-sound-design","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add dannyjpwilliams/ui-sound-design-skill","source_repo":"https://github.com/dannyjpwilliams/ui-sound-design-skill","install_from":"skills.sh"}},"qualityScore":"0.464","qualityRationale":"deterministic score 0.46 from registry signals: · indexed on github topic:agent-skills · 29 github stars · SKILL.md body (11,751 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-05-01T13:02:29.491Z","embedding":null,"createdAt":"2026-04-18T22:22:36.794Z","updatedAt":"2026-05-01T13:02:29.491Z","lastSeenAt":"2026-05-01T13:02:29.491Z","tsv":"'+200':792 '+7':722 '-2':475 '0':699,994 '0.001':1001 '0.01':700 '0.03':1073 '0.05':686 '0.06':770 '0.08':1074 '0.1':780 '0.15':685,697,769 '0.2':710 '0.3':696,781,1062 '0.4':711 '0.8':708,1067 '1':117,139,229,318,474,528 '1.4':746 '10':843,1406 '100':921 '1200':666 '150':886,896 '1500':651 '2':150,235,316,330,533 '200':875,908 '2000':828 '200ms':856 '3':162,244,336,378,544 '30':865,932 '3000':652,665 '350ms':897 '4':174,255,347,450,563 '400ms':887,922 '5':190,261,361,502,572 '500':736 '500ms':876 '50ms':1136 '6':271 '7':284 '8':809 '80':855 '800':677 '800ms':909 '80ms':844,866,933 '9':1285 'abstract':1335 'adapt':368,1143,1414 'add':673,716,718,783,794,936 'adject':343 'adjust':464 'alert':914 'alway':971,998 'ambigu':592 'analysi':1376 'analyz':214,1425 'analyze-sound.mjs':1371,1421 'anyth':947 'api':12,76,1255 'appear':939 'appli':272,337,1009 'ascend':882 'ask':127,315,600 'asset':1397 'assets/sound-preview.html':369,1144 'attack':681,692,698 'attent':172 'attention-grab':171 'audio':11,27,75,79,193,523,963,1254,1352,1375,1394 'audio-file-references.md':1363 'audio-rules.md':551,1307 'audiocontext':430,439,956,976,1052,1412 'audit':114,513,616 'auto':1019 'auto-disconnect':1018 'back':222 'background':81 'bandpass':852 'bare':168,1075 'bell':916 'bell-lik':915 'best':1154,1331 'bit':810 'block':240,358,952,962,1257 'bounce/overshoot':790 'bridg':275,340,462,620 'brighter':643 'browser':62,393,961,1153 'bubbl':188,821,938 'buffersourcenod':1027 'build':31,357,951,1256,1270 'bundl':1240,1290 'burst':762,851 'button':404,421,847,1168 'buzzi':894 'call':1044 'captur':1091 'categori':250,325,833,836,1287 'caution':900 'cent':723 'chang':346,641 'charact':841 'characterist':501 'check':515 'chime':21 'clarifi':128 'class':375,1233,1237,1292 'clean':800 'cleanup':1016,1025 'clear':618 'cli':1372,1422 'click':18,143,300,597,842,846,968,1165 'closest':248 'code':77,116,414,518,524,536,1297,1321 'common':466,1266 'complement':1080 'complet':477,880,1280 'compon':755 'compos':355,949 'concret':574 'const':1092,1220,1224 'contain':1147,1401 'content':1455 'control':1248 'convers':1347 'core':624,1252 'count':569 'cover':352 'creat':17,1032,1049 'crisper':764 'critic':542,953 'ctx':1181 'ctx.currenttime':1094 'ctxref':1221 'currenttim':1111 'custom':944,1271 'cutoff':648,650,657,664 'darker':667 'decay':683,684 'default':264,304,367,603,1060,1118,1142,1186,1407 'depend':1149,1438 'depth':749 'deriv':1103 'descend':893 'describ':42,46,83,106,118,121 'describe-generate-listen-r':41 'descript':71,321,562 'design':4,8,65 'dest':1182 'detun':717,721 'develop':418 'differ':481 'direct':209,1463 'disconnect':1020,1045 'distinct':497 'domin':1082 'done':1047 'doubl':902 'download':58,403,1164,1167,1188 'drop':824,831,943 'durat':767,768,776,779,807,837,1199,1452 'e.g':593 'effect':29,1344 'els':948 'emot':154 'enable/disable':1244 'engin':80 'english':69 'enter':505,609,870 'entri':1196 'envelop':694,1259,1453 'equival':1343 'err':1083 'error':149,885,889,997 'es':371,1201 'evalu':526 'event':979 'everi':101,1011,1417 'exampl':642,1316 'exceed':1069 'except':1014 'exist':115,521,1320 'exponenti':830,1115 'exponentialramptovalueattim':993,1119 'export':406,1205,1209,1217 'factori':1264 'fail':578,891 'fallback':1185 'faster':1337 'feedback':23,443,456,1410 'ffmpeg':1450 'file':195,204,384,409,557,1176,1395,1427 'filter':647,649,656,675,760,853,928,1260 'filter/gain':1042 'find':546 'fix':575 'fm':740,918,1262 'follow':103 'formal':1308 'format':363,549,1139,1448 'four':133 'framework':132 'frequenc':645,669,791,820,1126 'fuller':712 'function':1102,1178,1206,1210,1218 'gain':990,1063 'game':184 'generat':43,107,136,287,309,317,584,606,1328 'gentl':693,871 'gestur':433,959 'get':1173 'getctx':1225 'give':293,455 'grab':173 'guid':1299,1348 'guidanc':234 'handl':429,448,986,1413 'handler':980 'handoff':416 'harmon':672 'hear':88,395 'high':671 'higher':788 'highpass':731,734 'hook':374,1214 'hover':24,144,864,868,1071 'html':364,382,1140,1402 'hz':653,678,737,793 'id':561,1312 'identifi':493 'immedi':310,398 'implement':954,1282 'inaud':1004 'includ':401,419,441,1162,1295 'increas':747,775 'inharmon':742 'initi':242,972 'insid':977 'instal':1443 'intent':614 'interact':37,967 'interpret':233,1366 'io':178 'item':937 'iter':40,1157,1362 'javascript':1203,1215 'key':840 'keyboard':179 'keydown':970 'knowledg':95 'label':420 'languag':126,632 'layer':626,714,726 'level':1277 'librari':34,1232 'like':52,186,297,470,491,917 'line':553,558 'linear':1132 'linearramptovalueattim':1127 'listen':44,108,379,1159 'listen-refin':1158 'live':1041 'load':230,256,331,529,1268,1317,1353,1384 'long':1040 'long-liv':1039 'longer':691,772 'loop':105,1161 'louder':702 'low':1276 'low-level':1275 'lower':655,668,689,802 'lowpass':674 'maco':182 'major':883 'make':97,298,495 'manual':1024 'map':633,1200,1374,1462 'master':1246 'match':208,245,282,319,499,1195 'mathemat':1006 'max':707 'maximum':1065 'mechan':1129,1278 'messag':913 'metal':739 'metric':1377 'mid':905 'mid-rang':904 'minim':161,801 'mistak':1267 'mix':758 'mod':744,748 'mode':507,585,611 'modul':372,1202 'mous':869 'mp3':203 'much/little':484 'multipl':1112 'must':428,1179 'nativ':1446 'natur':752,1121 'near':872 'need':82,1026,1193,1325 'never':988,1048,1068,1109 'new':912,1034,1051 'node':215,1015,1043,1435 'node.js':1442 'nois':754,761,850,929,1261 'normal':289 'note':819 'notic':170 'notif':20,146,181,907,911 'novel':349 'null':1223 'on/off':860 'one':552,1030,1035 'one-shot':1029 'open':389,1150 'option':111,504,1208,1212 'organ':751 'osc':720 'oscil':715,1258 'oscillatornod':1017 'output':221,362,1138,1329,1419,1429,1451 'over-ask':313 'overrid':262 'overshoot':796 'page':925 'paramet':243,270,345,465,476,488,637,640,1183,1296,1380,1466 'pass/fail':568,1315 'past':219,520 'path/to/reference.wav':217 'pattern':440,468,983,1265 'per':554,1053 'percept':169,1076 'phase':785 'pitch':789,795,814,823,862,942 'plain':68,125 'plain-english':67 'play':159,445,787,1037 'playclick':1207,1229 'playsuccess':1211,1230 'plus':1288 'point':177,254 'pop':189,931,935 'practic':1332 'precis':1090 'prefer':1357 'press':848 'preview':53,365,383,427,1141,1418 'prioriti':543,571,1313 'proceed':285 'product':413 'profession':160,798 'profil':226,267,279,1368,1391,1432 'programmat':5 'promin':164,704 'prototyp':1338 'provid':38,92,228,380,564,1388 'puls':903 'quantiz':813 'question':129,134 'quick':327,829,834 'quiet':1088 'r':45 'rais':644,705,730 'ramp':989,999,1116 'random':757 'rang':906 'rapid':822,1361 'ratio':743,745 'react':373,1213 'read':236,1110 'real':99 'recip':252,258,263,307,333,354,838,1294,1342,1382,1465 'recipe/approach':482 'reduc':670,765 'refer':176,194,328,835,1250,1396 'references/audio-file-references.md':231 'references/audio-rules.md':532 'references/sound-recipes.md':260,335,845,857,867,877,888,898,910,923,934,1239 'references/web-audio-api.md':360,946,985 'refin':109,451,467,1160 'reject':892 'relev':487 'remov':725 'report':545 'request':296,377,590,1306 'requir':960,1449 'resourc':1249 'resum':974 'retro':808 'return':1228 'review':112,503,506,512,602,610,1319 'richer':713 'rising/falling':861 'rule':530,539,560,579,955,1310 'rule-id':559 'run':212,1433 'safeti':1059 'satisfi':156 'save':881 'sawtooth':662 'say':511,639 'scale':485 'scan':534 'schedul':1089,1105 'script':1423 'second':719 'section':283 'see':326 'select':1383 'self':1146,1400 'self-contain':1145,1399 'sensibl':303 'short':806 'shorter':680,763 'shot':1031 'side':1086 'simplifi':1339 'sine':663,728,733,804,825,940 'sine/triangle':659 'singl':732 'singleton':438,982,1057,1227 'skill':91 'skill-ui-sound-design' 'skills/ui-sound-design/tools/analyze-sound.mjs':216 'slack':180 'slide':927 'snappier':679 'softer':688 'sound':3,7,19,25,33,51,64,70,102,123,138,225,249,301,324,350,397,400,424,517,598,832,1012,1054,1072,1078,1101,1120,1128,1171,1177,1192,1231,1242,1272,1286,1367,1390,1408,1431 'sound-preview.html':1398 'sound-recipes.md':1279 'source-dannyjpwilliams' 'spectral':1454 'squar':811,817 'start':253,435,540,1098,1302 'startfreq':827 'state':901 'stay':582 'step':527 'stop':1022 'sub':1135 'sub-50ms':1134 'subject':631 'sublimin':873 'subtl':157,756,799 'success':148,874,878 'success/error':26 'suggest':239,269,573,1460 'summari':566 'support':1189,1444 'suspens':431 'sustain':774,778,784 'sweep':863,930 'switch':661,815,859 'synth':1340 'synthesi':94,238,636,741,919,1263,1379,1459 'tabl':567 'tap':849,969 'task':879 'templat':447,1403 'term':276 'thinner':724 'third':884 'throw':995 'time':1106,1113 'toggl':22,145,854,858 'tonal':1456 'tone':155 'tone-js.md':1333 'tone.js':14,1334,1358 'tool':1373,1420 'tools/analyze-sound.mjs':1436 'topic-agent-skills' 'topic-claude-code' 'topic-sound-design' 'topic-tone-js' 'topic-ui-sounds' 'topic-web-audio-api' 'total':766 'transit':147,926,1137 'translat':66,342,457,625 'trash':183 'tri':479 'trigger':141,839 'tune':1298 'tweak':55,473 'type':1341 'ui':2,6,36,49,63,185,1077 'ui-sound-design':1 'ui-sounds.js':1204 'uisoundlibrari':1236,1291 'understand':1274 'up/down':489 'urgent':158 'use':9,15,130,251,302,411,436,459,547,630,658,727,753,818,1055,1114,1131,1180,1234 'usecallback':1226 'user':120,198,292,387,432,454,510,588,629,638,958,966,1356,1387 'user-gestur':957 'useref':1222 'useuisound':1219 'useuisound.js':1216 'vagu':295 'valid':890,1007,1309 'valu':1064 'vanilla':1350 'vari':945 'variat':425,1301 'verifi':1327 'violat':555 'visual':442,1409 'vocabulari':274,281,339,461,619 'volum':690,695,706,709,803,1058,1061,1066,1124,1247 'want':86,206,1360 'warmer':654 'warn':895,899 'wav':201,408,1163,1175,1445 'wav/.mp3':1426 'wave':660,729,805,812,826 'web':10,74,522,1253,1351 'web-audio-api.md':1251 'whoosh':28,920,924 'without':599 'work':73,1281,1439 'workflow':100,607 'wrong':478 'x':492,496 'zero':992,1437","prices":[{"id":"ec079c84-d108-46fc-bb8e-ba644a8f5842","listingId":"fe98208f-ebda-4898-bd6d-eabf4a3c2827","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"dannyjpwilliams","category":"ui-sound-design-skill","install_from":"skills.sh"},"createdAt":"2026-04-18T22:22:36.794Z"}],"sources":[{"listingId":"fe98208f-ebda-4898-bd6d-eabf4a3c2827","source":"github","sourceId":"dannyjpwilliams/ui-sound-design-skill/ui-sound-design","sourceUrl":"https://github.com/dannyjpwilliams/ui-sound-design-skill/tree/main/skills/ui-sound-design","isPrimary":false,"firstSeenAt":"2026-04-18T22:22:36.794Z","lastSeenAt":"2026-05-01T13:02:29.491Z"}],"details":{"listingId":"fe98208f-ebda-4898-bd6d-eabf4a3c2827","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"dannyjpwilliams","slug":"ui-sound-design","github":{"repo":"dannyjpwilliams/ui-sound-design-skill","stars":29,"topics":["agent-skills","claude-code","sound-design","tone-js","ui-sounds","web-audio-api"],"license":"mit","html_url":"https://github.com/dannyjpwilliams/ui-sound-design-skill","pushed_at":"2026-04-08T19:33:43Z","description":"Claude Code skill that translates plain-English sound descriptions into working Web Audio API and Tone.js code","skill_md_sha":"f72940fa39688a912f2b7dfbf8a34229eef4a8df","skill_md_path":"skills/ui-sound-design/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/dannyjpwilliams/ui-sound-design-skill/tree/main/skills/ui-sound-design"},"layout":"multi","source":"github","category":"ui-sound-design-skill","frontmatter":{"name":"ui-sound-design","license":"MIT","description":"Programmatic UI sound design using Web Audio API and Tone.js. Use when creating click sounds, notification chimes, toggle feedback, hover sounds, success/error audio, whoosh effects, or building a sound library for UI interactions. Provides an iterative describe-generate-listen-refine workflow with audio engineering knowledge translated into plain English."},"skills_sh_url":"https://skills.sh/dannyjpwilliams/ui-sound-design-skill/ui-sound-design"},"updatedAt":"2026-05-01T13:02:29.491Z"}}