# TV / Box / Stick Compatibility & Fleet Notes

> **TL;DR:** Living device matrix + vetting checklist for every TV/box/stick we test for the gz-tv-app kiosk. The hard requirement: an engine of roughly Chrome/WebView 111+ (genuine Android 11+) or the app renders black-on-black; the 5-step vet (security-patch date, WebView version, CPU-Z, phone cross-check, ADB) catches counterfeit boxes like the rejected i96_8K. Read before buying or deploying any new device; add a matrix row per device tested. Fleet strategy: genuine Android stick behind every TV via HDMI. (Matrix last updated 2026-05-28; test-server IPs reflect that period's laptop.)

Living reference for every display device we test for the **gz-tv-app** kiosk. Add a row to the matrix for each new device. Owner: whoever tests the device.

> Last updated: 2026-05-28 · Server during testing: laptop `<LAN_IP>:9001`

---

## 1. The hard requirement (read this first)

`gz-tv-app` = **Next.js 16 + React 19 + Tailwind v4**. It needs a browser/WebView engine of roughly **Chrome 111+ (2023)**. In practice that means **genuine Android 11 or newer**.

On an older engine the app shows **only the logo on a black screen**: Tailwind v4 puts its theme colour variables inside `@layer`, which old engines drop → text becomes black-on-black (invisible), and modern JS (`?.`, `??`) may not even parse. The app is fine — the engine is too old. (Proven: the app renders perfectly on a modern phone but is black on a Chrome-66 device.)

## 2. Vet ANY new device BEFORE trusting it (5 checks)

1. **Settings → About → Android security patch level** — must be **2023 or newer**. An old date (e.g. "March 2019") means the device is old/fake *regardless of the "Android version" it claims*. This is the #1 fake-detector.
2. **Settings → Apps → Android System WebView (or Chrome) → version** — must be **111+**.
3. **Install CPU-Z** (or AIDA64 / DRM Info) from Play Store / Downloader → read the **real** RAM / storage / SoC. No-name boxes lie on the sticker.
4. **Phone cross-check:** open `http://<LAN_IP>:9001/pair-device` on a modern phone. Renders on phone but black on device ⇒ device engine is the problem.
5. **ADB reachable?** `adb connect <ip>:5555`. If it connects, we can fully inspect/control (see §5).

## 3. Device matrix

| # | Device | Type | Claimed | Real / verified | Engine | App works? | Verdict |
|---|--------|------|---------|-----------------|--------|-----------|---------|
| 1 | Genuine Android TV ("google 8347") | TV (built-in Android) | Android 14 | genuine (re-verify specs) | modern | ✅ yes (via wrapper launcher) | **USE — baseline** |
| 2 | Samsung TV | TV (Tizen) | — | Tizen, **no Android** | Tizen browser (version varies) | ❌ can't sideload APK | Use HDMI Android stick, or Tizen web app (§6) |
| 3 | "New" TV (unknown) | TV | — | TBD — UI looks non-Android/old | TBD | TBD | Run the 5 checks (§2) |
| 4 | Android TV stick | Stick | TBD | TBD | TBD | TBD | Run the 5 checks (§2) |
| 5 | **i96_8K set-top box** | Box | "Android 14, 8GB+128GB, 8K" | **Android 9** (patch Mar 2019); Chrome **66**; serial `0123456789` (placeholder) | Chrome 66 (2018) | ❌ black screen | **COUNTERFEIT — REJECT** |

## 4. Per-device findings

### #5 i96_8K box — COUNTERFEIT, do not deploy
- HDMI1; IP `<LAN_IP>`; Wi-Fi MAC `18:bb:26:74:b2:19`; eth MAC `e8:bb:3e:9e:d4:40`; serial `0123456789`.
- About: Model `I96_8K`, "Version 14" **but security patch `March 5, 2019`** ⇒ truly Android 9. WebView Chrome 66.
- Network probe: pings, but **all TCP ports closed** (5555/adb, 8008/9 cast, 80/443, etc.). ADB connect refused. No remote access possible as shipped.
- Real RAM/storage **unverified** — sticker says 8GB/128GB; I96 clones are typically ~2GB/16GB. Confirm with CPU-Z or ADB.
- Reverse-engineering / custom ROM: not practical (no firmware images for these clones, high brick risk). **Discard.**

### #1 Genuine Android TV 14 — works
- App installed earlier via the WebView wrapper launcher; main test device. TODO: record IP/MAC/model/RAM next session.

### #2 Samsung TV (Tizen) — see §6 for options.

## 5. What control ADB gives us (on a genuine box)

ADB (no root) is the practical software ceiling — plenty for a hotel kiosk:
- Set our app as default home/launcher: `adb shell cmd package set-home-activity com.tripgzio.webapp/com.gigglezen.tvlauncher.MainActivity`
- Auto-start on boot: handled by the APK's `BootReceiver` (+ being default launcher).
- Hard kiosk (can't escape): `adb shell dpm set-device-owner com.tripgzio.webapp/com.gigglezen.tvlauncher.KioskDeviceAdminReceiver` + lock-task mode (device must have no accounts).
- Inspect everything: `getprop`, `cat /proc/meminfo`, `df -h /data`, `pm list packages -3`, `dumpsys`, `screencap`.
- Install/replace app: `adb install -r app-debug.apk`.

**Enabling ADB when there's no "network debugging" toggle** (as on the i96): turn on **USB debugging**, connect the device to the PC by **USB cable** (boxes/sticks usually have a micro-USB/USB-C OTG data port), then `adb devices` (over USB) → `adb tcpip 5555` → `adb connect <ip>:5555` for wireless thereafter.

Beyond ADB: **root** (needs unlockable bootloader / exploit) for system changes; **SoC flash tools** (Amlogic USB Burning Tool / Rockchip RKDevTool / Allwinner LiveSuit) to reflash firmware — only worthwhile on genuine, documented hardware.

## 6. Samsung / non-Android TVs

Samsung Smart TVs run **Tizen**, not Android — an APK won't install. Options, best first:
1. **HDMI Android stick** (recommended, universal): plug a genuine modern Android stick into the TV's HDMI. Works on *any* TV (Samsung, WORLD TUBE, etc.) and gives one app + one install process across the whole fleet.
2. **Tizen web app**: our app is web-based, so it can be packaged as a Tizen app (Tizen Studio + Samsung dev cert + TV "Developer Mode"). Caveat: older Samsung TVs have older web engines — same compatibility risk.
3. **Samsung Hospitality (LYNK Cloud)**: if it's a Samsung *hotel* TV, there's a native hospitality path — separate investigation.

## 7. Recommended fleet strategy

**Put a genuine modern Android stick/box behind every TV via HDMI, regardless of the TV's own OS.** One device type, one install (`Downloader → http://<LAN_IP>:9001/tv.apk`), one app to maintain — and it bypasses every TV's built-in-engine problem at once.

**Approved (genuine, modern engine):** Xiaomi Mi TV Stick 4K / Mi Box S · Amazon Fire TV Stick · Google TV (Chromecast w/ Google TV, Google TV Streamer) · Realme / TATA Play Google TV sticks.

**Avoid:** no-name "Android 14 / 8GB+128GB" boxes — **I96, X96, T95, H96, MXQ**. They spoof the version string (the i96 above is one).

## 8. Server / app facts (for installs)
- gz-tv-app served at `http://<LAN_IP>:9001`; sideload APK at `http://<LAN_IP>:9001/tv.apk`.
- APK `SERVER_URL` baked = `http://<LAN_IP>:9001`. If the laptop IP changes, the APK breaks — **reserve the laptop IP on the router** before deploying widely.
- Pairing model: dashboard generates a 6-digit code → typed into the TV's `/pair-device` screen.

---

**Related:** [TV + Web App install & setup guide](webApp-and-Tv-setup-guide.md) · [TV shell recommendation](researches/tv-shell-recommendation.md) · [TV-Native backlog](TV-NATIVE-BACKLOG.md) · [Second "TV" from a laptop browser](two-tvs-on-one-pc.md)
