Top AI Repos β open-source AI, indexed and scored
Top AI Repos tracks AI repositories on GitHub and answers two different questions about each one: is it moving right now, and would you bet a product on it.
Top AI Repos tracks AI repositories on GitHub and answers two different questions about each one: is it moving right now, and would you bet a product on it.
β¨π€β¨ Build instant multiplayer webapps, no server required β Magic WebRTC matchmaking over BitTorrent, Nostr, MQTT, IPFS, Supabase, and Firebase
| Date | Stars |
|---|---|
| 2026-07-24 | 2663 |
| 2026-07-25 | 2664 |
| 2026-07-28 | 2664 |
| 2026-07-30 | 2664 |
| 2026-08-06 | 2664 |
Today
β stars today
This week
β stars this week
This month
β stars this month
Momentum
35.0
growth rate 0.00%/day
# β¨π€β¨ Trystero
**Build instant multiplayer web apps, no server required**
π **[Try it live on trystero.dev](https://trystero.dev)** π
Trystero makes browsers discover each other and communicate directly. No
accounts. No deploying infrastructure. Just import and connect.
Peers can connect via π BitTorrent, π¦ Nostr, π‘ MQTT, β‘οΈ Supabase, π₯Firebase,
πͺ IPFS, or a π self-hosted WebSocket relay β all using the same API.
Besides making peer matching automatic, Trystero offers some nice abstractions
on top of WebRTC:
- ππ£ Rooms / broadcasting
- π’π© Automatic serialization / deserialization of data
- π₯π· Attach metadata to binary data and media streams
- βοΈβ³ Automatic chunking and throttling of large data
- β±π€ Progress events and promises for data transfers
- ππ Session data encryption
- πβ‘ Can run peers server-side on Node, Bun, and Deno
- βοΈπͺ React hooks
You can see what people are building with Trystero
[here](https://github.com/jeremyckahn/awesome-trystero).
---
## Contents
- [How it works](#how-it-works)
- [Get started](#get-started)
- [Listen for events](#listen-for-events)
- [Broadcast events](#broadcast-events)
- [Audio and video](#audio-and-video)
- [Advanced](#advanced)
- [Binary metadata](#binary-metadata)
- [Action promises](#action-promises)
- [Progress updates](#progress-updates)
- [Encryption](#encryption)
- [React hooks](#react-hooks)
- [Troubleshooting connection issues](#troubleshooting-connection-issues)
- [Running server-side (Node, Bun, Deno)](#running-server-side-node-bun-deno)
- [Self-hosted WebSocket relay](#self-hosted-websocket-relay)
- [Write your own strategy](#write-your-own-strategy)
- [Supabase setup](#supabase-setup)
- [Firebase setup](#firebase-setup)
- [API](#api)
- [`joinRoom(config, roomId, [callbacks])`](#joinroomconfig-roomid-callbacks)
- [`selfId`](#selfid)
- [`getRelaySockets()`](#getrelaysockets)
- [`pauseRelayReconnection()`](#pauserelayreconnection)
- [`resumeRelayReconnection()`](#resumerelayreconnection)
- [Which strategy should I choose?](#which-strategy-should-i-choose)
---
## How it works
π **If you just want to try out Trystero, you can skip this explainer and
[jump into using it](#get-started).**
To establish a direct peer-to-peer connection with WebRTC, a signalling channel
is needed to exchange peer information
([SDP](https://en.wikipedia.org/wiki/Session_Description_Protocol)). Typically
this involves running your own matchmaking server but Trystero abstracts this
away for you and offers multiple strategies for connecting peers (currently
BitTorrent, Nostr, MQTT, Supabase, Firebase, IPFS, and self-hosted WebSocket
relay).
The important point to remember is this:
> π
>
> Beyond peer discovery, your app's data never touches the strategy medium and
> is sent directly peer-to-peer and end-to-end encrypted between users.
>
> π
You can [compare strategies here](#which-strategy-should-i-choose).
## Get started
Install Trystero with your preferred package manager, then import it in your
code:
```sh
npm i trystero
```
```js
import {joinRoom} from 'trystero'
```
No package manager? You can also use a CDN:
```html
<script type="module">
import {joinRoom} from 'https://esm.run/trystero'
</script>
```
The default Trystero package runs on the Nostr network, but you can swap in any
other stategy by changing which package you import:
```js
import {joinRoom} from '@trystero-p2p/mqtt'
// or
import {joinRoom} from '@trystero-p2p/torrent'
// or
import {joinRoom} from '@trystero-p2p/supabase'
// or
import {joinRoom} from '@trystero-p2p/firebase'
// or
import {joinRoom} from '@trystero-p2p/ipfs'
// or
import {joinRoom} from '@trystero-p2p/ws-relay'
```
Next, join the user to a room with an ID:
```js
const config = {appId: 'san_narciso_3d'}
const room = joinRoom(config, 'yoyodyne')
```
The first argument is a configuration object that requires an `appId`. This
should be a completely unique identifier for your appΒΉ. The second argument is
the room IExcerpt of 36,866 characters
Read on GitHubWould you bet a product on this? Bounded 0β100 and slow moving.
matched fp:aa54d101e02e9957, topic:serverless