industry10 min read

The Open-Source Libraries Powering Ghost Arcade — A Credits Essay

Ghost Arcade is built on a stack of remarkable open-source libraries. This post walks through every major dependency that earned its keep in v1.7.1 — Butterchurn (Milkdrop), Hydra, MediaPipe, AudioMotion, Wave.js, Three.js, Svelte, Electron — what each one does, why we chose it, and what we contributed back.

Published June 2, 2026

What we stand on

Ghost Arcade isn't built from scratch. It's a thin layer of opinion

and integration sitting on top of decades of work by other people

who released their code under licenses that let us use it. The

v1.7.1 plugin tier — eight new visualizers landing in one release —

exists because eight other communities already did the hard part.

This is the credit essay. Every library below earned its keep,

shipped to your laptop, and gets named because that's the deal you

make when you take someone's open-source work.

Visualizers we integrate

Butterchurn (Milkdrop reborn)

`@jberg/butterchurn` — MIT licensed. A pure-JS port of the

Milkdrop visualizer that has been on Winamp since 2001. Ghost

Arcade's Milkdrop plugin is butterchurn + the official preset

pack with a panel for choosing presets, blending between them, and

routing audio bands per-stem. The preset library is a piece of

culture — twenty years of psychedelic shader work by hundreds of

contributors — and butterchurn lets it run unmodified in the

browser.

If you grew up watching the cymatic waveforms swirl over a Winamp

playlist, the same presets are now playing inside Ghost Arcade with

a routing matrix you can wire your kick drum into.

Hydra (Olivia Jack)

`hydra-synth` — AGPL-3.0. Olivia Jack's live-coding video synth.

Hydra is a functional pipeline of video transforms — `osc(20).rotate(0.1).out()`

is a complete program. Ghost Arcade ships Hydra as a plugin with a

curated preset library AND a code editor so you can write your own

sketches inline. The Hydra panel auto-compiles as you type; a typo

shows red but doesn't crash the layer.

Hydra changed what live-coded visuals look like on the web. Picking

it up was the obvious thing to do.

MediaPipe Hand Landmarker (Google)

`@mediapipe/tasks-vision` — Apache-2.0. The hand-tracking pipeline

that powers v1.7.1's gesture binding system + the HandFX visualizer.

MediaPipe is published by Google's MediaPipe team and runs the

inference on the GPU delegate, which means a modern laptop can

track two hands at 60fps with <15ms inference per frame.

We do a small amount of post-processing — adaptive smoothing,

forward prediction, handedness-label swap when mirror is on — but

the actual landmark detection is all MediaPipe. See the

MediaPipe gesture binding post

for the full technical writeup.

AudioMotion-Analyzer (Henrique Vianna)

`audiomotion-analyzer` — AGPL-3.0. Henrique's Web-Audio-driven

spectrum analyzer is the engine behind Ghost Arcade's AudioMotion

plugin. Logarithmic frequency scaling, customizable bar count,

gradient palettes, peak holds — every visual knob the original

exposes is wired through Ghost Arcade's panel. The reactivity to

your actual audio source (mic, line-in, browser tab, virtual cable)

inherits from Ghost Arcade's audio routing system, so any source

the rest of the app can hear, AudioMotion visualizes.

Wave.js (foobar404)

`@foobar404/wave` — MIT. Lightweight Web-Audio waveform / shape

visualizer with a long catalog of animation styles (Bars, Cubes,

Flower, Wave, Wings, Stars, …). Ghost Arcade's Wave.js plugin

exposes the catalog as a select and every animation's parameters as

modulation-aware sliders. Smaller surface than AudioMotion but very

fast — good when you want one element of audio reactivity layered

into a busier composition.

ISF Shader Library (Vidvox)

`interactive-shader-format` — public domain shader format from

Vidvox (the company behind VDMX). ISF is what made it tractable to

ship a library of 500+ user-tunable shaders: every shader carries

metadata about its inputs (sliders, colors, points) so the panel can

auto-generate UI for any new shader you drop in. Vidvox's

shadertest.vidvox.net library is

where most of our curated shaders started life.

Three.js (mrdoob et al.)

`three` — MIT. The compositing engine that takes every layer's

output texture and composites it through warp / blend / mask /

effects to the master output. Ghost Arcade's layer pipeline,

projection mapping mesh, model3D layers, and every shader effect

ride on Three. The post-FX system is custom but every WebGL primitive

underneath is Three. Twelve years old; still the workhorse of the

web-3D ecosystem for good reason.

WebGPU (W3C standard, browser implementations)

Not a library, an API. The new low-level GPU access standard for

browsers; Ghost Arcade uses it for the master warp + dome

reprojection (v1.7.0), the GPU shader layer renderer, several

visualizers (Flythrough, Ink Cloud, Fluid Sim, Paint Drip, the

3D-smoke pipeline), and the per-screen output windows. Chromium's

implementation (Dawn) is what runs inside Electron. WebGPU is the

thing that made it possible to do real-time GPU compute on

arbitrary user-supplied shader code without dropping out of the

browser.

The application stack

Svelte 5 (Rich Harris)

`svelte` — MIT. The reactivity model that the entire Ghost Arcade

UI is built in. Svelte 5's runes API (`$state`, `$derived`,

`$effect`) replaced a lot of `writable` / `subscribe` boilerplate

for v1.6+ and the codebase reads cleaner now. The whole VJ Mode

panel, the layer mixer, the binding overlays — every interactive

element you see is a Svelte component.

Electron (OpenJS Foundation)

`electron` — MIT. The shell that wraps the web app into a desktop

binary with native filesystem access, MIDI/OSC, system video output,

