Change what your Logitech mouse’s buttons do from a plain text file

1 month ago

The mouse on your desk is a small computer. What each button does is stored inside the mouse itself. OpenLogi changes those settings from your own machine, free and open. The software that came with your mouse asks it for the same things. OpenLogi runs on Mac, Windows and Linux.

Ask

Ask about this presentation

Answers are generated from this presentation.

Chapters

  1. 0:00OpenLogi · a desktop app that configures Logitech devices
  2. 0:15You pick a button and say what it does
  3. 0:31Every setting in the mouse carries a permanent number
  4. 0:47The app asks the mouse where it keeps the sensitivity setting
  5. 1:26Four short messages change your pointer speed
  6. 1:44Forty four capabilities, each with a number OpenLogi knows
  7. 2:00Your settings live in one text file you own
  8. 2:26OpenLogi is free and open on all three desktops
  9. 2:48Your mouse is a small computer that takes orders
Show transcript

OpenLogi · a desktop app that configures Logitech devices

OpenLogi

a desktop app that configures Logitech mice, keyboards and webcams
Rust Apache-2.0 or MIT macOS, Windows, Linux v0.7.4
OpenLogi v0.7.4, released 2026-08-21

The mouse on your desk is a small computer. What each button does is stored inside the mouse itself. OpenLogi changes those settings from your own machine, free and open. The software that came with your mouse asks it for the same things. OpenLogi runs on Mac, Windows and Linux.

You pick a button and say what it does

You pick a button and say what it does.

the project’s own MX Master 4 side render, graphite, seen from the thumb side
Middle Click Gesture Button DPI Toggle Haptic Panel Forward Thumb Wheel Back
one background helper owns the connection to the hardware
OpenLogi device render, v0.7.4

OpenLogi draws your actual mouse on screen, with every button labelled. You pick one and say what it should do. The wheel. The thumb wheel. The gesture button. The toggle marked DPI, which changes how far the pointer travels when you move the mouse. A background helper owns the connection to the hardware.

Every setting in the mouse carries a permanent number

Every setting in the mouse carries a permanent number.

the sensitivity setting
0x2201
the wheel that switches between clicky and free spinning
0x2110
the battery level
0x1004
the same numbers on every Logitech device that has the feature
openlogi-hidpp/src/feature, v0.7.4

Inside the mouse, everything it can do carries a permanent number. The sensitivity setting is one number. The wheel that switches between clicky and free spinning is another. The battery level is another. And those numbers are the same on every Logitech device that has the feature.

The app asks the mouse where it keeps the sensitivity setting

The app asks the mouse where it keeps the sensitivity setting.

which device
which slot
which function
one message · at most 19 bytes of payload
OpenLogi → the mouse
the sensitivity setting · 0x2201 · to slot 0
slot zero is the same on every device, and it answers where the setting lives
the mouse → OpenLogi
a slot number
the slot this device keeps that setting in
the mouse → OpenLogi
0
a zero back means it does not have that
openlogi-hidpp/src/channel/message.rs and feature/root.rs, v0.7.4

The permanent number names the setting. Finding it on your mouse is a separate question. The mouse speaks a request and answer language called HID plus plus. Every message is nineteen bytes at most, and the first three bytes are an address: which device, which slot, which function. Every mouse files its capabilities in its own order. The sensitivity setting might sit in the fourth slot on your mouse and the ninth on somebody else’s. So the app asks. Slot zero is slot zero on every Logitech device, and slot zero’s whole job is to answer one question: where do you keep this? You hand slot zero the permanent number. The mouse hands back the slot it keeps that setting in. And a zero coming back is the mouse saying it does not have that capability at all.

Four short messages change your pointer speed

Four short messages change your pointer speed.

fn 0
count the sensors
fn 1
list the speeds that sensor accepts
fn 2
read the one in use
fn 3
write the new one
all four go to the slot the mouse just gave back
openlogi-hidpp/src/feature/adjustable_dpi.rs, v0.7.4

