# BridgeSwarm

BridgeSwarm

A bridge that brings the **Hyperswarm P2P stack** into normal desktop browsers (Chrome, Edge, Firefox) without forking the browser. A [Bare](https://www.npmjs.com/package/bare)-based native host runs the real modules; the extension injects APIs into the page and talks to the host via Chrome/Firefox native messaging. | | | |--|--| | License | **[AGPL-3.0](LICENSE)** | | Publisher | **HoneyPeer, LLC** | ## Why BridgeSwarm? Traditional web applications use a **client-server model** - all communication goes through a central server. This creates: - **Single point of failure** - if the server goes down, everyone is affected - **Latency** - messages travel through the server, adding delay - **Bandwidth costs** - the server handles ALL traffic - **Privacy concerns** - all data passes through the server **BridgeSwarm enables peer-to-peer (P2P) communication** directly between browsers: ```mermaid flowchart LR subgraph Traditional["Traditional client–server"] B1[Browser] -->|HTTP| S[Server] S -->|HTTP| B2[Browser] end subgraph P2P["BridgeSwarm P2P"] P1[Browser] <-->|Noise / Hyperswarm| P2[Browser] end ``` ## Features ### P2P Networking - **Topic-based discovery** - Join a topic to find other peers interested in the same thing - **NAT traversal** - Works behind home routers and firewalls via UDP hole-punching - **End-to-end encryption** - All connections use Noise protocol - **Unique identities** - Each tab gets its own cryptographic key pair ### Data Storage (Built-in) - **Hypercore** - Append-only log - **Hyperbee** - Key/value B-tree store - **Hyperdrive** - P2P file system - **Autobase** - Multi-writer linearized log - **Hyperdb** - Schema-based P2P database ### Protocols - **Protomux** - Protocol multiplexing over connections - **HRPC** - Remote procedure calls with streaming support ### Optional capabilities (default host) - **Media** — `bare-media` + `bare-ffmpeg` (`BridgeSwarm.media.*`) — batch jobs **and live VP9 encode** - **Files** — allowlisted `BridgeSwarm.fs.*` under storage `files/` - **SQLite** — `BridgeSwarm.sqlite.*` under storage `sqlite/` - **Net** — `BridgeSwarm.net.fetch` to public http(s) only See [docs/CAPABILITIES.md](docs/CAPABILITIES.md). ## Quick Start ### Easy install (recommended) Downloads prebuilt native-host binaries and the extension from the rolling Gitea release [`latest-main`](https://git.ssh.surf/snxraven/BridgeSwarm/releases/tag/latest-main). No Node.js or git clone required. **macOS / Linux:** ```bash curl -fsSL https://install-bridgeswarm.honeypeer.com | bash ``` **Windows (PowerShell):** ```powershell irm https://git.ssh.surf/snxraven/BridgeSwarm/raw/branch/main/scripts/install.ps1 | iex ``` This installs the host to `~/.bridgeswarm/` (or `%LOCALAPPDATA%\bridgeswarm\` on Windows) and saves `BridgeSwarm-*.zip` / `.xpi` to `~/Downloads`. ### Load the Extension **Chrome / Edge:** 1. Open `chrome://extensions` 2. Enable **Developer mode** 3. Drag & drop `~/Downloads/BridgeSwarm-1.0.0.zip` onto the page (or Load unpacked after extracting) 4. Extension ID should be `jhmbaojjfkkpoolhkoohklbjokdmbdpm` 5. Restart the browser **Firefox:** temporary via `about:debugging` → Load Temporary Add-on, or permanent on Nightly/Dev Edition via Install Add-on From File (`.xpi`). ### Develop from source ```bash git clone https://git.ssh.surf/snxraven/BridgeSwarm.git cd BridgeSwarm npm run setup # or ./scripts/install-from-source.sh # Load unpacked: extension/ ``` Build release artifacts locally: ```bash npm run pack # extension zip + xpi npm run build:dist:package # all-platform host zips (needs bare-build; best on CI) ``` ### Try the examples In the extension **Settings** (or Dashboard → Settings), enable **Examples server**. Open **http://127.0.0.1:4173/** (do not use `file://`). Pick a demo and open it in two tabs. Dev alternative from the repo: `npm run examples` (same URL). ### Your First P2P App ```javascript // Create a swarm const swarm = new BridgeSwarm({ appName: 'my-app' }); // Join a topic to discover peers await swarm.join('my-topic'); // Handle incoming connections swarm.on('connection', (conn, peerInfo) => { console.log('Peer connected:', peerInfo.publicKey); // Receive messages conn.on('data', (data) => { console.log('Received:', new TextDecoder().decode(data)); }); // Send messages conn.write(new TextEncoder().encode('Hello, peer!')); }); // Clean up when done await swarm.leave('my-topic'); swarm.destroy(); ``` ## Building Blocks | Technology | Purpose | |------------|---------| | **Hyperswarm** | P2P networking, DHT discovery, NAT traversal | | **Corestore** | Multi-Hypercore storage | | **Hypercore** | Append-only log | | **Hyperbee** | Key/value B-tree | | **Hyperdrive** | P2P file system | | **Autobase** | Multi-writer log | | **Hyperdb** | Schema-based P2P database | | **Protomux** | Protocol multiplexing | | **HRPC** | Typed RPC with streaming | ## Architecture ```mermaid flowchart TB subgraph Page["Web page"] API["window.BridgeSwarm
join / write / request / media.*"] end subgraph Ext["Browser extension MV3"] CS["content.js
injects api.js"] BG["background.js
service worker"] OPT["Settings / Dashboard
autosave + examples toggle"] end subgraph Host["Native host Bare"] NH["host.js
Hyperswarm · Hyper* · HRPC"] CAP["Capability packs
media · fs · sqlite · net"] EX["examples-server
http://127.0.0.1:4173/"] end API <-->|postMessage| CS CS <-->|runtime.sendMessage| BG BG <-->|native messaging
4-byte LE + JSON| NH NH --> CAP BG -->|examplesServer.start/stop| EX OPT --> BG ``` ### How It Works 1. **Extension** (Manifest V3): Background service worker maintains the native messaging port; content script injects `api.js` into pages. Settings autosave to `bridgeSwarmSettings` (including the examples-server toggle). 2. **Native host** (Bare runtime): Runs Hyperswarm, Hyper* data stores, HRPC/Protomux attachment, default media capabilities, and the optional local examples HTTP server. 3. **Protocol**: 4-byte LE length prefix + JSON; binary data base64-encoded (NMH ~1 MB limit). ## Security ### Important Warnings **The native host runs with your user privileges** and can: - Make network connections - Read/write files - Access system resources **Only install from sources you trust!** ### Built-in Protections | Threat | Protection | |--------|------------| | Connection flooding | `maxPeers` option | | Malicious peers | `swarm.setFirewall({ mode, keys })`, `swarm.ban(publicKey)`, `peerInfo.ban()` | | Data interception | Noise encryption (automatic) | | Identity spoofing | Cryptographic key pairs | | DHT attacks | Rate limiting (built-in) | See [theory/bridgeswarm-for-dummies.md](theory/bridgeswarm-for-dummies.md) for detailed security documentation. ## API Reference ### BridgeSwarm Class ```javascript // Wait for API to be ready await BridgeSwarm.ready(); // Create swarm const swarm = new BridgeSwarm({ appName: 'my-app', // Required for Hyperswarm maxPeers: 50 // Optional: limit connections }); // Join topic await swarm.join('my-topic'); // Handle connections swarm.on('connection', (conn, peerInfo) => { // conn: BridgeSwarmConnection // peerInfo: { publicKey: 'abc123...', topics: [...] } }); // Get current connections const connections = swarm.connections(); // Leave topic await swarm.leave('my-topic'); // Destroy swarm swarm.destroy(); ``` ### Connection ```javascript conn.on('data', (data) => { // data is Uint8Array }); conn.on('end', () => { // Peer disconnected }); conn.on('error', (err) => { // Connection error }); // Send data (returns Promise) await conn.write(new TextEncoder().encode('Hello!')); // or await conn.write('Hello!'); // String auto-encoded ``` ### Data API ```javascript // Hyperbee (key/value) await BridgeSwarm.request('beePut', { key: 'name', value: 'Alice' }); const result = await BridgeSwarm.request('beeGet', { key: 'name' }); // Hyperdrive (files) await BridgeSwarm.request('drivePut', { path: '/file.txt', base64: '...' }); // Hyperdb (database) await BridgeSwarm.request('hyperdbInsert', { collection: 'records', doc: { id: '1', value: 'data' } }); ``` ### Events ```javascript // Native host disconnected window.addEventListener('bridge-swarm-host-disconnect', () => { console.log('Host disconnected!'); }); ``` ## Extension Settings Open **Options** or the **Dashboard → Settings**. Changes **save automatically** (no Save button). - **Swarm defaults**: Default app name, max peers - **Requests**: Default request timeout (ms) - **API**: Default ready timeout (ms) - **Injection**: Skip injection on `file://` URLs - **Notifications**: Show notification on host disconnect - **Examples**: Enable the bundled demos server at **http://127.0.0.1:4173/** (native host) - **Debug**: Enable debug logging ## Examples | Example | Description | |---------|-------------| | **chat-advanced** | Full-featured P2P chat with rooms, presence, emoji, file sharing | | **chat** | Minimal P2P chat | | **firewall-room** | Peer firewall allowlist/denylist + ban | | **data-demo** | Hyperbee, Hyperdrive, Hyperdb | | **sync-demo** | Auto-replicate Hyper* resources | | **sdk-demo** | BridgeSwarm + Protomux | | **hrpc-demo** | HRPC (unary + streaming) | | **whiteboard** | Collaborative drawing | | **screenshare** | P2P screen sharing (WebRTC + BridgeSwarm signaling) | | **live-encode** | Live VP9/WebM encode via host `bare-ffmpeg` → MSE | | **media-demo** | Batch media transforms / transcode | | **clip-studio** | Nearline clip tooling on the media pack | | **local-power** | Allowlisted files, SQLite, and public host fetch | Enable **Examples server** in Settings, then open **http://127.0.0.1:4173/** (not `file://`). ## Theory & Documentation For comprehensive documentation, see: - **[theory/bridgeswarm-for-dummies.md](theory/bridgeswarm-for-dummies.md)** - Complete guide covering everything from basics to advanced security - **[docs/ARCHITECTURE.md](docs/ARCHITECTURE.md)** - System architecture and message flow - **[docs/API-REFERENCE.md](docs/API-REFERENCE.md)** - Full API reference - **[docs/DATA-API.md](docs/DATA-API.md)** - Data storage API - **[docs/CAPABILITIES.md](docs/CAPABILITIES.md)** - Bare capability packs (media) - **[docs/DEFAULT-MODULES.md](docs/DEFAULT-MODULES.md)** - Modules shipped in the default host - **[docs/PROTOMUX.md](docs/PROTOMUX.md)** - Protocol multiplexing - **[docs/HRPC.md](docs/HRPC.md)** - RPC with streaming - **[docs/living/](docs/living/README.md)** - Living status, Holepunch notes, and the continued-development plan ## Troubleshooting ### "Native host has exited" The launcher runs Bare via Node (`node …/node_modules/bare/bin/bare …/index.mjs`). Re-run `./scripts/install.sh` (or `npm install` in `native-host/` and `npm run build:host`) so the local `bare` dependency and launcher paths are correct. ### "Access to the specified native messaging host is forbidden" Extension ID mismatch. Run `./scripts/update-native-manifest-extension-id.sh YOUR_EXTENSION_ID`. ### "hrpc not available" Run `npm run build:hrpc` to generate the HRPC spec. ### Users not showing in each other's lists - Ensure all tabs are joined to the same topic - Check that events are being routed correctly (enable debug in settings) - Verify swarms are properly registered ## Development ### Build Commands ```bash npm test # Host helper unit checks (net allowlist) npm run examples # Dev: serve demos at http://127.0.0.1:4173/ (or use Settings toggle) npm run sync:examples # Copy examples/ into extension + native-host for packaging npm run brand:build # Regenerate bridgeswarm-branding/ + sync runtime icons npm run brand:sync # Sync existing branding package into extension/assets npm run build:protomux # Rebuild Protomux bundle npm run build:hrpc # Rebuild HRPC spec (+ mirror into native-host/spec) npm run build # host launcher + protomux + hrpc npm run pack # Package extension (includes examples) → releases/ npm run build:dist # Standalone host binary (current platform) npm run build:dist:package # All platforms + zip archives (CI) ``` ### Releases (Gitea) - Push to `main` → CI builds artifacts and updates rolling prerelease tag `latest-main` - Push tag `v*.*.*` → versioned Gitea release - Requires repo secret `RELEASE_TOKEN` and self-hosted runner label `ssh` (same as holesail-browser) ### File Layout ```mermaid flowchart TB root[BridgeSwarm] root --> theory["theory/
guides + essays"] root --> docs["docs/
ARCHITECTURE · API · CAPABILITIES · living/"] root --> examples["examples/
source of truth for demos"] root --> brand["bridgeswarm-branding/
master brand package"] root --> extension["extension/
MV3 + synced examples/"] root --> native["native-host/
Bare host + examples-server"] root --> scripts["scripts/
install · pack · sync-examples · brand"] examples --> demos["chat · firewall-room · live-encode · media-demo · …"] brand --> brandOut["logo · favicons · app-icons · tokens"] extension --> extFiles["api.js · background.js · content.js · options · dashboard"] native --> hostFiles["host.js · messenger.js · capabilities/ · examples-server.js"] ``` `npm run sync:examples` / `npm run pack` copy `examples/` into `extension/examples/` and `native-host/examples/` for packaging. `npm run brand:build` regenerates [`bridgeswarm-branding/`](bridgeswarm-branding/) and syncs icons into `extension/icons/`, `assets/brand/`, `assets/logo/`, and `assets/favicons/`. ## Compatibility - Chrome 88+, Edge, Firefox 79+ - Desktop only (native messaging not available on mobile) - **Release install:** prebuilt Bare host binaries (darwin/linux/win32) — no Node required for end users - **From-source / CI:** Node.js for tooling; Bare `>=1.29.4` via the `bare` npm dependency ## License **[GNU Affero General Public License v3.0](LICENSE)** ([AGPL-3.0](https://www.gnu.org/licenses/agpl-3.0.html)). If you modify BridgeSwarm and let others interact with it over a network, review AGPL source-offer obligations (AGPL §13). Owned and engineered by **HoneyPeer, LLC** (DeKalb County, Georgia, USA). Legal: [legal@honeypeer.com](mailto:legal@honeypeer.com).