Turn a cheap mini PC into your Tesla's offline music jukebox, network router, and ad-blocker — no Premium Connectivity required, and music streaming costs zero mobile data.
Two annoyances every Tesla owner with a homelab streak knows:
- The in-car browser refuses local networks. Tesla routes
192.168.x.xinternally, so the browser can never reach a Plex server on your home LAN — you just getERR_CONNECTION_REFUSED. - Music in the car costs money. Either you pay for Premium Connectivity, or your phone streams over its data plan.
A headless Debian mini PC (powered by a portable power station) joins your car's Wi-Fi and becomes:
- 🌐 A tiny router for a conflict-free
10.10.10.0/24network — AdGuard Home provides DHCP + DNS with ad blocking, so the Tesla has working internet through your router's uplink - 🎵 A Bluetooth boombox: the server pairs with your Tesla like a phone and streams music directly from MPD to the car speakers over A2DP — zero mobile data
- 🖥 A media backend: Plex and Pinchflat (YouTube archiver) in Docker
- 📱 Fully remote-controlled: the myMPD web UI works from your phone (LAN) and from the car's touchscreen via a Tailscale Funnel URL
flowchart LR
subgraph CAR["🚗 Tesla"]
SCREEN["Car screen / browser"]
BTSINK["Bluetooth A2DP sink"]
SPK["Car speakers"]
end
subgraph PC["Mini PC — headless Debian"]
MPD["MPD"] --> PW["PipeWire"]
PW --> BTSRC["Bluetooth A2DP source"]
MYMPD["myMPD web UI"]
ADG["AdGuard Home - DHCP + DNS"]
NAT["NAT router - 10.10.10.0/24"]
FUN["Tailscale Funnel"]
DK["Docker - Plex + Pinchflat"]
end
PHONE["📱 Phone"] -- "LAN" --> MYMPD
SCREEN -- "Funnel URL" --> FUN
FUN --> MYMPD
FUN --> DK
BTSRC -. "Bluetooth - 0 MB data" .-> BTSINK
BTSINK --> SPK
CARW["Tesla Wi-Fi"] --> HW["📶 4G router with SIM"]
PC -- "Wi-Fi uplink" --> HW
HW --> INET["🌐 Internet"]
- Why the Tesla browser can't reach private IPs — and how to prove it with tcpdump (spoiler: the SYN packets never leave the car)
- The hidden WirePlumber "seat gate" that silently disables Bluetooth audio on headless Linux — and the one-file fix (
monitor.bluez.seat-monitoring = disabled) - A router-on-a-stick over Wi-Fi that coexists with Docker's aggressive iptables management
- Serving services to a car browser through Tailscale Funnel, including the data-volume math when your uplink is a SIM card
| Part | Notes |
|---|---|
| Tesla (Model Y tested) | any Tesla with the built-in browser and Bluetooth |
| x86_64 mini PC | tested on an Awow box (Celeron N3350, 4 GB RAM) with built-in Wi-Fi + Bluetooth; anything similar works |
| Wi-Fi router with internet | a 4G/SIM router works fine — the PC uplinks to it wirelessly |
| Portable power station | optional — for parking-lot cinema sessions (tested: EcoFlow) |
| Phone | for initial setup and as an alternative MPD remote |
Work through the guides in this order:
- Network router + AdGuard Home — build the 10.10.10.x network
- The Bluetooth jukebox — MPD + PipeWire + the seat-gate fix ← the fun part
- Plex & myMPD in the car browser — Tailscale Funnel setup
- Feeding the library — Pinchflat as your download pipeline
- Something broke? → Troubleshooting — every pitfall we hit, with fixes
Prefer scripts over copy-paste? Check scripts/ — idempotent shell scripts with all knobs as variables at the top. Tested on Debian 13 (trixie) with NetworkManager and PipeWire 1.4 / WirePlumber 0.5.
TeslaBoomboxProject/
├── README.md
├── docs/
│ ├── 01-router.md # 10.10.10.x network, AdGuard Home DHCP/DNS, NAT
│ ├── 02-bluetooth.md # MPD + PipeWire + WirePlumber seat-gate fix
│ ├── 03-tesla-browser.md # Tailscale Funnel, Plex, myMPD, data-volume math
│ ├── 04-pinchflat.md # download pipeline for music & audiobooks
│ └── troubleshooting.md # every pitfall we hit, with fixes
└── scripts/ # idempotent setup scripts (edit variables at top)
This project involves software only — nothing inside the vehicle is modified. Tesla firmware updates may change browser/network behavior at any time. Use at your own risk. Not affiliated with Tesla, Inc.
MIT — do whatever you like, attribution appreciated.