← viiy.tech

Overview & concept

VIIY is a media server for video installations and live shows. Content is built in the CUE EDITOR as layers on a timeline, stored as cues (a cue = a snapshot of all layers), and played out through SHOW to the physical screens configured in OUTPUTS. Live sources (cameras, DeckLink, NDI, Spout) are routed on the MATRIX tab.

Made by a practitioner. VIIY comes from years of running real shows — the ideas that proved themselves on site kept, the friction removed. The result is one focused tool that does exactly what a show needs, and nothing it doesn't: edits go live, the outputs are frame-accurate, and a backup machine stands ready to take over. Powerful where it matters, simple everywhere else.

Seven tabs: SHOW · CUE EDITOR · MATRIX · OUTPUTS · AI ASSISTANT · ACTION · SETUP (keys F1F7). The whole UI is in English.

PROGRAM-FIRST — the core of the workflow

Interface colour legend

ColourHexMeaning
Blue#2f8df5accent, active state, progress
Green#27c264LIVE, playing, GO, enabled
Amber#e0b020test card, SOLO, User Guides, warning
Red#c0504aerror, BLACKOUT, delete
White#ffffffselected slice (frame + veil) — selection only

The monospace font is Consolas (timecodes, numbers). Panels are divided by draggable splitters (hover = grey, press = blue); the layout is remembered in the workspace.

Quick start — from documents to a running show

There are two ways to build a show in VIIY. This chapter is the short one: hand your production documents to the AI Showbuilder and let it lay the show out for you. Building the same show by hand — canvas, outputs, slices, cues, layers — is the long way, and every step of it is described in OUTPUTS and CUE EDITOR.

1 · Connect the key, then prepare the documents

Paste your Anthropic API key once — the 🔑 API key control sits at the bottom of the AI ASSISTANT tab, under the input box (not in SETUP). Everything after that depends on what you feed it. The Showbuilder is only as precise as your paperwork, so gather:

The API key control at the bottom of the AI ASSISTANT tab
The 🔑 API key control lives at the bottom of the AI ASSISTANT tab, under the input box — click it, paste, Save.

2 · Let it build

Attach the materials with 📎 and ask for the show. You do not have to do it in one go — send the timecode sheet first, the stage plan later, and keep asking questions in between.

What is written above takes far longer to read than to do. In practice it is a few mouse clicks, and you watch it happen in real time — cues appearing in the list, files landing on the timeline, the screens lighting up. It looks strange, and it is very fast.

AI SHOWBUILDER with the show materials attached as chips
Materials attached and waiting: a timecode sheet and the stage documents sit as chips above the input. Add a comment if you want to — or just press BUILD.
VIIY building the show: cue list filled from the rundown, clips placed on the timeline per screen
The build in progress. The cue list has taken the names and order from the rundown; on the timeline the same song's files are already split across three layers — …_LEFT_LED, …_CENTR_LED, …_RIGHT_LED — each routed to the screen its file name names. Note the status line: air keeps playing — the build happens in the background.

3 · Convert the media to HAP

For smooth playback the footage should be in HAP. Two ways:

SETUP → Project → Collect files with the HAP format choice
SETUP → Project → COLLECT FILES. Press Collect & convert to HAP (cues) and the format row appears: Hap (DXT1) · Hap Alpha (DXT5) · Hap Q (YCoCg). Everything lands in media/ inside the project and the paths become relative — which is what makes the folder movable to another machine.

4 · That is a show

You may still want to touch things up by hand — but if the documents were accurate and complete, there should be nothing to fix. If you do not trust the mechanism, it is worth trying once: it saves hours.

Two things worth remembering about the assistant: it has no eyes (yet), and it does not read your mind (yet). Tell it what you want. The conversation stays with the project, so the more precisely you explain something once, the less you have to repeat it later.

Global elements

Top navigation

Bottom status bar

Live values: PROJECT: <name> · FPS 25 · TC 00:00:00:00 · on the right OUTPUT ● native (output mode). On the left — the name of the selected object of the current tab (cue / layer / slice) and a row of COPY CUT PASTE DUPLICATE DELETE that acts on that object.

Splash screen

A separate borderless 600×340 window in the centre (the V:I:I:Y logo + a gradient loading bar). The main window appears once initialization is complete.

Numeric fields & formulas

Every numeric field behaves the same way:

This works in NumSpin / NumField spinners, composition size, FPS, grid step and the New Project dialog.

Hotkeys

Single-letter keys do not fire while a text field is being edited. F-keys always work.

KeyAction
F1F7tabs, in bar order: SHOW · CUE EDITOR · MATRIX · OUTPUTS · AI · ACTION · SETUP
Changed in v0.9.45: ACTION moved next to SETUP and took F6; SETUP is now F7. F1F5 are unchanged.
F12all outputs ON/OFF (opens every screen whose monitor is connected, or closes them all)
Shift+SpaceSHOW MODE — lock editing for the show. Locking is instant; unlocking needs a second press within 2s (or holding the button for 2s) ⭐ v0.9.37
MCUE EDITOR: drop a marker at the playhead ⭐ v0.9.37
Shift+M / Ctrl+Shift+Mgo to next / previous marker ⭐ v0.9.37
Ctrl+SSave the whole project to disk (Save As if it has no folder yet)
Known limit: if the focus is still inside a text field or the cue list, the key may not fire — click the timeline and repeat, or use SETUP → Save project.
Ctrl+Mtoggle MIDI MAP mode (map controls to a MIDI surface)
BBLACKOUT (toggle; restores the previous master level)
Space / Backspace / PSHOW: GO / BACK / Pause–Resume
SpaceCUE EDITOR: Play / Pause
Home End · , .playhead: start/end · −1/+1 frame
Shift+, Shift+.playhead ±5 frames ⭐ v0.9.39
nudge the selected keyframe ±1 frame
Shift+← Shift+→nudge the selected keyframe ±5 frames ⭐ v0.9.39
jump to the previous / next edit point on the timeline — every clip edge, not a fixed step ⭐ v0.9.39
SCUE EDITOR: SNAP on/off ⭐ v0.9.39
Ctrl+ACUE EDITOR: select every clip on the selected layer ⭐ v0.9.39
C / VCUE EDITOR: arm the RAZOR blade / back to selection
Ctrl+K / Ctrl+Shift+Kadd edit (cut) at the playhead: selected layer(s) / all tracks
+ F · PgUp PgDntimeline zoom / Fit · horizontal scroll
Ctrl+Alt+C / Ctrl+Alt+VCopy / Paste Attributes — copy a layer's attributes, paste the chosen groups onto every selected layer ⭐ v0.9.38
Ctrl+Shift+ACUE EDITOR: new ✦ adjustment layer above the selected one — effects on it treat everything below as one picture ⭐ v0.9.76
Ctrl+Z / Ctrl+Y (Ctrl+Shift+Z also redoes)Undo / Redo (editor). A whole gesture is one step ⭐ v0.9.39 — dragging a fader or a corner in the preview undoes in a single press, not value by value
Ctrl+C/X/V Ctrl+Dcopy / cut / paste / duplicate the last-clicked object — a cue row, a layer, a clip on a track, a bin file, a slice or a screen. Paste is driven by what is in the clipboard: copy a clip, click another layer, Ctrl+V pastes the clip at the playhead. ⭐ v0.9.33
Deletedelete the selected object. A clip goes immediately, with no dialog — the action is undoable, and a group delete comes back in one Ctrl+Z ⭐ v0.9.40. Cues, layers, screens and slices still ask. SHOW: delete selected cues (multi-select)
Escin a physical output window — close the output; in the UI — cancel the current action

Launcher & dialogs

VIIY launcher
The launcher — start a new project, open a recent one, or let the AI Showbuilder build the show.

Welcome (launcher)

A full-screen overlay at start: NEW PROJECT and OPEN PROJECT cards, a RECENT list (click to open), an AI Showbuilder card (upload materials to build a show) and a "Show this window at startup" toggle.

NEW PROJECT

