■ huff Home How It Works Install Interface MIDI OSC Output
--:--:--
Video Output
_

huff has three ways to send its output outside the app window: Syphon (macOS), Spout (Windows), and the canvas mirror window (all platforms).


Syphon (macOS)

Syphon lets huff share its canvas as a named texture that any Syphon-enabled application can receive in real time — without capture cards or screen recording.

Compatible receivers: Resolume Avenue/Arena, VDMX, MadMapper, CoGe, Millumin, Modul8, Max/MSP Jitter, Processing (Syphon library).

Usage

  1. Click the SYPHON button in the top bar.
  2. Set the output resolution (default: 1280×720).
  3. Set the FPS cap (default: 30fps — do not set higher than your canvas frame rate).
  4. Click ▶ Start. The sender appears as huff in any Syphon receiver.
CPU round-trip: Uses getImageData() → loopback WebSocket → Metal texture re-upload. Not zero-copy. Works reliably at 720p/30fps. See Caveats for details.

Installation Notes

The Syphon.framework is bundled inside the huff app bundle — no separate installation required.


Spout (Windows)

Spout is the Windows equivalent of Syphon. huff shares its canvas as a named D3D11 texture via the SpoutDX bridge.

Compatible receivers: Resolume Arena, TouchDesigner, MadMapper, Notch, and anything supporting the Spout2 protocol.

Usage

  1. Install the Spout2 runtime if not already present.
  2. Click the SPOUT button in the top bar.
  3. Set resolution and FPS cap.
  4. Click ▶ Start. The sender appears as huff in Spout receivers.

Canvas Mirror Window

The canvas window connects to the embedded WebSocket relay on port 8787 and renders JPEG frames as they arrive. The controls WebView receives canvas-client count updates from Rust, performs no mirror capture or JPEG encoding while no canvas receiver is attached, and waits for one relay acknowledgement before sending the next frame.

  • Opens automatically with the app.
  • Press F in the canvas window to toggle fullscreen.
  • Move it to a second monitor or projector.
  • Can also be opened in any browser on the local network — navigate to file:///path/to/huff/src/canvas.html.
OBS capture: The canvas window has no UI chrome. Use OBS Window Capture pointed at the canvas window for recording or streaming.

WebSocket Roles and Frame Payloads

Canvas mirror sender: hello text : {"type":"hello","role":"index"} frame : JPEG binary payload relay ack : {"type":"mirror-ack","receivers":N} Canvas mirror receiver: hello text : {"type":"hello","role":"canvas"} frame : JPEG binary payload from latest-frame relay slot Syphon sender: hello text : {"type":"hello","role":"syphon-sender","width":W,"height":H} frame : raw RGBA8 pixels only (W × H × 4 bytes) Spout sender: hello text : {"type":"hello","role":"spout-sender","width":W,"height":H} frame : raw RGBA8 pixels only (W × H × 4 bytes) Legacy compatibility: HUFFSYPH / HUFFSPOUT header packets remain accepted by Rust.