Lock and unlock your KDE desktop session based on Bluetooth device proximity.
BlueLock monitors a paired Bluetooth device's signal strength. When the device moves out of range the session is locked automatically; when it returns the session is unlocked.
- System tray icon with five states reflecting proximity and lock status
- Configurable RSSI thresholds with hysteresis (separate lock/unlock levels)
- Configurable time durations before acting (avoids triggering on momentary drops)
- D-Bus
org.freedesktop.ScreenSaverfor lock/unlock — no extra tools required - Optional custom lock/unlock shell commands
- RSSI smoothing with a configurable ring buffer
- Real-time signal strength display in the configuration dialog
- Python 3.11+
- PyQt6 (
python3-pyqt6-baseon Fedora) - BlueZ (
bluez)
pip install .
bluelockmake runmake rpm
sudo rpm -i ~/rpmbuild/RPMS/noarch/bluelock-*.rpm- Launch BlueLock — it appears in the system tray.
- Right-click the tray icon and choose Preferences.
- Click Scan to find nearby Bluetooth devices.
- Select your device and click Use.
- Adjust the lock/unlock RSSI thresholds and durations to taste.
- Click OK — monitoring begins immediately.
| Icon | Meaning |
|---|---|
| Close (blue) | Device is nearby — session is unlocked |
| Far (yellow/amber) | Device is moving away — lock countdown active |
| Gone (red) | Device is absent — session is locked |
| Error (grey) | Initialising, or no signal yet |
| Paused | Monitoring is paused — no automatic lock/unlock |
| Setting | Description |
|---|---|
| Lock RSSI | Session locks when signal drops below this level |
| Lock duration | Signal must stay below the threshold for this many seconds before locking |
| Unlock RSSI | Session unlocks when signal rises above this level |
| Unlock duration | Signal must stay above the threshold for this many seconds before unlocking |
The gap between the lock and unlock thresholds acts as a hysteresis band, preventing the session from oscillating when you are standing right at the boundary.
Saved at ~/.config/bluelock/config.toml.
make test # run tests
make coverage # run tests with coverage report
make lint # run ruff
make format # auto-format with ruff
make build # build wheel and sdist
make release V=X.Y.Z # tag and publish a releaseUnlicense — public domain.