Changelog
nw_wrld 0.7.0-beta is a hardening release. No new signal sources this time; instead the focus is on project data that survives crashes, packaged builds that are locked down properly, a noticeably lighter dashboard and projector under live input, and a large cleanup of the codebase and documentation. Two small dashboard additions came along for the ride: one-click duplication of sets, tracks and modules, and a live input readout in the footer. Download the .dmg, .exe, .AppImage, or .deb from the release page; each artifact has a SHA256 checksum in SHA256SUMS.
-
Duplicate Sets, Tracks and Modules: Every set, track and module instance now has a duplicate button. Copies carry their full configuration (module settings, channel mappings, sequencer patterns and recordings), get a fresh id, and are named with a
(Copy)suffix that increments if you duplicate again. Track copies are placed in the next free track slot. -
Live Input Activity in the Footer: The dashboard footer now shows the most recent track selection and channel trigger as they arrive, with the source (MIDI, OSC, audio, file or sequencer). You can confirm signal is reaching nw_wrld without opening the debug overlay.
-
Crash-Durable Project Saves:
userData.json,appState.jsonand recordings are now written to a temp file, synced to disk, and renamed into place, with a rolling.backupkept alongside. If the main file is ever truncated or corrupted (power loss mid-write, a crash), nw_wrld loads the backup automatically instead of starting from an empty project. Redundant saves are skipped when nothing has changed. -
Locked-Down Packaged Builds: Packaged apps now disable the Electron fuses for
RunAsNode, Node inspector andNODE_OPTIONS, drop thedisable-library-validationentitlement on macOS, refusewindow.openand external navigation inside the app windows, and handleopenExternalfailures.electron-buildermoved to v26 to clear build-time CVEs, and the release workflow's publish action is pinned to a commit SHA. -
Projector Performance: Trigger maps are cached per track reference instead of being rebuilt per note, the channel dispatcher no longer rebuilds its handler map on every unmapped-channel trigger, module sources are cached by file mtime so a track switch no longer re-reads and re-transfers every module file, three.js modules skip redundant renders, and the sandbox reuses its token rather than re-handshaking on every request.
-
Dashboard Performance: Sequencer ticks and input heartbeats no longer re-render the whole track tree; only the rows that changed update. IPC listeners subscribe once instead of re-registering on every render, the audio capture loop no longer reads
localStorageinside its 60fps tick, closed modals skip building their markup, and debug logs are parked while the overlay is closed. -
Resource Leak Fixes: Destroying a module now clears any pending show/hide/invert timers, releases its WebGL context and window resize listener, and the animation loop stops when its last subscriber leaves. A failed MIDI connection no longer leaves handlers attached to the WebMIDI singleton across workspace switches, and the sequencer audio engine is disposed on exit.
-
Module Loading Fixes: A module's
executeOnLoadmethods now run even when they were dropped from the saved constructor list, so a freshly added method fires on first load as documented. A set with no active track shows an explicit empty state on the projector instead of a stale frame. -
Clearer IPC Failures: Every bridge call that can fail now returns a stable reason code (
INVALID_BAND,PROJECT_DIR_MISSING,WRITE_FAILEDand so on) instead of an empty failure or a raw filesystem error string. The raw error is logged in the main process for debugging. -
Codebase Cleanup: Around 3,000 lines removed net. Dead code, duplicated helpers and 84 redundant type casts are gone, two dormant UI flows that had no way to be opened (a method source viewer and an in-app "new module" dialog) were removed outright, unused fonts and sample assets were dropped from the bundle, and
eslint,@types/nodeand several audit-flagged dependencies were realigned. New modules are created by adding a file to your project'smodules/folder, as the guide describes. -
Documentation Corrections: The getting-started tutorial now describes the buttons that actually exist,
matrixis documented as a triggerable method handled by the projector rather than something to call from module code, the five built-inBaseThreeJsModulemethods and the full list of sandbox globals (includingNoiseand the Three.js loaders) are documented, andMODULE_DEVELOPMENT.mdnow ships inside packaged builds so new workspaces get their copy of the guide. -
Test Coverage: New unit and E2E suites for duplication, the footer readout, the sandbox host, constructor run ordering, reload targeting and atomic writes, bringing the totals to 196 unit and 48 E2E tests. A timing-dependent lifecycle test now uses a deterministic clock, and the suite no longer leaves temp directories behind.