skills/win31-audio-design/SKILL.md
Expert in Windows 3.1 era sound vocabulary for modern web/mobile apps. Creates satisfying retro UI sounds using CC-licensed 8-bit audio, Web Audio API, and haptic coordination. Activate on 'win31 sounds', 'retro audio', '90s sound effects', 'chimes', 'tada', 'ding', 'satisfying UI sounds'. NOT for modern flat UI sounds, voice synthesis, or music composition.
npx skillsauth add curiositech/windags-skills win31-audio-designInstall 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.
Expert in creating authentic Windows 3.1 era sound experiences for modern web and mobile applications using CC-licensed alternatives that capture the satisfying, lo-fi essence of early 90s computing.
Input Type:
├── UI Feedback
│ ├── High frequency (>20/sec) → Single click (20ms, 800Hz)
│ ├── Medium frequency (5-20/sec) → Toggle chirp (100ms, sweep)
│ └── Low frequency (<5/sec) → Chime variation (400ms, harmonic)
│
├── System Events
│ ├── Success → TADA-style fanfare (1-2s, ascending chord)
│ ├── Error → DING-style alert (300ms, 880Hz + decay)
│ └── Navigation → RINGIN/OUT-style sweep (150ms, pitch slide)
│
└── Device Constraints
├── Mobile → Add haptic pairing + respect silent mode
├── Low bandwidth → Use procedural synthesis over samples
└── Desktop → Full sample library + optional reverb
Sound Type → Sample Rate → Frequency Range:
├── Button clicks → 11kHz → 600-1200Hz
├── System alerts → 22kHz → 400-2000Hz
├── Musical elements → 22kHz → 200-4000Hz
└── Error/warning → 11kHz → 200-800Hz
Device Memory:
├── <100MB available → Procedural only
├── 100-500MB → Core samples + procedural fallbacks
└── >500MB → Full sample library
| Anti-Pattern | Detection Rule | Symptom | Fix | |--------------|----------------|---------|-----| | Modern Clarity | Sounds crisp at 48kHz+ | Too clean, loses retro charm | Downsample to 22kHz max, apply 8-bit quantization | | Cathedral Reverb | Reverb tail >200ms | Sounds spacious, not desktop-like | Remove reverb or limit to <100ms room | | Frequency Bloat | Energy below 200Hz or above 8kHz | Muddy bass or harsh highs | High-pass at 200Hz, low-pass at 6kHz | | Copyright Trap | Using actual .WAV filenames | Legal risk, identical to Windows | Replace with CC-licensed alternatives only | | Sound Spam | >3 sounds per second | User fatigue, cacophony | Limit to primary actions, add global toggle |
Scenario: Creating a satisfying toggle switch with coordinated vibration and Win31-style sound
// 1. Analyze requirements
const toggleRequirements = {
duration: "100-150ms", // Fast enough to feel instant
frequency: "sweep 600→1200Hz for ON, reverse for OFF",
haptic: "light impact at sound start",
timing: "audio and haptic must fire within 5ms"
};
// 2. Decision point: Procedural vs sample?
if (memoryConstraint < 50MB) {
// Choose procedural synthesis
function createToggleSound(isOn: boolean) {
const ctx = audioContext;
const osc = ctx.createOscillator();
const gain = ctx.createGain();
// Win31 characteristic: triangle wave (softer than sine)
osc.type = 'triangle';
// Frequency sweep decision
const startFreq = isOn ? 600 : 1200;
const endFreq = isOn ? 1200 : 600;
osc.frequency.setValueAtTime(startFreq, ctx.currentTime);
osc.frequency.exponentialRampToValueAtTime(endFreq, ctx.currentTime + 0.12);
// Envelope: fast attack, medium decay
gain.gain.setValueAtTime(0.3, ctx.currentTime);
gain.gain.exponentialRampToValueAtTime(0.001, ctx.currentTime + 0.12);
return { oscillator: osc, gainNode: gain };
}
}
// 3. Timing coordination (critical for satisfaction)
async function playToggleWithHaptic(isOn: boolean) {
const startTime = performance.now();
// Fire simultaneously
const [soundPromise, hapticPromise] = await Promise.allSettled([
playToggleSound(isOn),
Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Light)
]);
const endTime = performance.now();
// Quality check: timing must be tight
if (endTime - startTime > 10) {
console.warn('Haptic-audio sync exceeded 10ms threshold');
}
}
// 4. What expert catches vs novice misses:
// Expert: Checks for silent mode before playing
// Expert: Uses exponential ramps (more natural than linear)
// Expert: Applies 8-bit quantization for authentic character
// Novice: Forgets to coordinate timing
// Novice: Uses default Web Audio sample rate (48kHz - too clean)
Do NOT use this skill for:
Delegate when:
Core Formula: Win31 sounds = Simple + Bright + Lo-fi + Fast decay. Always pair audio with haptics on mobile. Never copy Microsoft sounds - create inspired CC-licensed alternatives.
tools
Building resilient distributed systems with circuit breakers, retries with full-jitter exponential backoff, retry budgets (per-request 3-attempt + per-client 10% ratio per Google SRE), deadline propagation, and the cascading-failure math (4 layers × 3 retries = 64x amplification). Grounded in Resilience4j, Microsoft Cloud Patterns, AWS Architecture Blog (Marc Brooker), and Google SRE Book.
testing
Designing HTTP cache headers that work correctly across browsers, CDNs, and shared proxies — `Cache-Control` directives per RFC 9111, `stale-while-revalidate` and `stale-if-error` per RFC 5861, the Vary header for varying responses, and surrogate keys for tag-based purging. Grounded in IETF RFCs and Cloudflare/Fastly docs.
development
Use when designing or fixing a Content Security Policy on a real site, choosing between nonce-based and hash-based CSP, adding strict-dynamic, debugging "Refused to execute inline script" errors, deploying CSP in report-only mode first, configuring report-to / report-uri, or auditing an existing policy for unsafe-inline / unsafe-eval / wildcards. Triggers: "CSP blocks legitimate inline script", strict-dynamic, nonce-{RANDOM}, sha256-{HASH}, object-src none, base-uri none, frame-ancestors, Trusted Types, X-Content-Security-Policy obsolete, report-only vs enforced. NOT for general HTTP security headers (HSTS, COOP/COEP), Trusted Types deep dive, CORS configuration, or building a WAF.
tools
Choosing and operating an HTTP API versioning strategy that doesn't break clients — Stripe's date-based pinned versions, the Deprecation/Sunset header pair (RFC 9745 + RFC 8594), URI vs header vs media-type approaches, and the version-transformer pattern. Grounded in Stripe's published architecture and IETF RFCs.