Both Syphon and Spout routes use getImageData() to read the canvas pixels back from the GPU to CPU inside the WebView, ship them over the loopback WebSocket, then re-upload to a Metal or D3D11 texture in Rust. This is a full GPU → CPU → GPU round-trip per frame.
| Resolution | Bytes/frame | Max frames (quality=1) |
|---|---|---|
| 720p (1280×720) | ~3.7 MB | 51 frames |
| 1080p (1920×1080) | ~8.3 MB | 23 frames |
| 1440p (2560×1440) | ~14.7 MB | 13 frames |
| 4K (3840×2160) | ~33.2 MB | 5 frames |
At 4K the datamosh effect loses most of its temporal depth. 720p or 1080p is the practical sweet spot.
No cross-platform texture sharing equivalent exists. Options for cross-platform output:
In distribution builds on macOS, the app must be codesigned with the NSCameraUsageDescription entitlement for the camera permission dialog to appear. Without codesigning, getUserMedia() will fail silently on macOS 12+.
huff binds the WS relay on 127.0.0.1:8787 at startup. If another application is using this port, the canvas window shows "WS: disconnected" and never receives frames.
To change the port: edit const PORT: u16 = 8787; in src-tauri/src/main.rs and __getWSURL__ in src/index.html, then rebuild.
Running two huff instances simultaneously causes a port conflict on 8787. Build two copies from source with different PORT values if you need parallel instances.
The Tauri scaffolding supports Linux and build prerequisites are documented in Installation. No binary has been tested against a Linux runtime in this release. Syphon and Spout do not exist on Linux. The canvas mirror window and MIDI/OSC will work if the build succeeds.
FEEDBACK above ~2.5 combined with non-neutral FB Z can cause the buffer to saturate (full white or full black) within seconds. This is natural behaviour for a positive-feedback system. Recovery: lower FEEDBACK to 0 or click ↺ Reset in the Feedback group. The buffer clears over the next few frames.
Cluster centre positions and velocities are runtime JavaScript state and are not serialised into preset files. Loading a preset restores all slider values but cluster centres will be at whatever position they were at load time.