Skip to content

ScreenKit

Take whatever 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.