Solana Badge v1 · rev lcd

Bridge

Give your badge internet through this phone.

The badge speaks Bluetooth LE, and a Chromium browser can open a BLE link. So when there's no Wi-Fi for the badge, this phone can be its uplink: the badge hands each HTTP request over the radio, this tab runs it on the phone's own connection, and streams the answer back. Registration, the app store, small script fetches — anything the badge would do over Wi-Fi.

The link is granted by you to this tab only. But read the security note below before you bridge anything — the trust model over the bridge is not the same as the badge on Wi-Fi.

Security

This phone terminates TLS. Every request the badge makes over the bridge is decrypted, read, and re-encrypted here — this tab can see and modify all of it. The badge's pinned-CA broker guarantee does not apply over the bridge. Only bridge badges you own, and treat anything you tunnel as visible to this device.

01 Connect a badge

Put the badge in range and hit connect — the browser shows a chooser of nearby badges advertising the Nordic UART service. Nothing is bridged until you pair.

How it works

The badge and phone already share a Nordic UART link over BLE — the same one the app store and push tooling use. The bridge adds a small framed protocol on top of it.

The badge asks, the phone fetches
When the badge has no Wi-Fi but the bridge is on, its http calls are packed into %REQ frames and sent over BLE. This tab decodes them, runs fetch() on the phone's network with the badge's cookies deliberately withheld, and streams the response back in %DATA chunks. Responses over 32 KB are truncated — fine for registration and small scripts, not for large downloads.
You hold the pairing code
Bridging only starts after you type the six-digit code from the badge's screen. It's the same authorisation gate the badge uses for any privileged BLE command, so a phone in range can't bridge for a badge it wasn't handed the code for.
A guard, not a promise
The phone refuses to fetch loopback, private, link-local and .local addresses by default, so a badge can't use your phone to probe its own LAN. You can lift that for a service you own with the toggle. It's a literal-URL check — a public name that resolves to a private address at fetch time is not caught, so bridge only badges you trust.
iPhone can't be the bridge
Web Bluetooth is a Chromium feature — desktop Chrome/Edge and Chrome on Android. Apple ships no Web Bluetooth in any iOS browser, so an iPhone or iPad can't run this side. Use an Android phone, or a laptop, as the uplink. Everything on Solana OS that gates on wifi.connected() just works once the bridge is up.
Solana Badge · DEF CON Generated from pcb/v1, pinout/ and firmware/testkit/testkit.ino