← All posts

Calls became meetings — and connections that go straight through

Three things this week: a call grew into a full multi-party meeting with screen sharing and recording; connections learned to punch straight through NAT, ~99% of the time, so we could rip out libp2p's relay machinery entirely; and the site grew up — in Russian, and with the trackers taken out.

A four-person meeting on the mesh, with a screen share and a raised hand

Three things this week, and they line up neatly: calls became meetings, connections learned to go straight through the wall, and the site around it grew up — in Russian, and with the trackers pulled out.

Calls became meetings

A call is now a room you can grow. Several people, each with their own panel, every voice heard separately; someone can share a screen (from a desktop or a phone), raise a hand, and there's a "hall" mode for the case where most people are an audience rather than participants. When it's over, the recording plays back as a single meeting, with a lane per speaker so you can see who talked when.

The hard part, as ever, was doing it well over real networks. A meeting uses selective forwarding, so the person on hotel Wi-Fi doesn't drag everyone else's picture down to match — each connection is judged on its own link, gets the quality that link can carry, and the room routes a smaller copy to whoever needs one. Under the hood that meant a proper congestion controller: reading the delay signal and the loss the far end actually counted, telling a keyframe the encoder chose from one you asked for, and not mistaking the ladder's own moves for the network refusing. A lot of it was measured against a real WebRTC control, because a benchmark that only compares us to ourselves can't tell you if you're any good.

Straight through the wall

The bigger foundational win: MeshHold now does its own NAT hole punching. When two nodes are both behind routers, they coordinate and punch a direct path — with both a UDP and a TCP leg, so even a network that blocks UDP still gets a straight line instead of a relay. In a two-router trial it connects directly about 99% of the time.

Getting there let us throw a lot away, which is the best kind of progress. Out went libp2p's DCUtR (it "never ran") and its circuit-relay (it "was carrying nothing"), and the last of several overlapping transport paths folded into one: a single delivery layer with one connection pool, one carrier ladder, and one traffic scheduler that every protocol — calls, transfers, the agent proxy, the tunnel — now rides. Fewer moving parts, more direct connections, faster everything.

The site grew up — and we took the trackers out

The website got a proper shape: pages that say what MeshHold is and honestly how it compares, a roadmap, a support desk that's a real ticket queue rather than an email address, and donations on their own page. The whole interface now speaks Russian — all 236 strings, with a translation memory so it stays in sync as the English changes.

And the part I care about most: we deleted Google Analytics and every last telemetry beat. Visit counts are our own now, aggregate-only, computed on our server, with no third party in the loop and no cookie banner to apologise for. A private, self-hosted cloud that phoned home would be a bad joke. Now it doesn't — not the product, and not the site that sells it.

That's the shape of the run-up to 0.8: the last big feature landed, the networking under it got simpler and more direct, and the product around it got honest.


Since last week

  • Group meetings: a call grows into a multi-party room — a panel per person, per-person audio, screen sharing from desktop and phone, raise-a-hand, a hall mode for audiences, and a recording that replays as one meeting with a lane per speaker
  • Selective forwarding + congestion control: each connection is judged on its own link and gets the quality that link can carry, so one bad connection can't drag the room down; a real delay-and-loss congestion controller, validated against a WebRTC control
  • Our own NAT hole punching: nodes punch a direct path with both a UDP and a TCP leg (so a UDP-blocked network still connects directly), ~99% direct in a two-router trial
  • One transport layer: libp2p's DCUtR and circuit-relay removed; every protocol now rides a single delivery layer with one connection pool, one carrier ladder, and one traffic scheduler
  • A grown-up website: about / comparisons / roadmap pages, a real support-ticket queue, and donations on their own page
  • Russian interface: all 236 UI strings translated, backed by a translation memory that flags what falls out of sync
  • No more trackers: Google Analytics and the entire telemetry pipeline deleted; visit counts are self-hosted, aggregate-only, with no third party and no cookie banner