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.
data-ai
license: Apache-2.0 NOT for unrelated tasks outside this domain.
development
Use when designing caching strategies (cache-aside, write-through, write-behind), implementing distributed locks, building rate limiters, leaderboards, real-time streams (XADD/consumer groups), pub/sub, or tuning eviction policies. Triggers: thundering-herd on cache miss, dogpile on key expiry, Redlock vs SET-NX-PX choice, sliding-window rate limiter, hot-key on a single cluster slot, big-key blowup, MULTI/EXEC across slots, KEYS in production. NOT for Redis Cluster operations/admin (different domain), embedded KV (SQLite, leveldb), in-process LRU caches, or Memcached.
tools
Drawing the `'use client'` boundary correctly in React Server Components apps (Next.js App Router, RSC frameworks) — leaf-pushing, slot composition, serialization rules, and environment poisoning prevention. Grounded in react.dev and Next.js 16 docs.
development
Use when designing rate limiting for an API, choosing between token bucket / sliding window / leaky bucket / fixed window, implementing it in Redis, deciding edge (Cloudflare/Upstash) vs origin enforcement, sizing per-user vs per-IP vs per-endpoint quotas, returning the right 429 response with Retry-After, or fixing the boundary-burst bug in fixed-window limiters. Triggers: 429 too many requests, INCR + EXPIRE, ZADD + ZREMRANGEBYSCORE + ZCARD, X-RateLimit-Remaining header, Cloudflare WAF rate limiting rules, Upstash @upstash/ratelimit, leaky bucket shaping vs policing, distributed rate limiter consistency. NOT for DDoS mitigation specifically (different scale), CAPTCHA / bot management, full WAF design, or per-user quota billing.