Mouser README

The project's README from github.com/TomBadash/Mouser. As one markdown file: README.md.

Mouser — Logitech Mouse Remapper

Mouser logo

English | 中文文档

A lightweight, open-source, fully local alternative to Logitech Options+ for remapping Logitech HID++ mice. The current best experience is on the MX Master and MX Anywhere families, with detection and fallback UI support for additional Logitech models.

No telemetry. No cloud. No Logitech account required.


Contents


Download & Run

No install required. Just download, extract, and double-click.

Windows Downloads macOS Apple Silicon Downloads macOS Intel Downloads Linux Downloads
Downloads

  1. Open the latest release page.
  2. Download the zip for your platform:
    • Windows — Mouser-Windows.zip
    • macOS (Apple Silicon) — Mouser-macOS.zip
    • macOS (Intel) — Mouser-macOS-intel.zip
    • Linux — Mouser-Linux.zip
  3. Extract it anywhere (Desktop, Documents, /Applications, wherever).
  4. Run the executable: Mouser.exe, Mouser.app, or ./Mouser.

That's it. The app opens, drops a tray / menu-bar icon, and starts remapping immediately.

What to expect on first launch

First-time notes


Screenshots

Mouse & Profiles Point & Scroll
Mouser — Mouse & Profiles page Mouser — Point & Scroll settings

Features

Button remapping

Device control

Cross-platform

Smart connectivity

Multi-language UI

Privacy first


Device coverage

Family / model Detection + HID++ probing UI support
MX Master 4 / 3S / 3 / 2S / MX Master Yes Dedicated interactive per-model layouts
MX Anywhere 3S / 3 / 2S Yes Dedicated interactive per-model layouts
MX Vertical Yes Generic fallback card (with DPI switch button support)
Unknown Logitech HID++ mice Best effort by PID/name Generic fallback card

MX Master and MX Anywhere devices have dedicated visual overlays. Other devices are still detected, show their model name, and can opt into an experimental layout override — button positions just may not line up until a real overlay lands. See CONTRIBUTING_DEVICES.md to add yours.


Default mappings

Button Default action
Back button (XButton1) Alt + Tab (Switch Windows)
Forward button (XButton2) Alt + Tab (Switch Windows)
Middle click Pass-through
Gesture button Pass-through
Gesture swipes (up / down / left / right) Pass-through
Mode shift (scroll click) Switch Scroll Mode (Ratchet / Free Spin)
Horizontal scroll left Browser Back
Horizontal scroll right Browser Forward
DPI switch (MX Vertical) Pass-through

Available actions

Action labels adapt per platform. Windows exposes Win+D and Task View; macOS exposes Mission Control, Show Desktop, App Exposé, and Launchpad; Linux falls back to compositor-native equivalents.

Category Actions
Navigation Alt+Tab, Alt+Shift+Tab, Show Desktop, Previous Desktop, Next Desktop, Task View (Windows), Mission Control / App Exposé / Launchpad (macOS), Page Up / Page Down / Home / End
Browser Back, Forward, Close Tab (Ctrl+W), New Tab (Ctrl+T), Next Tab (Ctrl+Tab), Previous Tab (Ctrl+Shift+Tab)
Editing Copy, Paste, Cut, Undo, Select All, Save, Find
Media Volume Up, Volume Down, Volume Mute, Play / Pause, Next Track, Previous Track
Scroll Switch Scroll Mode (Ratchet / Free Spin), Toggle SmartShift, Cycle DPI Presets
Mouse Left Click, Right Click, Middle Click, Back (Mouse Button 4), Forward (Mouse Button 5)
Custom User-defined keyboard shortcuts (any key combination, captured in the UI)
Other Do Nothing (pass-through)

Build from source

You only need this if you want to hack on Mouser or run a development build. Most users should grab a release zip — see Download & Run.

Common prerequisites

git clone https://github.com/TomBadash/Mouser.git
cd Mouser
python -m venv .venv
Windows
.\.venv\Scripts\activate
pip install -r requirements.txt

# Run from source
python main_qml.py

# Or start straight into the tray
python main_qml.py --start-hidden

# Build a portable zip
build.bat                # standard
build.bat --clean        # force clean rebuild

build.bat installs requirements, verifies that hidapi is importable, and packages with PyInstaller. The output lives in dist\Mouser\ — zip the folder and ship it.

To launch a source checkout without a console window, create a shortcut that uses pythonw.exe; see DEVELOPMENT.md.

macOS
source .venv/bin/activate
pip install -r requirements.txt

# Run from source
python main_qml.py
python main_qml.py --start-hidden     # launch directly to menu bar

# Build the native menu-bar bundle
pip install pyinstaller
./build_macos_app.sh

The output is dist/Mouser.app. The script reuses images/AppIcon.icns when present, otherwise generates one from images/logo_icon.png. Signing depends on whether MOUSER_SIGN_IDENTITY is set in the environment:

  • Unset (default): ad-hoc signs with codesign --sign -. Convenient for one-off builds, but the bundle's code identity can change on rebuild, so macOS may ask for Accessibility permission again.
  • Set to a codesigning identity (security find-identity -v -p codesigning to list them — SHA-1 form preferred): signs every nested .dylib / .so / .framework with hardened runtime options, then signs the outer app with the hardened-runtime exceptions at build_resources/Mouser.entitlements. This is a local developer signing path for repeated builds; stable macOS permission behavior depends on keeping the same source, resolved Python interpreter, dependency versions, architecture, signing identity, entitlements, and timestamp policy. A failing codesign --verify --deep --strict check aborts the build.
