R1 fleet inventory
Living inventory of the Rabbit R1 mesh nodes (catch-and-release). 6 devices total (5 live,
1 to flash). Network: WiFi "Hawk", 10.0.0.0/24. Data port 8090, gossip UDP 9090. Model:
qwen05-dense.knot (qwen2.5-0.5b); stage plan 0..12,12..24 exists as a fallback, but the
model (373 MB) fits each node's RAM so fit-aware election makes every node role=both
(serves the whole model 0-24 as a data-parallel lane — N nodes = N full lanes, no entry
bottleneck). Last updated 2026-05-24 (gossip-NodeStatus build, all nodes hardware-hash-named).
Devices
Node id = r1-<bitwise hash of ANDROID_ID> (hardware-derived, privacy-preserving — raw id
never gossiped; stable across re-flash). Set with equip.sh -n auto (the default). The old
friendly r1-0..r1-3 names were retired 2026-05-24.
| node (hash) | was | serial | android | build | wifi ip | role | status |
|---|---|---|---|---|---|---|---|
r1-b50eb85c |
r1-0 | 919109A4H16000691813 |
13 (sdk33) | GSI gsi_r1 |
10.0.0.199 | both | released, live on WiFi |
r1-7513bea5 |
r1-1 | 919109A6U160125835C7 |
13 (sdk33) | GSI gsi_r1 |
10.0.0.240 | both | released, live on WiFi |
r1-9d76f8e5 |
r1-2 | 919109A6B1600836591B |
16 (sdk36) | BSP k65v1_64_bsp |
10.0.0.67 | both | released, live on WiFi |
r1-05384d3c |
r1-3 | 919109A6U160125647C7 |
13 (sdk33) | GSI gsi_r1 |
10.0.0.196 | both | released, live on WiFi |
r1-14ec8106 |
(r1-4 slot) | 919109A491600012265B |
16 (sdk36) | BSP k65v1_64_bsp |
10.0.0.64 | both | released, live on WiFi |
| to flash | r1-5 | TBD | flash -> 16 | -> k65v1_64_bsp |
— | self-elect | 1 remaining |
- Role is NOT pinned — every node self-elects from gossip (
--auto-stage). With a node-fitting model the election returnsrole=both(full model); for a model too big for one node it falls back to the under-replicated0..12/12..24split. Re-elects to cover a dark stage. - Mesh state: 5 full-model
bothlanes, all new-build (gossip NodeStatus). Each node advertises live health (RAM / load / in-flight /jammed) on the heartbeat;/chainroutes aroundjammedpeers.curl http://<ip>:8090/mesh/hive->healthy. - Inspect any live node:
curl http://<ip>:8090/status(this node's health) ·/mesh/peers(topology + every peer's gossiped status) ·/mesh/hive(2002 brain digest +X-Mesh-Status). - Management after release: every node has adb-over-wifi (
equip --tcpip):adb connect <ip>:5555. (Caveat:adb tcpipis not persistent — a reboot drops it until the next equip; HTTP/statusstill works regardless.)
Android 16 is the target
We prefer the Android 16 build (r1-2, the 919109A6B... "B" serial, k65v1_64_bsp,
sdk 36) — nicer than the Android 13 GSI units. Plan: flash the 2 remaining units to
Android 16, and re-flash the Android-13 GSI units (r1-0/r1-1/r1-3) to Android 16 as they
cycle through. The in-app node + prep flow work on both (the Android-16 BSP build needed
two extra fixes the GSI didn't — both now handled by equip.sh --apk):
- WebView provider unset -> launcher crashed at init. Fixed:
set-webview-implementation. - GMS absent -> appops failed. Fixed: GMS appops tolerated.
Prep flow per device (catch -> equip -> release)
- Flash the Android 16 image with the mtkclient "unknot" toolkit in
packages/aeon-r1-unknot(the R1 is a MediaTek MT6765). This is the only hardware step. - Knot:
adb -s <serial> push qwen2.5-0.5b-instruct.knot /data/local/tmp/qwen05-dense.knot(or rely on--knot-urlfor R2 first-boot download — too many knots to push them all). - Equip (one command — does install + all OS prep + launch):
NoAPK=open-source/aeon-shell/.../app-universal-debug.apk bash open-source/gnosis/distributed-inference/scripts/r1/equip.sh \ -s <serial> --stages 0..12,12..24 --seed http://<live-node>:8090 \ -p <live-ip>:9090 --tcpip --apk "$APK" # [--knot-url https://<r2>/...]-n-> the node self-names from its hardware hash (r1-<hash>). Installs the APK, sets launcher + WebView provider, lockscreen off / provisioned, grants audio/camera, applies the power config (screen sleeps to save heat; CPU + WiFi stay up via wakelock/WifiLock + no-doze so the node keeps serving with the display off), writes the self-election conf, enables adb-over-wifi, launches. The node auto-elects (bothfor a node-fitting model) and joins. - Release: unplug. It survives reboots autonomously (proven on Android 13 + 16).
Seed --seed/-p from any LIVE node's :8090/:9090 (e.g. 10.0.0.64). The old seed
10.0.0.199 is now r1-b50eb85c (re-id'd); any live node works.
Re-id an already-equipped node to its hardware hash (over wifi-adb, no re-plug):
adb -s <ip>:5555 shell 'sed -i "s/^NODE_ID=.*/NODE_ID=auto/" /data/local/tmp/mesh-node.conf'
adb -s <ip>:5555 shell 'am force-stop run.aeon.shell; monkey -p run.aeon.shell -c android.intent.category.LAUNCHER 1'
# verify: curl http://<ip>:8090/status (node_id is now r1-<hash>)Notes
- The aeon-shell APK is built per
docs/R1_INAPP_NODE.md(carrieslibfatstation.so). - IPs are DHCP — they can change across reboots; the node auto-detects its wlan0 IP, so
only the (hardware-hash) node-id is stable. Re-check IPs via
adbor the gossip view. - "B"-prefix serial (
919109A6B...) and the919109A49...unit are the Android-16 BSP batch (k65v1_64_bsp, sdk 36); "U"/"H" prefixes are the Android-13 GSI units.