Permissions
An app without permissions can only show its own window: greet the person, show toasts, open a stage for that person. Everything that touches the meeting is a permission. You list permissions in the manifest; before installing, the person sees them in plain words and presses Allow and add.
List
| Permission | What the person sees | What it unlocks |
|---|---|---|
participants.read | See who is in the meeting and who is speaking | context.participants, app.participants(), events participant.joined, participant.left, speaking |
app.broadcast | Exchange data with its copies at other participants | app.broadcast(), event broadcast |
chat.read | Read the meeting chat | event chat.message |
chat.send | Write to the chat on your behalf, marked with the app name | app.chat.send() — the message goes from the person, starting with [App name] |
captions.read | Read live captions | event captions, while live captions run in the meeting |
badges.write | Show small labels on participant tiles | app.badges.set(), app.badges.clear() |
stage.start | Open a shared stage for everyone (only when you are the host) | app.stage.open({ everyone: true }) |
storage | Keep up to 64 KB of its own data for you | app.storage.get/set/delete |
Always available, no permission needed: ReMeet.ready(), app.notify(), app.stage.open() for yourself, app.stage.close(), the theme event.
Camera and microphone
If your page itself needs the camera or the microphone (for example, a recorder or a pose game), add media:
"media": ["camera", "microphone"]The person sees «Use your camera inside the app (the browser asks once more)». After they allow it, the frame gets access and the browser asks its own question on first use. Without media, getUserMedia() inside the frame fails. An app never gets the meeting's audio or video streams.
Checking at runtime
const app = await ReMeet.ready();
if (app.can('chat.send')) {
showShareButton();
}
app.permissions; // ['participants.read', 'app.broadcast', …] — what this person allowedA call without the permission fails with code 403:
try {
await app.chat.send('Results are ready');
} catch (error) {
if (error.code === 403) app.notify('Allow the app to write to the chat to share results');
}Events that need a permission simply never arrive without it.
Good manners
- Ask for the minimum. Every extra line in the install window costs installs.
- Don't make the main function depend on a permission you can live without: check
app.can()and offer a simpler path. - If an update adds a permission, people who installed the app earlier don't have it until they add the app again — see updating an app.