
What it does
A BirdDog PLAY has no way in from outside the room it's sitting in. The PLAY Patcher fixes that by building a firmware package that installs Tailscale, but it can't put an auth key in the package, because the package is a file a web page hands you and anyone could read the key out of it. So every unit came up with Tailscale installed and not signed in, and the only way to finish the job was SSH.
bdts finishes the job. It patches the decoder's own web UI to add a Tailscale panel to the System page: sign in, see the tailnet name and address, change the preferences this hardware can actually honour, and log out. Nothing else about the unit changes. It's still a BirdDog decoder with BirdDog's interface, just one section longer.
The System page is also where the firmware upload form lives, which is your way back if anything goes wrong, so the patch handles it with a lot of care. It refuses markup it doesn't recognise, keeps a copy of the original, writes atomically, and inserts a block with no template logic in it at all. The installer checks the web UI came back afterwards and rolls back if it didn't.
- A Tailscale panel on birdUI's own System page — sign in, sign out, and read the tailnet address
- Interactive login started in the background and its URL read back, so the page never hangs waiting for a human
- Preferences applied one at a time, so setting one does not reset the others
- Route advertising and acting as an exit node withheld rather than shown broken — this kernel has no TUN device. Using someone else's exit node still works, and the picker is there
- Writes gated on a birdUI session, checked against the device rather than assumed
- Exactly reversible: the stock page is kept and restored byte for byte
Where it stands
Installed and running on a real PLAY on firmware 1.0.30: the patch applies, the web UI reloads, the firmware upload form survives, and the panel reports correctly from the device's own Tailscale. Two things are still unproven and it shipped anyway. One is whether the browser sends its birdUI session cookie to the panel's port, which needs a login I don't have the password for. The other is the interactive sign-in flow, because testing it would log out the very node the device is reached over. There's no tagged release yet.