Name → folder (Browse…) → Project FPS (24/25/30/50/60 — this is the project frame standard; the decks, engine and outputs all live by it) → Canvas (WxH, "From file…" takes the size from a file, plus presets) → Create ›.

The project FPS is chosen once, at project creation. All timing is frame-accurate to it (no milliseconds, no drift) — the engine is the single metronome for frame selection.

Closing the app

A "Save before closing?" dialog: Cancel / Don't save / 💾 Save. All physical outputs close on exit.

SHOW — the playout desk

VIIY SHOW tab
SHOW — cue list, program output preview, system meters and the transport.

The live tab: you do not edit here, you play finished cues. Three columns plus a transport bar at the bottom.

Left column — CUE LIST

Centre — PROGRAM

Right column

SYSTEM: CPU / VRAM / MEM. VRAM is video-memory use vs the Windows budget, not GPU core load — it turns amber over 80% and red over 95%; above 100% the budget is exceeded and Windows spills textures to system RAM (stutter) — convert heavy H.264 media to HAP to fix it. ⭐ v0.9.32 Then PROJECT (frame standard) · RENDER (real engine fps) · LAYERS (honest layer frame rate: min..max new frames/s; "—" = the engine is asleep) · DECODE (total decoder throughput). MASTER: VIDEO/AUDIO faders + VU meter. ACTION / AI — two pages of one panel; ACTION is in front by default, AI is one click away. Next to them sits MSG — the one-off message to the crew screens.

Do not confuse the two: this panel is the operator's own event feed on the desk. The ACTION tab (F6) is a separate page — the live preview of the crew screen, the show-wide event rules and the list of every event of the show; and the ACTION output is the physical screen the crew looks at. All three read the same selection of events ⭐ v0.9.44. See ACTION screen.

ACTION — the event feed ⭐ v0.9.37

Turns the timeline markers of your cues into a running list of events with a countdown — what a theatre calls the stage manager's book. Markers are placed in the CUE EDITOR (M, see below).

Transport (bottom)

SHOW READY (see below) · BLACKOUT · PAUSE/RESUME · GO ▶ · ◀◀ BACK · ■ STOP ALL.

SHOW READY — one button before doors ⭐ v0.9.37

The button keeps the result of the last run in its colour: grey SHOW READY? — not checked yet · green — clean · amber — warnings · red — critical. Hover shows when it was run and the summary.

It checks: project saved (naming what exactly is unsaved) · media online (every file of every cue, codec and fps) · media collected into the project folder · outputs (monitor present, output open, refresh a multiple of project fps) · timecode conflicts between cues · Main/Backup and split-brain · Sync PIN · external timecode (input on? signal locked?) · audio device · VRAM headroom · which graphics card the show actually renders on ⭐ v0.9.65.

The GPU line is worth reading once, on every new machine. VIIY writes it to the log at every start ([gpu] …) and shows it here: card, memory, driver, Direct3D level, number of screens. It speaks up when the machine has two cards and the screens hang off the one we are not rendering on — every frame then crosses the bus between cards, which looks like "it is just slow" and reports no error anywhere. It also names a software adapter (no acceleration at all) and a Direct3D level below 11_0.
There are deliberately no thresholds here — no "at least N GB", no "driver newer than X". We have not measured those numbers, and an invented limit is worse than none. VIIY states the facts; the call is yours.
Checks that do not apply to this show are not asked at all. Running standalone with no external timecode? You will not see a word about PIN or TC. Irrelevant warnings train operators to ignore all warnings.

At the bottom: ▶ ENTER SHOW MODE — verify and lock the desk in one move. It is not blocked by findings: sometimes a show starts with a known problem, and that call belongs to the operator, not the software.

SHOW MODE — locking the desk ⭐ v0.9.37

The button in the right-hand side of the header, next to the TIMECODE chip ⭐ v0.9.39 (or Shift+Space) locks editing: tabs, cues, layers, mapping and outputs stop reacting to clicks. Still live: GO · BACK · PAUSE · BLACKOUT · STOP ALL and Ctrl+S. Rehearsal is an editor; a show is a desk.

Unlocking is deliberate. Hold the button for 2 s (an amber bar shows the progress) or press Shift+Space twice within 2 s. Locking stays instant — an error towards safety costs nothing, an accidental unlock mid-show does not.
STOP ALL = truly black. The program is muted (including the free-PROGRAM mirror) until the next action: a dropped file, Play, GO or TAKE wakes the screens again. The same happens after opening or creating a project — black until the first action. STOP ALL also switches TIMECODE off — it is the panic stop.
While TIMECODE is ON the manual transport is disabled (GO / BACK / cue GO pads / PAUSE / TAKE are dimmed) — the clock owns the show. Turn timecode off (one click in the header) to drive by hand. STOP ALL and BLACKOUT always work. Details: TIMECODE.

Show journal — what happened at 20:47 ⭐ v0.9.64

VIIY keeps <project>/show.log — one line per on-air event, with the wall clock and the show clock side by side:

2026-08-19 20:47:13  GO  cue 14  "15 ALL SCREENS GRID"  [SHOW 01:12:03]
2026-08-19 20:49:02  BLACKOUT ON  [SHOW 01:13:52]

If no project has been saved yet, the journal goes to VIIY's own folder instead, so the events are not lost.

Auto-save, and what happens if VIIY does not close normally ⭐ v0.9.61

Auto-save (SETUP → Project) drops a timestamped copy into <project>/backups/ every 1 / 3 / 5 / 10 minutes and keeps the N newest. It never touches your .viiy — that one is written only when you save.

If VIIY is killed, loses power or crashes, the next time you open that show it says so and offers the newest copy — with the time it was taken and how much newer it is than the show you just opened.

Nothing here is written during the show. The mechanism is one small marker file, written when a show is opened and when it is saved, and removed on a clean exit — no snapshots, nothing on every GO.

CUE EDITOR

VIIY CUE EDITOR
CUE EDITOR — media bin, cue list, live preview, layer controls and the timeline.

Layout: PROJECT (bin) → CUE LISTPREVIEW → the right panel (Controls / Effects / Live); the TIMELINE is along the bottom.

PROJECT (media bin)

PREVIEW + transport

Right panel — CONTROLS

Parameters belong to the CLIP ⭐ v0.9.38

Cut a layer with the razor and each piece is a self-contained clip: its own transform, its own effect stack, its own keyframes, its own crop / corner pin, its own volume. Editing one does not move the one next to it.

Reset ↺ — with a choice ⭐ v0.9.39

Every section header in CONTROLS (TRANSFORM · CROP · CORNER PIN · BLEND · AUDIO) carries a icon.

Copy / Paste Attributes ⭐ v0.9.38

Ctrl+Alt+C copies the attributes of a layer, Ctrl+Alt+V opens PASTE ATTRIBUTES, plus the same two items in the layer and clip right-click menus. Tick what should travel:

The right panel tabs are Controls (default), Effects and Live. EFFECTS — a searchable library: double-click or drag onto a timeline layer. LIVE — cameras/inputs (Refresh): click = to the bin, double-click = onto a layer.

TIMELINE

Commands are consistent everywhere: right-click any object (cue / layer / clip / media / slice / preset / screen) for Copy / Cut / Paste / Duplicate / Rename / Delete, or use the Ctrl+C/X/V/D shortcuts and the status-bar buttons. There is one shared clipboard, and the shortcuts target the object you clicked last ⭐ v0.9.33 — click a clip, a bin file or a cue row and Ctrl+C copies exactly that; Ctrl+V pastes whatever the clipboard holds. All context menus share one compact dark style (red hover on destructive items). Delete asks for confirmation on cues, layers, screens and slices; clips are removed straight away ⭐ v0.9.40 — the action is undoable, and asking twice for something Ctrl+Z takes back only trains people to click through dialogs.

EFFECTS ⭐ v0.9.34

Effects live on a layer (or on an adjustment layer, where they affect everything below) and on MATRIX routes. Drag one from the library onto a layer, or double-click to add it to the selected layer. Every numeric parameter can be keyframed (stopwatch) and MIDI-mapped. All of them run on the GPU in real time — nothing is pre-rendered.

