Turn your Ubuntu laptop into a wireless Bluetooth speaker.
Install β’ Usage β’ Troubleshoot β’ Contribute
Bluzy is a native GNOME desktop application that turns your Ubuntu laptop into a Bluetooth A2DP audio receiver (A2DP Sink). Connect your phone via Bluetooth and play audio through your laptop's speakers β wirelessly.
- ποΈ One-toggle Speaker Mode β Enable/disable with a single switch
- π± Real-time Status β See connected device name, streaming state, and animated indicators
- π System Tray β Quick access from the system tray with status-aware icon
- π Pairing Confirmation β Optional security prompt for new device connections
- πΎ Auto-Connect Memory β Remember trusted devices and auto-enable per device
- π Volume Control β Adjust incoming audio volume
- π¨ Native GNOME Look β Built with GTK4 + Libadwaita, follows HIG
- π Dark/Light Mode β Automatic via Adwaita style manager
| Requirement | Version |
|---|---|
| Ubuntu | 24.04+ or 25.04 |
| Python | 3.10+ |
| PipeWire | Default on Ubuntu 24.04+ |
| BlueZ | 5.x |
| Bluetooth hardware | Built-in or USB adapter |
Download the latest .deb package from GitHub Releases:
# Download the latest release
wget https://github.com/izzathnisfer/Bluzy/releases/download/v1.0.0/bluzy_1.0.0_all.deb
# Install (auto-resolves all dependencies)
sudo apt install ./bluzy_1.0.0_all.debOr simply double-click the .deb file in your file manager to install via GNOME Software.
After installation:
- π Search "Bluzy" in your app grid
- π₯οΈ Or run
bluzyfrom any terminal
To uninstall:
sudo apt remove bluzygit clone https://github.com/izzathnisfer/Bluzy.git
cd Bluzy
bash install.shThe installer will:
- Install all system dependencies via
apt - Start and enable the Bluetooth service
- Add your user to the
bluetoothgroup (if needed) - Deploy app files to
~/.local/share/bluzy/ - Install the
.desktopfile and icon for your app drawer
To uninstall a source installation:
bash uninstall.shIf you prefer to install dependencies manually:
sudo apt install -y \
python3-gi \
python3-gi-cairo \
gir1.2-gtk-4.0 \
gir1.2-adw-1 \
gir1.2-appindicator3-0.1 \
python3-dbus \
bluez \
pipewire \
wireplumber \
pulseaudio-utilsAfter installation, search "Bluzy" in your Ubuntu app drawer and click to launch.
python3 ~/.local/share/bluzy/main.pyOr during development:
python3 bluzy/main.py --debug| Flag | Description |
|---|---|
--minimized |
Start minimized in the system tray |
--debug |
Enable debug logging |
--version |
Print version and exit |
- Launch Bluzy
- Enable Speaker Mode β flip the toggle switch
- Connect your phone β open Bluetooth settings on your phone, you'll see "Bluzy Speaker" (or your custom name)
- Play audio β music, podcasts, or any audio will play through your laptop speakers!
- Disable β flip the toggle off to disconnect and stop being discoverable
Modern BlueZ (5.x) with PipeWire handles A2DP profiles automatically. No changes to /etc/bluetooth/main.conf are typically needed.
If you experience issues, ensure the following in /etc/bluetooth/main.conf:
[General]
# Allow other devices to discover this computer
DiscoverableTimeout = 0
[Policy]
# Auto-enable Bluetooth adapter on boot
AutoEnable=trueAfter editing, restart the Bluetooth service:
sudo systemctl restart bluetooth# Check if adapter is blocked
rfkill list bluetooth
# Unblock if blocked
sudo rfkill unblock bluetooth
# Check if adapter is detected
hciconfig -asudo systemctl start bluetooth
sudo systemctl enable bluetooth
systemctl status bluetoothsudo usermod -aG bluetooth $USER
# Then log out and log back in- Make sure Speaker Mode is enabled in the app
- Check that your adapter is discoverable:
bluetoothctl show | grep Discoverable - Try restarting Bluetooth on both devices
- Check PipeWire/PulseAudio is running:
pactl info
- Check available Bluetooth cards:
pactl list cards short | grep bluez - Check the active profile:
pactl list cards | grep -A 20 bluez
On GNOME, you need the AppIndicator extension:
sudo apt install gnome-shell-extension-appindicatorThen enable it in GNOME Extensions or restart your session.
bluzy/
βββ bluzy/ # Python package
β βββ __init__.py # Package metadata & version
β βββ main.py # Entry point
β βββ app.py # Adw.Application lifecycle
β βββ window.py # Main window UI
β βββ tray.py # System tray (GTK3 subprocess)
β βββ tray_dbus.py # D-Bus IPC for appβtray
β βββ bluetooth_manager.py # BlueZ D-Bus integration
β βββ bluetooth_agent.py # Auto-accept pairing agent
β βββ audio_manager.py # PipeWire/PulseAudio profiles
β βββ config_manager.py # User preferences
β βββ utils.py # System checks & helpers
βββ resources/
β βββ bluzy.png # App icon
β βββ bluzy-tray-*.svg # Tray state icons
β βββ style.css # Custom GTK4 CSS
β βββ bluzy.gresource.xml # GResource bundle
βββ data/
β βββ com.github.izzathnisfer.bluzy.desktop
β βββ com.github.izzathnisfer.bluzy.metainfo.xml
βββ packaging/
β βββ build-deb.sh # .deb package builder
βββ dist/ # Built packages (gitignored)
βββ install.sh # One-command source installer
βββ uninstall.sh # Source install uninstaller
βββ requirements.txt # Python dependencies
βββ README.md # This file
Bluzy uses a two-process architecture to bridge the GTK3/GTK4 incompatibility with AppIndicator3:
βββββββββββββββββββββββββββ D-Bus (session bus) ββββββββββββββββββββ
β Main App (GTK4) βββββββββββββββββββββββββββββΊβ Tray (GTK3) β
β β com.github.bluzy.App β β
β β’ Adw.ApplicationWindowβ β β’ AppIndicator3 β
β β’ BluetoothManager β Methods: β β’ Right-click β
β β’ AudioManager β Toggle(), Show(), Quit() β menu β
β β’ ConfigManager β Signals: β β’ Icon changes β
β β’ BluzyDBusService β StateChanged(...) β β
βββββββββββββββββββββββββββ ββββββββββββββββββββ
β
β D-Bus (system bus)
β org.bluez
βΌ
βββββββββββββββββββββββββββ
β BlueZ (bluetoothd) β
β β
β β’ Adapter1 β
β β’ Device1 β
β β’ Agent1 β
β β’ MediaTransport1 β
βββββββββββββββββββββββββββ
Contributions are welcome! Here's how to get started:
git clone https://github.com/izzathnisfer/Bluzy.git
cd Bluzy
# Install dependencies
sudo apt install -y python3-gi python3-gi-cairo gir1.2-gtk-4.0 \
gir1.2-adw-1 gir1.2-appindicator3-0.1 python3-dbus bluez \
pipewire wireplumber pulseaudio-utils
# Run in debug mode
python3 bluzy/main.py --debug- Follow PEP 8
- Use type hints for all function signatures
- Add docstrings to all public classes and methods
- Keep modules focused and loosely coupled
- Fork the repository
- Create a feature branch:
git checkout -b feature/my-feature - Commit with clear messages:
git commit -m "Add: volume slider" - Push and open a Pull Request
MIT License β see LICENSE for details.
MIT License
Copyright (c) 2026 Bluzy Contributors
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
