Features

Everything it can do

In plain language — what each part is for, and why it's there. The screens are drawn rather than photographed — each one points at the single thing that matters on it.

Watch the screen, live

A camera points at the TV and streams its picture to you with very low latency — so you see exactly what's on screen, wherever you are. To save bandwidth it only streams while someone is actually watching, with a short warm-up window so re-opening is instant.

WHEPon-demandquality switching
Reception-01 · liveRemoteheld by you · Janaone holder at a time
Live camera in the set detail
off nobody is watching starting 2–4 s cold start running the picture flows warm for two more minutes 1 2 3 4 5
1the first viewer arrives — only now does the camera wake up 2the box is up and the picture is going out 3the last viewer leaves — or is released after 15 minutes with no sign of life 4come back within two minutes and it is instant — still warm 5after two minutes of silence it stops: the camera frees its slot and the uplink goes quiet

Control like you're there

A web remote sends key presses, volume and navigation straight to the TV over its LAN. Power is one smart button: it turns the TV off over the network, and wakes a sleeping TV with a Wake-on-LAN pulse — the button even reads the real on/standby state and relabels itself.

kac-remote protocolsdual-mode powerWake-on-LAN
The control deckbackhomemenuinfothe pad the TV really has
The control deck

Debug the on-screen app

For developers: full Chrome DevTools for the web app running on the TV — inspect elements, watch the console and network — deep-linked straight to the right set, embedded in the page.

chiiembedded DevTools
DebugElements<div class="tile"> <span>Checkout</span></div>ConsoleGET /catalog → 500the TV's own devtools, in the browserthe error, on the actual television
Debug pane

Record & replay sessions

While you watch, the box can record the session locally — together with a synchronised track of every key you pressed. Later you can scrub the video, see exactly what was pressed when, and even replay those exact key presses onto a live TV — turning a recording into a repeatable test. You can also export a clip with the key labels burned into the picture.

key-trackScénář replayburn-in export
KEY_RIGHT · 01:14the keys, lined up with the picture
The review player
watching the box records locally the picture video of the session the key presses a synchronised track export a clip labels burned into the picture replay onto a live TV the recording becomes a test 1 2 3
1both tracks are born at once — that they stay in step is the whole feature 2what goes back to a live TV is the key presses, not the video 3the export needs both: the key labels are burned into the picture

Write a test once, run it on any TV

A scenario is a short script: press these keys, wait, launch that app, then check the screen actually says what it should. You write it in a proper editor with a diagram beside the code — the two are the same document seen twice, so scrolling one follows the other and dragging a step in the diagram rewrites the code. Nothing has to be memorised: one button lists every step the language has and every key a TV can be sent. A broken document says what is wrong and on which line, and won't pretend it can be saved.

You can run the whole thing, walk it through dry with nothing reaching the TV, or start from the step your cursor is on — because the first forty seconds of setup are rarely what you are testing.

YAML / JSONC / TypeScriptdiagram ⇄ codedry-runrun from a step
Stepspress KEY_HOMEwait 2spress KEY_RIGHTexpect tile "Checkout"captureOutlinewrite it, or record it
The scenario editor

Let it watch the TVs for you

Point a scenario at one TV or twenty and give it a time: it runs itself every night, or every so many minutes, and tells you what happened. A round that failed posts to your webhook. A TV somebody was actually using is skipped rather than interrupted — and skipped is amber, not red, everywhere, because a scenario that never ran is not a scenario that failed. Every round is kept with its per-step timing and, when a camera check fails, the frame that failed it. Watches and runs are two screens: the plans live under Watches, and every run — scheduled, started by hand, or by an AI agent — lands in Runs, filterable by what started it.

And the news can be personal. Give your own account a channel and you hear about the runs you started — the scheduled ones and the one you just clicked — with a "let me know about this one" you can tick on the run itself. A team's admin can opt in to their own team's runs, one team at a time, and the people in it are told, in the app, that someone is listening. Failures always reach you; a pass only if you ask for it, and a round across twenty TVs arrives as one message rather than twenty.

