v0.5.0 — Multi-plugin chains
Shipped · 2026-05-26
Engine consumes full patch graphs. Native 3-band EQ + transpose + mix nodes. ADR-0006 accepted.
Stardust Pit ships release by release under semantic versioning. v1.0 is the public release; every pre-1.0 version is a real, tagged, exit-criteria-bound release on the path to it. There is no “polish phase” — polish is v0.15.0, and after that the open beta becomes 1.0.
Each version has a theme and explicit exit criteria. A version doesn’t ship until its exit criteria are met. Adding scope mid-version means slipping the version, not silently re-defining it.
Status badges reflect ship state. Shipped is tagged on GitHub. Next is the active version. Planned is on the roadmap with a target version assigned. v1.x and v2.0+ are post-1.0 backlog.
Refinement happens at the start of each version. Before code is written for any version, the user and Claude walk through the scope in a refinement session and lock in concrete UX, data-model, and exit-criteria details. The bullets below are the committed-to scope, not the only scope.
A post-version review happens after each ships. Items in scope that didn’t land become tickets in the next version. Items that proved unnecessary get removed. The Tech Debt section captures things we ship anyway.
No hard deadlines. Estimates are sized in engineering weeks, not calendar weeks. Total path to v1.0 is roughly 46 weeks of engineering — calendar time depends on how much of each week is engineering. There is no committed date.
v0.5.0 — Multi-plugin chains
Shipped · 2026-05-26
Engine consumes full patch graphs. Native 3-band EQ + transpose + mix nodes. ADR-0006 accepted.
v0.6.0 — Engine completeness
Next · ~2 weeks
Hardware MIDI bindings, plugin GUI hosting, engine Panic, scan caching, PR CI.
v0.7.0 — Plugin sandboxing
Planned · ~6 weeks
Out-of-process plugin hosting. Watchdog, crash recovery, quarantine, soak tests. ADR-0002 implementation.
v0.8.0 — Transport + MD essentials
Planned · ~4 weeks
Per-song + per-bar tempo, click engine + bus, MIDI clock send, tap tempo, pre-show validation.
v0.9.0 — Three-mode shell + splash + wizard
Planned · ~3 weeks
Setup/Program/Perform modes wired, splash screen, New Show wizard, settings window, autosave.
v0.10.0 — Library + Pit Mixer
Planned · ~5 weeks
All-patches-as-references data model, drawing primitives, image widget, multi-channel audio input.
v0.11.0 — Perform mode + widgets
Planned · ~4 weeks
Layout editor, full widget catalog, conductor cam (USB webcam), Live fullscreen, layout templates.
v0.12.0 — Click editor + balance
Planned · ~4 weeks
Click track editor (vamps, codas, cue points), LUFS-based balance tool, A/B compare, trim suggestions.
v0.13.0 — Backing tracks + bundle format
Planned · ~5 weeks
Audio decoding via Symphonia, song transport, .stardustshow/ bundle format, MIDI recording + audio bounce.
v0.14.0 — Native SFZ player
Planned · ~2 weeks
Native instrument.sfz node, bundled GM piano, SFZ 1.0 opcode coverage, foundation for future sampler.
v0.15.0 — Polish + Extension API + release CI
Planned · ~4 weeks
Onboarding, theme editor, signed installers, crash reporter, telemetry, extension API v1, Stream Deck.
v1.0.0 — Public release
Planned · ~2 weeks beta
Open beta (10–20 friendly MDs), Discord, beta feedback addressed, public launch, auto-update.
Tagged: v0.5.0 on 2026-05-26 · commit 20bfeaa (pit), 8eeff2f (core).
The engine stops short-circuiting to “first instrument” and walks the full patch graph. A topo-sorted, allocation-free Plan runs every block. Native nodes for 3-band stereo EQ, transpose, and mix ship in stardust-core so the engine has at least one full chain to exercise.
engine_graph Tauri command builds a Plan from a PatchPlan::process per blockThese shipped intentionally — most get addressed by upcoming version work:
PluginEntry leaks intentionally via mem::forget → cleaned up by v0.7.0 sandboxing rewriteengine_rebind_routingTheme: Close the open audio-path items v0.5.0 left behind. Patch-switching becomes seamless; hardware controllers wire to nodes one-by-one; CI starts running on every PR.
Size: ~2 weeks (revised ~3 with rig-lite). Status: In progress — 6/11 original scope shipped (#10 CI, #11 orphan cleanup, #9 testtone, #1 rebind, #2 per-source binding, #3 Panic). Re-sequenced 2026-07-06: a minimal rig-lite slice (#122) pulled forward from v0.10.0 — #5 and #7 already assumed a real rig surface, and #2’s per-node bindings are the interim model (device identity belongs on the rig component; per-patch bindings accrue migration debt the longer Program work continues without it). Refined 2026-07-06: #122 ships as one batch with #4 (scan caching), #117 (Settings in shell), and #121 (EnginePanel deletion) — the batch retires the EnginePanel strip entirely. Next: implement the batch, then #5 → #7; #6/#8 close out the version.
engine_rebind_routing ✅ shipped 2026-07-03 (stardust-pit#1 → PR #118) — swap MIDI/audio device without tearing down the Plan. The Plan travels between cpal streams via a Drop-carrier: no plugin reloads, held voices intact. Device identity → rebind; sample-rate / buffer-size → full rebuild. On failure the previous device stays (or is restored) active.deviceId: null = any device (back-compat). Device identity is midir’s opaque port id + name fallback — see tech debt for the (vendor, product) drift.rigComponentId is the node’s identity — no node-level binding concept survives; a node with no component is silent and flagged). Schema v2→v3 migration auto-converts #2-era per-node hardwareBinding blobs into rig components and deletes the field. Engine opens the union of rig-bound devices session-wide — patch switches never touch MIDI I/O. Explicitly excludes compounds, widget editor, velocity curves, per-pad widget config (all stay v0.10.0). Exit criteria: a component bound once in Setup feeds every referencing source node across patches with no per-patch re-binding; rig edits rebind (not restart) the engine; #2-era shows migrate on load and play unchanged. Ships as one batch with #4 + #117 + #121 so the EnginePanel strip can be deleted outright.instrument.testtone ✅ shipped 2026-07-03 (stardust-pit#9 → PR #116) — hidden from palette; only user surface is Settings → “Run engine self-test”. Bumps stardust.patch + stardust.show schemas to v2 with a v1→v2 rename migration. Engine topo now lifts MIDI sources ahead of consumers so single-block MIDI delivery is guaranteed.tsc --noEmit ✅ (rolled into #10); delete orphaned sound/ components ✅ shipped 2026-06-01 (stardust-pit#11 → PR #115)main for both stardust-pit and stardust-coreTheme: Implement ADR-0002. Plugins run in separate processes; a crashing plugin no longer crashes the host. This is the single most important reliability investment in pre-1.0.
Size: ~6 weeks. The biggest pre-1.0 version. Almost entirely engine work.
plugin.url metadatakill -9) does not crash the host; affected patch falls back to silence with a clear UI bannerTheme: Tempo, click, and the engine clock. Things a musical director needs for any rehearsal or runthrough.
Size: ~4 weeks.
Theme: Wire the Setup / Program / Perform mode model into the actual app. Replace the diagnostic stand-in. Make first launch make sense.
Size: ~3 weeks.
edit-vs-live, add setup-program-perform (done as part of doc rewrite ahead of this version).stardustshowTheme: The data-model unification version. Every patch is a reference to a library entry; library entries scope to show or global. This is the foundation for the v1.x marketplace + the v2.0+ collaboration story.
Size: ~5 weeks.
scope: "show" | "global" field on each library entryorphan.snapshot; banner + re-link / save-as-new / keep-snapshot optionsRig basics (component CRUD, device binding at component level, basic Learn, real Setup → Rig screen) moved to v0.6.0 as rig-lite (#122, 2026-07-06) — this version builds the rest on top of it:
source.compound node kindTheme: The Live view becomes real. Users build their own performance layout from the widget catalog. Conductor cam takes one input source for v1.0 (USB webcam) — RTSP / IP / NDI is v2.0+.
Size: ~4 weeks.
Existing (carried forward): keyboard, pad, footswitch, button/switch, expression pedal, sustain pedal, rig component instance, song/patch list (full + condensed), dynamic text, static text, volume meter, transpose indicator, click indicator, next-patch preview, panic, parameter favorite, show notes, time elapsed.
New in v0.11.0:
All MIDI widgets are reactive — they show live hardware state in Live.
Theme: Two pro-MD tools. The click track editor turns tempo into a first-class authorable artifact. The balance tool turns “is this patch louder than that one?” into a measurement, not a guess.
Size: ~4 weeks.
ebur128 Rust crate, offline render (no speakers)Theme: Backing tracks are the moment the file format needs to grow up from a single JSON to a bundle directory. We migrate the format here because backing tracks force the issue anyway.
Size: ~5 weeks.
.stardustshow/ folder with extension — replaces single JSONshow.json, libraries/, assets/audio, assets/images, assets/samples, thumbnails/Theme: Stardust ships with a real instrument by default. No “first launch and there’s no sound until you install a plugin.” Bundled GM piano is built in.
Size: ~2 weeks.
instrument.sfz node in patch graph — lives in stardust-core, in-processTheme: Everything that makes a 1.0 a 1.0. Installers, signing, telemetry, accessibility audit, the extension API, and the tech-debt sweep.
Size: ~4 weeks.
Theme: Ship.
Size: ~2 weeks of beta window before public.
Features that need v1.0 to land first but are explicitly committed for a v1.x point release:
Speculative or scope-too-large-for-1.x. Named so the direction is visible; commitment level varies.
Pure-Rust VST3 host
stardust-vst3 extracted as standalone crate. ~3–6 months. Removes the v1.x C++ shim.
Pure-Rust AU host
stardust-au, macOS-only. ~4–6 months.
Realtime WASM extensions
Custom DSP / graph nodes. Verified realtime contract. Extends the v0.15.0 extension API.
Marketplace
Paid + free content via Lemon Squeezy or Polar.sh (Merchant of Record). ~3–4 months dedicated.
Community share hub
Free anonymous sharing. v1.x bridge step before marketplace.
Cloud sync + collaboration
CRDT-backed via Automerge. ~6 months.
Hot-spare rig sync
LAN-primary, cloud-fallback.
Multi-keyboardist LAN sync
Multiple Pit instances on a stage staying in lockstep.
Show Control
MSC + OSC + Art-Net/sACN + LTC + MTC + show control panel. ~8–12 weeks. Turns Stardust into the ecosystem hub.
Mobile companion
Tauri Mobile, LAN remote.
Federation / self-hosted marketplace
Run your own instance.
Advanced cue system
MSC deeper, QLab bidirectional, cue list timeline.
AI sound search
Natural-language search across plugin presets + library.
Audio input rigs
Guitar / bass / vocals / winds via NAM / Guitarix / AIDA-X / Neural DSP.
Plugin bundles + one-click installer
Curated plugin sets that install together.
Custom sampler
Record / import → SFZ generation. Builds on v0.14.0.
DMX / lighting
Was dropped from v1.0 scope. Revisit if Show Control unlocks demand.
Conductor cam enhancements
RTSP/IP, NDI, capture-card UI affordance, virtual webcam streaming output.
We ship debt intentionally when the cost-of-fixing-now beats the cost-of-fixing-later. This list is the audit trail. Anything not naturally resolved by a later version gets explicitly addressed (or explicitly deferred) in v0.15.0.
| Item | Why we shipped it | Cleanup target |
|---|---|---|
| Patch-switch latency scales with plugin count | Multi-plugin shipped first; warm-pool needs sandboxing | v0.7.0 |
| Plan rebinds only on plugin-choice change (not config edits) | Edge case; live param editing not in scope yet | v0.11.0 |
PluginEntry leaks via mem::forget | Cheaper than fighting Rust lifetimes pre-sandboxing | v0.7.0 |
| Live device change tears down plan | Fixed by engine_rebind_routing (stardust-pit#1 / PR #118) | ✅ v0.6.0 |
Hardware MIDI binds to first source.keyboard | Fixed by per-source binding (stardust-pit#2 / PR #118); also fixed a latent bug where injected MIDI re-distributed every block | ✅ v0.6.0 |
| EQ crossover frequencies are constants | Settings panel is a bigger project | v0.15.0 polish |
| Plugin GUI hosting missing | Engine-graph was the priority | v0.6.0 |
| Velocity / sustain on preview keyboard (#18) | Moved out of v0.6.0 during refinement — not engine-completeness scope | v0.10.0 |
| QWERTY mapping on preview keyboard | Polish, deferred | v0.15.0 |
| Dirty-tracking is a dot, not a close-blocker | Pre-shell model — proper UX needs the shell | v0.9.0 |
| One show seeded; no New Show / Recent Shows UI | Splash + wizard live in v0.9.0 | v0.9.0 |
tsc --noEmit fails on tsconfig project-references bug | Fixed in stardust-pit#10 | ✅ v0.6.0 |
| Plugin metadata scan eager + uncached | Scan-cache is a v0.6.0 deliverable | v0.6.0 |
cpal::DeviceTrait::name deprecation warnings (3) | Suppressed with #[allow(deprecated)] in stardust-pit#10; full migration to description() + id() tracked as stardust-core#12 | future (stable-id audio device picker work) |
| No graceful shutdown on engine thread | Process exit currently does the job | v0.15.0 |
Storybook PluginUIDock has no plugins | Plugin GUI work fixes naturally | v0.6.0 |
sound/ components (plugin-browser, plugin-parameter-panel, midi-mapping-row, sound-flow) orphaned | Deleted in stardust-pit#11 / PR #115; v0.10.0 will build from scratch | ✅ v0.6.0 |
| No autosave anywhere | Shell + wizard work owns autosave | v0.9.0 |
| No backup / recovery / .swp-style protection | Lower priority than autosave | v0.9.0 or v0.15.0 |
| No telemetry / crash reporter | Opt-in infra lands with release CI | v0.15.0 |
| No CI pipeline anywhere | Shipped in stardust-pit#10 + stardust-core#11 on 2026-06-01 | ✅ v0.6.0 |
| No release automation | Lands as a v0.15.0 deliverable | v0.15.0 |
| Save file format is single JSON | Bundle migration is v0.13.0 | v0.13.0 |
| No multi-channel audio input | Pit Mixer is v0.10.0 | v0.10.0 |
| No native file menu | Shell work owns the file menu | v0.9.0 |
| Item | Why we shipped it | Cleanup target |
|---|---|---|
MIDI device identity is midir’s opaque port id + name fallback, not the spec’d (vendor_id, product_id) | midir exposes no vendor/product IDs on any platform — the #2 refinement claim was wrong. Port ids are stable on CoreMIDI; name fallback covers replug on ALSA/WinMM. Identical twin devices on platforms with unstable ids may need manual re-pick after replug | revisit if twin-device reports surface; no version planned |
| Device rebind has a few-ms silence gap at the swap (stream close → open) | Gap-free would need a second overlapping stream + crossfade; plan/voice continuity (the expensive part) is preserved. Pending user ear-test verdict on stardust-pit#1 | revisit after ear test; v0.15.0 at latest |
| Rebind underrun AC approximated — cpal exposes no portable underrun counter | Live-device integration test asserts the engine stays Running and audible across the swap window instead | none planned |
| Panic keyboard shortcut is fixed (Shift+Esc), not configurable | Configurable bindings belong to the button/switch rig component (#5) + Show Settings surface | v0.6.0 (#5) |