Just got my first self-built app onto the Passport Prime running the new beta (1.4.0-beta1) — and the whole flow worked great. Developer mode → Allowed Publishers → add my publisher cert → Install App → app launches. Huge improvement, the sideload pipeline is solid.
Now I’m hitting the wall I expected, and I’d love the devs’ input on the intended path forward.
The setup: my app is a self-hosted Bitcoin cold-storage app (QXXX). It talks to my own relay server for balance/sync/broadcast. The relay protocol is already fully implemented on-device (auth handshake + ChaCha20-Poly1305 envelopes) — the only missing piece is the data pipe to the host.
The problem: I request os/bt SendBle / SubscribeBle (and EnableBle / GetBtAddr ) in my app manifest. foundation pack accepts them, the app builds and signs fine, the signed manifest includes them — but on-device the kernel returns AccessDenied because those messages have no permissionGroup (they’re ungrouped, so no Settings → Apps → Permissions entry is generated for third-party apps).
The precedent: I noticed the recently published passport-nostr-signer POC uses exactly this companion-channel pattern — a third-party app getting a wired data channel via os/usbdev ( RegisterInterface / ReadEndpoint / WriteEndpoint ) + WebUSB. So the mechanism already exists in the OS for third-party apps; it’s just exposed per-app.
Two possible ways to open this up for sideloaded apps — either would unblock us:
1. BLE: add a permissionGroup (e.g. device-connectivity.bluetooth-data , grantOnFirstUse ) to SendBle / SubscribeBle / EnableBle / GetBtAddr in the bt-server manifest → the Settings → Apps → Permissions toggle appears for users.
2. WebUSB: add a permissionGroup to the os/usbdev data messages ( RegisterInterface , ReadEndpoint , WriteEndpoint , WaitForConnection ) — same channel the nostr signer uses. (Also: the two PIO endpoint fixes the nostr signer documented look like they’re already in mainline — pending_rx queue + RxCompleteInterrupt — so no kernel changes needed there.)
Both are one-line-ish manifest edits and I’m happy to test whichever the team prefers (dev-unit firmware or the next beta). Is the permissionGroup mechanism the intended way for third-party apps to get a data channel, or is there a different recommended path?
Thanks for the great work on the beta — this sideload experience is the best it’s ever been.
