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.