Sync turns what Noisedeck renders into a Syphon, Spout, or NDI source on the same computer, so the apps you already use can pick it up like any other input.
Noisedeck renders in the browser. Sync is a small menu bar or tray app that receives those frames over a local socket and republishes them as a named source: Syphon on macOS, Spout and NDI on Windows. Anything with one of those inputs, Resolume, VDMX, TouchDesigner, MadMapper, picks it out of its usual menu. The frames never leave your machine, and a site cannot send until you approve it.
Sync is a preview. It drops frames under heavy load and does not update itself yet. Rehearse with it. Do not run a paid show on it yet.
Download
No account needed. Every release publishes its SHA-256.
macOS, Apple Silicon
macOS 13 or later. Signed and notarized. Syphon is bundled.
Drag Sync into Applications and launch it. It lives in the menu bar.
Windows 10 or later. Spout is bundled. NDI needs the NDI Runtime installed separately; its licence does not let us ship it.
The installer is not code-signed yet, so SmartScreen will warn. Choose More info, then Run anyway, or check the file against the published SHA-256 first. Sync lives in the notification area.
CMake 3.21, a C++20 compiler, OpenSSL 3, and libuv. The repository has the daemon, the browser SDK, the protocol, and the tests. Local builds are unsigned.
In Noisedeck, open View and choose send to sync. Polymorphic has the same entry.
Choose Connect Sync and approve the pairing prompt. Your browser may also ask to allow local network access.
Name the output and choose Start sending.
Pick that name in the receiving app: a Syphon source on macOS, a Spout sender or NDI source on Windows.
Closing the dialog does not stop sending. Reopen it and choose Stop sending. Sync sends output only; native sources into Noisedeck are not built yet.
Noisedeck talks to Sync over loopback only. A site has to ask, you have to choose Connect Sync, and the companion shows you the exact origin before anything is allowed. The credential it creates is scoped to that origin and is stored by the app that asked, never in a URL.
Every paired origin is listed under Pairings in the Sync menu, where you can revoke it. From the command line:
Make sure Sync is running on the same computer, then choose Check again. Browser privacy settings can block loopback access.
Pairing was denied
Choose Connect Sync again and approve the origin the companion shows. If it has hit its pairing limit, revoke one you no longer use.
No provider available
Quit and reopen Sync. On Windows, NDI also needs the NDI Runtime installed.
The output stutters
The dialog counts frames as Sent, GPU busy, Network, and Failed. Some drops under load are normal; Sync skips frames rather than stall the render loop. Lower Noisedeck's output size or frame rate.
Sync pairs with any web origin the user approves. The browser SDK is dependency-free and lives under browser/ in the repository. Call pair() from a click, keep the token yourself, and send Permissions-Policy: loopback-network=(self) from your page.
import { SyncBridgeClient } from './browser/index.js'
const { token } = await new SyncBridgeClient().pair('My visual app')
const sync = new SyncBridgeClient({ token })
await sync.connect()
The wire protocol, the native daemon, and the conformance fixtures are in the repository.