nightly or intervalmulti-TVwebhook alertstell me when mine finishesfail screenshots
MonitoringCheckout · Reception-01every 15 minOnboarding · Window-03daily 06:00Regression · Meeting-02pausedLatest findingWindow-03 — the Checkout tile is goneit says when a screen stops being itself
Watches & Runs
the schedule nightly, or every so many minutes a round one TV, or twenty passed told only if you asked to be failed always reaches you · with the frame skipped somebody was using that TV 1 2 3 4
1the schedule starts a round — every night, or every few minutes 2passed: the news reaches you only if you asked for it 3failed: always reaches you, and on a camera check the frame that failed it 4skipped: somebody was using the TV — it was not interrupted, and amber is not red

A library, not a pile

Scenarios live in folders the whole team shares, built and rearranged by dragging. Every row says whose it is and where it came from — written by hand, or kept from a recording — and one recording is one scenario, not a new copy each time you open it. Labels you type become chips you can pluck off again, and the ones already used elsewhere sit underneath waiting to be clicked.

Choosing where something belongs is one control everywhere it is asked, and it browses in columns the way a system folder dialog does — with the last column showing what already lives in the folder you are pointing at, because you are not deciding where to navigate, you are deciding what this will sit next to. Typing filters, and every match carries the path it hangs under, so folders that share a name stay tellable apart. A new folder is made inside the picker, under whichever one is open, rather than by leaving what you were doing.

Because the folders are shared, someone else can rearrange them while you are looking at the same list — so the library is told when that happens and brings itself up to date, without you clicking anything or coming back to the window. That matters most in the case nothing else covers: two windows open side by side, neither of them ever brought back to the front, quietly disagreeing about where things are. The window that made the change is not disturbed by its own edit, and a list you are mid-drag through waits until you have let go.

shared foldersdrag to organiseone folder pickerlive between windowslabelsownership
ScenariosOnboardingCheckoutOutagesRegressionCard payment3 stepsQR payment5 stepsCard declined4 stepsRefund6 stepsfolders, not a pile
The scenario library

Every version, and more than one at a time

A scenario remembers more than its last save. Every save that changes something becomes a version you can look back at — who changed it, when, and whether it came from the editor, the command line or an AI assistant — with the difference shown beside it, and going back never erases anything.

It can also have more than one version at once. A branch is a place to change something without everyone else seeing it half-finished: the row above the name says which one you are working on, one click switches, and the address carries it, so a link to work in progress opens exactly what you were looking at. The line above the run button says which version the next run will use — and it is a fact, not a label: the server takes the document from that branch, and refuses one it does not know rather than quietly running something else.

version historyrestore safelybranchesrun a branch
Brancheson: fix-qr3 branchesPetr · added the QR stepJana · fixed the timeoutPetr · started the branchwhich line of work you are on
Branches and history

Production is somewhere you get to, not wherever you last saved

What runs at night is not simply the newest edit. A test suite has a production version, and a scenario reaches it one way: a promotion that somebody other than its author approves. Promoting is deploying, because production is exactly what the nightly watches run — so the review has its own address, and you can send it to the person who should look.

How far it reaches is on the screen before anything happens: how many scenarios change, how many watches will feel it, on how many televisions — and, the line worth the most, any watch whose scenario the promotion would delete, named while you can still do something about it. Otherwise that surfaces at three in the morning as a run that failed with nobody awake. Adding a commit cancels an approval, because what was approved was a particular shape and not an intention.

Watches say which version they run. New ones watch production; the other choice is offered with its consequence written out, so a freshly written test can be watched immediately if that is what you want — knowing that a mistake in it will also show up overnight.

promote to productionreviewed by someone elseblast radiuswatches pin a version
Promote to productionfromfix-qr6 changes · PetrtoproductionAurora · 12 televisionsThe client will see this. Sure?Promotenever by accident
Promoting to production

One client per project, kept apart

A studio running work for several clients keeps them genuinely separate, not merely foldered apart. A switcher in the header decides which project you are in, and it follows you into the address — so a link you paste into a message means the same thing to whoever opens it. Scenarios, recordings, uploaded builds and watches each belong to exactly one project; televisions, people and teams belong to none, because a screen in the corner of the office is not a client's property. Rename a project and its address moves with it while every old link keeps working.

Each project is recognised without reading: a colour you can pick, or the client's own logo, framed by dragging and zooming it inside its square on a background that can match the logo exactly. Teams carry their own colour on the same principle. Nothing here is compulsory — a project without a logo simply wears a coloured dot.