Once the mouse has told the app which slot holds the sensitivity setting, changing your pointer speed is four short messages to that slot. How many sensors read your movement? Which speeds will that sensor accept? Which one is in use right now? And here is the new one. Four messages, and the pointer moves differently.

Forty four capabilities, each with a number OpenLogi knows

Forty four capabilities, each with a number OpenLogi knows.

the sensitivity setting
0x2201
the wheel that switches between clicky and free spinning
0x2110
the battery level
0x1004
which computer the mouse is pointed at
0x1814
the high resolution wheel
0x2121
the thumb wheel
0x2150
the lights on the device
0x8070
the gesture pad
0x6501
0x0000 0x0001 0x0003 0x0005 0x0007 0x1000 0x1001 0x1815 0x1982 0x1990 0x19b0 0x1b04 0x1c00 0x1d4b 0x2100 0x2111 0x2200 0x2202 0x40a2 0x40a3 0x4301 0x4521 0x4522 0x4530 0x4531 0x4600 0x6100 0x6110 0x8040 0x8060 0x8061 0x8071 0x8081 0x8090 0x8300 0x8310
whether your device has one is the device’s own answer
44 feature ids, openlogi-hidpp/src/feature, v0.7.4

The same two step conversation covers everything else the mouse can do, and OpenLogi knows how to ask for forty four capabilities. The battery level. Which computer the mouse is pointed at. The lighting on a keyboard. You would expect the app to keep a list of which mouse can do what. Each mouse keeps that list itself.

Your settings live in one text file you own

Your settings live in one text file you own.

the project’s own diagram of where the settings go
schema_version = 4
selected_device = "receiver:aabbccdd:slot:1"
[devices."receiver:aabbccdd:slot:1"]
dpi = 1600
dpi_presets = [800, 1600, 3200]
[devices."receiver:aabbccdd:slot:1".bindings]
Back = "BrowserBack"
Forward = "BrowserForward"
one file, read by the app, the background helper and the command line tool
~/.config/openlogi/config.toml on Mac, Windows and Linux
“moving it afterwards would strand every existing user’s config.toml …”
docs/CONFIGURATION.md and openlogi-core/src/paths.rs, v0.7.4

Every answer lands in one plain text file in your home folder. The app, the background helper and the command line tool all read that same file, and you can open it and read it yourself. It sits in the same place on Mac, Windows and Linux. OpenLogi’s maintainer settled that one path before the Windows version shipped, and the note in the code says why. Moving the file afterwards would strand the copy every existing user already had.

OpenLogi is free and open on all three desktops

OpenLogi is free and open on all three desktops.

macOS
brew install --cask openlogi
or the signed, notarized .dmg
macOS 13 or later
Linux
.deb, .rpm or .pkg.tar.zst
amd64 and arm64
Windows
signed .msi installer or a portable .zip
x86_64 and arm64
Apache-2.0 or MIT · Rust · v0.7.4, released 2026-08-21
quit Logitech’s own app first: only one program at a time can own a wireless dongle
on Linux, quit Solaar too, the tool that manages these devices there
README.md and releases/latest, v0.7.4

OpenLogi is free and open under either of two standard licences, and it installs from Homebrew on a Mac, and from ordinary packages on Linux and Windows. The project’s install note says to quit Logitech’s own app first, because only one program at a time can own the little wireless dongle your mouse talks through. Version zero point seven point four landed today, and the project says it is still under active development.

Your mouse is a small computer that takes orders

Your mouse is a small computer that takes orders.

the OpenLogi app icon github.com/AprilNEA/OpenLogi
new repo tomorrow

Your mouse was keeping that list the whole time, and any program on your computer can ask for it. OpenLogi writes the answers where you can read them. April N E A slash OpenLogi, on GitHub. New repo tomorrow.