No description
Find a file
Neo Huyghe 710d02735a
All checks were successful
Release / release (push) Successful in 3m28s
chore: 0.2.2
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-29 16:17:38 +02:00
.forgejo/workflows fix(ci): carry the tap token under a name Forgejo does not claim 2026-09-22 18:26:02 +02:00
crates fix(agent): find the mouse again after the receiver is replugged 2026-09-29 16:17:28 +02:00
packaging ci: release on a pushed tag, with GoReleaser 2026-09-22 16:46:50 +02:00
.gitignore ci: release on a pushed tag, with GoReleaser 2026-09-22 16:46:50 +02:00
.goreleaser.yaml feat(cask): install the user service and the desktop entry, and start it 2026-09-22 18:47:44 +02:00
Cargo.lock chore: 0.2.2 2026-09-29 16:17:38 +02:00
Cargo.toml chore: 0.2.2 2026-09-29 16:17:38 +02:00
clippy.toml feat(ring): the Actions Ring, opened at the cursor on Wayland 2026-09-21 00:10:42 +02:00
LICENSE-APACHE build(gui): fetch the device render instead of shipping it 2026-09-22 00:46:47 +02:00
LICENSE-MIT build(gui): fetch the device render instead of shipping it 2026-09-22 00:46:47 +02:00
README.md build(gui): fetch the device render instead of shipping it 2026-09-22 00:46:47 +02:00
rust-toolchain.toml feat: scaffold the workspace and port the MX Master 4 HID++ subset 2026-09-20 23:03:34 +02:00

mx4

A Linux-only replacement for Logitech Options+, for one mouse: the MX Master 4.

Button remapping, hold-and-swipe gestures, resolution, SmartShift, both wheels, per-application profiles, a haptic Actions Ring at the cursor, and a pulse in the hand when a notification arrives. Plain-TOML configuration, no account, no telemetry.

Why one device

Options+ covers every Logitech device on three platforms. This covers one device on one platform, which is what lets it be about 20k lines and a 12 MB daemon that maps no GPU driver at all.

Two processes

mx4d The daemon. Owns the mouse over HID++, synthesises input through uinput, and draws the Actions Ring.
mx4 The settings window. Writes config.toml and tells the daemon to re-read it.

Settings live in $XDG_CONFIG_HOME/mx4/config.toml — readable, hand-editable, and applied the moment it changes.

Requirements

  • A Wayland session. KDE Plasma is what it is developed against: the Actions Ring needs wlr-layer-shell, and it asks KWin where the pointer is because Wayland offers no way to ask directly.
  • Membership of the input group, for reading the mouse's buttons: sudo usermod -aG input $USER, then log out and back in. Without it every ordinary remap is silently inert.

Building

cargo build --release --workspace

Then run ./target/release/mx4d, and ./target/release/mx4 to configure it.

Licence

Dual-licensed under MIT or Apache 2.0, at your option.

Two vendored pieces carry their own terms, kept beside them:

  • crates/mx4-hidpp/ is a pruned fork of the hidpp crate by Lukas Schulte Pelkum, by way of OpenLogi's fork. 0BSD — see crates/mx4-hidpp/LICENSE.
  • crates/mx4-ui/action-icons/ are Lucide icons. ISC, with some derived from Feather under MIT — see the LICENSE beside them.

Not affiliated with Logitech

Logitech, MX Master and Options+ are trademarks of Logitech International S.A. This project is an independent, unofficial program that talks to a device its author bought. It is not endorsed by, sponsored by, or connected with Logitech in any way, and the names above are used only to say which device it works with and what it replaces.

The HID++ protocol it speaks was documented by Logitech in a public drive folder and mapped by the Solaar project over many years; this program owes both.