And the client gets a screen of their own — Den. One day of a project's runs, written for somebody who does not use the rest of the app: what ran, what it found, and nothing about how any of it is wired. It speaks the app's own components rather than a second set built beside them, so what the client sees is the thing that actually ran.

project switcherin the addressmove between projectsthe client's day viewlogos & coloursarchive, never delete
ProjectsAurora Retail12 televisions · 34 scenariosMeridian Bank6 televisions · 19 scenariosLarkspurarchivedone client, kept apart
Projects, with what each one holds

A dashboard that tells you what's going on

The home screen: a glanceable summary of your devices, your favourites, recent recordings, and usage charts (activity, session lengths, busiest TVs) — plus a live bandwidth gauge for the operator.

favouritesusage statsegress gauge
Overview12televisions18runs today1finding76%storageRecording activity · 14 dayswhat is here, at a glance
The dashboard home

Accounts, teams & safe sharing

Real logins with roles, two-factor authentication for everyone and 30-day trusted devices. Teams scope who can see which TVs; presence and hand-over stop two people fighting over one set; every meaningful action is written to an audit log. People have names, not just addresses — a first name, a surname and an optional second surname, which is also where the initials in the corner of the screen come from.

Joining a team is an invitation, not a list. An admin sends one to an address; the link opens a page naming exactly one team and nothing else. Signed out it offers an account with a password of your own — no handoff of a temporary one. A token that is expired, already spent, revoked or never issued gets the SAME neutral refusal, so the address cannot be used to find out which teams exist.

TOTP 2FAteams / ACLe-mail invitationsaudit lognamed accounts
TeamsAurora RetailMeridian BankOfficeJana NovákováadminPetr SvobodamemberTomáš Marekreadersees 12 of 19 televisionsa team scopes what you see
Accounts & teams

Power-cycle of last resort

When a TV or its box stops responding, a smart plug on its socket can power-cycle it remotely. Discovered on the network, controlled by the box, gated to admins and audited.

Shellyholder/admin-gated
PowerPower-cycle Window-03?the socket, not the televisionCut the powerlast resort, and audited
Restart power

Find devices on the network

A superadmin can scan a site's network from the box to find cameras, TVs and plugs — each picked up with its MAC address. Because devices are tracked by MAC, a TV or camera that gets a new IP overnight is followed automatically, with no manual fixing.

LAN discoveryMAC identityIP self-heal
New deviceNameReception-01ModelSamsung QE55Q60DTV address10.0.4.21Camera10.0.4.22 · Reolinkrecordonly if you opt in
Device registry

Install an app onto the TV

Get a Tizen app onto the (selected) Samsung TVs without a laptop or Tizen Studio. A superadmin uploads the site's signing certificates once (kept encrypted on the box, never in the cloud); the box then signs a .wgt and pushes it straight onto the TV over the network — install and launch in a click, with each step reported. It even re-signs another company's app with your certificate so it installs, and reads the TV's DUID for you. Proven end-to-end on a real Samsung TV.

Tizen .wgt signingbox-side installsuper-only
Install the appretail-demo-3.4.1.wgt · signedReception-01doneMeeting-02installing…Window-03queuedone batch, many televisions
Instalace

Storage that manages itself

Recordings are kept within a per-user quota with a system disk reserve. When space runs low, the oldest un-starred clips are evicted automatically — starred ones are never touched, and every eviction is logged.

per-user quotaauto-eviction★ keep
Storage800 GB / 1 TBWhat goes first when it fills upoldest, unstarredswept★ keptneverit manages itself
My storage

Connect an AI agent (MCP)

Point an AI client — Claude, or anything that speaks the Model Context Protocol — at your sets. It can read their state, health, recordings and stats, and drive the TV: press remote keys, switch power, replay a recorded scenario. Each agent acts with the rights of the user who connected it — never more — and every action is audited as that person. A thin, stateless server forwards your token to the relay, which stays the single authority; it holds no standing credential of its own. How MCP works →

read + controlacts as youaccess tokensOAuth 2.1
Connected appsAn AI agentmay do exactly what YOU may dolist the televisionsallowedrun a scenarioallowedsee another team's setsrefusedan agent is not a way around the roles
Settings → Connected apps

See these on the real screens in the app walkthrough, the technical design in architecture, or the deep dive on the MCP API.