From 6aa74619d5f148998c7e2e8ce0abfef8fc9c76bd Mon Sep 17 00:00:00 2001 From: SAPHID Date: Mon, 26 Oct 2026 00:46:39 +0000 Subject: [PATCH] Document reproducible ARM64 LocalSend core and isolated Frame health probe --- .../framey-localsend-arm64-2026-10-26.json | 97 +++++++++++++++++++ .../framey-localsend-arm64-2026-10-26.md | 57 +++++++++++ docs/framey-compatibility.md | 4 +- scripts/framey-compatibility-doc.py | 3 + ui/framey-compatibility.json | 2 +- 5 files changed, 161 insertions(+), 2 deletions(-) create mode 100644 docs/evidence/framey-localsend-arm64-2026-10-26.json create mode 100644 docs/evidence/framey-localsend-arm64-2026-10-26.md diff --git a/docs/evidence/framey-localsend-arm64-2026-10-26.json b/docs/evidence/framey-localsend-arm64-2026-10-26.json new file mode 100644 index 0000000..6de57c0 --- /dev/null +++ b/docs/evidence/framey-localsend-arm64-2026-10-26.json @@ -0,0 +1,97 @@ +{ + "checkedAtUtc": "2026-10-26", + "plugin": { + "id": 125, + "name": "Decky Localsend", + "officialArchiveStatus": "x86_64; blocked; no substitutions or safeguard changes" + }, + "source": { + "url": "https://github.com/MoYoez/LocalSend-Go", + "revision": "66edc509a28b9f877e7374504892dcbc653a4da4", + "license": "MIT", + "licenseUrl": "https://github.com/MoYoez/LocalSend-Go/blob/66edc509a28b9f877e7374504892dcbc653a4da4/LICENSE", + "pluginLicense": "BSD-3-Clause; distinct from the MIT helper", + "officialElfBuildInfo": "Go 1.25.7, CGO_ENABLED=0, GOARCH=amd64; no embedded VCS revision. Exact source correspondence unproven." + }, + "build": { + "toolchain": "go1.25.7", + "environment": { + "GOTOOLCHAIN": "go1.25.7", + "CGO_ENABLED": "0", + "GOOS": "linux", + "GOARCH": "arm64" + }, + "command": "go build -trimpath -o localsend-core .", + "elfMachine": 183, + "architecture": "aarch64", + "staticallyLinked": true, + "sha256": "e79238f6051ce34f172f765ae918d3d902b819e27377989a55e5b1eba10e46f9", + "rebuildSha256Matches": true + }, + "realFrame": { + "os": "Frame OS 0.5.6 ARM64", + "sharedLockOwner": "kp0z857q58-live-steam-reads-20261026", + "helpExitCode": 0, + "officialBackendFlagsAllRecognized": true, + "helpFlags": [ + "-doNotMakeSessionFolder", + "-log", + "-scanTimeout", + "-skipNotify", + "-useAlias", + "-useAutoSave", + "-useAutoSaveFromFavorites", + "-useConfigPath", + "-useDefaultUploadFolder", + "-useDownload", + "-useHttp", + "-useMultcastAddress", + "-useMultcastPort", + "-usePin", + "-useReferNetworkInterface", + "-useWebOutPath" + ], + "runtimeExitCode": 0, + "isolation": "unshare -Urn; loopback and private veth pair only; no external interface/default route", + "receiving": "-useAutoSave=false and -useAutoSaveFromFavorites=false; no upload/transfer requests", + "notifications": "-skipNotify", + "readOnlyRequest": "GET http://127.0.0.1:53317/api/localsend/v2/info", + "result": { + "ok": true, + "protocolVersion": "2.0", + "deviceType": "headless", + "responseKeys": [ + "alias", + "deviceModel", + "deviceType", + "download", + "fingerprint", + "version" + ], + "aliasMatches": true + }, + "cleanup": { + "helperExited": true, + "filesCreated": [ + "config.yaml", + "helper.log" + ] + }, + "privateDirectoryAbsent": true, + "servicesInstalledOrStarted": false, + "powerChanges": false, + "sharedLockReleasedAfterTests": true, + "independentReacquireAudit": "Deferred: another job had acquired the shared lock; it was left untouched. The helper process exited and TemporaryDirectory removal completed within the original locked probe." + }, + "failedProbe": { + "interface": "loopback only", + "result": "Upstream rejects lo as a discovery interface and exits. Repeated with a veth pair wholly inside the private namespace; no source changes." + }, + "unverified": [ + "Exact source correspondence to shipped official ELF", + "Unmodified official Python backend invoking this ARM64 artifact", + "HTTPS, discovery on real network, pairing and file transfers", + "Framey frontend/proxy protocol integration", + "Worn VR/controller/keyboard" + ] +} diff --git a/docs/evidence/framey-localsend-arm64-2026-10-26.md b/docs/evidence/framey-localsend-arm64-2026-10-26.md new file mode 100644 index 0000000..0472a50 --- /dev/null +++ b/docs/evidence/framey-localsend-arm64-2026-10-26.md @@ -0,0 +1,57 @@ +# LocalSend ARM64 build and isolated Frame probe + +The official Decky Localsend archive remains **broken/blocked**: its helper is +x86_64. A source rebuild is now proven to execute on the ARM64 Frame and answer +the LocalSend 2.0 info endpoint. This is a core runtime result, not a working +official-plugin or file-transfer claim. [Machine-readable evidence](framey-localsend-arm64-2026-10-26.json) +records the exact scope and cleanup. + +## Reproduce the build + +The helper is MIT-licensed; the separate official Python plugin is BSD-3-Clause. +Use the pinned helper source and retain its license for any redistribution. +No binary is redistributed in Frame Control, and no installer digest or +architecture safeguard was changed. + +```sh +framey_build_dir=$(mktemp -d) +git clone https://github.com/MoYoez/LocalSend-Go "$framey_build_dir/source" +git -C "$framey_build_dir/source" checkout --detach 66edc509a28b9f877e7374504892dcbc653a4da4 +cd "$framey_build_dir/source" +env GOTOOLCHAIN=go1.25.7 CGO_ENABLED=0 GOOS=linux GOARCH=arm64 \ + go build -trimpath -o "$framey_build_dir/localsend-core" . +sha256sum "$framey_build_dir/localsend-core" +``` + +Two builds produced the same static aarch64 ELF SHA-256: +`e79238f6051ce34f172f765ae918d3d902b819e27377989a55e5b1eba10e46f9`. +The official ELF uses Go 1.25.7 too, but embeds no VCS revision, so the exact +source correspondence is still unproven. The rebuilt helper recognizes every +CLI flag supplied by the official Python backend. + +## Real Frame scope + +Tests ran under the normal atomic `/tmp/frame-test.lock` with a private temporary +directory. `-h` exited before configuration or networking. For the health probe, +`unshare -Urn` created a private user/network namespace with loopback and a veth +pair entirely inside it: no external interface or default route. The veth used +the documentation-only `192.0.2.1/24` address. Upstream rejects a loopback-only +discovery interface, which is why the second isolated attempt used a veth. + +The helper used a private config/upload path, `-skipNotify`, +`-useAutoSave=false`, `-useAutoSaveFromFavorites=false`, `-useHttp=true`, +`-useReferNetworkInterface probe0` and `-scanTimeout 1`. The test client sent only +`GET /api/localsend/v2/info` over loopback; it returned version `2.0`, device type +`headless` and the private test alias. No upload, transfer, pairing or external +discovery request ran. The helper exited; its private config/log and executable +directory were removed; no service or power setting changed. The lock was +released. An independent cleanup reacquisition found another job's lock and +left it alone; cleanup success comes from the original probe's process wait and +temporary-directory exit, not that deferred audit. + +Before enabling an ARM64 official package, verify the unmodified Python backend +and frontend/proxy protocol with this source revision, then HTTPS, discovery and +an explicitly safe private transfer. The official store must publish a matching +ARM64 archive or Frame Control must gain a separately reviewed, digest-scoped +build/package path. Compiling the core does not justify accepting the current +x86 archive or marking the full plugin works. diff --git a/docs/framey-compatibility.md b/docs/framey-compatibility.md index 1ab4d3c..09469e2 100644 --- a/docs/framey-compatibility.md +++ b/docs/framey-compatibility.md @@ -279,6 +279,8 @@ DFL includes exports imported through decky-frontend-lib / @decky/ui. Steam stor All published Linux native payloads in this snapshot are x86_64; no published aarch64 payload was found. The three Windows DLLs belong to Decky-Framegen. The installer still rejects these archives. Apart from the explicitly described LocalSend experiment, ARM64 builds were not attempted: the constraints below remain unresolved. +[LocalSend ARM64 build/runtime evidence](evidence/framey-localsend-arm64-2026-10-26.md) covers a reproducible MIT helper build and its isolated real-Frame protocol 2.0 info response. The official x86 archive remains blocked; full plugin integration and file transfers are unverified. + | Plugin | Native payloads | ARM64 result / remaining blocker | | --- | --- | --- | | Fantastic | bin/backend | Fan backend/driver is Deck-specific; an ARM64 rebuild would not provide compatible Frame hardware. | @@ -302,7 +304,7 @@ All published Linux native payloads in this snapshot are x86_64; no published aa | HueSync | bin/hello, py_modules/portio.so | portio and handheld LED backends depend on x86 I/O/unsupported hardware; ARM64 compilation alone is insufficient. | | Decky Clipboard | bin/xclip | xclip needs ARM64 X11 libraries/server; root and gamescope assumptions also block this archive. | | Reroll | bin/memscan.so | memscan.so needs ARM64 process-memory support and ABI testing; root requirement remains. Frontend initializes but no memory access was tested. | -| Decky Localsend | bin/localsend-core | LocalSend-Go commit 66edc509a28b9f877e7374504892dcbc653a4da4 cross-compiled successfully with CGO_ENABLED=0 GOOS=linux GOARCH=arm64. Static aarch64 ELF SHA-256 e79238f6051ce34f172f765ae918d3d902b819e27377989a55e5b1eba10e46f9. Not executed; source tip is not proven to match the shipped helper/protocol. Official ZIP is still x86_64. | +| Decky Localsend | bin/localsend-core | MIT LocalSend-Go 66edc509a28b9f877e7374504892dcbc653a4da4 reproducibly cross-built with Go 1.25.7/CGO_ENABLED=0 for ARM64; SHA-256 e79238f6051ce34f172f765ae918d3d902b819e27377989a55e5b1eba10e46f9. Help/official backend CLI flags and protocol 2.0 info endpoint passed on real Frame in an isolated network namespace. No file transfer or full plugin/CEF integration tested; exact source match to shipped helper unproven. Official ZIP stays x86_64 and blocked. | | Launch Options | bin/hello | Remove the template x86 bin/hello or publish an ARM64 rebuild; missing Steam module mapping also prevents frontend initialization. | | Decky-Clipper | bin/gstreamer-1.0/libgstproxy.so, bin/gstreamer-1.0/libgstmidi.so, bin/gstreamer-1.0/libgstmpegtsmux.so, bin/gstreamer-1.0/gst-plugin-scanner, bin/gstreamer-1.0/libgstivfparse.so, … 115 total; full list in JSON | Rebuild all bundled GStreamer libraries/plugins for ARM64 and verify capture/codec ABI against Frame SteamVR; gamescope capture differs. | diff --git a/scripts/framey-compatibility-doc.py b/scripts/framey-compatibility-doc.py index 14eaac7..f4d868e 100644 --- a/scripts/framey-compatibility-doc.py +++ b/scripts/framey-compatibility-doc.py @@ -85,6 +85,9 @@ def render(data): 'All published Linux native payloads in this snapshot are x86_64; no published aarch64 payload was found. ' 'The three Windows DLLs belong to Decky-Framegen. The installer still rejects these archives. ' 'Apart from the explicitly described LocalSend experiment, ARM64 builds were not attempted: the constraints below remain unresolved.', '', + '[LocalSend ARM64 build/runtime evidence](evidence/framey-localsend-arm64-2026-10-26.md) ' + 'covers a reproducible MIT helper build and its isolated real-Frame protocol 2.0 info response. ' + 'The official x86 archive remains blocked; full plugin integration and file transfers are unverified.', '', '| Plugin | Native payloads | ARM64 result / remaining blocker |', '| --- | --- | --- |'] for p in data['plugins']: if p['native']: diff --git a/ui/framey-compatibility.json b/ui/framey-compatibility.json index d37b2bd..07138bd 100644 --- a/ui/framey-compatibility.json +++ b/ui/framey-compatibility.json @@ -10897,7 +10897,7 @@ }, "backend": "Python + native payload", "hardware": "No specific hardware requirement detected statically; runtime requirements unverified.", - "nativePort": "LocalSend-Go commit 66edc509a28b9f877e7374504892dcbc653a4da4 cross-compiled successfully with CGO_ENABLED=0 GOOS=linux GOARCH=arm64. Static aarch64 ELF SHA-256 e79238f6051ce34f172f765ae918d3d902b819e27377989a55e5b1eba10e46f9. Not executed; source tip is not proven to match the shipped helper/protocol. Official ZIP is still x86_64.", + "nativePort": "MIT LocalSend-Go 66edc509a28b9f877e7374504892dcbc653a4da4 reproducibly cross-built with Go 1.25.7/CGO_ENABLED=0 for ARM64; SHA-256 e79238f6051ce34f172f765ae918d3d902b819e27377989a55e5b1eba10e46f9. Help/official backend CLI flags and protocol 2.0 info endpoint passed on real Frame in an isolated network namespace. No file transfer or full plugin/CEF integration tested; exact source match to shipped helper unproven. Official ZIP stays x86_64 and blocked.", "uiSurfaces": [ "local/Steam routes", "toasts",