embedder-bridge is a Rust service for hardware attached to another machine. The agent stays on your workstation while serial data, flash commands, managed debug processes, and file transfers cross an authenticated WSS connection.
Bridge Protocol 1.1.0 is separate from the headless JSON-RPC protocol 0.19.9.
Choose a deployment
The CLI carries a platform-specific bridge binary and extracts it below the Embedder application directory.
install-service copies that binary to /usr/local/bin/embedder-bridge.
Start a temporary LAN bridge
On the machine with the hardware:~/.embedder/bridge/config.toml, stores state under ~/.embedder/bridge/state, and starts a detached process.
_embedder-bridge._tcp.local. The bridge advertises:
- Its configured name
- Port
- Protocol version
- SPKI fingerprint
mode=light
Pair over the LAN
1
Open a pairing window on the bridge host
2
Redeem the code from the workstation
3
Verify the fingerprint
The workstation prints the SPKI fingerprint returned during pairing. Compare it with
embedder-bridge status on the bridge host before accepting it as trusted.4
Test the saved pairing
doctor checks the pinned connection, serial enumeration, common flash and debug binaries, and a file-transfer round trip.~/.embedder/bridges.json. The file is set to mode 0600 where supported. The bridge stores only an Argon2 hash of the client token.
Install a relay service
Run this on the bridge host:- Copies the bundled binary to
/usr/local/bin. - Preserves an existing config or creates one.
- Creates the state directory.
- Installs and starts a service.
- Configures the production relay URL.
127.0.0.1:4849. Remote clients reach it through the relay rather than an inbound LAN port.
Linux service
Linux uses:embedder-bridge, adds it to dialout and plugdev, sets the state directory to mode 0700, and enables the systemd service.
NoNewPrivileges, protects home directories, restricts realtime scheduling, and locks the process personality.
macOS service
macOS uses:Override install paths
Claim the relay enrollment
On first service start, the bridge connects to:- A bridge ID
- A relay credential
- The relay setup state
Bridge configuration
The binary reads TOML and rejects unknown fields./etc/embedder-bridge/config.toml
Changing
bind away from loopback enables mDNS advertisement. Every session still requires pairing or relay authentication.
Manage the bridge from the CLI
On the bridge host,embedder-bridge can run the service, show status and diagnostics, open pairing, manage clients, remove relay enrollment, or reset its identity.
On the workstation, embedder bridge can discover, pair, list, remove, test, and execute against saved bridges. See the CLI reference for the complete command syntax and options.
bridge exec defaults to a 10-minute timeout. The command runs in the bridge staging directory. A requested working directory must remain inside staging.
When exec_allowlist is nonempty:
- The first argv element must appear in the list.
- Shell mode is disabled.
Protocol limits
Bridge Protocol1.1.0 enforces:
Text frames carry control messages. Binary frames use a one-byte kind, four-byte little-endian channel, and payload. The defined binary kinds are serial, file upload, and tunnel.
The bridge advertises
serial, exec, proc, and tunnel. It advertises scripts only when instruments_enabled is true.
Security model
- TLS uses a stable bridge key and client-side SPKI pinning.
- Pairing codes are hashed at rest and expire after two minutes.
- Client tokens are 32 random bytes and stored as Argon2 hashes on the bridge.
- Authentication failures trigger exponential lockout after the third failure, capped at one hour.
- The first post-TLS message must be
hello; any other message is rejected. - LAN and relay sessions use the same authenticated bridge protocol.
- File working directories are confined to staging.
- Serial output uses bounded queues and drops data instead of allowing unbounded memory growth.
exec_allowlist, and device permissions that match the intended lab access.
Troubleshooting
Discovery finds nothing
Discovery finds nothing
mDNS only runs when the bridge binds outside loopback. Check
bind, UDP multicast between the hosts, and the _embedder-bridge._tcp.local service. Pair directly with host:port when multicast is blocked.The bridge identity changed
The bridge identity changed
The pinned SPKI key differs from the current bridge. Confirm whether the state directory or identity was reset. Remove and re-pair only after verifying the new fingerprint on the bridge host.
Serial ports are missing
Serial ports are missing
On Linux, confirm that the service user belongs to
dialout and that USB probe udev rules grant plugdev access. embedder-bridge diagnose prints the hardware inventory visible to the service.A flash command is rejected
A flash command is rejected
Check
exec_allowlist. An empty list permits programs; a nonempty list must contain the exact first argv element. Shell execution is unavailable while that list is active.Relay enrollment never completes
Relay enrollment never completes
Read the service log for the setup code, confirm outbound WSS access to the relay, and claim the current code in the Embedder app. Expired setup codes are replaced automatically.
Doctor reports no flasher or GDB server
Doctor reports no flasher or GDB server
Install
probe-rs and either OpenOCD or J-Link GDB Server on the bridge host. The service process must be able to find them on its PATH.CLI reference
Check every bridge command and option.

