Skip to content

Releases: asavs/snakecharmer

Snakecharmer v0.10.0

Choose a tag to compare

@github-actions github-actions released this 27 Oct 17:52
f315572

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 charmctl to 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

Choose a tag to compare

@github-actions github-actions released this 19 Oct 22:45

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.exe and, 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

Choose a tag to compare

@github-actions github-actions released this 17 Oct 18:13
acc7146

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: CalloutSlot gained Button(u8), and ProtoError gained
    KeymapNotWritable.
  • New razer_proto::keymap module. 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" in docs/CRACKING-MICE-GUIDE.md.
  • Each device file has its own tests to copy, CONTRIBUTING has one set of build commands
    that matches CI, and docs/SPEC.md describes 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

Choose a tag to compare

@asavs asavs released this 24 Aug 04:17

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
    DeviceSpec names 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 DeviceSpec table 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::diagram is an Option, and a device
    with None is 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) no WH_MOUSE_LL hook 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-proto has one module per device under devices/, so a new mouse is a new file
    plus a line in SUPPORTED.

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 warnings passes again. An assertions_on_constants error had been
    failing CI since the autostart commit.

Breaking changes

For anything building on the crates:

  • DeviceSpec::diagram is now Option<Diagram>; device definitions need Some(...) or
    None.
  • DeviceSpec gained a polling field.
  • 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

Choose a tag to compare

@asavs asavs released this 11 Jul 02:53

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 and CRACKING-MICE-GUIDE.md walk you through cracking your own.
  • GPL-2.0-or-later. Protocol knowledge from OpenRazer.