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
- Click the SYPHON button in the top bar.
- Set the output resolution (default: 1280×720).
- Set the FPS cap (default: 30fps — do not set higher than your canvas frame rate).
- 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
- Install the Spout2 runtime if not already present.
- Click the SPOUT button in the top bar.
- Set resolution and FPS cap.
- 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 frames as they arrive.
- 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 Binary Protocol
Syphon frame:
Bytes 0–7 : b"HUFFSYPH" (8 bytes)
Bytes 8–11 : width u32 little-endian
Bytes 12–15 : height u32 little-endian
Bytes 16+ : raw RGBA8 pixels (width × height × 4 bytes)
Spout frame:
Bytes 0–8 : b"HUFFSPOUT" (9 bytes)
Bytes 9–12 : width u32 little-endian
Bytes 13–16 : height u32 little-endian
Bytes 17+ : raw RGBA8 pixels (width × height × 4 bytes)