High-quality audio effects for the Web Audio API, compiled from Rust to WebAssembly.
Early foundation — see the Foundation epic.
# One-time: install Vite+ (CLI wrapping pnpm + Vite + Vitest + oxlint/oxfmt)
# macOS / Linux:
curl -fsSL https://vite.plus | bash
# Windows (PowerShell):
# irm https://viteplus.dev/install.ps1 | iex
# Install deps (Vite+ reads pnpm-workspace.yaml + .node-version automatically)
vp installSee CONTRIBUTING.md for the full workflow.
den-core is a #![no_std] Rust crate that compiles to wasm32-unknown-unknown and is post-processed with wasm-opt (binaryen). The rest of the workspace is std Rust + TypeScript packages built with Vite+.
- Rust stable (managed by
rust-toolchain.toml; thewasm32-unknown-unknowntarget installs automatically) wasm-optfrom thebinaryenpackage — must be onPATH:- macOS:
brew install binaryen - Ubuntu/Debian:
sudo apt-get install -y binaryen
- macOS:
- Vite+ (
vpCLI) and Node 22 — installed via the Quickstart above
vp run buildThis runs (in topological order across the workspace):
packages/core/scripts/build-wasm.mjs—cargo build --target wasm32-unknown-unknown --profile wasm-release -p den-core, thenwasm-opt -O3 ...intopackages/core/dist/den_core.wasm.packages/corelibrary bundle (TS loader + the WASM artifact placed beside it).packages/worklettwo-bundle build — main-thread ESM + classic IIFE worklet processor.packages/effectslibrary bundle.packages/test-utilslibrary bundle.
# Rust — den-core is checked separately for its wasm32 target.
cargo fmt --all -- --check
cargo clippy --workspace --exclude den-core --all-targets -- -D warnings
cargo clippy -p den-core --target wasm32-unknown-unknown -- -D warnings
cargo check --workspace --exclude den-core --all-targets
cargo check -p den-core --target wasm32-unknown-unknown
# TypeScript / JS
vp check # fmt + lint (+ typecheck if enabled in lint.options)
vp run smoke # Node-side WASM smoke test (scripts/smoke.mjs)
# DSP harness (Sub C)
vp run gen-golden # regenerate Python scipy golden WAVs (requires `uv` from
# https://docs.astral.sh/uv/getting-started/installation/)
vp run test:tier2 # Node WASM null tests against committed goldens
vp run test:tier3a # Playwright + OfflineAudioContext null tests
vp run test # tier2 + tier3a chained (`vp run test`, NOT `vp test` —
# `vp test` would invoke Vitest directly and bypass the
# chain script in package.json)Dual-licensed under MIT or Apache-2.0.