Sendspin Bluetooth Bridge — multi-device, multiroom, 4 deployment options #5061
Replies: 31 comments
|
This sounds really cool! I can't wait to try it. |
|
A lot has happened since the initial post — here's a summary of the key improvements: ● Update: v2.13.1 → v2.16.2 (March 8–10) 🔗 Multiroom & Groups
🔊 Audio
📱 Platform Support
🏠 HA Addon
🔒 Security (v2.16.0) SSRF prevention in HA auth, SSE connection limits (4 max / 30 min TTL), volume clamping 0–100, MAC validation, error response sanitization, set_log_level allowlist, path 🔋 Other
Full changelog: https://github.com/trudenboy/sendspin-bt-bridge/blob/main/CHANGELOG.md |
|
What's new since v2.16.3 → v2.22.2: 🔑 Automatic MA integration — no more manually copying tokens. Sign in with your Music Assistant or Home Assistant credentials right from the web UI, and the bridge obtains a 🔐 Web UI login — protect the dashboard with a password. Optionally authenticate using MA or HA credentials. 🎵 MA auto-discovery — the bridge finds your Music Assistant server automatically via mDNS. No need to enter the server URL manually. 🔇 Faster mute — mute/unmute responds instantly. A separate MUTE_VIA_MA toggle lets you route mute through MA independently from volume. 🔄 Smarter restart — Save & Restart now shows a live progress indicator with per-device status for Bluetooth, PulseAudio, Sendspin, and MA. Click to expand details. 🎨 Redesigned Configuration UI — cleaner layout, advanced settings integrated into main sections, better device list with collapsible entries, static Save button, 🧹 Legacy cleanup — old BLUETOOTH_MAC config deprecated, dead config keys removed automatically on upgrade. 🐛 Lots of bug fixes — MA beta 2.8+ compatibility, HA OAuth token exchange, phantom player cards, mute sync with PulseAudio, and many UI polish improvements. |
|
What's New (v2.22.3 → v2.28.2) 🛡 Security Hardening — session variable leak fixed (cross-user MFA prevention), MAC address validation against command injection, broad except Exception narrowed to specific types across 6 modules, ⚙ Two-Tier Device Control — new global enabled checkbox fully removes a device from BT/PA/MA stack (player unregistered); separate BT Release/Reclaim stays for Bluetooth-only hot toggle. Release 🎧 TWS Earbuds Support — SSP passkey auto-confirm enables pairing TWS devices (HUAWEI FreeClip, etc.) that require confirmation prompts; D-Bus resilience for stale BlueZ objects when earbuds are in ⚡ Smooth Restart — PA sinks muted before restart, auto-unmuted after audio stabilises (1.5 s settling window, 60 s safety timeout). Cached sink names (LAST_SINKS) skip the 3 s A2DP retry loop on 🎵 Sink Routing Fix — each subprocess verifies and corrects its sink-input routing after audio starts; fixes silent speakers when PulseAudio ignores PULSE_SINK with multiple BT speakers. 🔑 HA Login Improvements — actual HA username displayed (reads Ingress X-Remote-User-Display-Name header); login handler split into 4 per-flow handlers; auto-detects MA_AUTH_PROVIDER=ha when MA is 🐛 Bug Report Button — one-click diagnostics collection: system info, device states, last errors — auto-masks sensitive data and opens a pre-filled GitHub issue. Redesigned modal with SVG icons, ⬆️ One-Click Updates — header shows update badge when a new version is available. Update modal with release notes preview: "Update Now" for LXC (one-click apply), "Update in HA" for addon mode, 🎨 Dashboard Redesign — compact connection column (85px, dots-only with tooltips); identity column with ellipsis player names + inline badges; progress time inline with progress bar; volume slider 🎮 Demo Mode — full UI demo with emulated BT devices and MA playback without hardware. Set DEMO_MODE=true or try the live demo. 🔧 S6 + AppArmor — proper PID 1 process supervision (S6 overlay v3.2.0.2) with zombie reaping and signal forwarding. AppArmor in enforce mode matching the Music Assistant addon pattern. 🧪 187 Tests across 15 files — config, volume routing, device status, auth, API endpoints, daemon process, MA token exchange, PulseAudio, BT manager, MA discovery, HA config translation. |
|
What's New (v2.28.2 → v2.30.5) 📋 BT Diagnostics — ℹ️ BT Info modal on each paired device shows full bluetoothctl info (paired, trusted, connected, UUIDs) with Copy button — no SSH needed. Adapter ↻ Reboot button power-cycles ⬇️ Config Backup & Restore — Download and Upload buttons in the Configuration section. Download filename includes bridge name and timestamp (MyBridge_SBB_Config_20260313.json). Upload validates JSON ⛔ Quick Disable from Dashboard — ⛔ Disable button directly on each device card to fully remove a speaker from the BT/PA/MA stack without navigating to Configuration. 🔄 Smooth Restart — PA sinks are muted before restart and auto-unmuted after audio stabilises (1.5 s settling window); 6-step progress bar in the header shows each phase. Non-smooth mode still ⏳ Buffering Indicator — when MA reports a group is playing but the bridge hasn't received audio yet, the card shows ▶ Buffering with a pulsing orange dot instead of a misleading ⏸ Stopped. 🔇 Mute Indicator Fix — startup unmute now correctly propagates status to the UI (was stuck showing 🔇 even though the sink was unmuted). Timeout reduced from 60 s to 15 s for faster feedback. 🔍 Scan UX — Scan button shows a live countdown during cooldown (Scan (28s) → Scan (27s) → …). Buttons reordered: Add before Add & Pair in scan results. 🎨 Dashboard Layout — device cards now arrange in up to 3 columns on wide screens. Card redesign: status dots with colour classes, chip-style sync display, ±Nms delay format, shuffle/repeat always 🐛 Stability — released → disabled persistence bug fixed (devices no longer incorrectly skipped on reboot); MA group matching uses stable player_id instead of fuzzy name comparison; bluetoothctl |
|
What's New (v2.30.6 → v2.31.7) 🎨 Major UI Redesign — device cards, header, and toolbar were fully rebuilt to better match Home Assistant / Music Assistant design language. Added grid/list view, adapter and status filters, group 🧩 UI Consistency & Configuration Cleanup — the Configuration area was refactored into a proper card-based settings surface with a cleaner hierarchy across General / Security / Bluetooth / Devices / 🔗 Faster Navigation & Device Management — adapter badges now jump directly to Configuration → Bluetooth, custom adapter names are editable, and Music Assistant sync-group badges open the correct MA 📊 Better Runtime Visibility — device delay is now shown consistently in both card and list views, list rows expose the same key runtime context as cards, and adapter/status badges are visually 🛡 Security Hardening — added CSRF protection on login, CSP and X-Content-Type-Options headers, adapter input validation against command injection, config upload size limits, sanitized API error 🔐 Home Assistant Login / MFA Improvements — auth flows were improved overall, and v2.31.7 fixes a regression in direct HA login with MFA/TOTP: the second-step authenticator form now preserves a 🧪 Tests & CI — the test suite was expanded and current validation now passes with 223 tests. CI was also fixed to install libdbus-1-dev, allowing dbus-python to build correctly in GitHub Actions. ✨ Smaller UX Improvements — the version badge now links to GitHub release notes, the username links to the HA/MA profile when available, empty states span the full grid width, card hover no longer |
What changed since v2.31.8Since On the runtime / ops side, updates for native LXC installs became much safer with archive-based sync, detached upgrade execution, smoke checks, and rollback logic. Config handling, diagnostics, On the Music Assistant integration side, album-art delivery was fixed through a safe same-origin proxy, queue metadata and progress handling became more reliable, and the latest releases moved On the UI side, the dashboard moved much closer to a real Music Assistant-style experience: cleaner card/list parity, tighter expanded-list playback layout, more truthful control availability, |
|
What’s New (v2.31.9 → v2.40.6) 🎛️ A much better Music Assistant playback UI — the dashboard got a lot more polished across both card and list views. Playback controls, queue previews, progress display, badges, warnings, and live 🖼️ Better now-playing and artwork handling — album art is more reliable again, playback progress is less jumpy, and the UI does a much better job showing what is actually playing right now. 🔁 Music Assistant controls are much more reliable — a lot of work went into fixing next / previous / shuffle / repeat, especially for solo players and mixed MA versions. In practice, transport ⚡ Faster, calmer UI behavior — queue actions and MA state sync were improved so the interface reacts faster, shows more useful pending/confirmed state, and recovers more gracefully from short 🩺 Far better status, startup, and diagnostics — the bridge now exposes startup progress, richer health/status snapshots, better diagnostics, and clearer onboarding hints. That makes it much easier 🧩 Home Assistant addon experience improved a lot — stable, RC, and beta tracks are now much clearer and safer to use. Parallel addon channels were improved, ingress behavior is cleaner, and the UI ⬆️ Updates are safer and clearer — update channels are now first-class, standalone/LXC updates are more predictable, and the release flow is cleaner: stable builds use GitHub Releases, while 🎨 General UI polish everywhere — lots of smaller improvements landed across warnings, spacing, helper text, header actions, onboarding, and config screens. 🎮 Want to see the UI almost live before updating? Try the demo stand here: 🙏 And thank you all for the interest in the project, the testing, the feedback, the bug reports, and the ideas. It really helps move the bridge forward much faster
|
|
What’s New (v2.40.6 → v2.42.1) 🧭 A much smarter operator guidance system — the bridge now has a real onboarding checklist, recovery assistant, and unified operator guidance model. Instead of just showing raw status, the UI now does a much better job explaining what is wrong, what is ready, and what to do next. 📋 Setup flow is much clearer now — onboarding is no longer just an empty-state hint. It became a structured checklist with progress, completion markers, and direct actions for Bluetooth setup, device attachment, Music Assistant auth, and latency review. It also stays available from the header as a reference even after the first setup is done. 🚑 Recovery UX is now much stronger — the new Recovery Center and recovery assistant group active issues more clearly, show recovery traces, and suggest safer next actions like reconnect, re-pair, release, or diagnostics. This makes troubleshooting much less guessy when a speaker drops out or gets stuck in a bad state. 🩺 Diagnostics got a major overhaul — diagnostics is now split into a simpler Overview plus Advanced diagnostics, with much better scanability. There are also copy helpers for support workflows, expandable raw details for advanced debugging, and direct jumps to the most relevant config sections. 🔒 Restart, startup, and update flows feel much more correct — a lot of work went into lockout behavior and startup state handling. The UI now stays aligned with the real backend startup/restart/update progress much better, including the finalizing phase. LXC updates also behave more cleanly now, and after an update the UI does a cache-busting refresh so the browser actually loads the new frontend immediately. ⛔ Disabled devices now behave properly — disabling a device is now much more consistent across dashboard state, live refreshes, and Save and restart. Disabled devices keep their proper disabled visuals, survive refreshes correctly, and no longer “bounce back” into misleading states. 🔁 Bluetooth recovery and release are more responsive — releasing a device while reconnect is in progress is much less frustrating now. Internally, the reconnect flow can be cancelled more cleanly, so release actions no longer feel blocked behind long retry loops. 🎨 A lot of UI polish landed too — larger artwork in grid playback cards, clearer diagnostics hierarchy, better disabled-state visuals, improved onboarding/recovery copy, and better action placement across the dashboard. 🏗️ Under the hood this was also a big architecture release — a lot of runtime logic was moved out of the old monolithic state path into dedicated services for bridge runtime state, Music Assistant state, device registry snapshots, async jobs, event hooks, operator guidance, and recovery analysis. So this release is not just more polished — it also gives the project a much stronger base for the next steps. |
|
v2.47.0 — biggest update since launch 🚀 🛡️ Security — SSRF protection, session fixation, injection prevention, artwork proxy size caps, MAC validation, update ref whitelist (8 fixes). 🔧 Sendspin 5.3→5.7 — volume no longer resets on reconnect, pitch shift fixed. New native PulseVolumeController for atomic per-speaker volume via PA/PipeWire. 🖼️ Artwork & visualizer — bridge receives artwork frames (base64) and visualizer data from server. Graceful fallback. 🏠 Rooms & handoff — devices carry room_name/room_id + transfer_readiness. HA area registry integration for naming. Per-device handoff_mode for fast room switches. 🐳 Split-privileges Docker — root for BT/D-Bus init, re-exec as AUDIO_UID. Fixes RPi PulseAudio mismatch out of the box. 🧭 Smarter guidance — 7-step onboarding follows real dependency order; recovery banners are calmer with +N more collapse; blocked controls show visible hints (no hover needed). 🔄 MA hot-reload — change MA URL/token without full restart. Better HA add-on discovery priority. 📡 BT pairing — scan keeps running after modal close, stale state cleared, BlueZ agent serialized, real failure reasons in logs, empty-state recovery suggestions. 🧹 Refactors — 3 modules split (BT 1226→669, api_ma 2343→150, config 999→449 lines). BT manager decoupled via Protocol. 🐛 25+ bugfixes — cold-start races, volume tracking, WS drops, task leaks, subprocess lifecycle, configurable restart grace. 🔬 699 tests (was ~480). Changelog: https://github.com/trudenboy/sendspin-bt-bridge/blob/main/CHANGELOG.md |
|
What’s New (v2.47.0 → v2.48.0) 📡 Native Sendspin transport path — the bridge now supports native Sendspin transport commands for play, pause, stop, next, previous, shuffle, repeat, mute, and volume via the Controller role. When native transport is unavailable, the UI still falls back to Music Assistant queue commands automatically. ℹ️ Richer metadata and controller state — the bridge now forwards more data from Sendspin, including album, album artist, artwork URL, year, track number, shuffle, repeat, 🔧 Better defaults out of the box — startup/audio defaults were tuned for more reliable first-run behavior. Startup grace is now shorter, recovery banner grace is separated into its own setting, default Pulse latency is now 600 ms, and newly added BT devices start with a more practical default static delay. 📦 Pinned runtime dependencies — direct runtime packages, including 🛡️ Sendspin API compatibility fix — the bridge now works with the current Sendspin audio API layout ( 🔁 Restart and recovery hardening — several fixes landed for restart behavior. The bridge now avoids false 🏎️ Snappier native transport buttons — native Sendspin 🧪 779 tests — full validation for the release passed with |
|
very usefull |
|
What's New (v2.49.1 → v2.51.0) 🐛 Critical fix: NumPy crash on older CPUs — v2.49.1 fixes a daemon subprocess crash on x86_64 CPUs without SSE4.2/POPCNT (Celeron, Pentium, early Core i3). NumPy ≥2.0 requires the X86_V2 instruction set; we've pinned numpy<2.0 to restore compatibility. 📱 Mobile UI overhaul — the web interface has been redesigned for phones:
🩺 Diagnostics UX overhaul — the diagnostics panel has been completely reworked for both casual users and power users:
🎨 Artwork proxy fix — now constructs proper MA /imageproxy URLs and URL-encodes unicode track names, so album art loads correctly for all tracks (#112) 📜 In-container log viewer — logs now use a 2000-line in-memory ring buffer instead of relying on the docker CLI, which is unavailable inside the container (#111) 🏷 Long speaker name fix — names like [AV] Samsung Soundbar M360 M-Series @ asus-laptop-ubuntu no longer crash with zeroconf.BadTypeInNameException. Fallback player IDs now use UUID5 — always 36 chars, deterministic, no mDNS issues (#115) 🌙 Idle standby fix — the standby timer now correctly starts when a speaker connects but never plays (v2.50.4) |
|
I would still love to see the majority of features from this to be supported as part of the Linux-Voice-Assistant project/application someday! 😀 That project is in need of not only a Sendspin client and Bluetooth speaker/microphone support, but also a good web interface for configuring everything, including settings for hardware; like Soundcard (output/input), Volume, maybe Pipewire configuration, and Bluetooth connections. For reference, the Linux-Voice-Assistant project is a new(ish) experimental Linux-based voice satellite solution that would be perfect for also serving dual-purpose as a Sendspin client and media player The idea it that it will allow you to deply it as an all-in-one voice assistant smart speaker package on any x64 or ARM64 hardware capable of handling local audio processing on-device. ecause it runs on a full Linux system this approach provides great flexibility for customization of the hardware that it can run on. It also gives you access to significantly more local computing resources for additional features and other integrations on the same satellite. That project was started as an alternative to remote voice satellites based on the Wyoming protocol which has now been abandoned in favour of using the ESPHome native API protocol to integrate and communicate with Home Assistant Remote. It too seems to have the potential to grow into something that could also be a device bridge as well all feature local on-device voice pipeline. PS: It is packaged as Docker container now but there is ongoing work to also package it as an Home Assistant App (formerly add-on) as well. |
What's New (v2.52.0 → v2.54.1)🔊 PulseAudio sink monitoring — idle standby is now driven by real PA/PipeWire sink state ( 💓 WebSocket heartbeat — daemon now sends 30 s ping/pong on server-initiated WebSocket connections, matching MA's client-side heartbeat. Prevents idle connection drops through proxies, 🔌 Restart reliability — process no longer hangs after restart (event loop wasn't stopped); S6 overlay restart now works when running as non-root UID; restart banner no longer gets 🍓 Raspberry Pi support — entrypoint auto-runs 🔒 OpenSSL 3.5 fix — update checks failed on newer distros because post-quantum ML-KEM key exchange produced oversized TLS Client Hello packets that middleboxes dropped; GitHub API calls 📱 Mobile UI fix — action buttons (Reconnect / Wake / Disable) no longer overflow on mobile at 125% zoom. Layout overrides that were accidentally scoped to dark-mode-only are now applied universally. 🔈 Mute via MA by default — 📦 Docker update UX — the update modal now shows the full Docker image name as a copyable code block and the correct 🧹 Housekeeping — removed deprecated
|
What's New (v2.54.2 → v2.55.0)🌙 Per-device idle mode — new
🐳 Docker image −51% — 916 → ~450 MB. Removed redundant system FFmpeg on amd64/arm64 (PyAV bundles its own), force-removed transitive GStreamer/codec deps, stripped 🎨 Unified branding — all logos, favicons, and HA addon icons replaced with the landing page wave-bridge design (two pillars + three wave curves). Channel color differentiation preserved: 🐛 PipeWire idle standby fix (#120) — PipeWire's PA compat layer doesn't emit sink state events for BT sinks, so the SinkMonitor never cancelled the idle timer. Daemon playback flags now act as a dual authority alongside SinkMonitor: idle timer only fires when both sources agree the device is idle. Fixes standby during active playback and the reverse (timer not starting when playback stops). 🔈 Mute desync after BT reconnect (#132) — the daemon unmuted the PA sink on reconnect but never told Music Assistant, leaving MA stuck on ⚡ NumPy crash on older CPUs — numpy ≥2.0 requires X86_V2 (POPCNT/SSE4.2), unavailable on QEMU 🔌 Subprocess crash on PipeWire — kept 🔧 Config download 404 in HA addon — the download button bypassed the ingress 📦 Dependency & CI updates —
|
|
What's new — v2.58.0 → v2.60.1 🔄 On-line config apply (no more bridge restart for most saves) — saves from the web UI now apply live (immediately after click save button) . A pure diff layer classifies each changed field as hot-apply (IPC to the running daemon), warm-restart (single subprocess respawn, ~3–5 s silence), global broadcast, global restart, or restart-required (only Flask-bound fields still need a full restart). POST /api/config returns a per-action summary and the UI renders a detailed toast so you can see exactly what happened. Notably, static_delay_ms now reaches the running daemon via a new IPC command — previously it was persisted but never took effect until restart. 🎚️ static_delay_ms default is now 300 ms for newly added devices — field reports on Ubuntu + Docker + PipeWire two-speaker setups consistently show 300 ms gives noticeably better A/V sync than 0. Pre-filled on every new-device path (manual Add, scan Add, paired Add). Existing saved configs are untouched. 🔑 Legacy-pair / stale-agent fix for HMDX JAM & IKEA KALLSUP-class speakers (BT 2.x, LegacyPairing: yes) — two surgical fixes in the standalone and per-device pair flows:
🎧 AKG Y500 / BlueZ 5.82+ A2DP profile auto-switch — on some devices the headset pairs and connects but no bluez_*.a2dp_sink appears, because the card lands in headset_head_unit due to the BlueZ 🔌 Port-collision auto-shift — host-side bind preflight in SendspinClient auto-shifts listen_port on EADDRINUSE, records port_collision / active_listen_port on device status, and halts the restart loop after 5 consecutive bind failures (auto-clears when the daemon comes back alive). No more daemon crash loop when the configured port is taken. 🔇 SinkMonitor log-flood fix — diagnoses the PulseAudio failure on first WARNING with an actionable hint, demotes subsequent attempts to DEBUG, and self-disables after 3 consecutive initial failures so callers fall back to daemon-flag idle detection. Exponential backoff 5→60 s for post-success transients; start() resets state so the monitor can be revived after the operator fixes PA. 🛡️ CSP script-src is nonce-only — 'unsafe-inline' dropped. Every inline on*= handler (Jinja templates + app.js-generated HTML) migrated to a delegated data-action dispatcher, with a regression guard scanning shipped assets to block reintroduction. 🍓 Fresh Raspberry Pi OS Lite preflight — rpi-install.sh now idempotently clears BT soft-block via rfkill unblock and auto-enables bluetoothd; rpi-check.sh reports rfkill state and warns when systemd-user linger is off on PipeWire hosts (the "no bluez_* sinks after reboot" classic on headless installs). Docs also add a purge+reinstall fallback for stuck BlueZ on Trixie where plain --reinstall doesn't clear the state. As always — feedback and bug reports very welcome 🙏 |
|
What's new — v2.60.2 → v2.61.0 🩹 BlueZ 5.86 dual-role A2DP Sink hardening (#166, bluez/bluez#1922) — on the regressed BlueZ band some speakers pair and connect but no 🔑 Standalone pair flow — reliability pass (#168) — 🔁 Opt-in recovery ladders (experimental, v2.61.0) — three new flags surface in Settings → Experimental (now highlighted in red with an "EXPERIMENTAL" badge so volatile toggles are distinguishable from merely unsaved settings):
Also experimental: 🎚️ Pair-time adapter quiesce is now experimental — the "Pause other speakers on same adapter" checkbox is hidden by default behind the experimental-features toggle. It only helps on single-adapter + BlueZ 5.78–5.86 regression band + Realtek exclusivity quirks, so it no longer adds clutter for users who don't need it. API unchanged — ⬆️ 🐳 Docker build hygiene — As always — feedback and bug reports very welcome 🙏
|
|
What's new — v2.61.1 → v2.62.0 ✨ Add a Bluetooth speaker without restarting the bridge — pair a new speaker from the Scan modal, click Save, and it goes live as an MA player within a few seconds. Same for re-enabling a previously-disabled device. No more 30–60 s addon-restart that would drop A2DP on every other speaker. 🤝 Native BlueZ pairing agent — bridge now exports its own 🔉 Two-way volume sync via PulseAudio events — moving the volume slider in MA, in the bridge UI, or with the physical knob on the speaker now propagates everywhere within ~1 s. Fixes a regression reported on the HA Community forum thread where bridge players showed as muted in MA with the volume slider greyed out in HA, even though audio was playing. 🎚️ Multi-adapter listing fix (#193) — on hosts with two BT adapters (e.g. Pi internal + USB stick) the UI no longer mislabels each adapter with the other one's alias, and 🛠️ HA addon: "Disable PA rescue-streams" persists across restarts — was silently resetting because the option was missing from the addon schema. 📝 Update modal release notes render properly — code spans, headings and bullets now show as styled DOM instead of raw markdown. 🪶 Docker image trimmed by ~38 MB — pip leftover, unused udev hardware DB, systemd unit files and package docs that were never reachable inside the container. Same functionality, faster pulls. 🧹 Internal cleanup — removed the parallel HTTP-proxy path to MA for volume/mute (sendspin's PulseVolumeController is now the single source of truth) and the dead-code artwork relay. ~400 LoC lighter, fewer moving parts. |
|
What's new — v2.62.0 → v2.63.0 🎛️ MPRIS hardware integration for speakers — the bridge now exports a per-device 📶 Live RSSI badge for connected speakers (opt-in, ⚙️ HA addon: settings now actually persist across restarts (#190-class regression) — 🎨 Settings UI — experimental block reorganized — moved out of Connection recovery into a dedicated "Experimental features" card with amber accent + ⚠ icon. Includes the new 🔍 BT info modal renders the full 🧾 MA server version in diagnostics — bug-report payload + post-handshake INFO banner line 📡 HA Supervisor SSE corruption fix — adds 🐛 Pre-existing bugs surfaced during the rc cycle:
🧪 1701 tests — green on every supported config.
|
|
Sendspin BT Bridge v2.64.0 🎉 🔊 Multi-speaker button routing — finally fixed 🎚️ Volume knob updates the bridge slider ⚡ Bulk actions dropdown 📶 Live RSSI badge on by default 🔍 Scan UX improvements As always — feedback and diagnostics reports via the Report button in the bridge UI. |
|
Sendspin BT Bridge v2.65.0 🎉 🏠 Native Home Assistant integration 🎛️ Switches and buttons that match what you'd actually automate 🛌 Disabled or sleeping speakers stay reachable 🔌 Two ways to wire it up — pick one
⚙️ New Settings → Home Assistant tab
As always — feedback and diagnostics reports via the Report button in the bridge UI. |
|
Sendspin BT Bridge — v2.65.1 → v2.66.14 update 🎉 A burst of releases since the v2.65.0 post, focused on diagnostics, pairing reliability, audio quality, and platform reach. 🩹 Forensic breadcrumbs that survive restarts 🎧 Cleaner audio at stream start 📡 Samsung Q-series soundbars (HW-Q910B / Q990B etc.) 🏠 One device card per speaker in Home Assistant (HACS path) 🍓 Raspberry Pi 1 / Zero W back in service 🔌 Smoother Home Assistant integration setup
⚙️ Behind the scenes As always — feedback and diagnostics reports via the Report button in the bridge UI. |
|
Sendspin BT Bridge — v2.66.15 → v2.67.2 update 🎉 Big arc since the v2.66.14 post: the Home Assistant Configuration tab got a from-scratch UX overhaul, MQTT publisher reliability fixes lifted operators out of multi-minute reconnect gaps reported in #247 / #249, and the in-bridge Class of Device preset dropdown grew from a single Samsung-Q-series workaround into a full preset table covering more speaker families. 🏠 HA Configuration tab — UX overhaul 📡 Class of Device presets — broader hardware coverage
Each preset corresponds to a documented case where that exact CoD unblocked pairing. Custom hex still available for outliers. Full reference table in the troubleshooting docs with bug-tracker / forum-thread links for every value. 🎨 HACS integration ships its own icon 🔌 MQTT publisher — reliability under flaky links
🩺 Diagnostics — host-side fixes called out specifically 🍓 Platform / deployment fixes
⚙️ Behind the scenes As always — feedback and diagnostics reports via the Report button in the bridge UI. |
|
Sendspin BT Bridge — v2.67.2 → v2.69.0 update 🎉 A focused round since the v2.67.2 post: per-player sync delay is now drivable from Music Assistant, every bridged speaker shows its own model and manufacturer on the MA player card, settings saves through the dashboard apply more cleanly, and the bundled audio engine rolled forward with two fixes for audible glitches at speaker reconnect and delay changes. 🎚️ Per-player sync delay in the MA UI (trudenboy/sendspin-bt-bridge#237) 🏷️ Each speaker shows its own brand on the MA player card ⚡ Settings saves are more honest 🔊 Bundled Sendspin audio engine refresh — better sync, fewer glitches
🛡️ HA add-on: "Release Bluetooth" survives a restart (trudenboy/sendspin-bt-bridge#276) 💖 Sponsorship Feedback and diagnostics via the Report button in the bridge UI. |
|
Sendspin BT Bridge — v2.69.0 → v2.70.0 update 🎉 A pairing-UX & reconnect-stability round. Configured-but-never-paired speakers now get a dedicated remediation flow, a known AVDTP-collision reconnect loop on PipeWire stacks is fixed, and HA 2026.5+ stops rejecting MQTT discovery for per-device settings. 🆕 Never-paired devices are now first-class (trudenboy/sendspin-bt-bridge#258, #260–#263) 🔁 AVDTP-collision reconnect loop on WH-1000XM4 & similar A2DP sinks (trudenboy/sendspin-bt-bridge#269) 🔧 HA 2026.5+ MQTT discovery compliance Feedback and diagnostics via the Report button in the bridge UI. |
|
Sendspin BT Bridge — v2.70.1 → v2.71.0 update 🎉 A Sendspin-observability & deployment-hardening round. Default port aligned with upstream MA, daemon-exit failures finally visible, RPi / Proxmox LXC installers hardened, and a whole class of silent CPU-baseline crashes is no longer silent. 🛰️ Daemon-exit events are now visible (#291) 🔌 Default Sendspin port aligned with upstream MA ( 🐧 Raspberry Pi & Proxmox LXC installer hardening
🧠 CPU-baseline crashes ( 📋 Tested-hardware references
If your speaker or adapter isn't on either page, please open an issue with the model and a 📦 sendspin 7.1.0 → 7.3.1 + dep bumps 📘 BlueZ ≥ 5.79 is now documented as a prerequisite for the v2.70.0 AVDTP-collision fix (#269) Full changelog: github.com/trudenboy/sendspin-bt-bridge |






















Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
🔊 Sendspin Bluetooth Bridge
Turn any Bluetooth speaker into a Music Assistant player — no new hardware, no cloud.
This is a community companion project based on loryanstrant's sendspin-client. It started as a Docker wrapper and has grown into a full-featured multi-device bridge with a web dashboard, multiroom sync, and four deployment options.
Repository: https://github.com/trudenboy/sendspin-bt-bridge
Documentation: https://trudenboy.github.io/sendspin-bt-bridge/
What it does
Each Bluetooth speaker appears as a regular player in Music Assistant — just like Sonos or Chromecast. You can play music, control volume, group speakers for multiroom, and manage everything from the MA UI or a dedicated web dashboard.
Key features
static_delay_msfor A2DP buffer syncDeployment
Run multiple bridge instances against the same MA server — each handles the speakers within its Bluetooth range:
Tested on
All 5 speakers run multiroom-synced from 3 bridge instances with CSR8510 USB adapters.
Install
HA Addon (one click):
1. Add the addon repository to Home Assistant:
Or manually: Settings → Add-ons → Add-on store → ⋮ → Repositories → add
https://github.com/trudenboy/sendspin-bt-bridge2. Find Sendspin Bluetooth Bridge in the store and click Install.
Docker / LXC: see installation docs.
Built on top of the excellent sendspin-client by @loryanstrant and the Sendspin protocol in Music Assistant. Thanks for making this possible! 🙏
All reactions