# overskride: a GTK4 Bluetooth and OBEX client for Linux desktops

> Overskride is a Rust and GTK4 application that manages Bluetooth devices, adapters and file transfers through BlueZ, packaged as a flatpak and built with libadwaita. It is aimed at Linux desktop users who want device management and OBEX transfers in one window instead of juggling separate tools.

**kaii-lb/overskride** — A simple yet powerful bluetooth client. 

- Repository: https://github.com/kaii-lb/overskride
- Stars: 913 · Forks: 19
- Language: Rust
- License: GPL-3.0
- Published: 2026-10-20 · Updated: 2026-10-20 · Language: en
- Canonical page: https://hysenlabs.com/projects/kaii-lb-overskride

## A Bluetooth client with an OBEX file transfer in the same window

Overskride describes itself as a simple yet powerful Bluetooth client that is straight to the point, desktop environment and window manager agnostic, and the README expands it as a Bluetooth and Obex client.

The combination of those two words is the whole product. Bluetooth device management and OBEX file transfer are usually separate pieces of software on a Linux desktop. Pairing, trusting and unpairing a device tends to live in the system settings, and pushing a file to a phone or a headset tends to live in a file manager's right click menu or a separate utility. Overskride puts both in one application.

The implementation is Rust with a GTK4 and libadwaita interface. The Cargo.toml shows the shape of it: the `gtk` crate with the `blueprint` feature, `libadwaita` with `v1_4`, and `bluer` for the Bluetooth stack itself with the `dbus`, `dbus-crossroads`, `bluetoothd`, `id` and `serde` features. BlueZ is the Linux Bluetooth daemon, so `bluer` is the library that talks to it, and `dbus-crossroads` is used to consume the BlueZ D-Bus signals.

The result is a native looking application rather than a web app in a wrapper, and the flatpak packaging makes it installable without fighting your distribution's Bluetooth stack version.

## The feature list covers the whole device lifecycle

The README's feature list is long enough to be worth reading as a specification of what a desktop Bluetooth client is expected to do.

On discovery, the application can dynamically enumerate and list all devices known or in range, and it sorts devices by RSSI, signal strength, with connected and then trusted devices coming first. That sort order is a small design decision with a large effect on usability, because the device you are probably looking for is usually the strongest signal or the one already paired.

On interaction, it can authenticate with devices, which the README describes as passkey confirmation, send and receive files, connect and disconnect, rename a device, and remove a device. Trust and block are both there, which are the two operations that decide whether a device is allowed to connect at all.

On the adapter, it can turn the adapter on and off, set discoverability and its timeout, select between multiple adapters, and rename an adapter.

Then there are the settings that make a client usable day to day. Resizing support, changing the files storage location, auto accept files, audio profiles, transfer rate for incoming and outgoing file transfers, showing errors to the user rather than failing silently, more info about a device with distance approximation, and battery polling over Bluetooth, which the README notes requires enabling experimental bluetooth options.

That last one is a good example of the project being honest about its dependency on kernel and BlueZ support for a specific feature rather than pretending it works everywhere.

## Three things the README says do not work

The What doesn't work section is short and specific, which is the sign of a project that has been asked about its gaps.

Applet support, in other words the system tray, does not work. Neither does background running with a tray applet, which is the same limitation seen from the other side. And the quality of life items, described as auto trust on pair and auto accept service, are also listed as not working.

The tray gap is the consequential one for daily use. A Bluetooth client that only exists as a window is a tool you open when you need to pair something or send a file, not a resident utility that notifies you when a device connects or when a transfer completes. The two lines about the applet and about background running say the same limitation twice from different angles, which suggests the author knows it is the complaint people raise most.

The auto trust and auto accept gaps are more of a security posture than a missing feature. Automatically trusting a device on pairing is exactly the behaviour that makes Bluetooth pairing attacks work, and leaving it out is defensible even though it costs convenience.

Taken together, these three gaps define the audience. Overskride is for someone who wants a focused window for Bluetooth tasks, not for someone who wants a system-wide Bluetooth daemon replacement.

## Installing the nightly flatpak

The recommended installation is the flatpak, and the README's steps are specific about ordering.

First you enable the Bluetooth service:

```bash
sudo systemctl enable --now bluetooth
```

