A real element tree
document, Element, events that capture and bubble, a selector subset, and a
CSSStyleDeclaration on everything. Libraries that build DOM structure keep working.
vite build emits and run it on a television. No browser, no WebView, no native compile per app.ScreenKit is a prebuilt native runtime. An app is a web build plus its assets, and it never triggers a native compile — adding a native capability means shipping a new runtime version, not rebuilding every app. The model is Capacitor’s, not Expo’s.
A real element tree
document, Element, events that capture and bubble, a selector subset, and a
CSSStyleDeclaration on everything. Libraries that build DOM structure keep working.
Three elements paint
<canvas>, <video> and <iframe> have something native behind them. Every other tag is
inert: it lives in the tree, dispatches events, and never renders.
Native where it must be
SDL3, Hermes, GL contexts, the compositor and the platform media players are C++. The browser — the DOM, the WebGL object model, the CSS subset — is JavaScript.
Four targets, one package
tvOS, Android TV, Fire TV and embedded Linux run the same .skpkg. Where the platforms
genuinely differ, the difference is written down rather than papered over.
Your Shaka code, unmodified
shaka-player resolves to a player that mirrors Shaka Player 5 over
AVPlayer, ExoPlayer and libvlc — same Player, same filters, same error codes.
It is not a browser. There is no layout engine, no cascade for anything that does not composite, no
HTML parsing at runtime, and no Web Workers. index.html is read as a manifest of entry points,
never as markup. That is the trade that makes a 60 fps UI on a $30 box possible, and the
environment contract enumerates exactly what you get.
Nine apps in examples/ — Pixi, Phaser, three.js, Lightning 3, and a whole upstream Blits app with
its src/ untouched. Every one has a screenshot captured by the runtime itself, and a
page saying what it proves and where it stops.