Skip to content

How it works ​

An app is a web page in a frame ​

A ReMeet app is a web page on your own https address plus a manifest, remeet.json. In a meeting, ReMeet opens the page in an isolated frame (iframe with sandbox). The page cannot see the meeting page itself, ReMeet cookies, tokens, the person's account or other participants' video. It talks to the meeting only through the bridge: JSON-RPC 2.0 messages over postMessage. Both sides check who sent each message — the exact frame and its origin. The SDK file wraps this for you; the protocol is documented if you prefer to speak it yourself.

┌──────────────── ReMeet meeting (remeet.video) ────────────────┐
│  video grid                    │  side panel                   │
│  ┌──────────────────────────┐  │  ┌─────────────────────────┐  │
│  │  stage: your-site/stage  │  │  │  panel: your-site/panel │  │
│  │  (iframe, sandbox)       │  │  │  (iframe, sandbox)      │  │
│  └────────────▲─────────────┘  │  └────────────▲────────────┘  │
│               └──── bridge: JSON-RPC 2.0 over postMessage ──┘  │
│                       only what the person allowed              │
└────────────────────────────────────────────────────────────────┘

Where an app is shown ​

SurfaceWhat it isWho opens it
panelThe side panel next to the chat. Personal: each participant opens their own.Anyone: More → the app.
stageA shared area over the video grid, for things everyone looks at together: a board, a game, a presentation.Anyone for themselves; the host can open it for everyone with app.stage.open({ everyone: true }) (permission stage.start).

An app can have one surface or both. The frame lives while the surface is open. When the person closes the panel or the stage, the frame is removed — keep what matters in storage or on your server, or ask other copies for the current state when you start (see below).

Every participant runs their own copy ​

There is no shared «app server» in the meeting. Each participant who opens your app runs their own copy in their own browser. Copies talk to each other with app.broadcast(): the message goes over the meeting's own real-time channel and reaches the copies of your app (the same key) at every other participant who has it open. Your copy does not receive its own messages.

A common pattern for shared state:

js
const app = await ReMeet.ready();
let state = { votes: {} };

// A new copy asks for the current state…
app.broadcast({ type: 'hello' });

app.on('broadcast', ({ data }) => {
  // …and the others answer.
  if (data.type === 'hello') app.broadcast({ type: 'state', state });
  if (data.type === 'state') state = data.state;
  if (data.type === 'vote') state.votes[data.option] = (state.votes[data.option] || 0) + 1;
});

Beta: everyone needs the app installed

Right now an app runs only for participants who installed it in their own ReMeet account. People who haven't — and guests without an account — don't see the shared stage the host opens and don't receive broadcasts. Opening an app for everyone in the meeting without a separate install is planned.

Identity ​

Every participant gets an id for your app: p_ plus 24 hex characters, the same for the same person in every meeting, and different in every app. It does not reveal the person's ReMeet account. Use it with app.badges.set() and to tell participants apart.

To trust who is on the other side on your server, use the context token: a signed JWT that ReMeet gives your app at start.

Everything beyond showing its own window is a permission. The manifest lists what the app asks for; the install window shows it to the person in plain words; the app gets only what the person allowed. A call without the permission fails with error 403.

Theme and language ​

app.context.theme is light or dark; when the person switches, you get the theme event, and the SDK also sets data-theme on your <html>, so CSS like :root[data-theme="dark"] { … } just works. app.context.locale is the person's language: en, ru or ar. For Arabic, set dir="rtl" on your page yourself.

ReMeet Apps SDK v0 · beta. The SDK file v0.js is MIT.