Then you download the `.flatpak` from the latest build on the GitHub Actions page, save it to `~/Downloads/overskride-nightly.flatpak`, and if needed install the GNOME platform runtime with `sudo flatpak install org.gnome.Platform//45`. The flatpak is then installed by double clicking it or by running `sudo flatpak install ~/Downloads/overskride-nightly.flatpak`.

The scripted version of the same thing is in the README, and it also shows where the zip build comes from:

```bash
sudo systemctl enable --now bluetooth
curl -sSL https://nightly.link/kaii-lb/overskride/workflows/main/v0.5.4/overskride-nightly-x86_64.zip -o ~/Downloads/overskride-nightly.zip
unzip ~/Downloads/overskride-nightly.zip -d ~/Downloads/
sudo flatpak install org.gnome.Platform//45 # only if needed
sudo flatpak install -y ~/Downloads/overskride-nightly.flatpak
rm ~/Downloads/overskride-nightly.flatpak
```

Two observations. The URL uses nightly.link with a workflow run rather than a release, so the build is whatever the continuous integration produced, which means the version you get is not pinned and can change between downloads. And the URL in the documentation references the `v0.5.4` workflow, while the current releases are in the v0.6.x line, so the documented command points at an older build than the latest tag.

The `org.gnome.Platform//45` runtime is a real dependency to be aware of. A machine that does not have it will download it, and that is a one time cost, but it does mean the application is tied to a specific GNOME runtime version.

## Building from source with meson and a manual schema step

The prerequisites for building are gtk4 and libadwaita development packages, rust, cargo, and bluez, which the README notes should be installed by default on all distributions.

The build sequence is meson rather than a plain cargo build, which tells you something about the project layout. There is a `meson.build` at the top level, a `run_devenv.sh`, a `subprojects/` directory and separate scripts for flatpak and packaging, `build-flatpak.sh` and `make-pkg.sh`. Cargo handles the Rust code and meson handles the desktop integration.

```bash
git clone https://github.com/kaii-lb/overskride && cd overskride
meson setup build && cd build
meson compile && meson devenv
mkdir -p ~/.local/share/glib-2.0/schemas
cp ../data/io.github.kaii_lb.Overskride.gschema.xml ~/.local/share/glib-2.0/schemas
glib-compile-schemas ~/.local/share/glib-2.0/schemas
./src/overskride
```

The last four lines are the part the author apologises for. The GSettings schema has to be copied into the user's schema directory and compiled with `glib-compile-schemas` before the application can read its settings, and the README comments that this should be automated later on but oh well.

That step is the price of not packaging for the system directly. In the flatpak the schema is handled by the runtime and the manifest, `io.github.kaii_lb.Overskride.json`, so the manual step only bites people building from source.

The application is then launched from the build directory as `./src/overskride`, which is the Rust binary rather than a wrapper script.

## The Rust stack behind a GTK4 interface

The Cargo.toml is where the engineering decisions become visible, and they are mostly about doing the Bluetooth work off the UI thread and keeping the interface simple to build.

The async runtime is tokio with the `full` feature, and tokio-util is there for its combinators. That choice is what allows the D-Bus and BlueZ work to be asynchronous instead of blocking the GTK main loop, which matters because a Bluetooth operation such as pairing can take seconds and a blocking implementation would freeze the window. The `futures` crate with the `futures-executor` feature is present as well, and `async-channel` provides the channel type used to move work between tasks.

On the desktop side, `gtk` 0.10.2 with the `blueprint` feature means the interface is defined in Blueprint, the declarative markup language for GTK4, rather than in Rust code. That is why `gtk4` appears under the `gtk` crate name in the manifest.

On the system side, `bluer` 0.17.4 with `dbus`, `dbus-crossroads`, `bluetoothd`, `id` and `serde` is the Bluetooth library, and `dbus` 0.9.9 plus `dbus-crossroads` 0.5.2 handle the D-Bus plumbing, with `serde` in the bluer feature list explaining the `phf` dependency for hash-based field handling.

Two more entries deserve a mention. `pulseaudio` is the `libpulse-binding` crate with the `pa_v15` feature, which is what makes the audio profiles feature possible. And `gettext-rs` with the `gettext-system` feature is the internationalisation layer, matching the `po/` directory in the repository tree, so the translations are standard gettext catalogues rather than a bespoke format.

The remaining dependencies are small and predictable: `uuid` for identifiers, `lazy_static` for the lazy statics the GTK binding pattern needs, and `tokio-util`.

## GPL-3.0 terms and a version number that lags the release