Generative FX driven by your live signal

These four are the unusual ones: they generate imagery rather than filter it, and three of them can be born from the pixels of the incoming video by colour. The classic case: a camera on stage, a performer in a dark costume with a white trim — pick white, and sparks fly off the trim in real time.

Image effects

Brightness/Contrast · Hue/Saturation · Levels · Blur · Sharpen · Glow/Bloom · Invert · Posterize · Mono/Threshold · Pixelate · Vignette · RGB shift · Scanlines/CRT · Noise/Grain · Edge detect · Tritone · Fire · Wave/Ripple · Twirl · Radial blur · Text, plus ⭐ v0.9.34 Kaleidoscope · Bad TV / VHS · Halftone · Polar / Tunnel · Lens distortion · Anamorphic streak · God rays.

Titles — the speaker's name, made readable ⭐ v0.9.65

The Text effect stopped being a single line of white letters. It is now the thing you put a speaker's name in, five minutes before they walk on.

Animate it freely. A title is drawn once and then reused: moving it or turning it on keyframes costs the show nothing measurable, because position and rotation are applied when the title is placed on the frame, not when its letters are drawn. Changing the text, the font, the size or the outline is what redraws it — and that happens once per change, not once per frame.

Audio-reactive parameters ⭐ v0.9.35

Right-click any effect parameter's fader and an audio row appears. The chip cycles OFF → LOW → MID → HIGH → LVL — the frequency band that will drive the parameter (bass 20–250 Hz, mid 250 Hz–2 kHz, high 2–16 kHz, or the overall level). Next to it a live bar shows that band so you can see the value breathing, and an amount slider sets how far it moves. The amount can be negative — then the parameter ducks on the beat instead of jumping, which is often the better look.

ISF — your own shaders ⭐ v0.9.34

VIIY runs shaders in ISF (Interactive Shader Format). Drop .fs files into the folder shown in SETUP → Effects → ISF SHADERS ⭐ v0.9.39 (the page moved out of Project), press Rescan, and they appear in the effects library under a separate ISF section with their parameters turned into normal sliders, colour pickers and dropdowns — keyframable and MIDI-mappable like any built-in effect. GLSL is translated to the GPU's native shader language on load; float, bool, enum, colour and point inputs are supported. Multi-pass shaders run too ⭐ v0.9.74: a shader may declare PASSES with named TARGET buffers, read them back in later passes, size them with the usual "$WIDTH/4" expressions, and mark them PERSISTENT so their contents survive into the next frame — which is what feedback, motion trails, fluid simulations and reaction-diffusion shaders are built on. Each effect on each layer keeps its own buffers, and they are freed again when the effect is not used. Up to 8 passes and 8 texture slots per shader; audio-input shaders are still rejected, with the reason shown in SETUP, so a shader never fails silently. VIIY ships no third-party shaders — the folder is yours.

⚠ Use ISF shaders at your own risk. ⭐ v0.9.40 A shader is third-party code compiled and run on this machine's GPU. VIIY catches compilation failures (they are listed with their error in SETUP), but not what a working shader does at runtime: an endless loop, a division by zero or heavy maths at 4K can stall the render or take the program down together with the graphics driver. Try every shader in rehearsal, at show resolution — never first on air.

The assistant knows this dialect ⭐ v0.9.74 — VIIY ships a small pattern library that the built-in AI (and any connected MCP client) reads before it writes or explains a shader: a machine-generated description of what this build supports, plus worked examples for frame history, separable blur, reaction-diffusion, half-resolution bloom, a pure generator and the metadata that turns inputs into controls. The examples are ours, written for VIIY — no third-party shader code is shipped or fed to the model. You can add your own: SETUP → Effects → AI PATTERN LIBRARY → My patterns, and a file named like one of ours replaces it.

And it can write one ⭐ v0.9.74 — ask for an effect in words and the assistant builds it. The shader is compiled in a sandbox first: if it does not build, nothing is written and the compiler's full text goes back to the model, which fixes it and tries again. When it builds, the file lands in your shader folder with a provenance header (model, date, your request) and appears in the effects library. It is never put on air by itself — you place it on a layer. VIIY asks for confirmation before writing, because overwrite replaces a file of yours, and rescanning the library restarts the frame history of ISF effects currently running. Loops without a bound, and loops whose bound is an input the operator can drag, are refused before the shader is even compiled — but those are filters, not a safety proof: the rehearsal rule above still applies to generated shaders, doubly so.

The shaders folder and the LUT folder default to a location next to the program; the shader folder can be pointed anywhere (SETUP → Effects). Avoid folders synced by OneDrive or similar: cloud placeholder files can fail to open on a show machine with no network.

MATRIX

VIIY MATRIX router
MATRIX — route any source to any screen, transform per slice, and recall states as presets.

A live "source → slice" overlay router — F3, the third tab. A route lays a live source (station logo, camera, identity) on top of the program on a chosen slice, independent of the cues.

Sources

Slices & the TRANSFORM panel

