nw_wrld is an event-driven sequencer for triggering visuals using web technologies. It enables users to scale up audiovisual compositions for prototyping, demos, exhibitions, and live performances. Users code their own visual modules, then orchestrate them using the project's native UI composer.
Visuals can be triggered via the built-in 16-step sequencer or by configuring external MIDI, OSC, audio capture, or file-upload inputs.
This project is currently in beta. Downloadable installers are provided via GitHub Releases for macOS, Windows, and Linux, and nw_wrld can also be run from source using this repository. Please note that whilst the project is in beta, there may be frequent breaking changes between releases.
Build from source to contribute or customize:
Prerequisites: Node.js v20+ and basic terminal knowledge
# 1. Clone the repository
git clone https://github.com/aagentah/nw_wrld.git
cd nw_wrld
# 2. Install dependencies
npm install
# 3. Start the app
npm start
Two windows will open:
npm run test:e2e
test-results/ (gitignored).NW_WRLD_TEST_PROJECT_DIR.nw_wrld uses a project folder model. Each project is a self-contained folder containing your modules, assets, and data.
Note: Workspace modules are JavaScript code executed by nw_wrld. Only open project folders you trust.
MyProject/
├── modules/ # Visual modules (hot-reloadable JavaScript files)
│ ├── Text.js
│ ├── GridOverlay.js
│ ├── SpinningCube.js
│ └── ...16 starter modules
├── assets/ # Images, JSON, and other resources
│ ├── images/
│ │ └── blueprint.png
│ └── json/
│ └── meteor.json
└── nw_wrld_data/ # Tracks, settings, and recordings
└── json/
When you first launch nw_wrld, you'll be prompted to select or create a project folder. The app automatically scaffolds a working project with:
Projects are completely portable - copy the folder to share with others, work across machines, or back up your work. Everything needed to run your audiovisual compositions is contained in one folder.
If your project folder is deleted, moved, or disconnected, nw_wrld will prompt you to reselect it (see Getting Started).
color or rotate)You'll see the playhead move across the grid and trigger your visuals. No external setup required!
Signal Sources:
┌──────────────┐
│ Sequencer │──┐
│ (Built-in) │ │
└──────────────┘ │
├──▶ Dashboard ──▶ Projector
┌──────────────┐ │ (Control) (Visuals)
│ External │──┘
│ MIDI/OSC/ │
│ Audio/File │
└──────────────┘
Dashboard is where you compose and map triggers; Projector is where visuals render and respond.
Follow the Getting Started Guide for detailed step-by-step instructions.
The built-in sequencer is perfect for testing modules and creating standalone audiovisual pieces without external hardware.
For live performance and reactive workflows, you can use MIDI controllers/DAWs, OSC senders, audio input devices, or uploaded audio files.
To set up input routing and switch modes, see Getting Started.
Most DAW setups send notes on MIDI Channel 1 unless you explicitly route or change it. nw_wrld supports both single-channel and split-channel workflows:
11Then map which triggers activate track selection vs method triggers.
Option B (clean separation): Split MIDI channels
12Modules are JavaScript files in your project's modules/ folder. Edit them with any text editor and nw_wrld hot-reloads automatically.
Create or edit a .js file in your project’s modules/ folder and save — nw_wrld hot-reloads it automatically.
Workspace modules are loaded from your project folder and must follow a strict contract:
modules/MyModule.js → module id MyModule (must be alphanumeric and start with a letter)@nwWrld name, @nwWrld category, @nwWrld importsexport default MyModuleAllowed @nwWrld imports:
ModuleBase, BaseThreeJsModule, assetUrl, readText, loadJsonTHREE, p5, d3/*
@nwWrld name: My Module (Display Name)
@nwWrld category: 2D
@nwWrld imports: ModuleBase, assetUrl, loadJson
*/
class MyModule extends ModuleBase {
async init() {
const imgUrl = assetUrl("images/blueprint.png");
const data = await loadJson("json/meteor.json");
}
}
export default MyModule;
See the Module Development Guide for complete documentation including:
When you extend ModuleBase, you inherit powerful methods for free: show, hide, offset, scale, opacity, rotate, randomZoom, and matrix.
These methods can be triggered via the sequencer or external signal sources (MIDI/OSC/audio/file), giving you instant control over positioning, visibility, transformations, and effects.
See the Module Development Guide for complete documentation of all built-in methods and their parameters.
Switch between modes in Settings → Signal Source.
Sequencer Mode (Default) - Program patterns with a 16-step grid per channel. Perfect for getting started, testing modules, and creating standalone pieces without external hardware. Adjustable BPM (60-130), patterns loop continuously and save with your tracks.
External Modes (Advanced) - Use one of the following sources:
Configure global mappings in Settings for consistent control across all tracks.
Switch modes anytime - your tracks, modules, and methods remain the same. Only the trigger source changes.
Every new project includes 16 starter modules in your modules/ folder:
2D & UI:
3D Graphics:
Data Visualization:
Getting Started:
Study these modules to learn patterns for 2D, 3D, text, and data visualization. All are fully editable in your project's modules/ folder.
MyProject/
├── modules/ # ← YOUR MODULES GO HERE
│ ├── Text.js
│ ├── GridOverlay.js
│ ├── SpinningCube.js
│ ├── YourCustomModule.js # Create your own modules here
│ └── ...16 starter modules
│
├── assets/ # ← YOUR ASSETS GO HERE
│ ├── images/
│ │ ├── blueprint.png # Included starter asset
│ │ └── your-image.png # Add your own images
│ └── json/
│ ├── meteor.json # Included starter dataset
│ └── your-data.json # Add your own data
│
└── nw_wrld_data/ # App data (auto-managed)
└── json/
├── userData.json # Tracks, settings, mappings
├── appState.json # Current app state
├── config.json # App configuration
└── recordingData.json # Recording data
nw_wrld/
├── src/
│ ├── dashboard/ # React UI for control
│ │ ├── Dashboard.js # Main dashboard logic
│ │ ├── modals/ # UI modals
│ │ ├── components/ # Reusable components
│ │ └── styles/ # Dashboard styles
│ │
│ ├── projector/ # Visual output window
│ │ ├── Projector.js # Main projector logic
│ │ ├── helpers/
│ │ │ ├── moduleBase.ts # Base class (the foundation)
│ │ │ └── threeBase.ts # Three.js base class
│ │ └── templates/
│ │ └── ThreeTemplate.ts # 3D module template
│ │
│ ├── main/ # Electron main process
│ │ ├── InputManager.js # MIDI/OSC input handling
│ │ ├── starter_modules/ # Starter modules (seeded into projects)
│ │ └── workspaceStarterModules.js
│ │
│ ├── shared/
│ │ ├── json/ # JSON file management
│ │ ├── config/ # Default configuration
│ │ ├── sequencer/ # Sequencer playback engine
│ │ ├── midi/ # MIDI utilities
│ │ └── audio/ # Audio feedback
│ │
│ └── renderer.ts # SDK initialization
│
├── package.json
└── README.md
Configuration files are sto
$ claude mcp add nw_wrld \
-- python -m otcore.mcp_server <graph>