Repository navigation
Releases: asavs/snakecharmer
Release list
Snakecharmer v0.10.0
Snakecharmer 0.10.0 brings the repository audit fixes together: safer device control, more reliable configuration handling, and a smaller default feature set.
Upgrade notes
- PC Vitals integration is now opt-in at build time (
--features pc-vitals), and is excluded from the downloadable binaries. - Quit the daemon before using
charmctlto control the mouse. The daemon and CLI now enforce exclusive device ownership. Standalone Python reference tools still require you to quit other controllers first. - Invalid or unreadable configuration now produces an error instead of silently falling back to defaults. Existing files are preserved; saves use atomic replacement.
- A device communication or verification failure stops further commands. Check that the mouse still moves and clicks before manually restarting Snakecharmer.
Changes
- Enforce read-before-write, read-back checks, terminal failure handling, and device/button allowlists in the supported control paths.
- Validate reload candidates before applying and committing configuration; prevent event traffic from starving maintenance work; report polling-read errors.
- Fix Win32 reentrant state access and keep platform input filtering independent of Razer device definitions.
- Link the Windows CRT statically and check executable imports in CI and release builds.
- Share diagram geometry and rendering, remove the inactive wheel-control scaffold, and make the diagram editor produce reviewable source changes without controlling the daemon.
- Bound and validate editor HTTP requests; reject ambiguous source replacements without writing files.
- Clarify startup registration and input-hook guarantees, pin protocol reference provenance, and test actual device-control methods with simulated transport.
- Separate daemon responsibilities and enforce standard Rust formatting and the expanded validation gates.
Validation and limitations
Automated checks cover default and optional-feature workspace tests, Clippy with warnings denied, release builds, Python safety/source-identity tests, formatting, site generation, and static CRT imports. Tests use simulated transport; this release does not claim new hardware or visible UI verification.
The existing DPI storage-selector difference from the pinned OpenRazer snapshot remains documented in NOTICE and the protocol reference notes. This release preserves the existing command bytes; it does not add device support or authorize new protocol writes.
Includes the safety baseline #30 and audit fixes #33–45 and #47–52. The existing website, Sponsor link, and alternatives updates are preserved.
Downloads: snakecharmer.exe is the tray daemon; charmctl.exe is the command-line controller. Both are Windows x64 executables.
Full changelog: v0.9.1...v0.10.0
Snakecharmer v0.9.1
Snakecharmer 0.9.1 adds the Razer DeathAdder V4 Pro, over the cable or its wireless dongle.
New mouse: DeathAdder V4 Pro
@YUZHEthefool ported it and tested it on their own mouse, wired and wireless (#14). Thank you!
- DPI from 100 to 45000, and polling rates up to 8000 Hz.
- It works the same way over the cable (
1532:00BE) and the dongle (1532:00BF). If both are plugged in, for example while the mouse charges, Snakecharmer uses the cable. - The V4 Pro has no lighting and no wheel DPI buttons, so Snakecharmer skips those settings.
- Thumb-button remaps work in software, as on the Elite. On-board binds are V3 only for now.
- The settings window lists its controls as rows. It doesn't have a picture of the mouse yet.
Also in this release
- The cracking guide has an optional step for adding on-board binds to a newly ported mouse.
Notes
- Download
snakecharmer.exeand, if you want the command line,charmctl.exe. No installer, no admin. Windows 10 and 11. - Protocol details come from OpenRazer. GPL-2.0-or-later.
Snakecharmer v0.9.0
Snakecharmer 0.9.0 saves button binds on the mouse itself. On the DeathAdder V3 you can
remap five buttons to any key or shortcut, and the binds keep working when Snakecharmer
is closed.
What's new
Binds saved on the mouse (DeathAdder V3). Snakecharmer used to remap buttons in
software, so remaps only worked while it was running. On the V3, binds are now written to
the mouse's memory. The mouse keeps them when it's unplugged and sends them with
Snakecharmer closed, and no mouse hook is needed.
Five buttons, any key. Back, forward, wheel click, wheel up and wheel down can each be
set to any key or shortcut on a US keyboard (F13 to F24 and the number pad included), to a
mouse function such as middle click, or turned off.
Set and test it in the settings window. Each button has a box on the picture of the
mouse. Click it and press the key you want, and it's saved right away. The window then asks
you to press the mouse button and tells you whether the mouse sent the right key.
Leftover Synapse binds cleaned up. Synapse can store remaps on the mouse, and they stay
after Synapse is uninstalled, which made buttons seem broken. Snakecharmer now checks when
the mouse connects and offers to reset them.
You can also set binds in config.toml under [onboard] or with
charmctl keymap set back ctrl+c, list them with charmctl keymap, and reset them with
charmctl keymap reset.
Also in this release
- The settings window works from the keyboard (Tab, Shift+Tab, Alt+Down) and with
Narrator. - Left and right click can't be remapped, so you can't lose the clicks you'd need to undo
a mistake. - Quitting puts the mouse back to normal. Before, the DeathAdder Elite's DPI buttons
stopped working until you unplugged it. - Thumb-button remaps you already had on the V3 move onto the mouse automatically.
- A guide to removing Synapse 4 completely,
docs/RAZER-REMOVAL.md, with audit and cleanup
scripts. It also covers Windows reinstalling Razer's driver and installer when you plug a
Razer mouse in, and what you can do about it.
For developers
- Breaking:
CalloutSlotgainedButton(u8), andProtoErrorgained
KeymapNotWritable. - New
razer_proto::keymapmodule. Porting a mouse works as before; on-board binds are an
optional extra step that needs a USB capture of Synapse writing them. See "Optional:
on-board binds" indocs/CRACKING-MICE-GUIDE.md. - Each device file has its own tests to copy, CONTRIBUTING has one set of build commands
that matches CI, anddocs/SPEC.mddescribes the current design. - Releases are built by CI from a version tag.
Notes
- Download
snakecharmer.exe(0.67 MB) and, if you want the command line,
charmctl.exe(0.45 MB). No installer, no admin. Windows 10 and 11. - On-board binds are V3 only for now. The DeathAdder Elite keeps its software remaps.
- The DeathAdder V4 Pro test build is still a pre-release for testing in #13.
- Protocol details come from OpenRazer and USB captures of
Synapse. GPL-2.0-or-later.
Snakecharmer v0.8.0
Second supported device, polling rate control, per-zone lighting, a redesigned settings
window, native autostart, and the tooling for adding further devices. 40 commits since
v0.1.0.
snakecharmer.exe is the tray daemon, charmctl.exe the optional CLI. Both are single
static binaries: no installer, no admin, no runtime dependencies. 0.60 MB and 0.41 MB.
Added
- DeathAdder V3 (wired, PID
0x00B2) support, alongside the DeathAdder Elite. - Polling rate control, from the tray, the settings window,
config.toml, or
charmctl set-poll. Both OpenRazer command families are supported, so devices that
accept 8000 Hz get it, and the dropdown lists exactly the rates the connected model
accepts. - Per-zone lighting. The scroll wheel and logo can carry different effects and colors.
- "Start with Windows" as a tray toggle, replacing the install/uninstall PowerShell
scripts. It reads the registry state when clicked, so an entry revoked elsewhere (Task
Manager, for example) is reflected rather than overwritten. charmctl devices, which lists the Razer mice attached and marks which are supported.- A notice for unsupported devices. Opening Settings with a Razer mouse that has no
DeviceSpecnames that device and offers to open the device list, instead of naming
the models you do not own. This is enumeration only: unsupported hardware is still
never opened or written to. docs/DEVICE-WISHLIST.md, listing the 113 Razer mice whose protocol OpenRazer already
documents, with each model's USB id, transaction id, maximum DPI, lighting zones and
polling command family. It is generated from OpenRazer's source by
tools/wishlist-from-openrazer.py.- An issue form for requesting a device, which asks for three read-only pieces of
information and does not require cloning the repository. AGENTS.md, a brief for coding agents. Both devices here were ported with one.tools/diagram-editor.html, a point editor for authoring button-map diagrams.- A local health capsule: a small JSON status file for the PC Vitals ecosystem, published
at lifecycle changes with no polling thread.
Changed
- Device support is a
DeviceSpectable rather than DeathAdder Elite specifics. Each
device declares its transaction id, DPI range, lighting zones, polling command family
and whether it has wheel DPI buttons, so features are gated on what the hardware has. - Button-map diagrams are optional.
DeviceSpec::diagramis anOption, and a device
withNoneis fully functional: the settings window lists its controls as labeled rows
instead of callouts on a schematic. - The settings window is built around a vector schematic of the connected device, with
each control placed beside the button it configures and the layout following the
device's capabilities. The schematic is shape data, and one definition renders both the
window and the SVGs in the docs; a test fails if the two disagree. - Tray DPI presets are derived from the connected device's range instead of a fixed list.
- The thumb-button hook is installed only when a remap is configured. At the default
(none/none) noWH_MOUSE_LLhook exists. - Session retry uses exponential backoff and resets after a healthy session. Devices with
no button listener get a 5 second liveness tick; there is no polling thread. razer-protohas one module per device underdevices/, so a new mouse is a new file
plus a line inSUPPORTED.
Fixed
- The tray menu responds while no device is connected. Quit, Settings and the autostart
toggle previously went unserviced during the retry gap. - The Retry button on the no-device notice probes immediately rather than waiting out the
backoff, and reopens Settings if the probe succeeds. cargo clippy -- -D warningspasses again. Anassertions_on_constantserror had been
failing CI since the autostart commit.
Breaking changes
For anything building on the crates:
DeviceSpec::diagramis nowOption<Diagram>; device definitions needSome(...)or
None.DeviceSpecgained apollingfield.- The feature booleans are now feature data:
dpi_buttons: Option<DpiButtons>and
rgb_zones: &'static [u8].
Documentation
docs/ALTERNATIVES.md compares the other tools in this space and states which needs are
better served elsewhere: lighting effects and game sync by OpenRGB and SignalRGB, macros
by AutoHotkey, Linux by OpenRazer. Requests for those are redirected rather than built,
because each needs a permanently running process.
Also added: a safety FAQ in the README, CRACKING-MICE-GUIDE.md for porting a device,
docs/DRAWING-MICE-GUIDE.md for its diagram, and docs/how-deep-could-you-go.md on why
this stays in userland.
Notes
- Windows 10 and 11. A macOS port is possible, since the protocol layer is portable and
the Win32 layer is not. If you are on macOS with a Razer mouse, open an issue and say
which model. - The version jumps from v0.1.0 to v0.8.0 because the crate version had been running
ahead of the public tags. This release brings them level. - One process, no kernel drivers, no telemetry, no account. About 17 MB idle.
- Not supported: game-synced RGB, audio visualizers, macros, cloud profiles, accounts,
telemetry, DPI stages. - Protocol knowledge comes from OpenRazer. GPL-2.0-or-later,
as theirs is.
Snakecharmer v0.1.0
First public release of Snakecharmer — a tiny native Windows replacement for Razer Synapse, scoped to the DeathAdder Elite.
Download below: snakecharmer.exe (the windowless tray daemon) and charmctl.exe (the console CLI). No installer, no runtime deps — drop them anywhere and run.
⚠️ These binaries are unsigned. On first run Windows SmartScreen will show "Windows protected your PC" — click More info → Run anyway. This is expected for an unsigned indie build, not a sign anything's wrong. Code-signing and a Microsoft Store listing are planned so this warning goes away in a future release.
Footprint vs Razer Synapse
| Razer Synapse | Snakecharmer | Δ | |
|---|---|---|---|
| On-disk size | 500 MB | 0.43 MB | ~1,160× |
| Idle RAM | ~558 MB | 17 MB | ~32× |
| Idle CPU | ≈ 1 CPU·h/day | ≈ 0.06 CPU·h/day | ~17× |
| Processes | 6 (incl. Chromium/CefSharp) | 1 | 6 → 1 |
| Telemetry | yes | none, local-only | — |
Features
- DPI — set and lock sensitivity, re-asserted at login.
- DPI-button remap — the two wheel buttons (private Razer vendor codes) → keystrokes.
- Thumb-button remap — Back/Forward → keystrokes via a low-level hook.
- RGB lighting — static, breathing, spectrum, or off.
- System tray + native settings window.
Notes
- Requires Windows 10/11 and a Razer DeathAdder Elite (
VID 0x1532 / PID 0x005C). - Want a different mouse? The
reference/toolkit andCRACKING-MICE-GUIDE.mdwalk you through cracking your own. - GPL-2.0-or-later. Protocol knowledge from OpenRazer.