MOUSER_SIGN_IDENTITY="ABCD1234..." ./build_macos_app.sh   # local signed build
  • This is not a notarized release-signing flow. Public macOS release zips remain ad-hoc signed until a separate Developer ID signing, secure timestamp, notarization, stapling, and Gatekeeper validation workflow exists.
  • Build on the architecture you want to ship: an arm64 Python produces an Apple Silicon bundle, an x86_64 Python produces an Intel bundle. Set PYINSTALLER_TARGET_ARCH=arm64|x86_64|universal2 to override.
  • Release CI publishes both Mouser-macOS.zip (Apple Silicon) and Mouser-macOS-intel.zip (Intel) automatically on tag pushes.
  • Accessibility permission is required. See readme_mac_osx.md for the full grant flow and platform-specific notes.
Linux
source .venv/bin/activate
pip install -r requirements.txt

# Run from source
python main_qml.py

# Install device permissions (only needed once, then reconnect the mouse)
./packaging/linux/install-linux-permissions.sh

# Build a portable bundle
sudo apt-get install libhidapi-dev
pip install pyinstaller
pyinstaller Mouser-linux.spec --noconfirm

The helper installs 69-mouser-logitech.rules, reloads udev, and tries to modprobe uinput. After a successful run, reconnect the mouse, fully quit Mouser, and launch normally — no sudo. On systems without logind / uaccess, adding the user to the input group is the distro-specific fallback.

The first normal Linux launch creates or refreshes:

~/.local/share/applications/io.github.tombadash.mouser.desktop

The generated launcher uses absolute paths for the current portable app or source checkout, and syncs Mouser's app icon into the per-user hicolor icon theme when possible. If you move the checkout, launch Mouser once from the new path to refresh the app-menu entry. Enabling Start at login also manages:

~/.config/autostart/io.github.tombadash.mouser.desktop

That Linux autostart entry includes a short GNOME startup delay so Mouser does not race Bluetooth / HID initialization immediately after login.

xdotool enables per-app profile switching on X11; kdotool adds KDE Wayland support. Other Wayland compositors fall back to the default profile.

Automated releases: pushing a v* tag triggers .github/workflows/release.yml, which builds Windows, macOS (Apple Silicon + Intel), and Linux artifacts in CI and uploads them to the GitHub Release.

For project layout, the architecture diagram, the HID++ gesture detector, the Engine + reconnection flow, debug CLI flags (--hid-backend=iokit|hidapi|auto), and how to run the test suite, see DEVELOPMENT.md. To add a new device, see CONTRIBUTING_DEVICES.md.


Limitations


Roadmap


Contributing

Contributions are welcome.

Support the project

If Mouser saves you from installing Logitech Options+, consider supporting development:

Sponsor

Every bit helps keep the project going — thank you.


Acknowledgments

Mouser (TomBadash/Mouser)

personal
Searching Database…

5.3K ·GitHub
What is this?Mouser is a lightweight, open-source, fully local app for remapping Logitech HID++ mice (like the MX Master and MX Anywhere series), built as a free alternative to Logitech Options+.
Is this a background app or does it need a UI open all the time?It's a standalone desktop app that opens a settings window once, then keeps running in the tray/menu bar so you can close the window without quitting the remapper.
How do I get it running?Download the zip for your OS from the release page (Windows, macOS Apple Silicon, macOS Intel, or Linux), extract it anywhere, and run the executable (Mouser.exe, Mouser.app, or ./Mouser) — no installer needed.
Do I need Logitech Options+ installed, or an account?No account or cloud service is needed, but Logitech Options+ must not be running since both apps compete for HID++ access to the mouse.
Any catches with permissions or setup?macOS requires granting Accessibility permission for the event tap, Linux needs a one-time udev helper script for /dev/hidraw and /dev/uinput access, and per-device button mappings aren't fully separated yet (profiles are still global across devices).
Which mice work best with Mouser?MX Master and MX Anywhere families get the best experience with dedicated interactive layouts; other Logitech HID++ mice (like MX Vertical) are detected but only get a generic fallback UI.
Does Mouser send any data anywhere?No — all processing is local, the config is a plain JSON file on your machine, and there's zero telemetry, cloud connection, or account requirement.
What kind of remapping can I set up?You can remap any programmable button (middle click, gesture button, back/forward, mode shift, DPI switch), bind buttons to mouse clicks, record custom keyboard shortcuts, and choose from 40+ built-in actions.
Can mappings change automatically per app?Yes, Mouser supports per-application profiles that auto-switch mappings when the foreground app changes, for example different behavior in Chrome versus VS Code.
Does it support DPI and SmartShift controls?Yes, it offers a DPI slider from 200 up to the device max (8000 on MX Master) with quick presets, and can toggle Logitech's SmartShift ratchet/free-spin scroll mode, both mappable to buttons.
What happens if my mouse disconnects and reconnects?Mouser automatically detects power-off/on cycles and Bluetooth reconnections, rebinding HID++ and the OS mouse hook without requiring a restart, and replays SmartShift settings on every reconnect.
Creator
TomBadash
Size
9.1 MB
Stars
5.3K
Age
7mo
Commits · 90 Days