Browse by type
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.
A project folder holds three things: modules/ (your hot-reloadable visual modules), assets/ (images, JSON, and other resources), and nw_wrld_data/ (tracks, settings, and recordings). For the full annotated layout, see Project Structure below.
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 a single-channel workflow and a split-channel workflow (method triggers on one channel, track selection on another). For the full channel-defaults walkthrough and best practice, see Getting Started.
Modules 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, and 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, loadJson, listAssetsTHREE, p5, d3, NoiseOBJLoader, PLYLoader, PCDLoader, GLTFLoader, STLLoader/*
@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, viewportLine, background, and invert. A built-in matrix method is also available as a triggerable method, handled by the projector layout layer: declare and trigger it, but do not call it from module code.
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 (default 120), patterns loop continuously and save with your tracks.
External Modes (Advanced) - Drive channels from MIDI, OSC, live audio input, or an uploaded audio file. For the per-source breakdown and routing details, see Advanced: External Input Control above. 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 22 starter modules in your modules/ folder, grouped by category:
2D:
3D:
Text:
Study these modules to learn patterns for 2D, 3D, and text. 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
│ └── ...22 starter modules
│
├── assets/ # ← YOUR ASSETS GO HERE
│ ├── images/
│ │ ├── blueprint.png # Included starter asset
│ │ └── your-image.png # Add your own images
│ ├── models/ # 3D models (OBJ, PLY, PCD, GLTF/GLB, STL)
│ │ └── cube.obj # Included starter model
│ ├── fonts/ # Fonts for text modules
│ │ └── RobotoMono-VariableFont_wght.ttf
│ └── 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
│ │
│ ├── projector/ # Visual output window
│ │ ├── Projector.ts # Main projector logic
│ │ ├── moduleSandboxEntry.ts # SDK initialization (sandbox entry)
│ │ └── helpers/
│ │ ├── moduleBase.ts # Base class (the foundation)
│ │ └── threeBase.ts # Three.js base class
│ │
│ ├── main/ # Electron main process
│ │ ├── InputManager.ts # MIDI/OSC input handling
│ │ ├── starter_modules/ # Starter modules (seeded into projects)
│ │ └── workspaceStarterModules.ts
│ │
│ └── shared/
│ ├── json/ # JSON file management
│ ├── config/ # Default configuration
│ ├── sequencer/ # Sequencer playback engine
│ ├── midi/ # MIDI utilities
│ ├── audio/ # Audio feedback
│ └── styles/ # Shared styles (_main.css)
│
├── index.js # Thin bootstrap into the compiled main process
├── package.json
└── README.md
src/index.js is a thin bootstrap that loads the compiled main process. The Electron main process lives under src/main/mainProcess/ (entry.ts, windows.ts, sandbox.ts, workspace.ts, protocols.ts, lifecycle.ts, and ipcBridge/).
Configuration files are stored in your project
browse all types & interfaces →
$ claude mcp add nw_wrld \
-- python -m otcore.mcp_server <graph>