What's next
An honest punch list of what would make zvuk better, ordered by impact. No promises on dates — this is intent, not a release schedule. PRs welcome on anything sized small.
Highest impact
Hit immediately, missing today, small surface.
- smallLive spatializer control on Voice
voice.spatializer.setPan / setPosition while playing. Today the option is set at spawn and frozen — moving sources need a re-attach. The SpatialPanner demo even has to fake it.
related: /concepts/spatializer/ - smallVoice pause / resume
pause-on-menu, pause-on-blur, per-voice. Track the offset; resume from where it stopped. Currently we only have stop().
related: /concepts/voice/ - smallLive voice.playbackRate setter
pitch is set in PlayOptions and frozen. Live ramps unlock tension/slow-mo without granular stretch.
related: /concepts/voice/ - mediumAudio sprites
one buffer, many named regions, one fetch. Match-3 cascades, UI variants, low-latency one-shots. ~80 lines.
- mediumStream source
<audio> + MediaElementAudioSource for music files >30s. Don't decode 4-minute tracks into RAM. iOS works around its own decode bugs this way.
Quality of life
Pays back forever — across every page, every adopter.
- mediumAuto-generated /api/ from TypeDoc
Concept pages have hand-written API blocks; that drifts. TypeDoc → JSON → custom Astro content loader → MDX pages with consistent shape. Reference is always current.
- smallPagefind search
⌘K modal in the nav, indexed at build time, no Algolia key. With 27+ pages, search starts mattering.
- mediumLoudness normalization on load
loadSound(..., { normalize: true }) runs an RMS pass at decode and applies makeup gain so all sounds sit at the same perceived loudness. Removes a workflow tax every game-audio team currently pays in their DAW.
- smallBetter error messages
BusNotFoundError("sxf"; did you mean "sfx"?). Levenshtein on declared bus/sound names. Single-file change, big DX feel.
related: /concepts/engine/ - largeRealtime stretch via AudioWorklet
Current StretchProcessor is offline-only. Worklet port unlocks live tempo modulation — boss intros that bend in real time.
related: /fx/pitch/
For "library people adopt"
Not just "library that works."
- smallMaster limiter
Headroom is a static gain; a brick-wall limiter on master prevents clipping when FX stack. DynamicsCompressorNode at ratio 20+, fast attack.
related: /concepts/mixer/ - smallCrossfade helper
engine.crossfade("intro", "main", { ms: 1500 }) — common music-swap pattern. People will write this themselves five times before realising it should be a helper.
- largeExamples directory
Full deployable apps in /examples/: slot-machine, match-3, fps-footsteps. Way more convincing than 11 isolated demos. Linked from the landing.
Polish
Can wait, but on the list.
- smallnpx zvuk transcode raw/*.wav
The ffmpeg loop from the asset-formats guide as a CLI. Cuts setup friction.
related: /guides/asset-formats/ - mediumnpx zvuk gen bank.json
Typed sound names emitted from a manifest, so engine.sound("coin") is autocompleted.
- mediumBench suite
Voice spawn rate, decode time, fade event drift. Wired to PR CI.
- smallTouch handling polish
SpatialPanner is mouse-first; touch drag is rough on mobile.
related: /concepts/spatializer/ - smallAuto changelog page
Render .changeset/*.md as /changelog/ at build time.
- smallOG images
Per-page social cards via astro-og-canvas.
Pick one and PR it
Items sized small are usually a single file plus a test. Items sized medium typically touch 2–4 files. Items sized large are worth opening an issue first to align on shape.
Open an issue