Spout/Syphon/NDI bridges, and codesigning. Every desktop integration

that the browser sandbox would deny — Ghost Arcade gets via Electron.

Vite (Evan You)

`vite` — MIT. Dev server + build tool. Hot-module reload that

actually keeps app state across reloads when editing a Svelte

component. The build pipeline that produces the production bundle.

Boring infrastructure that just works, every time.

Audio + MIDI + OSC

  • @ffmpeg/ffmpegLGPL (wrapping FFmpeg, also LGPL). Video file
  • decoding when the browser native codecs don't cover the format

    (HAP, ProRes, etc.) and the offline render pipeline for export.

  • Web Audio APIW3C standard. The entire audio analysis chain
  • (FFT, beat detection, per-band energy, multi-stem analysis) rides

    on `AudioContext` + `AnalyserNode`.

  • Web MIDI APIW3C standard. Two-way MIDI for Learn mappings
  • and clock sync.

  • WebSocket OSC bridgecustom on top of `ws`, MIT licensed.
  • OSC messages route into the same dispatch surface as MIDI.

    File formats + content

  • Splat renderingopen file format from the Gaussian Splatting
  • research community + a renderer ported from Mark Kellogg's

    three.js-splat work, MIT.

  • glTF / FBX / OBJthree.js loaders, MIT.
  • PLY / SPLATGaussian splat file formats, public spec.
  • ISF shader formatVidvox, public domain.
  • NDIproprietary protocol from Vizrt with a free SDK; Ghost
  • Arcade wraps it via a native Electron addon. NOT open source but

    free for non-commercial use; commercial deployments need a Vizrt

    license.

  • Spout / Syphonopen-source video-sharing protocols for
  • Windows / macOS respectively; we wrap each via a native addon.

    What we contributed back

    Most of our contributions live in our own codebase as bug-fix forks

    or wrapper abstractions, but a handful have landed upstream:

  • Fixes to the butterchurn preset parser for non-standard preset
  • files seen in the wild.

  • A handful of issue reports + reproduction cases on MediaPipe's
  • tasks-vision repo around module-worker initialization.

  • Bug reports + workarounds on Electron's native modules build
  • toolchain.

    If you maintain one of these projects and Ghost Arcade has been a

    useful adopter, please reach out — we want to support the work that

    supports us. Contact via the

    community page.

    Why this matters

    Two things.

    One: when you download a closed-source VJ tool, the only thing you

    ever own is the binary. When you download an open-source one, you

    own the source and you own the right to fork it the day the vendor

    disappears. We chose AGPL-3.0 for Ghost Arcade specifically so the

    fork-rights propagate — anyone who modifies and ships a derivative

    work has to share the modifications back. This is the same license

    Mastodon, Synapse, and Nextcloud use, and we picked it for the

    same reasons.

    Two: the eight visualizers that landed in v1.7.1 took a year of

    combined work by their original authors before we ever touched

    them. Plugging them into Ghost Arcade took a few weeks each. The

    multiplier on open-source work is enormous. If you're building a

    creative tool in 2026, this is the path: pick the AGPL or MIT

    libraries that already do 80% of what you need, integrate them

    honestly with credit, and ship the 20% that makes your tool yours.

    Ghost Arcade is free, open source, and downloadable at

    /download. The source is at

    github.com/riskcapital/ghost-arcade.

    Every dependency above is in package.json.

    Frequently Asked Questions

    Why AGPL-3.0 instead of MIT?

    AGPL's strong copyleft propagates: anyone who modifies Ghost Arcade and ships a derivative (including hosted SaaS) has to share their modifications. MIT would let a company fork it, add proprietary plugins, and ship a closed competitor with no obligation to give back. AGPL is the same license Mastodon, Synapse, and Nextcloud use; we picked it for the same reasons. The visuals you CREATE with Ghost Arcade aren't covered — only the source code itself is. Commercial creative use (paid gigs, installs, streams, recordings) is allowed and encouraged.

    Is using AGPL software safe for commercial work?

    For creating output (the visuals at your gig, your installation, your recording) — yes, no obligations. The AGPL governs the source code of Ghost Arcade itself, not the rendered output. For modifying and redistributing Ghost Arcade (forking it, adding closed-source plugins, shipping a derivative) — you must publish your modifications under AGPL too. For most working VJs the second case never comes up.

    Are all the open-source libraries you mention actually shipped in the binary?

    Every one of them is in package.json and ends up in the production bundle. Butterchurn, Hydra, MediaPipe, AudioMotion, Wave.js, Three.js, the WebGPU shaders — all present. Electron + Vite are build-time. NDI is a native runtime dependency that's present on Windows builds where the SDK was found at compile time (proprietary, not redistributable in source).

    How do I credit Ghost Arcade in my show notes?

    Not required by the license but appreciated. "Visuals powered by Ghost Arcade (ghostarcade.live)" is plenty. If you forked or modified the source for a show, link the modified source per AGPL §13 — a GitHub repo with your changes is fine.

    Can I use the included shaders / Milkdrop presets commercially?

    The shaders bundled with Ghost Arcade come from a mix of sources, each with their own license. The Milkdrop preset pack is permissively licensed (most under public-domain or BSD-style). The ISF shaders bundled from Vidvox and community sources retain their original licenses (usually MIT or public domain — check the individual files). User-contributed shaders in the shader-lab dir are AGPL with Ghost Arcade. For most working-VJ use cases (live performance, recorded set, streamed gig) everything is fair game.

    open sourcecreditsbutterchurnmilkdrophydramediapipethree.jssvelteelectron

    Ready to start projection mapping?

    Download Ghost Arcade free for Mac and Windows.

    Download Free