# ScreenTinker on BrightSign — capability probe Not a port. This answers, on **real hardware**, the questions that decide what a port looks like — so the design isn't guessed from documentation. ## Run it 1. FAT32-format an SD card. It must be **empty** — a card with leftover data won't trigger a fresh provisioning cycle. 2. Copy `autorun.brs` and `probe.html` to the **root**. 3. Insert with the player powered off, then power on. 4. Read the screen. Remote devtools are on `http://:2999` if you'd rather read it there. 5. **Power-cycle and reload.** The reboot markers are the point — first run writes them, second run says which survived. ## What it answers, and why each matters | check | why it decides something | |---|---| | which `@brightsign/*` modules resolve | `nodejs_enabled: true` injects them into the runtime. If injection is origin-independent, a **remotely-served** page gets them too — which is the whole cheap path. | | `registry` survives reboot | ScreenTinker's device identity (`deviceId`, `deviceToken`, `paired`, `serverUrl`) lives in `localStorage`, and on BrightSign that behaves like sessionStorage. Without a durable store every panel re-pairs on every boot and spawns a new device row. | | `localStorage` survives reboot | If it does on this OS build, the port gets dramatically simpler. Reports say it doesn't; worth confirming rather than inheriting a 2019 answer. | | serviceWorker / Cache API / indexedDB | The web player registers `/player/sw.js` for content caching. If unavailable, offline playback has to move to BrightSign's storage APIs — which is the "extra mile" work anyway. | | `