ArenaM8 (Oi!)
Native Resolume Arena control for the Stream Dock N4 Pro — live thumbnails on the keys, no Companion in the middle.
ArenaM8 — shipped under the marketing name "Oi!" — is a VSD Craft plugin that turns a Mirabox Stream Dock N4 Pro into a first-class control surface for Resolume Arena. Live clip thumbnails on the LCD keys, one-tap clip triggers, encoder-mapped layer opacity and speed, touch-bar crossfading, OSC custom actions. REST for the composition tree and thumbnails, OSC for low-latency triggers, 30-second composition cache to keep thumbnails fresh without hammering Arena. No middleware, no Bitfocus Companion, no Stream Deck software in the chain.
- Node.js
- JavaScript
- VSD Craft SDK
- OSC
- REST API
- Apache
ArenaM8 — branded "Oi!" on the marketing page — is the VJ-rig answer to "I don't want Companion in the middle of my show." It's a VSD Craft plugin that talks WebSocket to the deck, REST + OSC to Resolume Arena, and paints live clip thumbnails directly onto the LCD keys of a Mirabox Stream Dock N4 Pro. Tap a key, the clip fires; green border = currently playing.
Ten actions across the deck
- Trigger Clip — live thumbnail on the key, tap to fire, green border when active.
- Trigger Column — fire every clip in a Resolume column simultaneously.
- Deck Select — switch the active deck.
- Layer Bypass / Solo / Clear — one key per layer-state action.
- Encoder Opacity — dial layer opacity 0–100%, configurable step per click.
- Encoder Speed — dial playback speed 0–2×, push to reset to 1×.
- Touch Crossfader — map the touch bar to the Arena crossfader or any OSC float param.
- Custom OSC — fire any user-defined OSC address with int / float payload.
Plumbing
- REST on Arena's port 8080 for composition tree + clip thumbnails.
- OSC over UDP on port 7000 for low-latency triggers and parameter changes.
- 30-second composition cache with auto-refresh — deduplicates REST calls and keeps the thumbnail rail current without flooding Arena.
- 10-second connection poll with an auto-update banner when a new plugin version is published upstream.
- File-based logger under
plugin/log/— noconsole.login committed code, so the deck stays quiet in production. - Modular Property Inspector — split into
pi-bridge,pi-connection,pi-clip-selector, and per-action PIs so the config UI stays focused.
Why no middleware?
Companion is great until it's the thing that crashed mid-set. Talking straight to Arena over its own protocols means one fewer process to babysit, one fewer log file to read at 2 AM, and one fewer reason for the deck to lose the show.
Straight from the source
The project's own README.
Rendered in place — every link, image, and code block carried over from the repo. The page below is what a contributor would see opening the project for the first time.
Oi! (N4 ArenaM8)
Native Resolume Arena control for the Mirabox Stream Dock N4 Pro.
Live clip thumbnails on the LCD keys, one-tap clip triggers, encoder-mapped layer parameters, touch-bar crossfading, and connection diagnostics — straight from the deck. No middleware. No Bitfocus Companion. No Stream Deck software.
- 🌐 Website — https://arenam8.gamingworld.uk
- 📦 Latest plugin — https://arenam8.gamingworld.uk/downloads/oi-latest.zip
- 📓 Changelog —
CHANGELOG.md - 📐 Design doc —
design-doc.md
Current version: 0.8.0 (see VERSION).
What's in the box
This repository ships two deliverables from a single source tree:
| Deliverable | Lives in | Runs on | What it is |
|---|---|---|---|
| Plugin | plugin/ |
VSD Craft (Windows, Node.js 20 runtime) | A .sdPlugin bundle that talks WebSocket to VSD Craft, REST + OSC to Resolume Arena |
| Website | website/ |
Apache2 on namek.top |
Static HTML/CSS/JS marketing + download site at arenam8.gamingworld.uk |
Both deploy from main. Every commit goes to production.
Plugin features (v0.8.0)
Ten actions covering the full N4 Pro control surface:
| Action | Control | What it does |
|---|---|---|
| Trigger Clip | LCD key | Live thumbnail on the key, tap to fire the clip, green border when active |
| Trigger Column | Key | Fire every clip in a Resolume column at once |
| Deck Select | Key | Switch the active deck |
| Layer Bypass / Solo / Clear | Key | One key per layer-state action |
| Encoder Opacity | Knob | Dial layer opacity 0–100% with configurable step |
| Encoder Speed | Knob | Dial playback speed 0–2×, push to reset to 1× |
| Touch Crossfader | Touch bar | Map touch position to the crossfader or any OSC float param |
| Custom OSC | Key | Fire any user-defined OSC address with int/float payload |
Under the hood:
- REST for composition tree + clip thumbnails (HTTP, port 8080)
- OSC over UDP for low-latency triggers and parameter changes (port 7000)
- 30s composition cache with auto-refresh — deduplicates REST calls and keeps thumbnails fresh
- Connection polling every 10 s, with auto-update banner if a new website version is published
- File-based logger in
plugin/log/(noconsole.login committed code) - Global settings shared across actions (Resolume IP, ports, debug toggle)
- Property Inspector modular split:
pi-bridge,pi-connection,pi-clip-selector, plus per-action PIs
Requirements
| Minimum | |
|---|---|
| Hardware | Mirabox Stream Dock N4 Pro |
| Host OS | Windows 10/11 |
| VSD Craft | 3.10.188.226 |
| Node.js (bundled by VSD Craft runtime) | 20 |
| Resolume Arena | OSC + REST API enabled (default ports 7000 / 8080) |
The plugin zip ships with node_modules bundled — no npm install on the target machine.
Install (end users)
- Download
oi-latest.zip. - Extract it. You'll get a folder named
uk.gamingworld.arenam8.oi.sdPlugin. - Drop that folder into your VSD Craft plugins directory.
- Restart VSD Craft. The actions appear under the Resolume Arena category.
- In Resolume: enable OSC Input (port 7000) and the Web Server (port 8080).
- Open any action's Property Inspector and set the Resolume host IP. Hit Test Connection.
Repository layout
ArenaM8/
├── VERSION ← Single source of truth (e.g. 0.8.0)
├── CHANGELOG.md ← Human-readable release notes
├── Justfile ← Task runner (deploy, bump, package, verify)
├── design-doc.md ← Master architecture doc
│
├── plugin/ ← VSD Craft plugin source
│ ├── manifest.json ← Plugin definition (10 actions)
│ ├── package.json ← deps: ws
│ ├── src/plugin.js ← Entry: WebSocket registration + event routing
│ ├── src/actions/ ← One module per action
│ ├── src/lib/ ← connection, cache, REST, OSC, logger, utils
│ ├── pi/ ← Property Inspector UI (HTML/JS/CSS)
│ └── images/ ← Plugin SVG icons
│
├── website/ ← Static site (Apache document root)
│ ├── index.html ← Splash landing
│ ├── oi/ ← Product page (SSI partials)
│ ├── css/ ← 18 focused stylesheets
│ ├── js/ ← main.js, animate.js, modal.js (vanilla)
│ ├── fonts/ ← Orbitron, Exo 2, JetBrains Mono (woff2)
│ ├── sprites/ ← Lucide SVG icon sprite
│ ├── img/ ← WebP imagery, favicons, logos
│ ├── downloads/ ← Versioned + latest plugin zips
│ └── version.txt ← Live version (auto-bumped)
│
├── docs/ ← Project + agent documentation
│ ├── quick-start.md ← Read first — full architecture reference
│ ├── post-work.md ← Pre-deploy checklist
│ ├── features/ ← Per-feature specs
│ ├── plugin/ ← VSD Craft + Resolume API notes, N4 Pro hardware
│ └── web/ ← Design system, SEO checklist
│
└── scripts/
├── bump-version.sh ← Bumps VERSION + manifest + package.json + version.txt
└── package-plugin.sh ← Zips plugin into website/downloads/
For the full architecture tour, CSS file map, plugin event flow, and coding rules, see docs/quick-start.md.
Development
Prerequisites
- WSL2 / Linux / macOS for editing
- A Windows host running VSD Craft + Resolume Arena for plugin testing
justfor the task runnerbash,curl,zip,ssh(for deploys)
Clone
git clone [email protected]:saintpetejackboy/ArenaM8.git
cd ArenaM8
Plugin
cd plugin
npm install # only if you wiped node_modules — the published zip bundles them
Edit source under plugin/src/. Test by running just package and dropping the resulting zip into VSD Craft on Windows.
Website
The website is pure static — no build step. Just edit and refresh.
cd website
python3 -m http.server 8000 # or any static server
Apache SSI is used for partials in oi/index.html (<!--#include virtual="..." -->). The local Python server won't expand them — view the built page on the deployed site, or use any SSI-aware dev server.
Justfile commands
| Command | What it does |
|---|---|
just deploy "msg" |
git add -A → commit → push → SSH git pull on namek.top |
just bump [patch|minor|major] |
Bumps VERSION, manifest.json, package.json, version.txt |
just package |
Zips plugin into website/downloads/ (versioned + oi-latest.zip) |
just release [level] "msg" |
Bump → package → deploy (full pipeline) |
just verify |
Curls remote version.txt and compares with local VERSION |
just check-resolume [host] [port] |
Pings the Resolume REST API |
Coding rules
These are non-negotiable for any commit landing on main:
- Max 150 lines per file. Refactor if approaching the limit.
- Max 30 lines per function. Extract helpers.
- Every file starts with a comment header: path, purpose, one-line description.
- No
console.login committed plugin code — uselib/logger.js. - No magic numbers — use named constants or config.
- No duplicate logic — lift it into
lib/orutils/. - No secrets in tracked files — use
.env(gitignored). - CSS: all values via custom properties in
theme.css. No inline styles. No!important. - JS: vanilla only.
constby default.async/await. Named exports. - HTML: semantic elements,
alttext, ARIA labels. - Git: never force push, reset hard, rebase shared history, or delete branches.
Full rationale and detail in docs/quick-start.md.
Versioning & releases
- Single source of truth:
VERSION just bumppropagates the version toplugin/manifest.json,plugin/package.json, andwebsite/version.txtjust packageproduces bothoi-vX.Y.Z.zipandoi-latest.zipunderwebsite/downloads/- The plugin checks
version.txton the live site and shows an update banner in any Property Inspector when a newer version is published
See CHANGELOG.md for release history.
License
This project is currently proprietary / unlicensed (UNLICENSED in plugin/package.json). All rights reserved by Gaming World. Contact https://gamingworld.uk for licensing or distribution questions.
Credits
Built by Gaming World. Bug reports, feature requests, and feedback go through the modal on the website or by opening an issue on this repo.
Build something like this
Want a tool like this for your shop?
We've shipped this kind of thing before. Twenty-minute intro call, no slides.