Preview note: the MATRIX tile preview shows the fit only (the engine's route preview knows fit, not the full transform) — the real transform is visible on the physical output and in the SHOW OUTPUT PREVIEW. A PNG logo previews on a black tile (alpha is not composited in the tile), but the alpha is correct on the output.

OUTPUTS — mapping

VIIY OUTPUTS mapping
OUTPUTS — the canvas, the output map, and the mapper (warp · mesh · calibrate · color).

The mapping model: outputs (physical/virtual displays, named OUT N by default) → slices — the "screens" of the show (the TO SCREEN buttons and MATRIX route onto them). Input Map = what a slice takes from the composition; Output Map = where it puts it on the output. Both maps are shown at once, stacked in a vertical split.

A show with no outputs ⭐ v0.9.75

You can now remove every output, including the last one — the menu item says what will happen (Remove OUT → default map). What you get back is the default map: one VIRTUAL output at the design resolution with one screen covering the whole composition, exactly what a new project starts with. Your composition is untouched — cues, layers, media and canvas size all stay as they were; only the outputs are reset.

Before v0.9.75 the last output simply refused to go: the menu item was greyed and the row stayed, with nothing to explain why. Clearing the outputs to build a map from scratch is a normal thing to do, so it now works — and lands in a defined state instead of the leftovers of what you deleted.

Which one am I editing — the OUT or the SCREEN? ⭐ v0.9.64

An output and a screen are different objects with different settings, so the MAPPER panel shows one of them at a time and says which:

Before v0.9.64 both rows lit up the same way and the panel always showed the screen, so its fields read like output settings. If you are used to looking for the device or the design size here — they live on the OUT page now (and, as before, in the Mon dropdown in the tree).

❄ FREEZE — hold the picture while you rebuild under it ⭐ v0.9.64

❄ FREEZE in the OUTPUTS toolbar, next to IDENTIFY, holds the last frame on every open output while you change cues, layers or mapping. Click again to go live.

Two canvases at once

Canvas toolbar

Slice editing

SCREENS tree

Auto-VIRTUAL — a dead receiver no longer stops the show ⭐ v0.9.39

If a display or LED processor stops answering (power cut, a broken chain) or the cable is pulled, the output falls back to VIRTUAL by itself — it is not closed. Rendering continues headless, the OUTPUT PREVIEW thumbnail stays real, and the other outputs and the desk keep running: before v0.9.39 a receiver that held its EDID but stopped taking frames could freeze the whole interface.

MAPPER panel (selected slice)

Two rotations — and which one you want ⭐ v0.9.51

A slice has two rotation controls, and they are not variants of each other. Picking the wrong one is the single easiest mistake in this panel, so the short version first:

OUTPUT rotation — a screen mounted sideways ⭐ v0.9.51

Rotates how the content lands on the screen, leaving the input selection alone: the slice keeps taking a normal, axis-aligned landscape region from the composition.

INPUT rotation — for tilted LED ⭐ v0.9.44

Rotates what the slice takes from the composition, not where it lands on the output. The case it exists for: a LED panel hung at an angle, or several panels turned on their side and tiled across one output — you keep composing straight and let each slice pick its content rotated.

⚠ For a whole screen standing vertically, use OUTPUT rotation instead. A full-frame 1920×1080 selection simply cannot be turned 90° and still fit inside a 1920×1080 composition — the rotated rectangle hangs off the top and bottom, and everything outside the composition is empty (see below). That is not a defect, it is arithmetic.

Why this changed ⭐ v0.9.51: the fields used to describe the rectangle before rotation while the canvas and the engine drew it after, turned about its centre. At 0° the two coincide, so nothing looked wrong — at 90° they came apart: W became the visible height and the centre (X + W/2) drifted, so one number moved two things at once. Quarter turns no longer rotate any geometry, which removes the mismatch at its source rather than compensating for it.

Honest limits — free angles only. Quarter turns behave exactly like 0° now, so none of this applies to them. At an arbitrary angle the slice's hit area stays an unrotated rectangle, so you may have to aim slightly off the corner; the resize handles are caught where they are drawn, but the drag deltas are not rotated. POLY slices ignore input rotation altogether (they carry their own geometry), and the canvas honestly does not rotate their frame either.

Outside the composition there is nothing ⭐ v0.9.51: where a rotated or oversized selection reaches past the composition, the output shows empty, not a smeared edge pixel. Earlier the sampler clamped and painted the last row or column into a stripe — content that does not exist anywhere. Empty tells you the truth: narrow the INPUT rect, or use OUTPUT rotation.

COMPOSITION panel

Size (WxH + presets) and project FPS (field + chips). Changing the FPS automatically switches the output monitors' refresh to a clean multiple (25→50 Hz, 30→60).

AI ASSISTANT — the Showbuilder

VIIY AI Showbuilder
AI ASSISTANT — describe the show, or upload materials, and VIIY builds it from your files.

A chat tab with an AI agent (Anthropic API; the 🔑 API key control is at the bottom of this tab, under the input box; the agent replies in your language). The same conversation is duplicated by a compact panel on SHOW (with its own 📎). It does not just chat — it builds the show through a catalogue of real tools: inspect the project state / media / cues / screens, create and fill cues, set the canvas, build screens and slices, route the matrix.

Upload materials 📎

What it can build

Confirmation gate — the agent asks before it overwrites ⭐ v0.9.39

Anything that overwrites or removes what already exists is held until you allow it: filling or updating a saved cue, deleting a cue, removing a layer from a cue, changing the properties of saved cues or layers, rebuilding screens or the canvas, and saving the project. An amber banner appears at the top of the window — 🤖 AI wants to: <what it is about to do> — with Allow all and Deny, visible from any tab, plus a line in the chat.

The editor tools are safe; route_matrix changes what the physical screens show — the agent asks first when the request is unclear. Reset aborts the in-flight request; the network timeout is 120 s.

MCP — drive VIIY from any AI agent

VIIY ships a built-in MCP server (Model Context Protocol — the open standard AI clients speak). Any MCP-capable agent — Claude Code, Claude Desktop, compatible IDEs and assistants — can discover and call the same tool catalogue the built-in Showbuilder uses, plus operate tools: it can open a project, build screens and cues, route the matrix, select the timecode source, take cues to air, blackout, open/stop outputs and read the live output status. The catalogue covers the full cue-list lifecycle ⭐ v0.9.33 — create, fill, batch-edit, delete, duplicate and reorder cues, and add/remove single layers of a saved cue without rebuilding it.

The crew side is covered too ⭐ v0.9.45: an agent can list, add, change and delete events, import them from an editor's marker export (the same parser the LOAD button uses, so the operator and the agent read a file identically), import the show's cue timecode list, add and configure a ACTION screen (rotation, text size, event rules) and put a message on the crew screens. Slices accept input rotation for tilted LED. Until this version an agent could build a whole show and leave it without a single instruction for the stage manager — it saw cues, but not the events the show is actually run by.

One screen at a time, without rebuilding the mapping ⭐ v0.9.48: until now an agent could only rebuild the whole screen layout, so asking it to turn one tilted LED panel would have wiped the warp, mesh, blending and colour of the entire venue — which is why that job stayed manual. It can now edit a single mapper slice in place: input rotation, the canvas region it takes, the rectangle it lands on, which output it belongs to, mirroring, opacity, and switching the surface off. The edit undoes with Ctrl+Z in the mapper like any of your own, and it asks for confirmation — switching a surface off says so in plain words, because that surface goes dark. Warp, mesh, masks and colour correction are deliberately not exposed: those are set by eye, and one call should not be able to undo a venue you aligned by hand.

Enable & connect

The operator stays in charge

SETUP redesigned ⭐

VIIY SETUP
SETUP — settings by category: Project · Timecode · Control input · Multi-server · Workspace · Display · Audio · Effects · AI/MCP · Feedback.

A left category list — pick a category on the left, only its settings show on the right. 10 categories:

The Anthropic API key for the AI Showbuilder lives on the AI ASSISTANT tab, not in SETUP.

SETUP → 🖥 Display → OUTPUT COLOUR DEPTH ⭐ v0.9.63

Two buttons: Auto (10-bit) — the default — and Force 8-bit. VIIY writes every output in 10 bits per colour and drops to 8 only if the graphics driver refuses the format, which it says in the log.

What this is for. Banding in a projector overlap or in a long fade is usually blamed on the content, but it was born on the last step: the blend curve is computed at full precision and lost it when the frame was written to the screen. A deeper output gives that ramp four times as many steps. Your footage does not need to change — 8-bit HAP into a 10-bit output is a normal pair, and the same is true in other servers whose codecs are 8-bit by design.

Measured, not assumed: on a paused heavy cue (58 layers, three outputs, the same frame, the same build) 10-bit and 8-bit came out level — CPU drifted 44–53 % of a core in both, and the counter on the physical output read 24–26 fps in both. That is why it is the default now.

SETUP → ✉ Feedback — send a report

Name (required) · Email (optional — only if you want a reply) · what happened (10–1950 characters, counter under the field) → ✉ Send report. It goes straight to the VIIY team: no account, no mail client, no visit to the website.

ATTACH LOG is the point of this form. VIIY attaches the log itself — you never have to find the file, and its location depends on where the installer put the app.

Size is not a problem: a log above 15 MB is not rejected but trimmed from the head — you send the tail, where the failure is, with a note about it on the first line. The VIIY version and your Windows version are appended automatically; we won't ask you for them.

Logs are received privately: they are visible to the VIIY team only and are never published. Up to 5 reports per hour from one connection — that limit is against spam, not against you.

Multi-server — backup, sync & render-node

Two (or more) VIIY machines on one LAN, with a role each. A Master runs the show; a Backup takes over if the master dies; a Node (render-node) drives only some outputs on its own hardware. All controls are in SETUP → 🖧 Multi-server — the panel shows only the controls for the role you pick (Master = sync + output assignment; Backup = receive + follow + failover; Node = receive + follow). Wire the machines to the screens (parallel or through a switcher). Ports: UDP 7700 (discovery) + TCP 7701 (file transfer).

  1. Both machines:Network ON — they discover each other (same subnet, multicast). The peer list shows role, show-match ✓/≠, current cue and heartbeat age.
  2. Role: Master on the main machine, Backup on the spare. Name each machine.
  3. Backup: Choose… a local receive folder → "● receiving :7701"; Follow master ON; Auto-failover ON → Return to standby (outputs dark, backup warm).
  4. Master: ⟳ SYNC → backup → a dialog: prepare files (Push as-is / Collect / Collect+HAP / Collect+HAP Q) + what to send (Changed size+date / Verify hash / Everything). Start → the whole show (media + .viiy) copies over the network and the backup auto-opens it. A re-sync after edits sends only changed files (seconds). A dropped link auto-resumes; ✕ Cancel aborts.
  5. Running: drive the show on the master — the backup mirrors it live (GO cue, playhead, play/pause, blackout). For frame-exact sync, put both on TIMECODE off the same LTC/MTC clock.
  6. Failover: master gone (heartbeat lost >2.5 s) → the backup lights its own outputs + a red MASTER LOST banner on every tab. Failback is manual (Return to standby) to avoid flicker if the master blips; a returning master raises a hand-back hint.
Note: media is not streamed live — sync first, then the backup follows. Only the project travels over the network, not gigabytes per frame.

BACKUP indicator — is the backup holding the same show? ⭐ v0.9.40

A BACKUP chip sits in the top bar of the master, on every tab. It does not answer "is the other machine online" — it answers "does the backup hold the same show", by counting the actual files the receiver is missing. A machine can be perfectly alive and still hold yesterday's show; that is the failure this chip exists to catch.

ChipMeaning
IN SYNCevery receiver holds exactly the files the master has
N FILES BEHINDthat many files are missing or different — the tooltip names them
2/3 IN SYNCsome receivers confirmed, others have not answered yet
NO RECEIVERno backup or node is receiving on the network
% SENDINGa transfer is running (measured in megabytes, not file count)
PIN NOT PAIRED / BACKUP DISK FULLthe receiver refuses: wrong PIN, or no space for the show

Pairing PIN — what the receiver shows ⭐ v0.9.40

The master generates 4 digits (New PIN); you type them into every backup and node. The receiver now tells you where you stand instead of staying silent until the first transfer:

New PIN invalidates the old digits everywhere. After pressing it on the master, retype them on every receiver — until you do, they refuse every sync. The digits take effect immediately: no restart of VIIY on the receiver, and entering a PIN also starts a receiver that was waiting for one.

The show is shared, the hardware is not ⭐ v0.9.41

Everything that is the show travels with SYNC and must be identical everywhere: cues, layers, media, timecode, transitions, effects — and the mapping geometry (warp, mesh, blend, colour correction). The projectors and the surfaces are the same whichever server feeds them, so after a takeover the picture has to land in exactly the same geometry.

What is not shared is which physical socket carries which output. Monitors are numbered differently on every machine, a backup may have no DeckLink at all, and a camera enumerates under a different device path on every computer. So each machine keeps its own binding:

SHOW READY tells you before the show, not during it. Preflight now checks that every enabled output has a real device on this machine, and that every live input resolves here — the two things that used to be discovered at the moment of a takeover.

Render-node — split the wall across machines

A Node drives only some of the physical outputs — e.g. the master runs LEFT/CENTRE/RIGHT while a node runs a 4th screen on its own hardware. The whole show lives on every machine (sync first); each node opens only the outputs assigned to it and follows the master's transport. This scales one show across several machines when a single PC can't drive every screen.

  1. Node machine: Network ON → role Node, name it, choose a receive folder, Follow master ON.
  2. Master → RENDER-NODE — output assignment: per physical OUT pick which machine drives it — This machine (local) or a discovered node by name. An OUT handed to a node is no longer opened by the master; only the node drives it (on the node's own monitor / SDI). The who renders choice (here) is separate from the where it goes device picker in OUTPUTS (monitor / SDI / NDI on that machine).
  3. Master: ⟳ SYNC → the show copies to the node, which auto-opens it and lights its assigned outputs.
  4. Preflight: each backup/node reports media completeness — the master's peer list shows ✓ media or ⚠ MISSING media before you GO (a node missing a file would play black there). A sync fixes it.
  5. Resilience: if the master drops, a node keeps playing its current content — its screen never goes black; when the master returns the node re-follows instantly (even onto a new cue).
Frame-exact sync across machines: for separate screens (tiles with a gap), put every machine on the same TIMECODE (LTC/MTC) — that is frame-accurate and enough. For a seamless / edge-blended image that spans the seam between machines you also need hardware genlock: a Blackmagic DeckLink REF input for SDI outputs, or NVIDIA Quadro Sync for GPU outputs — both fed from one house-sync generator. Timecode aligns which frame; genlock aligns the exact moment it is shown.

TIMECODE — the show follows the clock

One switch turns VIIY from a manual desk into an automated playout: every cue has a Timecode mark, and while TIMECODE is on the show continuously follows the clock — like a tape locked to the soundtrack.

One source dropdown

Follow semantics

Concert recipe: put marks on the cues (or let the AI build them from a timecode sheet) → SETUP → Source: LTC → the sound desk plays the click/track with LTC → the show runs itself; you keep your hands on MATRIX, faders and BLACKOUT.

TIMECODE OUT — VIIY as the master clock ⭐ v0.9.64

Until now timecode was only an input: someone else led, VIIY followed. At a conference or in a theatre it is often the other way round — video leads, and sound and light follow it.

SETUP → ⏱ Timecode → TIMECODE OUT: SEND MTC, a MIDI output to send on, and the frame rate (24 / 25 / 30). The time comes from the SHOW CLOCK — the same clock already in the header, so there is no second, independent count of time to disagree with it.

MIDI Show Control — the lighting console calls our cues ⭐ v0.9.64

MSC is how a theatre drives every system from one desk. The console says GO cue 14 and VIIY fires the cue that owns number 14 — the number carried inside the message, not a key you had to map in advance.

SETUP → ⏱ Timecode → MIDI SHOW CONTROL: ACCEPT MSC and a Device ID (0–126). Messages addressed to Device ID 127 are a broadcast and are always accepted.

Virtual outputs & NDI OUT

VIRTUAL output

NDI OUT — an output into the network

ACTION screen — the crew display ⭐ v0.9.44

A whole output that shows the show, not the picture: what is on air, what is next, how long is left, and which cue events are coming. Hang it in the wings, at the follow-spot, at the pyro station — anywhere a department needs to know when rather than what. It is the same idea as a ProPresenter stage screen, driven by your cues and markers.

How to add: OUTPUTS → + ▾📋 Add ACTION screen. It is a normal output: give it a monitor (or leave it VIRTUAL for NDI/monitoring). It reads no composition at all, so it costs almost nothing to run.

An ACTION output takes no SCREEN or POLY slices ⭐ v0.9.51: the crew page is drawn full screen and deliberately bypasses the mapper, so a slice added there would show nothing while still occupying the tree. The two menu items are greyed out on such an output and say why. The test card does work on it — that is exactly what you need when you are working out which monitor is which.

What it shows

Which events appear

Set per show in the ACTION tab (they are saved in the project):

Nothing is hidden silently. If more events exist than fit on the screen, the section header says so: + 3 MORE — NOT SHOWN. An empty strip always means "there is nothing more", never "we ran out of room".

ALL ACTIONS IN THE SHOW — the whole evening in one list ⭐ v0.9.51

The right-hand list of the ACTION tab is the only place where the evening is visible at once — on a timeline you only ever see one cue's markers. It is editable, and every edit lands on the marker itself:

Preview: UPRIGHT / AS ON SCREEN ⭐ v0.9.51. If the crew screen is a portrait monitor, its page is laid out for portrait — and the preview used to lie on its side, which made reading and editing miserable. The preview now stands upright by default; one click on ⟳ AS ON SCREEN shows the crew's real picture, rotation included, for the pre-show check. The caption under the preview changes with the state, so it never claims to be something it is not.

Import events from your editor ⭐ v0.9.45

The editor has usually placed those markers already. Retyping them by hand puts an error into the very thing the show is run by, so VIIY reads their exports as they are: ACTION tab → ⭳ LOAD….

Frames are converted with the PROJECT fps, and the report says so. If the export came from a sequence at another frame rate, the drift grows towards the end of the number — better to see it stated than to discover it on a cue.

Approach phases

Shared with the ACTION panel on the desk, so both read the same: calm beyond 10 s → the row warms to the marker colour under 10 s → red and blinking under 3 s. If the deck is paused the hot phase is suppressed — the countdown is frozen anyway, and a row blinking "2 seconds" while nothing can happen until GO is a lie the crew would learn to ignore.

Message to crew ⭐ v0.9.44

SHOW → the MSG button next to the ACTION panel. Type a line — HOLD, STANDBY and 5 MIN are one click — and it appears on every crew screen above everything else, amber. Clear it manually or let it expire. It is deliberately not saved into the project, and it is cleared when you open or create another project: opening tomorrow's show and seeing yesterday's "holding 5 min" would be worse than typing it again.

Look of the screen

The watchdog ⭐ v0.9.44

The crew screen is drawn by the output thread, which keeps running even if the interface does not. If the page stops being updated for more than 5 seconds, the screen dims itself and shows a red NO DATA — THIS SCREEN IS FROZEN band. A frozen page that still looks correct is the most dangerous thing this display can do: the crew would keep trusting a countdown that stopped. The watchdog stays quiet while the application is legitimately busy (loading a project), so it warns about failure, not about work.

Mesh warp

Full mesh warping for projection mapping, per slice, on top of the 4-corner perspective warp — drag the corners and the mesh deformation survives.

Camera calibration

Automatic projector alignment with any camera (webcam / NDI phone / DeckLink): VIIY projects structured-light patterns, the camera watches, and the result is a regular mesh you can still edit by hand: automatic first, precise by hand after.

Slice presets + CROP a VIIY signature

You map once in OUTPUTS — then content is laid across the wall with a single click from every cue. At the very top of CONTROLS is the "→ TO SCREEN" block: one button per slice (in its colour). A click:

CROP (a section in CONTROLS)

Edge blending — joining projectors ⭐ v0.9.59

Two projectors aimed at one wall have to overlap, and in the overlap the light doubles. Edge blending fades each projector towards the overlap so the two add up to one even picture. Without it a wide panorama is simply not possible — the seam is a bright bar down the middle.

It lives on the slice (MAPPER → EDGE BLEND), not on the output: one output can carry several slices, and it is surfaces that get joined, not connectors.

1 · The zone

2 · The curve

3 · Black level

Order of work. Geometry first: aim the projectors, use Test card and User Guides to get the grids to sit on top of each other, warp what needs warping. Only then blend — a blend on top of misaligned geometry hides nothing and confuses everything.

Effects — details

The full effect list, the generative FX (Particles / Lightning / Lattice / Sky / Ocean), Color LUT and ISF are described in EFFECTS above. This section covers the older notes on Fire and effect handling.

The Effects library (right panel in CUE EDITOR) is a searchable list — double-click or drag an effect onto a timeline layer. Every effect parameter is animatable with keyframes, and can be driven by a MIDI fader (see below). Since the show content usually arrives already finished from your editing and compositing software, the built-in effects focus on colour correction and a few looks rather than a big library.

Fire

Slice-level COLOR CORRECTION (Gamma / Gain / Lift / Temp / Tint) lives in the OUTPUTS MAPPER and applies at the output stage, per slice.

Lip-sync — the sound is early, not the picture late ⭐ v0.9.64

On site the sound almost always arrives before the picture. Nothing is broken: an LED processor, a scaler or a projector needs 2–5 frames to push a frame through, and audio has no such delay. The cure is to hold the audio back by the same amount.

SETUP → 🔊 Audio → LIP-SYNC — 0–500 ms, with the equivalent in frames shown next to it for your project's fps.

The delay is applied last, after the meters and after the audio analyser. That is deliberate: it exists to line the sound up with the picture in the room, so audio-reactive effects keep following the sound as it is mixed, not as it is heard. Otherwise fixing a presenter's lips would quietly put every audio-driven effect out of step with the beat.

MIDI mapping

A universal MIDI learn that works with any MIDI surface — several at once. There are no per-surface profiles: you map by learning. Tested with an AKAI APC mini.

What can be mapped ⭐ v0.9.34 — anything highlighted in MIDI MAP mode: transport (GO / BACK / PAUSE / TAKE / STOP ALL / BLACKOUT), cues, tabs, masters, screen opacity and colour correction, MATRIX arm/route/preset, and on the selected layer its position, scale, rotation, anchor, opacity, volume, Visible / Solo / Audio-mute, plus any parameter of any effect and each effect's on/off — so a fader can drive, say, the turbulence of a particle emitter or the wave height of the ocean. CUE EDITOR play/pause too.

SETUP → Control input lists every assignment ⭐ v0.9.34 as “control ← surface key” with a ✕ to remove one, so the map is reviewable instead of all-or-nothing.

Two ways to map

What can be mapped

LED feedback

VIIY opens every MIDI output (skipping the Microsoft GS synth so it never plays sound) and drives the pad LEDs: a bound pad is green, the live cue blinks green, the active tab / armed source / routed slice blink amber, STOP ALL and BLACKOUT are red (the active one blinks). A clean shutdown turns the surface off.

A device used for MTC input is excluded from mapping automatically (WinMM holds a MIDI input exclusively). Rescan handles hot-plugging. The map is stored globally (one surface serves all shows), not per project.

AJA cards ⭐ v0.9.61

AJA KONA, Io and T-TAP cards work alongside Blackmagic DeckLink, in both directions. The AJA driver (Desktop Software) is not part of the VIIY installer — install it first, exactly as you would Desktop Video for Blackmagic.

Not yet confirmed on a card. This support was written without AJA hardware in hand: the mode choice and the colour conversion are verified automatically on every build, but "the frame really reaches the cable" is proven by a cable and nothing else. If you have a card, the first run is worth reporting either way.

OSC — and a Stream Deck

OSC is how the rest of the show talks to VIIY over the network: a QLab network cue, a lighting desk, a tablet, or a Stream Deck through Bitfocus Companion. It travels over UDP, and both directions live in SETUP → Control input.

OSC IN — commands to VIIY

Set the UDP port (default 53000) and press Start. The addresses are:

AddressArgumentWhat it does
/viiy/goGO — the next cue on air
/viiy/backthe previous cue
/viiy/gocueNfires the cue that OWNS number N ⭐ v0.9.64 — the number you see in the CUE LIST, not the N-th row. Deleting a cue above it does not move the target. An unknown number does nothing and says so in the log.
/viiy/takeTAKE the editor to PROGRAM
/viiy/pausepause / resume what is on air
/viiy/stopSTOP ALL
/viiy/blackout0 / 1 (or none = toggle)blackout
/viiy/master0.0–1.0master video level
/viiy/statusasks VIIY to send its whole state back. Changes nothing ⭐ v0.9.61

OSC OUT — VIIY tells the controller what the show is doing ⭐ v0.9.61

Give it a host and port and press Start. From then on, whenever something changes, VIIY sends it out — on the same addresses you would use to set it, so there is one dictionary to learn, not two.

AddressValue
/viiy/cueinteger — the cue on air, counting from 1. 0 means nothing is on air
/viiy/cue/namestring — the name of that cue
/viiy/playinginteger 0 / 1
/viiy/blackoutinteger 0 / 1
/viiy/masterfloat 0.0–1.0

Stream Deck, in practice

A Stream Deck talks to VIIY through Bitfocus Companion (free), using its Generic OSC connection — the same route Companion uses for lighting desks and other media servers. Nothing extra is installed on the VIIY machine.

  1. In Companion, add the connection Generic → OSC. Point its target at the VIIY machine and the port from OSC IN (53000 by default).
  2. Give the connection a listen port of its own — for example 53001 — and put that same host and port into VIIY's OSC OUT. The two must not be the same number as OSC IN.
  3. Buttons: add the action Send message without arguments with path /viiy/go, or Send integer with /viiy/gocue and the cue number. Same for /viiy/blackout (integer 0 or 1) and /viiy/master (float).
  4. Lights on the buttons: add the feedback Listen for OSC messages (Integer) on /viiy/cue and compare it with that button's cue number — the button now lights when that cue is on air, even if the operator pressed GO on the keyboard. The same works for /viiy/playing and /viiy/blackout.
Feedback is what makes a surface honest. Without it a button shows your last press, not the show: press GO on the keyboard and the Stream Deck keeps lighting the previous cue.
What Companion cannot do with the cue name. Its OSC connection turns numbers into button feedback; incoming text is only kept as "the latest message received", whatever address it came from. So use /viiy/cue for the lights, and treat /viiy/cue/name as something for a logger, a tablet or your own tooling — not as a reliable label on a key.

DMX IN (Art-Net / sACN)

A lighting desk can drive VIIY through the same mapping system as MIDI — no separate profiles.

Pixelmapping — video to fixtures ⭐ v0.9.58

The other side of DMX IN: there a lighting desk drives VIIY, here VIIY drives the lights. A small canvas is built from the fixtures you actually have, the composition is cropped onto it, and every cell takes the colour of the pixel it sits on.

The canvas is small on purpose. A pixelmap is not 1920×1080 — it is exactly as large as your layout (say 32×8), so you build content for it instead of squeezing a clip into a corner of a screen. VIIY derives that size from the layout and keeps it in step: add fixtures and the output grows by itself. You never type it.

1 · Fixture profiles — what a fixture is

2 · Where they stand

3 · The picture: a PIXELMAPPING output

4 · Sending it

5 · Output nodes — which controller gets which universes ⭐ v0.9.60

One destination for everything is fine on a desk and wrong on a site: real controllers sit at different addresses. A node is one controller on the wire — a name you will recognise on site, its address, and the contiguous block of universes it takes.

Finding the controllers instead of typing their addresses ⭐ v0.9.60

⌕ Discover asks the network who is out there and lists everyone who answers — address, name, number of ports. → output node turns any of them into a node row without you retyping an address (and therefore without mistyping one).

Broadcast has a ceiling in practice. It is the easy way to start, but once you pass roughly 30 universes it is bad practice — the whole network sees every packet. Past that, give each controller its own node address. VIIY says so on screen when your patch crosses that line.

6 · ArtSync — one frame across all universes ⭐ v0.9.60

Without it, each universe is output by the receiver the moment it arrives. On one or two universes you will never notice; on a wide wall spread over dozens, the top shows a newer frame than the bottom — this is tearing. ArtSync makes VIIY broadcast one small packet after the whole frame has been sent, and every receiver puts its universes out at that instant.

7 · Import a patch instead of typing it twice ⭐ v0.9.60

Your rig already exists somewhere: in the lighting desk, in the visualiser, in the drawing. MVR (DIN SPEC 15801) is the industry file that carries it — fixtures, their DMX addresses and where they hang. grandMA3, Vectorworks, Capture, ChamSys and others write it. VIIY reads it, so the same rig is not typed in twice.

Fixtures with no address are normal. A scene often holds decorative or unpatched lights: they exist in the drawing but have no DMX yet. VIIY counts them and says so, rather than treating the file as broken.

An MVR usually carries the fixture types too, as GDTF files inside it. VIIY reads them for one practical reason: how many channels each type occupies. The row for each type shows it, and with that VIIY can answer a question the MVR alone cannot — does this patch actually fit? The file only stores each fixture's starting address, so two fixtures set too close together run into each other and nothing in the desk says so. If that happens, VIIY lists the clashes before anything is imported.

"No colour info" is not a fault. Some exporters write the channel layout in full, others just number the channels. When the type says nothing about colour, VIIY says exactly that instead of guessing — which is why choosing the profile stays your decision.

8 · sACN instead of Art-Net ⭐ v0.9.60

The button next to Send switches the protocol. Art-Net sends to the address you type. sACN (ANSI E1.31) is multicast: every universe has its own group, and a switch with IGMP carries a frame only to the ports that asked for it. That is exactly what you want once the patch grows — with Art-Net you eventually have to abandon broadcast and hand out addresses by hand; with sACN the addressing does it for you.

Universe synchronisation in sACN ⭐ v0.9.61

In sACN mode the ArtSync button is replaced by a sync universe box, and that is not a cosmetic difference. ArtSync is one broadcast to the whole network; E1.31 synchronisation has an address — a universe number that travels inside every data frame. A receiver holds the frames that carry that address until the synchronisation packet arrives on it, and then the whole wall changes at once.

VIIY announces its universes ⭐ v0.9.61

While sACN transmission is on, VIIY sends a universe discovery packet every 10 seconds (and one the moment you press Send), listing the universes it is driving plus its synchronisation address. This is what the standard asks of a source, and it is how monitoring tools show who is on the network without subscribing to every multicast group and sniffing all of the lighting traffic. It stops the moment the transmission stops — VIIY never announces universes it is not driving.

⚠ This is a different question from Art-Net discovery, where VIIY still stays silent until an OEM code is assigned to it. Nothing is registered or borrowed here: the packet carries VIIY's own source name and its own identifier.

9 · Output delay — when the light runs ahead of the screen ⭐ v0.9.60

LED reacts the instant the data arrives; a projector does not — it has a pipeline of its own. Feed both from the same frame and the light is visibly early. The delay box next to ArtSync holds the light back by that many milliseconds so the two land together.

VIIY owns the universes it writes. Every universe it transmits is sent as a full 512 channels — the channels your fixtures do not use are sent as zero. Do not share a universe between VIIY and a lighting desk: whatever the desk puts there, VIIY will overwrite it on the next frame.
Discovery. VIIY answers Art-Net discovery under its own OEM code (0x2F21, assigned by Artistic Licence), so a desk lists it as "VIIY Media Server". Sending and receiving DMX never depended on this.

Deinterlace

Interlacing is treated at the source, not as an effect (a proper deinterlacer beats a shader — it is a property of the footage).

Files (bake it into HAP)

Set the field parity explicitly. Auto can pick the wrong field on a mistagged file (leaving combing on motion). If Auto looks wrong, choose Top field or Bottom field by hand — that is the reliable path.

Live SDI (DeckLink)

Runtime deinterlace on the capture thread. Detection is by field dominance in the input-format-changed event. Right-click the DeckLink card in MATRIX to choose the mode: Auto (blend if interlaced) · None · Blend (a soft vertical low-pass, 0 added frames) · Bob (line-doubles the dominant field — respects TFF vs BFF, so lower-first SD such as 576i no longer jitters). The card shows an "interlaced" / "DEINT BLEND" badge; the mode is remembered per input. NDI / Spout / webcams are progressive and have no menu.

BAKE — render a cue to file

Renders a heavy cue (layers + keyframes + effects + fades) into one video file — on the show it plays as a simple clip. Trigger: right-click a cue → 🔥 Bake to file… (or CUE ▾ for the current editor).

SHOW READY — preflight ⭐ v0.9.37

The SHOW READY button in the SHOW transport (called ✓ VERIFY before v0.9.37). One button instead of a dozen "did I really do everything?" — and it keeps the last result in its colour: grey SHOW READY? not checked yet · green clean · amber warnings · red critical. Hover for the time and the summary.

CheckResult
Project saved to disk✖ never saved · ⚠ unsaved changes, naming what exactly
Every media file of every cue exists✖ red "FILE MISSING" + where it is used, and a 🔗 Relink N missing… button straight to Relink missing media ⭐ v0.9.38
File codec⚠ amber "heavy codec — convert to HAP"
File FPS = project FPS⚠ a warning on mismatch
Live inputs (cameras)⚠ "check the signal manually"
Media collected into the project folder⚠ N files live outside it → Collect Files
Outputs: monitor connected? open? Hz a multiple of FPS?✖ / ⚠ / ✔
Cues sharing one timecode mark✖ ambiguous CHASE target
Main / Backup: split-brain, master visible✖ / ✔  (asked only when multi-server is on)
Sync PIN set⚠ empty PIN → pair before the show
External timecode: input on? signal locked?✖ off while chasing · ⚠ no lock yet · ✔ locked
Audio output device⚠ not ready → check SETUP
VRAM headroom⚠ over 80% · ✖ over 95% (textures spill to system RAM)

A summary at the top: "ALL GREEN — show ready" or a list of problems. Re-check repeats it.

Checks that do not apply to this show are not asked. No backup and no external timecode? Not a word about PIN or TC. Irrelevant warnings train operators to ignore all warnings.

Bottom row: ▶ ENTER SHOW MODE — verify and lock the desk in one move. It is deliberately not blocked by findings: a show sometimes starts with a known problem, and that call belongs to the operator.

The project moved to another machine, the drive letter changed, someone reorganised the footage folder — every cue now points at files that are not there. SETUP → Project → 🔗 Relink missing media… (or the 🔗 Relink N missing… button in the SHOW READY checklist) opens one dialog that fixes the whole project.

  1. 📁 Choose folder… — point VIIY at the folder that now holds the footage. ◉ Subfolders searches it recursively; ⟳ Rescan repeats the search after you move something.
  2. The table lists every missing file, where it is used ("in bin only", or the cues), and what was found for it: matched · possible · not found in this folder. Untick a row to leave it alone.
  3. 🔗 Relink selected — the bin, the editor and every cue are re-pointed in a single pass.

User Guides & test card

UG (the button in the SCREENS header)

ON: the physical screens show a grid (if Grid is on, at the same step), the frames of all slices (in the slice colour, with warp/mirror applied) and the white frame + veil of the selected one — click slices in the tree and the selection "runs" across the wall. OFF: clean video.

Test card (▦)

Your own test card ⭐ v0.9.39

Right-click the ▦ icon of an output or of a slice: Load test image… (PNG / JPG / BMP / WEBP) replaces the built-in card with your picture — a venue pattern from the contractor, a client's build-check slide. Use built-in card goes back, Reveal image in Explorer opens the file.

HAP conversion

Right-click files in the bin → Convert to HAP ▸: Hap (DXT1, smallest) · Hap Alpha (DXT5, with transparency) · Hap Q (YCoCg, best colour — the project standard), with an optional deinterlace choice and a "Save to" row (the project's media/ · next to the original · a custom folder — remembered). Progress and ETA appear right in the file row; the converted copy *_hapq.mov is treated as "the same footage" on Replace. HAP unpacks on the GPU — CPU load ≈ 0.

After a conversion VIIY offers to replace the original with the HAP everywhere it is used (layers / cues / MATRIX) — "Replace everywhere" or "Keep original". Batch conversions queue their prompts.

Show rule: before a performance run SHOW READY — it tells you which files are not yet in HAP.

SHOW MODE ⭐ v0.9.37

The SHOW MODE button (called LOCK before v0.9.37) sits in the right-hand side of the header, next to the TIMECODE chip ⭐ v0.9.39 — it used to stand beside the logo, right against the SHOW tab, and the two similar words were easy to hit wrong. It, or Shift+Space, locks editing for a performance. It blocks everything except the transport and the cue GOs: tab switching, MIDI-MAP, branding, cue editing, reordering, right-click menus, +New and the editing shortcuts are all gated while locked. Ctrl+S keeps working — saving is never a risk. Rehearsal is an editor; a show is a desk.

Unlocking is deliberate ⭐ v0.9.37. Hold the button for 2 s (an amber bar fills to show the progress) or press Shift+Space twice within 2 s — the button prompts press again. Locking stays instant: erring towards safety costs nothing, while one stray click used to throw the catch open mid-show.

Output destinations

An open SCREEN goes wherever its Device menu points (see OUTPUTS) — only the monitor destination is a window; the rest render headless.

Monitor output windows

Non-window outputs: SDI · NDI · Spout · Virtual

Project files

PathWhat it is
<folder>/<Name>.viiyproject (JSON): cues, layers, displays/slices, media list, salvos, MATRIX pool
<folder>/media/collected media (Collect, Bake results)
<folder>/PRESETS/My transform presets/user transform presets (*.json)
*.viiymapOUTPUTS layout preset (outputs + slices, incl. mesh & NDI flags)
<folder>/ai/materials attached to the AI Showbuilder (PDF / images / txt)
<folder>/scan-outN.pngcalibration scan photo (the canvas "Photo" underlay)
%APPDATA%/…/viiy.configrecent projects, workspace, MIDI map (global, one surface for all shows)
build/LOG/viiy.logruntime log (all QML errors + diagnostic probes)

Licence & demo mode ⭐ v0.9.41

VIIY runs in one of two states, and the difference is one thing only: without a licence every output carries a V:I:I:Y watermark. Nothing else is limited — every feature, every output, every tab works exactly the same. The watermark appears on the monitor window, on SDI, NDI and Spout, and in the previews alike, because it is drawn into the frame before the output is published. Its position changes every twenty seconds, and it is random ⭐ v0.9.75 — a different spot on each output, always fully inside the frame. Until v0.9.75 it cycled through five fixed spots, which a camera could simply be framed around.

Everything about the licence lives in SETUP → License: the current state, how long it runs, the Machine ID, the key field, and the button that takes the licence off this computer.

Activating

The licence belongs to the computer AND to the Windows account. The token is stored in the account that activated it, so a different Windows user on the same machine starts in demo. On a show machine, run VIIY under the account you activated.

One licence, several machines

A licence holds a number of seats. The first machine to activate takes the Professional seat (the main server); every next one takes a Companion seat — the backup and the render nodes. Extra nodes are sold as extra seats on the same key, not as a different product, and SETUP → License shows which seat this machine holds and how many of them are in use.

A Companion seat is not a cut-down version — the software is identical. The limit lives in the licence terms, not in the program: one licence covers one show running at a time. A separate, parallel show on independent machines needs its own licence.

Moving a licence to another computer

Machines die, and they die the night before a show. SETUP → License → Deactivate this machine frees the seat, and the same key then activates the replacement. The button asks twice on purpose: the outputs start carrying the watermark the moment it goes through.

If that machine has no network at the time, the licence is still removed locally, but the seat stays counted until it can tell the server. VIIY says so plainly instead of pretending — free the seat later from any machine that holds the key, or write to support.

What will never happen mid-show

The licence state is decided once, at launch, and inside a running session it can only get better, never worse. A revoked key, a freed seat, an expiry that falls during the show — none of them can put a watermark on outputs that are already live. They apply at the next launch.

The one exception is your own hand: pressing Deactivate this machine does what it says immediately. That is why it takes two clicks and warns you before the second one.

Before the licence runs out

SETUP → License shows both the number of days and the exact date (until 24 Aug 2026) — shows are planned on a calendar, not by counting days in your head. Under seven days left the line turns amber. If it does run out, VIIY keeps working and the outputs go back to demo at the next launch.

Installation & deploy

The setup.exe is not code-signed yet → Windows SmartScreen shows "unknown publisher". Fine for in-house use; removed once a code-signing certificate is applied.

VIIY Media Server · manual updated 03.08.2026 for v0.9.45 · English edition. Sections marked ⭐ are recent additions. Newest first: v0.9.44–45 — the ACTION crew screen as a full output (NOW/NEXT, where we are in the show, HOLD, the watchdog, message to crew), INPUT rotation for tilted LED, events importable from an editor's marker export, and F6 for the ACTION tab; v0.9.42–43 — live audio input with a spectrum/waveform analyser, sound-meter and generator effects, flip H/V, the effects library in categories, and the ACTION tab itself; v0.9.38–41 — parameters on the clip, Reset ↺, Copy/Paste Attributes, Relink missing media, Show usages, auto-VIRTUAL fallback, custom test card, AI confirmation gate, SETUP → Effects, the BACKUP identity indicator with SAVE & SYNC, pairing-PIN feedback on the receiver, instant clip delete, SETUP → License with seats for the backup and the render nodes, per-machine binding of outputs and live inputs, the AI build progress bar, and this manual inside the program.

Art-Net™ Designed by and Copyright Artistic Licence Engineering Ltd.

NDI® is a registered trademark of Vizrt NDI AB. VIIY is not a product of NDI and is not affiliated with, sponsored by or endorsed by Vizrt NDI AB; the NDI name is used here only to identify that VIIY is compatible with NDI products.

sACN is implemented as described in ANSI E1.31, published by ESTA. Blackmagic Design, DeckLink and Desktop Video are trademarks of Blackmagic Design Pty Ltd. FFmpeg is a trademark of Fabrice Bellard.

All other product names, logos and brands mentioned in this manual are the property of their respective owners. Where another product is named — for example to say that a keyboard shortcut matches the one in another editor — it is named only to describe compatibility, and implies no affiliation, sponsorship or endorsement.

V:I:I:Y and VIIY are trademarks or pending trademarks of the Licensor. Full third-party notices are installed next to the program as THIRD-PARTY-NOTICES.txt, with the complete license texts in the licenses\ folder.