Build anything the room can play.
Polls and quizzes are just the start. Agencies and in-house teams build their own experiences on Omnigate: a phone page that sends any input, a big screen that turns it into a show in real time — in HTML, Three.js, Unity WebGL, or best of all, OmniMotion.
How it works
Every experience has the same three parts. You decide what each one looks like; Omnigate carries the data between them, live, for up to 2,000 phones per computer.
- Inputs
Phone
Guests scan the QR and send votes, taps, sliders, text, photos or drawings — from the browser, no app.
→ - Computes + flow
Server
Omnigate checks every input, counts and ranks it in real time, and moves the show along: by the operator, a timer or a condition.
→ - Scenes
Screen
Big screens, side screens and LED walls receive the live data and turn it into the show.
Phone
13 input types · phone SDKEach part of an experience declares the inputs it accepts. Omnigate builds the phone screen for them — or you write your own phone page with the phone SDK and send anything you like.
choicePick one or several optionsbuttonA single tap — count, react, buzz inholdPress and hold — duration countsshakeShake the phone — motion as inputsliderA value on a scale — ratings, stars, 1–10numberA number with limits — guesses, estimatestextWords or short answers, moderatedphotoPhotos, approved before they showdrawingDraw on the phone, show on the wallteamJoin a team — races, battlespointTap a spot on an image or mapemojiEmoji reactions, livedataYour own shape: any JSON, checked by the server
Your own phone page
A plain HTML page in your pack. The SDK handles the connection, reconnects, the current view, uploads (resize and consent included) and haptics.
<!-- phone/index.html, inside your pack --> <script src="/sdk/phone.js"></script> <script> omnigate.on('init', (info) => setLanguage(info.lang)); // language, direction, brand, nickname omnigate.on('view', (view) => draw(view)); // what this phone should show now pick.onclick = async () => { const ack = await omnigate.send({ color: 'coral', size: 4 }); // any value your schema allows if (ack.ok) omnigate.haptic(30); }; const ack = await omnigate.upload(selfieBlob); // photo / drawing: resized, consent, approval </script>
Server
16 live computes · flow rulesYou describe what to calculate; Omnigate does it live and publishes the results to every screen. No backend to write, nothing to scale.
Live computes
Flow
- Operator: open, close, reveal from the operator screen
- Timer: move on after a set time
- Condition: move on when a value is reached (e.g. a team finishes the race)
- Repeats: rounds, with a running leaderboard
experience.json — a segment
One file describes the inputs, the computes, the scenes and the flow. The server checks it on upload.
{
"id": "bubbles",
"inputs": [
{ "id": "pick", "kind": "data", "per": "latest",
"config": { "schema": {
"color": { "type": "enum", "values": ["coral", "sky", "lime"] },
"size": { "type": "number", "min": 1, "max": 5, "integer": true } } } },
{ "id": "rate", "kind": "slider", "per": "latest", "config": { "min": 1, "max": 5 } }
],
"computes": [
{ "id": "all", "kind": "latest", "from": "pick", "params": { "n": 100 }, "publish": "bubbles" },
{ "id": "colors", "kind": "groupBy", "from": "pick", "by": "option", "field": "color", "publish": "colors" },
{ "id": "stars", "kind": "avg", "from": "rate", "publish": "rating" }
],
"scenes": {
"main": { "kind": "omni", "ref": "stage/bubbles.omni", "fallback": "idle" },
"phone": { "kind": "html", "ref": "phone/index.html" }
}
}Screen
built-in · HTML · OmniMotionEvery computed value reaches the screen as one live data object, Gate. Pick how you draw it:
Built-in views
Clean, branded views for every built-in experience. No code — and the fallback whenever a custom scene fails to load.
Your HTML
A page in your pack with the screen SDK: Canvas, Three.js, Unity WebGL, video. Runs sandboxed; the show keeps going if it fails.
OmniMotion
Design the screen in OmniMotion Studio and bind it to live data without code: {Gate.poll.question}, repeaters on Gate.poll.options, state machines on GateReveal. 2D, 3D, interaction and data in one file, live preview while you design.
Why OmniMotion is the best way to build the screen
- No glue codeText, lists, charts and animations bind to Gate directly.
- Designers, not just developersThe people who design the show build it — and change it on the day.
- Made for liveShow events (open, close, reveal) drive animations and state machines.
- Never a black screenIf a scene fails, the built-in view takes over in the same place.
Screen SDK (HTML)
<!-- stage/index.html — Canvas, Three.js, Unity WebGL… --> <script src="/sdk/stage.js"></script> <script> omnigate.on('scene', (msg) => { const g = msg.data.Gate; // live data: state, participants, join, brand, your computes title.textContent = g.content.question; drawBubbles(g.bubbles); // published by your "latest" compute }); omnigate.on('event', (name) => { // GateOpen · GateClose · GateReveal · GateReset… if (name === 'GateReveal') celebrate(); }); </script>
The Gate object (excerpt)
state- idle · open · closed · reveal
participants- connected phones
join.code · join.url · join.short- what the QR and the screen show
brand.primary · brand.accent- the event colours
content- what the organiser filled in
segment.index · segment.count- round and number of rounds
timer.endsInMs- time left to answer
<publish paths>- your computes, e.g. race.distance, quiz.leaderboard
Packs
ship itAn experience pack is a zip: the experience.json, your phone page, your screen scenes and translations. Upload it in the console; every upload becomes a version, and going live pins the version the event uses — what you rehearsed is what plays.
my-pack.zip ├── experience.json ├── phone/index.html ├── stage/bubbles.omni ├── stage/side.html └── locales/tr.json
- Upload, version and roll back in the console
- Checked on upload: schema, file types, sizes, missing scenes
- Sandboxed: no outside calls, rate limits and moderation built in
- Works online and fully offline, on the same computer
API
REST · your systemsEverything the console does goes through the same API: create events, set the flow, go live, end, and pull the report — as JSON or CSV — into your CRM, data warehouse or dashboards.
GET | /v1/experiences | Experiences and their content fields |
POST | /v1/events | Create a draft event |
PUT | /v1/events/:id/items | Set the whole flow in one request |
POST | /v1/events/:id/live | Go live |
POST | /v1/events/:id/end | End the event |
GET | /v1/events/:id/report | Participation and results (JSON) |
GET | /v1/events/:id/report.csv | The same as CSV |
POST | /v1/packs | Upload a pack version |
curl -X POST https://<your-omnigate>/v1/events \
-H "Authorization: Bearer $PANEL_KEY" -H "Content-Type: application/json" \
-d '{ "title": "Launch 2026", "language": "en", "brand": { "primary": "#14123a", "accent": "#ff5a3c" } }'
curl https://<your-omnigate>/v1/events/evt_42/report.csv?lang=en \
-H "Authorization: Bearer $PANEL_KEY" -o results.csvEnterprise: on your own servers, in your country, with your identity provider.
MCP Early access
Omnigate speaks the Model Context Protocol. Connect it to Claude or any MCP-capable assistant and prepare events in plain language — the assistant uses the same API, with the same checks.
“Set up a launch for 300 people: a welcome poll, a three-question quiz and a team race. Our colours are navy and coral.”
→ creates the event, fills the flow, applies the brand“Go live.”
→ checks the flow and the license, then goes live“Send me the results as a spreadsheet.”
→ pulls the report and exports CSV
Tools
Available to pilot and agency customers on request. Request access
Have an idea for the room?
Tell us what you want to build. We will help you shape it into a pack — or build it with you.