The licence field on the repository says GPL-3.0, with a COPYING file at the top level. GPL-3.0 is a strong copyleft licence, which matters for a desktop application rather than a library, because distributing a modified version of the application requires offering the corresponding source.

The maintenance picture is a project that is worked on steadily. The tagged releases are v0.6.3 on 2025-10-28, v0.6.5 on 2025-11-23 and v0.6.6 on 2026-01-02, and the last push was on 2026-09-01. There is a CHANGELOG.md in the repository, so the release history is documented there rather than only in tags.

There is one detail that suggests the Cargo manifest is not always kept in step with the releases. The Cargo.toml in this repository reads `version = "0.6.5"` while the newest tag is v0.6.6. For a project whose installation path is a nightly flatpak built by continuous integration, that is a minor inconsistency, but if you build from source it is worth checking which version you actually have, because the application reports its own version somewhere and the mismatch can make a bug report harder to place.

The release cadence also tells you something about the installation model. Because the recommended install is a nightly flatpak rather than a release artefact, the tagged versions matter less to a user than the quality of the most recent continuous integration build, and the README's own install commands point at a workflow run rather than at a tag.

For a Linux desktop tool with a flatpak distribution and a GPL licence, the practical summary is that you get an installable application with a stable dependency set, an asynchronous core, and a feature set with three clearly stated gaps around the system tray and automatic trust.

## Conclusion

Adopt overskride if you want a single Linux desktop window for Bluetooth device management, pairing and OBEX file transfers, and you are happy to run a flatpak on a BlueZ system. Skip it if you need a system tray applet, background operation without a window, or automatic trust on pairing, since the README lists all three as not working. Verify first that the nightly flatpak you install matches the Bluetooth stack on your machine, that the GNOME 45 runtime is available for it, and that the version in `Cargo.toml` matches the tag you are building from. The licence field on the repository says GPL-3.0, the last push was on 2026-09-01, and the newest release is v0.6.6.

## FAQ

### What is Overskride?

Overskride is a Bluetooth and Obex client written in Rust with a GTK4 and libadwaita interface, described as straight to the point and desktop environment and window manager agnostic. It manages devices, adapters and file transfers through BlueZ.

### How do I install Overskride on Linux?

Enable the Bluetooth service with `sudo systemctl enable --now bluetooth`, download the `.flatpak` from the latest build on the GitHub Actions page, install the GNOME platform runtime if needed with `sudo flatpak install org.gnome.Platform//45`, and then install the flatpak with `sudo flatpak install ~/Downloads/overskride-nightly.flatpak`.

### What are the build prerequisites for Overskride?

The README lists gtk4 and libadwaita development packages, rust, cargo, and bluez, which should be installed by default on all distributions. The build uses meson: `meson setup build`, `meson compile`, `meson devenv`, then copying the GSettings schema and running `glib-compile-schemas` before launching `./src/overskride`.

### What does Overskride not support?

The README's What doesn't work section lists applet support, in other words the system tray, background running with a tray applet, and quality of life items such as auto trust on pair and auto accept service.

### Which Bluetooth features does Overskride cover?

It can enumerate devices known or in range and sort them by RSSI with connected and trusted devices first, authenticate with devices, send and receive files, connect and disconnect, rename and remove devices, trust or block a device, turn the adapter on and off, set discoverability and its timeout, select between multiple adapters, rename an adapter, change the file storage location, auto accept files, configure audio profiles, set transfer rates, and poll battery over Bluetooth with experimental bluetooth options enabled.

### What licence is Overskride released under?

The licence field on the repository says GPL-3.0, with a COPYING file at the top level. The releases are v0.6.3 on 2025-10-28, v0.6.5 on 2025-11-23 and v0.6.6 on 2026-01-02, and the last push was on 2026-09-01.

## Sources

- [Issues](https://github.com/kaii-lb/overskride/issues)
- [kaii-lb/overskride on GitHub](https://github.com/kaii-lb/overskride)
- [License: GPL-3.0](https://github.com/kaii-lb/overskride/blob/main/LICENSE)
- [README](https://github.com/kaii-lb/overskride/blob/main/README.md)
- [Releases](https://github.com/kaii-lb/overskride/releases)

---

Hysen Labs editorial analysis, written from the project's own repository and release notes. Cite the canonical page: https://hysenlabs.com/projects/kaii-lb-overskride
