Work arenam8
tool

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.

Last updateApr 11, 2026 PrimaryHTML
  • Node.js
  • JavaScript
  • VSD Craft SDK
  • OSC
  • REST API
  • Apache
ArenaM8 (Oi!) — Native Resolume Arena control for the Stream Dock N4 Pro — live thumbnails on the keys, no Companion in the middle.
ArenaM8 (Oi!) media
ArenaM8 (Oi!) media

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/ — no console.log in 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.

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/ (no console.log in 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)

  1. Download oi-latest.zip.
  2. Extract it. You'll get a folder named uk.gamingworld.arenam8.oi.sdPlugin.
  3. Drop that folder into your VSD Craft plugins directory.
  4. Restart VSD Craft. The actions appear under the Resolume Arena category.
  5. In Resolume: enable OSC Input (port 7000) and the Web Server (port 8080).
  6. 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
  • just for the task runner
  • bash, 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.log in committed plugin code — use lib/logger.js.
  • No magic numbers — use named constants or config.
  • No duplicate logic — lift it into lib/ or utils/.
  • 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. const by default. async/await. Named exports.
  • HTML: semantic elements, alt text, 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 bump propagates the version to plugin/manifest.json, plugin/package.json, and website/version.txt
  • just package produces both oi-vX.Y.Z.zip and oi-latest.zip under website/downloads/
  • The plugin checks version.txt on 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.