peer-to-peer layer · open web

No central server.
No single point of failure.

Lumamesh is the peer-to-peer layer the web forgot. No company runs it. No server owns it. The mesh lives as long as anyone — anywhere — runs a node. And anyone can.

index.html · 5 lines · zero config
<script type="module">
  import { connect } from 'https://lumamesh.com/lumamesh.js';

  const net  = await connect();
  const room = await net.joinRoom('my-app', { nick: 'alice' });

  room.on('peer', peer => peer.send({ hello: 'world' }));
</script>
inscription.html · sandbox-safe · zero external fetches
<script type="module">
  // import by inscription id — same node, no external call
  import { connect } from '/r/sat/25483050765715/-1';

  const net  = await connect();
  const room = await net.joinRoom('lobby');

  room.on('peer', peer => peer.send({ x, y }));
</script>
~/$ · ~5 minutes · any Linux box with a public IP
# 1. Clone and build
git clone https://github.com/Lumamesh/relay.git && cd relay
go build -o lumamesh-relay .

# 2. First run — prints your node's config JSON, generates keys
MESH_SALT=<shared-salt> MESH_PEERS=<existing-node>:7400 \
  PUBLIC_IP=<your-ip> UDP_PORT=3478 ./lumamesh-relay

# Once running, your node auto-gossips itself to all peers.
# Browsers connecting to any relay will learn about yours.
# See github.com/Lumamesh/relay for MESH_SALT + systemd setup.
01

Decentralised by design

No operator. No kill switch. Every node is equal — the mesh strengthens with every one added.

02

Direct browser-to-browser

Relays only bootstrap. Once SDP is exchanged, all data flows direct. Servers fall out of the path.

03

End-to-end encrypted

AES-GCM 256, key derived from the room id. Relays see only ciphertext they will never decode.

04

Sandbox-escaping

Bitcoin inscriptions block fetch & WebSocket. WebRTC DataChannels are the door still open.

↳ Architecture

Two layers.
No central point to attack.

Built like Bitcoin and BitTorrent before it: distributed, leaderless, resilient by topology — not by trust.

1Community relay net

A signaling-free WebRTC DataChannel from your browser to the nearest relay. No HTTP. No WebSocket. Just a single UDP port. Any volunteer can run a relay on a spare machine or a $3/mo VPS.

2Direct browser mesh

Full-mesh RTCPeerConnection between browsers, signaled over Layer 1. When NAT traversal succeeds, the relay drops out entirely — your traffic flows direct, peer-to-peer. The relay only stays in the path as a TURN fallback if both peers are behind strict NAT.

↳ Resilience model

The bootstrap config — relay IP, DTLS fingerprint, node identity — is stored as a Bitcoin inscription. The pointer is permanent and public; no company can take it down. But the network still depends on at least one relay being reachable. Right now there are two nodes running. The more independent operators run nodes, the harder the network is to disrupt — but that resilience has to be earned by growing the node count, not assumed.

↳ Strengthen the mesh

Run a node.
Strengthen the mesh.

Any Linux box with a public IP and Go 1.22+. Point your node at an existing relay with the shared MESH_SALT, and it gossips itself to every peer automatically — no operator approval needed. Browsers connecting to any relay in the mesh will discover your node within seconds. To get the MESH_SALT for this network, open an issue on github.com/Lumamesh/relay.

node@your-vps · auto-propagates via mesh gossip
git clone https://github.com/Lumamesh/relay.git && cd relay
go build -o lumamesh-relay .
MESH_SALT=<shared-salt> MESH_PEERS=<existing-node>:7400 \
  PUBLIC_IP=<your-ip> UDP_PORT=3478 ./lumamesh-relay

# Your node is now live and visible to all browsers on the mesh.