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