# FrankenSonos

**Your Sonos, your way. Command your speakers from anywhere in the world, as
long as you're on your Tailscale tailnet.** A memory-safe Rust controller and
daemon for the Sonos speakers you already own: one binary that runs the whole
house from the terminal, an HTTP API, or any AI agent that speaks MCP.

-dea584)



> **Status: pre-release (before `0.1.0`).** Everything below is implemented,
> and every feature is tested end to end against `fsonos-sim`, a virtual
> Sonos house (an S1 and an S2 household speaking SOAP and GENA on loopback,
> checked against scrubbed captures of real players). The daemon also runs a
> real two-household house, S1 and S2, where discovery, grouping, volume,
> favorites, Spotify rendering and announcements have run on real players,
> and `fsonos selftest` checks yours without changing anything you can hear.
> There is no real-hardware CI yet, and interfaces may still change before
> `0.1.0`.
---
## Why FrankenSonos
Sonos hardware is excellent and lasts for years; the software around it is
where it falls short. The app loses speakers, grouping fights you, automation
is out of reach, the legacy S1 line is frozen while S2 moves on without it, and
the Spotify Web API cannot start playback on a Sonos at all.
FrankenSonos talks to your speakers directly, over the local protocols they
already speak (SSDP discovery, UPnP/SOAP on port 1400, GENA events), and turns
the whole house, both generations at once, into something you and your agents
can drive:
- **From anywhere on your tailnet.** `fsonos serve` serves its HTTP API on
loopback and your Tailscale addresses (MCP on loopback), and `fsonos tailscale
setup` puts HTTPS in front of both with Tailscale Serve. Your phone in another city, an agent on a cloud VM,
a laptop at work: if it is on your tailnet, it runs your house (the CLI
there too: `FSONOS_DAEMON_URL=https://