Local protocol authority for Bolt P2P file transfer.
Headless Rust daemon providing browser↔desktop direct transport. Default transport is WebSocket (WS) with optional WebTransport (WT/HTTP3) and QUIC transports behind feature flags.
Two runtime modes:
- WsEndpoint (default) — WS server for browser↔desktop direct transport, optional WT alongside
- Simulate — IPC-only mode for testing pairing/transfer event round-trip
Key capabilities:
- NaCl-box encrypted HELLO handshake with capability negotiation
- Profile Envelope v1 framing with Bolt Transfer Ratchet (BTR) encryption
- IPC channel (Unix socket / Windows named pipe) for native shell integration
- Identity persistence (TOFU) and pairing approval (trust store)
- Rendezvous signaling via bolt-rendezvous WebSocket server
Zero WebRTC runtime. All WebRTC/DataChannel code was removed in DEWEBRTC-2 (
f730501). Thedatachannelandwebrtc-sdpcrates are no longer dependencies. The cross-impl E2E test harness (tests/ts-harness/) retainsnode-datachannelintentionally for browser-fidelity testing — this is the only WebRTC surface in the repo.
Cargo.lock is committed and required. This is a binary daemon — all dependency
versions must be pinned for reproducible builds across machines and CI.
cargo build
Requires: Rust 1.70+.
bolt-daemon [options]
Mode:
--mode <ws-endpoint|simulate> Runtime mode (default: ws-endpoint)
WsEndpoint mode:
--ws-listen <addr> WS listen address (REQUIRED, e.g. 127.0.0.1:9557)
--socket-path <path> IPC Unix socket path (default: /tmp/bolt-daemon.sock)
--data-dir <path> Data dir for identity key, trust store, and signal files
--pairing-policy <ask|allow|deny> Pairing approval policy (default: ask)
--phase-timeout-secs <int> Per-phase timeout in seconds (default: 30)
WebTransport (requires --features transport-webtransport):
--no-wt Force-disable WT even if feature is compiled in
Simulate mode:
--simulate-event <type> pairing-request | incoming-transfer (REQUIRED)
Legacy flags (--role, --signal, --offer, --answer, --interop-*) exit 1.
These belonged to the pre-DEWEBRTC-2 WebRTC architecture.
cargo run -- --mode ws-endpoint --ws-listen 127.0.0.1:9557The daemon:
- Starts a WebSocket server on the specified address
- Generates an ephemeral TLS certificate and starts a WebTransport endpoint
on the adjacent port (9558) if the
transport-webtransportfeature is enabled - Writes WT metadata (
wt_info.json) to--data-dirfor the native shell to read - Starts an IPC server on
/tmp/bolt-daemon.sockfor native shell communication - Waits for browser or native app connections
When a browser connects, the session lifecycle is:
- NaCl-box encrypted HELLO handshake with capability negotiation
- Profile Envelope v1 framing for all post-HELLO messages
- BTR (Bolt Transfer Ratchet) encrypted file transfers when negotiated
The native shell communicates with the daemon via signal files
in the --data-dir directory. The daemon polls for these at 250–500ms intervals.
| Signal File | Purpose |
|---|---|
send_file.signal |
Write a file path → daemon sends it to the connected browser |
connect_remote.signal |
Write legacy WS URL or structured JSON (wsUrl, optional quicAddr / quicCertHash) → daemon connects outbound; WS remains current fallback until QUIC app-session routing lands |
disconnect_session.signal |
Touch → daemon disconnects the active session |
transfer_pause.signal |
Touch → pause the active transfer |
transfer_resume.signal |
Touch → resume a paused transfer |
IPC-only mode for testing the pairing/transfer event flow without a real connection:
cargo run -- --mode simulate --simulate-event pairing-requestEmits a simulated IPC event and waits up to 30s for a decision from a connected UI client. Exits 0 on decision received, 1 on timeout (fail-closed deny).
cargo test
Coverage spans lib unit tests, integration tests (BTR, QUIC, WS, WT, identity, IPC), golden vectors, and the cross-impl E2E harnesses.
The cross-impl E2E harness (tests/ts-harness/) uses node-datachannel for
browser-fidelity testing. This is test-only — no WebRTC code runs in the
daemon at runtime.
scripts/contract_smoke.sh verifies the operator contract
(docs/DAEMON_CONTRACT.md) against the built binary.
cargo fmt
cargo clippy -- -W clippy::all
Both must be clean (0 warnings).
bolt-daemon/
├── Cargo.toml # bolt-core, bolt-btr, tungstenite, tokio, serde
├── Cargo.lock # pinned (committed for reproducible builds)
├── src/
│ ├── main.rs # CLI, mode dispatch, boot diagnostics
│ ├── lib.rs # Module exports for integration-test access
│ ├── session_loop.rs # Shared WS/QUIC/WT session lifecycle, trust enforcement
│ ├── session_frame.rs # Session frame parsing/encoding helpers
│ ├── wt_endpoint.rs # WebTransport/HTTP3 server (feature-gated)
│ ├── wt_cert.rs # Ephemeral TLS cert generation for WT
│ ├── ws_btr.rs # BTR key derivation + chunk encrypt/decrypt
│ ├── ws_validation.rs # Send-path validation (size, path traversal)
│ ├── web_hello.rs # NaCl-box encrypted HELLO handshake
│ ├── envelope.rs # Profile Envelope v1 codec, router, error framing
│ ├── dc_messages.rs # Inner message types (ping, pong, file ops)
│ ├── session.rs # SessionContext: HELLO outcome persistence
│ ├── connect_signal.rs # Native connect signal parser (legacy WS + Q2D JSON)
│ ├── identity_store.rs # Ed25519 identity keypair persistence
│ ├── transfer.rs # Transfer state types
│ ├── ice_filter.rs # NetworkScope policy (retained, not active in WS/WT)
│ ├── ipc/ # IPC server, transport, trust store, event types
│ ├── relay.rs # Relay protocol
│ ├── relay_main.rs # bolt-relay binary entry point
│ ├── ipc_client_main.rs # bolt-ipc-client dev harness
│ ├── quic_endpoint_info.rs # QUIC endpoint metadata for native shell
│ └── quic_transport.rs # QUIC transport (feature-gated)
├── tests/
│ ├── ts-harness/ # Node.js cross-impl E2E (node-datachannel, test-only)
│ ├── e2e-browser/ # Browser E2E tests
│ ├── vectors/ # Golden test vectors
│ └── *.rs # Integration tests (BTR, QUIC, WS, identity, etc.)
├── scripts/ # Contract smoke + no-panic check
└── docs/ # Contracts, changelog, specs
Key dependencies:
bolt-core— canonical hash, encoding, crypto primitivesbolt-btr— Bolt Transfer Ratchet (per-transfer DH ratchet + ChaCha20-Poly1305)bolt-transfer-core— transport-agnostic transfer state machinetungstenitev0.24 — sync WebSocket client for rendezvous signalingtokio-tungstenitev0.24 — async WebSocket (WS endpoint)wtransportv0.7 — WebTransport/HTTP3 (optional, feature-gated)
daemon-vX.Y.Z[-suffix]. Release history lives in docs/CHANGELOG.md.
MIT