Syphon and Spout still require getImageData() to make WebView pixels CPU-readable before Rust uploads them into Metal or D3D11. This remains a full GPU → CPU → GPU architecture. Pass 51 retains the Worker-owned local WebSocket and adds a strict two-credit pipeline so browser readback for a following 720p frame can overlap native publication without creating an unbounded latency queue.
| 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.