โฌก Lumamesh

peer-to-peer layer for the open web

A mesh that
can never go down.

Lumamesh is a decentralised peer-to-peer layer for the web. No company runs it. No server owns it. The network lives as long as anyone, anywhere, is running a node โ€” and anyone can.

๐ŸŒ Decentralised by design

No operator controls the network. Every node is equal. The more nodes that exist, the more resilient it becomes โ€” just like Bitcoin or BitTorrent.

โšก Direct peer-to-peer

Relay nodes only bootstrap connections. Once browsers exchange SDP, all data flows direct โ€” the relay drops out of the path entirely.

๐Ÿ”’ End-to-end encrypted

AES-GCM 256-bit keys derived from the room id. The relay sees only ciphertext it can never read.

๐ŸŒ‘ Inscription sandbox escape

Bitcoin inscriptions block fetch() and WebSocket. Lumamesh uses WebRTC DataChannels โ€” the one primitive that still works. The relay SDP is static and embedded; zero external fetches needed.

Integrate in 5 lines

In a Bitcoin inscription (on-chain import โ€” no external fetches)

Inscriptions run in a strict sandbox where fetch() and external imports are blocked. Import the library by its inscription ID โ€” the content is served from the same ordinals node, so no external network call is needed:

<script type="module">
  // Replace LIB_INSCRIPTION_ID with the inscription id of lumamesh.js
  import { connect } from '/r/content/LIB_INSCRIPTION_ID';

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

  room.on('peer', peer => {
    peer.on('open', () => peer.send({ hello: 'world' }));
    peer.on('data', msg  => console.log(peer.nick, msg));
  });

  room.broadcast({ text: 'hi everyone' });
</script>

This is the reason Lumamesh exists: WebRTC DataChannels are the only way to open a network connection from inside an inscription sandbox. The relay is bootstrapped from a static SDP offer embedded on the page โ€” zero external fetches needed to open the relay connection.

In a regular web page or browser extension

<script type="module">
  import { connect } from 'https://lumamesh.com/lumamesh.js';

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

  room.on('peer', peer => {
    peer.on('open', () => peer.send({ hello: 'world' }));
    peer.on('data', msg  => console.log(peer.nick, msg));
  });
</script>

Send game state (60 Hz unreliable)

room.broadcast({ x, y, angle }, { reliable: false });

Private rooms

const room = await net.joinRoom('lobby', {
  secret: location.hash.slice(1)  // #key never sent to servers
});

Media (camera / screen / mic)

const cam = await navigator.mediaDevices.getUserMedia({ video: true, audio: true });
room.publish(cam, { kind: 'cam' });

room.on('peer', peer => {
  peer.on('track', ({ stream, kind }) => {
    document.querySelector('video').srcObject = stream;
  });
});

How it works

Lumamesh has two layers:

Layer 1 โ€” Community relay network. A signaling-free WebRTC DataChannel to the nearest relay node. No HTTP, no WebSocket โ€” just a single UDP port. Any volunteer can run a relay on a spare machine or a $3/mo VPS.

Layer 2 โ€” Direct browser mesh. Full-mesh RTCPeerConnection between browsers, signaled over Layer 1. Once browsers have exchanged SDP, the relay drops out of the path entirely. Your traffic never touches a server.

Why it can't be shut down: There is no central relay to seize or deplatform. Any node is sufficient to bootstrap new connections. The relay config (IP, DTLS fingerprint, node identity) is stored as a permanent Bitcoin inscription โ€” even the bootstrap pointer is immutable. As long as one relay exists anywhere, the network works. With many relays, it becomes unstoppable.

Run your own node โ†’ โ€” it takes about 5 minutes on any Linux machine with a public IP.