# nyan-watch build log (2026-09-07, Watch S4 41mm)
Minimal resource-light app: one page, ASCII nyan cat on black, no permissions, no images besides icon.
Project at `~/nyan-watch/` (user's machine). As of this log the app is NOT yet verified launching on device — this file is the debugging record, not a proven example.
**Status: v0.8 built (aiot release --enable-jsc --enable-protobuf, own release cert in sign/). STILL black-flashes (~0.02s, nothing visible).** Remaining suspects: (1) release-cert trust on international S4 firmware — diff META-INF/CERT (ours 2.4KB self-signed vs HyperBili's 18KB); (2) designWidth "device-width" vs 466 in config; (3) S4 real-device-debugging OTA requirement (docs say partner-only); (4) watch quick-app partition state. **Control experiment queued: sideload HyperBili's S4 rpk (`~/hyperbili-s4.rpk`, downloaded from hyperbili.astralsight.space) — if IT also fails, the watch/runtime is at fault, not our build.**
## src/manifest.json (v0.6+ shape — pages/index layout, aiot-toolkit)
```json
{
"package": "com.ilias.nyanwatch",
"name": "NYAN",
"icon": "/common/icon.png",
"versionName": "0.7",
"versionCode": 7,
"minPlatformVersion": 1000,
"features": [{ "name": "system.router" }],
"config": { "logLevel": "log", "designWidth": "device-width" },
"deviceTypeList": ["watch"],
"display": { "backgroundColor": "#000000" },
"router": { "entry": "pages/index", "pages": { "pages/index": { "component": "index" } } }
}
```
## src/common/icon.png — REQUIRED
192x192 png (rainbow stripes + cat box, drawn with PIL). Without this file the watch installer rejects the rpk with a generic "install failed" even though `hap build` succeeds.
## src/app.ux
```js
export default { onCreate() {}, onDestroy() {} }
```
## src/Index/index.ux (page dir at src/Index/, NOT src/pages/Index/)
Static variant that actually launches on device (animation removed while bisecting a launch crash — the setInterval-with-arrow-closure version installed fine but black-flashed back to the selector):
```
{{ frame }}
{{ title }}
```
Animated variant (installs fine; launches unverified on device — suspect):
```js
onInit() {
let i = 0;
this._timer = setInterval(() => { i = (i + 1) % FRAMES.length; this.frame = FRAMES[i]; }, 300);
},
onDestroy() { if (this._timer) clearInterval(this._timer); }
```
## Chronology of this debugging session (read before repeating these steps)
1. **v1 (hap-toolkit 2.1.1, animated, missing icon):** install rejected — missing `/common/icon.png`. Fix: generate 192x192 png with PIL. (Real fix, verified.)
2. **v2 (hap-toolkit, static cat+text, icon present, versionCode 2):** installs, icon shows in app list, but launch = black flash ~0.2s then back to app selector.
3. **v3:** removed `setInterval` arrow-closure animation, kept static `private` data → **same crash**.
4. **v0.4 (user asked for incrementing 0.1/0.2-style versions on every fix):** stripped page to ONE ``, NO `