How Freehop compares
Every option on this page can put people in a call. They differ in one question that decides your bill: when two people cannot connect directly, where do their audio and video go?
- Peer-to-peer libraries (PeerJS, Trystero, plain WebRTC) send media directly when they can. When they can't, they need a TURN relay, and someone pays for every byte it carries.
- SFU servers (LiveKit, Jitsi, mediasoup) route group media through a server. Jitsi also tries a direct route in two-person calls. Server forwarding makes large rooms, recording and livestreams possible, and makes the server's bandwidth a running cost.
- Hosted APIs run those servers for you and charge per minute or per gigabyte.
- Freehop keeps media between the people in the call. When a direct route fails, it uses machines that already belong to the session: a participant's desktop gateway, the host node, or a participant who forwards. Gates pass sealed signalling only. You may also operate a session gateway and pay for its media traffic.
At a glance
| Option | How people find each other | When a direct route fails, media goes through | Your media bill | Built for | End-to-end encrypted media | License |
|---|---|---|---|---|---|---|
| Freehopthis projectPeer-to-peer SDK plus small signalling gates | Your gates, community gates and public WebTorrent trackers, all at once; sealed end to end | Machines in the session: a participant's desktop gateway, the host node, or a forwarding participant; optionally your own TURN relay as a last resort | Gates carry no media; gateway costs depend on who hosts it; an opt-in TURN relay bills only the calls that need it | Small-room mesh; initial target 2–8 | Direct and gateway paths: yes. A forwarding participant decodes and re-encodes the media | Apache-2.0 |
| WebRTC + your own TURNThe browser API, plus the servers you build (e.g. coturn) | You build it: WebRTC does not define signalling | Your TURN server | Every relayed byte | Small groups (mesh), more with an SFU you add | Yes, between peers; TURN relays only see ciphertext | coturn: BSD-3-Clause |
| PeerJSLibrary for one-to-one connections by peer id, with a signalling server (PeerServer) | PeerServer: the free shared cloud server or your own | A TURN server you supply. Its free TURN service closed in December 2023 | Yours, once you add TURN | One-to-one; groups are a mesh you build | Yes, between peers | MIT |
| TrysteroServerless peer-to-peer rooms (mesh) | Nostr by default; also BitTorrent trackers, MQTT, Supabase, Firebase, IPFS or your own relay. Encrypted; a password makes the key private | A TURN server you add; by default only STUN, so hard-NAT pairs fail | Yours, once you add TURN | Small groups (mesh) | Yes, between peers | MIT |
| LiveKitOpen-source SFU server and SDKs, or LiveKit Cloud | The LiveKit server | Always the server: every stream goes through the SFU, with built-in TURN | Your servers' bandwidth, or Cloud pricing per minute and GB | Large rooms, livestreams, AI agents | Optional end-to-end encryption; otherwise the server can access the media | Apache-2.0 |
| Jitsi MeetComplete meeting app: Videobridge SFU with XMPP signalling | An XMPP server (Prosody) | With 2 people it tries a direct link; with 3 or more, every stream goes through the Videobridge | Your servers' bandwidth, or 8x8's hosted JaaS | Meetings with dozens of people | Optional, where the browser supports it; otherwise the Videobridge can access the media | Apache-2.0 |
| mediasoupSFU library for Node.js or Rust, with a C++ media worker | You build it | Always your SFU server | Your servers' bandwidth | Large rooms you build yourself | Not built in; you can add it in your app | ISC |
| simple-peerThin wrapper around one WebRTC connection | You build it | A TURN server you add; by default only STUN | Yours, once you add TURN | One-to-one; groups are a mesh you build | Yes, between peers | MIT |
| Hosted video APIsManaged services such as Daily, Agora, Twilio Video and Cloudflare Realtime | The provider | The provider's servers: most send every stream through them | Per participant-minute, or per GB (Cloudflare) | Large rooms, nothing to run | Varies by provider and mode; verify its E2EE options | Proprietary |
| Game platform networksSteam Datagram Relay and Epic Online Services P2P: native game SDKs, not browsers | The platform | The platform's relays: Valve's backbone, or Epic's relays on AWS | The platform carries it (Epic: EOS is free; Steam relays need a Steam release) | Native games on those platforms | Depends on the platform | Proprietary (Valve open-sources the protocol library, without the relays) |
On a narrow screen, the table scrolls sideways.
Freehop’s gates carry no media. Participants and session gateways still use bandwidth and compute; a gateway you host can add those costs to your bill. The 2-to-8-person range is the intended use, not enforced room admission; see room limits.
Which one fits
Freehop fits when:
- calls are small groups of 2 to 8 people: meeting rooms, in-app calls, shared workspaces, communities or games;
- you don't want a relay bill that grows with every call, and you accept that a pair with no route inside the session is reported as
unreachable, or you opt into your own TURN relay for just those pairs; - people use your app in the browser and on the desktop, so desktop participants can open a front door for everyone.
An SFU (LiveKit, Jitsi, mediasoup) fits when:
- rooms have dozens or hundreds of people, or one person broadcasts to many;
- you need recording, server-side processing, transcription or AI agents in the call;
- you want media to pass through your server and budget for that bandwidth; successful connections still depend on transport support and firewall rules.
A thin peer-to-peer library (PeerJS, Trystero, plain WebRTC) fits when:
- you want one-to-one calls or data channels with the least code;
- you are happy to run (and pay for) your own TURN server for the pairs that can't connect directly.
A hosted API fits when:
- you want nothing to operate and a vendor contract, and per-minute pricing works for your margins.
What Freehop does not do
Being honest about the trade-offs is part of the comparison:
- No large-room capacity benchmark. Freehop is a mesh: every person sends to every other person. Larger rooms need separate load testing; an SFU reduces each participant's upload requirements.
- No built-in recording or server-side media processing. Gates cannot record media they never receive. Receiving participants can record it, including a participant forwarding decoded tracks; gateway relays carry encrypted packets.
- No guarantee on locked-down networks. A network that can reach only your server has no route for media without your server carrying it. Freehop reports
unreachableinstead of paying for a relay, unless you opt into a TURN relay that network can reach. See limits. - Tested in a developer-built home lab, not field-proven. See network test results.
Sources
Checked against each project's own documentation and source code on 2 October 2026. Pricing and service availability can change:
- coturn: TURN server, BSD-3-Clause.
- PeerJS and its repository: MIT and PeerServer cloud; the maintainers' 5 December 2023 announcement ended the free TURN service. Some default settings still list the old TURN addresses; they are not a supplied service you should rely on.
- Trystero: MIT; Nostr is the default strategy, TURN is configured separately, and a password protects signalling with a private key.
- LiveKit: Apache-2.0 SFU; embedded TURN, end-to-end encryption, and Cloud pricing.
- Jitsi Meet and Jitsi Videobridge: Apache-2.0; security and two-person P2P mode, P2P configuration, and JaaS.
- mediasoup: ISC; Node.js and Rust integrations.
- simple-peer: MIT; configurable ICE servers and mesh groups built by the application.
- Hosted APIs: Daily, Agora, Twilio Video, Cloudflare Realtime.
- Native game networks: Steam Datagram Relay and Epic Online Services P2P.
Something out of date or wrong? Open an issue and we will correct it.