Changelog

What changed in each Mechvibes release, newest first.

Latest: v3.5.4, November 6, 2026

v3.5.4

Latest

On GitHub

Added

  • Mute Mood from the tray. A new "Mute Mood" item in the tray menu quiets the background sounds without opening the app. It is the same mute as the button on the Mood page, and the two always match.

Changed

  • Muting Mechvibes now quiets Mood too. "Mute sounds" in the tray, Ctrl+Alt+M, the mute toggle on Home and the automatic mute while your microphone is in use now silence the Mood sounds as well as your keyboard and mouse. Unmuting brings Mood back just as it was.

v3.5.3

On GitHub

Added

  • Mute while the microphone is in use, now on macOS and Linux. The switch in Settings > General is no longer Windows only. On macOS 14 and later it works with any microphone. On older macOS it watches microphones that are a device of their own, like a built-in or USB microphone, but not the microphone of a headset. On Linux it works with PulseAudio and PipeWire, and apps that record only your system sound, like a screen recorder, do not count.

v3.5.2

On GitHub

Added

  • Your own sounds in Mood. A new "Add your own sound" button on the Mood page takes an MP3, WAV, OGG, FLAC or M4A file, like a lo-fi track or a recording of your favorite café, and plays it on repeat. It gets its own switch and volume slider and mixes with the built-in sounds. Mechvibes keeps its own copy, so moving the original file later is fine, and the bin icon removes it again.

v3.5.1

On GitHub

Added

  • Mute while the microphone is in use (Windows). A new switch in Settings > General keeps Mechvibes quiet while any app is using your microphone, like a call or a recording, and brings the sounds back when the microphone is free. It works on its own, so a mute you set yourself with Ctrl+Alt+M stays as it was when the call ends. It is off until you switch it on.

v3.5.0

On GitHub

Added

  • Start hidden in the tray. A new switch in Settings > General opens Mechvibes in the background every time it starts, not only at login, with sounds on and the window hidden. Click the tray icon (the menu bar icon on macOS) or open Mechvibes again to show it.
  • A build for Intel Macs. Each release now has two macOS downloads: macos-arm64.dmg for Apple Silicon (M1 and later) and macos-x86_64.dmg for Intel Macs. Like the Apple Silicon build, it is experimental and not notarized.

Changed

  • Clearer screen after putting a theme on. It shows the theme's picture and who made it, and which parts it changed or left as yours. Done is the main button now, and Undo sits apart on the left so it is not clicked by mistake.
  • Hiding to the menu bar also hides the Dock icon (macOS). When you hide Mechvibes with the eye button, its Dock icon goes away too, and it comes back when you show the window again from the menu bar. When it starts minimized at login, it starts without a Dock icon as well. Closing the window with X still quits the app.
  • Usage stats now go to mechvibes.com. The one anonymous ping per launch (OS, app version and language) is counted by the Mechvibes website instead of Aptabase. The site keeps only a daily count and no IP address. You can still turn it off in Settings > Privacy.

Fixed

  • The Linux AppImage now starts on Fedora. It stopped with an error about a missing libbz2.so.1.0 file. The app now carries that library inside itself, so it no longer depends on how each Linux system names it.
  • Mood sounds no longer lag while you drag a volume slider. The volume is saved once you stop moving the slider, not on every step. The main slider now turns all sounds up or down together and keeps each sound's own level, instead of setting them all to the same volume.
  • The mouse wheel makes sound on Windows. Scrolling up or down now plays when the sound pack has sounds for MouseWheelUp and MouseWheelDown. The mouse packs that come with the app only have left and right clicks, so they stay quiet on scroll.
  • No more double sounds when one copy runs as administrator (Windows). If Mechvibes is already running as administrator, opening it again without admin rights no longer starts a second copy next to it, so each key plays once. It brings the running window to the front instead, and a library link or theme file opened at that moment is picked up.
  • Mood toggles, mute and play act once. Switching a sound on no longer starts it twice, and each click saves your settings once. Unmuting while paused stays silent, and a sound switched on while muted plays when you unmute.
  • The Windows key plays again, and Home, End and others play their own sound. Sound packs from Mechvibes 2 had the Windows keys, right Ctrl and Alt, the Menu key, Home, End, Page Up, Page Down, Insert, Delete, Print Screen, Pause and numpad Enter read as other keys, so some were silent and others played the sound of a different key. The packs that come with the app are fixed, and packs you brought over from Mechvibes 2 are fixed on their own the first time the new version starts.

v3.4.0

On GitHub

Added

  • A new Customize page. The look you have now sits at the top with Share, Import and Find more, and four tabs sit below it: Themes, Colors, Logo and Background. The Default card in Themes puts back the look Mechvibes starts with, and keeps your logo and background settings for later.
  • Choose which parts of a theme to use. Before a theme goes on, the dialog lists its colors, logo and background, each with a tick. Untick a part to keep yours. It also says when a theme will replace your logo or background.
  • See a theme before you use it. The dialog shows the theme the way the theme library does: a picture of it, its name, who made it and its description. A theme file can carry its own author and description, with credit for its images, and Mechvibes 3.3 still opens such a file. A short heading over the choices says what they are for. The picture is a small copy of the app as it will look with the theme on: its background, its logo and its colors. It follows what you tick, so an unticked part shows yours.
  • Undo. Right after you put on a theme or the Default look, Undo brings back the look you had before. It stays readable whatever the theme does to the colors.
  • Open a theme file with a double-click (Windows and Linux), or drop it on the Mechvibes window. The app comes to the front and asks before it changes anything.
  • Theme files have their own icon (Windows and Linux), so you can tell a .mvtheme file apart from the app.
  • Share saves straight to a file. The save dialog opens right away, and once the file is saved, Show file opens the folder it is in.
  • Share a theme as a link. Publish a theme on mechvibes.com/themes and it gets a short link, like mechvibes.com/t/f9try9c. Posted on Discord, the link shows a card with the theme's picture, and anyone can install it from there in one click.
  • A gallery of your themes. Customize > Themes opens with one line on what a theme is (colors, logo and background together), then shows every theme as a card with a small preview: Default, the ready-made themes, your own themes, and the themes you installed. Click a card to put it on. The theme you had stays in the gallery, so you can always click it again.
  • Four ready-made themes come with the app: Retro Beige, Midnight Blue, RGB Night and Rainy Cafe.
  • Your changes save on their own. There is no Save button. Editing your own theme updates it. Editing a ready-made or installed theme, or the Default look, saves your version as "<name> (my copy)" and leaves the original as it was. If you had your own logo or background before this version, it is saved as "My theme" the first time you open the app.
  • Share, duplicate, rename and delete themes from the "..." menu on a card. You can rename your own themes, and delete your own and the ones you installed.
  • Unused images are cleared. A week after no theme or setting uses an image Mechvibes saved, the app removes it. If you run more than one copy of Mechvibes (for example the installed app and a portable one), each copy only removes images it saved itself. If a theme in the other copy loses its image, import that theme again.

Changed

  • A theme only changes what it has. If a theme has no logo or no background, yours stays as it is. Before, the app turned yours off.
  • Clicking a theme card puts on that whole theme. A part the theme does not have is turned off, and your settings for it are kept for later.
  • Installing a library theme again updates it instead of adding it a second time. Importing the same theme file again uses the card you already have. Your own copies of a theme are never changed.
  • An installed theme keeps all its parts. If you untick a part when you install a theme, only the look you see now leaves it out; clicking the theme's card later puts on all of it.
  • "Reset to Defaults" in Settings keeps your look. It first saves the look you have as a theme, then puts back the default colors and turns off your logo and background. Click the theme in the gallery to get it back.
  • A theme from the library is checked before the app asks. The app downloads the theme and checks it first, so the dialog lists what is really in the file, and Use this theme puts on exactly that.
  • Images are stored once. Importing the same theme, or picking the same image, twice no longer makes a second copy of the image.
  • Packs without an icon get a cover. Instead of a music note, the pack picker and the Sound packs list show the pack's initials on a color picked from its name, so a pack always has the same color. Pack icons are rounded squares again, where some themes turned them into circles.

Fixed

  • The logo border takes the new theme's color when you switch themes. A border that uses one of the theme's colors kept the color of the theme before it until you restarted the app.
  • Colors you make are put on right away, instead of only being added to the list.
  • Deleting the colors you are using goes back to the default colors. The app asks first. If your colors go missing in any other way, the app shows the default colors too.
  • You now see an error when your changes cannot be saved, or when a picked image cannot be used. Before, the error only went to the log.
  • A damaged colors list is kept. Mechvibes used to replace it with an empty one. It now keeps a copy next to it, themes.json.corrupt, and tells you where. If the list cannot be read at all, nothing in it is changed until you restart the app.
  • The logo no longer changes color when you first edit it. Editing a part that is off turns it on and changes only what you edited.
  • A half-typed color is not saved. A color you type is saved once it is complete, or when you leave the field or press Enter.
  • Turning a background or logo image off takes it off the screen. Before, the old image, border and shadow stayed until you restarted the app.

Security

  • A theme can only change colors and a few known sizes. Theme files and the Colors editor keep only the app's color variables, light or dark mode, and corner, field and border sizes within normal limits. A color that would make text invisible is left out. A theme file is read only up to its size limit, and a theme file link that points at another computer is ignored.

v3.3.0

On GitHub

Added

  • Share your look with a friend. In Customize > Themes, click Share to save your theme colors, logo style and background, images included, as one .mvtheme file. Whoever gets the file clicks Import, sees what it holds, and clicks Use this theme to get the same look. Images set from a web address are saved inside the file, so it works without the internet. Their own themes stay in the list.
  • Shared themes stay small. Share cuts the wallpaper to the shape of the window and shrinks large images, so a theme with a 4K photo fits in a chat message. Animated images are kept as they are.
  • Ready for the theme library. When the theme library on mechvibes.com opens, its Install in Mechvibes button puts a theme on straight from the website. The app first shows what the theme changes and waits for you to click Use this theme. Windows and Linux.

Security

  • A theme file can only change colors and images. Imported theme CSS keeps only color and size settings, colors cannot load anything from the internet, and images are checked to be real pictures. Theme CSS is also handed to the window in a way it can no longer break out of.

v3.2.1

On GitHub

Fixed

  • Windows: upgrading through winget removes Mechvibes 2. winget installs silently, so the installer skipped its "Remove version 2?" question and left both apps running, and every key played twice. The winget package now asks the installer to remove Mechvibes 2 by itself. Your Mechvibes 2 settings and sound packs are kept, as with the question. Updating from inside the app works as before.

v3.2.0

On GitHub

Changed

  • Linux: X11 now reads the keyboard and mouse the same way Wayland does, and picks up devices plugged in while the app runs. With your user in the input group, Mechvibes reads keys, clicks and the mouse wheel straight from the input devices on X11 too, whichever window is in front, and a keyboard or mouse you plug in later, or that reconnects after sleep, is heard within a couple of seconds instead of after a restart. Without the input group, X11 keeps using the older listeners, so sound still works there. On X11 this adds the mouse wheel, and, as on Wayland, touchpad taps and two-finger scrolling make no sound. Thanks to @Palatis for the device handling and its tests (#122).

v3.1.0

On GitHub

Added

  • Install sound packs from the library in one click (Windows and Linux). On a pack's page at mechvibes.com/sound-packs, click Install in Mechvibes. The app opens, or comes to the front if it is already running, shows the pack's name, author and size, and installs it when you click Install. If you already have the pack and the library has a newer version, the same button updates it. Nothing is downloaded until you confirm, and the download is checked against the library's checksum. macOS still installs from the ZIP for now.
  • Importing a newer ZIP of a library pack updates it. Importing a library pack you already have used to stop with "already exists". A newer version now replaces the installed one, and the same or an older version says you already have it.

Changed

  • The Sound pack editor links open the new editor at editor.mechvibes.com.
  • Linux: opening Mechvibes again brings the running window back instead of starting a second copy, which played every key twice. Windows already worked this way, including that a --headless run now refuses to start while the app is open.
  • ZIP imports stop at a size limit. A pack whose config.json unpacks past 1 MB, or whose files unpack past 200 MB in total, is refused instead of filling the disk. Real packs are far below both.
  • A ZIP whose files would clash is refused with a clear message. Every file of a pack lands in one folder, so two files that end up with the same name, even if they differ only in capital letters or sit in different subfolders, made the installed pack depend on which one was unpacked last. The config is now the file named exactly config.json (myconfig.json used to count too), and there can be only one. File names Windows cannot store, such as NUL.ogg or one ending in a dot, are refused on every system, so a pack made on Linux installs on Windows too. macOS clutter such as __MACOSX and .DS_Store is skipped.

Fixed

  • Importing a ZIP works when Mechvibes is installed for all users. The check wrote a temporary file into the app's own folder, which is read-only under Program Files, so the import failed there.

Removed

  • The "Advanced editor" button when creating a theme. It led to a page the new website does not have.

v3.0.1

On GitHub

Added

  • Sound packs you added to Mechvibes 2 come over by themselves. The first time Mechvibes starts, it copies them into its own list, marked New, so there is no need to zip and import them again. The originals stay where they were. A pack you already have in Mechvibes is left as it is. This happens once, so a pack you delete afterwards does not come back.
  • macOS: Mechvibes offers to move the old MechvibesDX app to the Trash. If MechvibesDX is still in your Applications folder, Mechvibes asks once and moves it to the Trash when you click Yes. Your settings and sound packs stay. It does not ask while Mechvibes runs straight from the disk image.

Fixed

  • Sound packs with one file per key ("multi") play every key and stay as they are. Mechvibes used to rewrite such a pack to use a single file the first time it loaded, keeping only the keys that shared the most common file: every other key went silent, and the pack could no longer be opened as a multi pack. The pack is now left untouched on disk, and its files are joined in memory when it loads, so every key plays, with its press and release sounds if it has both. Packs made for the original Mechvibes still convert as before, with one sound per key played when the key goes down.
  • Stereo sounds no longer play with left and right swapped on some keys. A key whose timing fell between two samples, such as the .5 ms values in some bundled packs, could start in the middle of a stereo frame, so that key played with its channels reversed. Playback now always starts and ends on a whole frame.

v3.0.0

On GitHub

Changed

  • MechvibesDX officially becomes Mechvibes 3. It replaces the original Mechvibes app (version 2), so the version number carries on from there: after 0.8.4 comes 3.0.0, and the app is now simply called Mechvibes. What to do:
    • Windows, coming from MechvibesDX: nothing special. Click Download & install when the app offers the update, or run the new installer. Your settings, sound packs and "Start at login" carry over. Don't uninstall MechvibesDX first, because that deletes your settings and sound packs.
    • Windows, coming from Mechvibes 2: run the new installer. It finds Mechvibes 2 and offers to remove it: click Yes, or every key will play twice.
    • Linux: install the new .deb as usual. It replaces MechvibesDX or Mechvibes 2 by itself.
    • macOS: open the .dmg and drag Mechvibes to Applications (choose Replace if asked), then drag MechvibesDX from Applications to the Trash. macOS may ask you to allow Accessibility and Input Monitoring again.
    • Sound packs you added to Mechvibes 2 yourself are not moved over: import them again in the app, as a ZIP.
  • The project now lives at github.com/hainguyents13/mechvibes. The links in Settings and the tray menu, and the update check, point to the new address. The old mechvibes-dx address still redirects there, so earlier versions keep finding updates. The original Electron app moved to mechvibes-electron.

Added

  • Linux: mouse wheel scrolling now reaches the engine under Wayland. Scrolling was ignored because the input-device listener only looked at keys and buttons. Wheel up and wheel down now arrive as MouseWheelUp and MouseWheelDown, limited to one sound per 120 ms so a fast scroll does not machine-gun the samples. This is the mouse wheel only: two-finger scrolling on a touchpad is synthesized by the compositor and produces no wheel delta, so it stays silent. Whether you hear anything depends on your pack defining those two codes: as with every other key, a pack that does not define them stays silent rather than falling back to the left click. X11 is unchanged: its listener does not report the wheel yet.

Fixed

  • Windows: uninstalling keeps your settings and sound packs unless you ask for them to go. The uninstaller asked whether to remove your data, but it had already deleted the folder by then, so answering No changed nothing. It now deletes the folder only when you answer Yes, and No is the default. Your data stays in %APPDATA%\Mechvibes, where a reinstall picks it up again.
  • Importing a sound pack whose ID is already taken no longer replaces the installed pack. The check compared the bare ID from the ZIP against the prefixed IDs the app stores (mouse/…), so it could never match and the import went ahead, writing over the installed pack file by file. It now resolves the folder the import would write into and refuses when that folder already exists. An ID that belongs to a built-in pack is refused too: that import would have installed and then been hidden by the built-in pack, so it never played.
  • Linux: the tray icon menu works while the window is hidden. Hiding to the tray used to leave the menu able to act once: after a first Mute, Show or Exit nothing in it responded any more, and the mute checkmark moved without the sound changing. The window also came back behind every other window instead of to the front. The menu is now handled on the toolkit's own main loop, which keeps running while the window is hidden, and the window is raised and focused when it is asked for.
  • Linux: mouse clicks now make sound in every application under Wayland. On Wayland the mouse was read through X11, which only sees input while one of its own windows is under the pointer. Clicks in Wayland-native windows (the terminal, the file manager, the browser, and this app's own window) produced no sound at all, while apps that run through XWayland (Discord, for one) kept working. Mouse buttons are now read straight from the input devices, the same way keystrokes already are. If the input devices cannot be read, the previous behaviour stays as a fallback, and a click is never played twice. Two limits are worth knowing: the pointer gate is decided once at startup, so a mouse that is plugged in or reconnected while the app runs (over Bluetooth, or after the machine wakes from sleep) stays silent until the app is restarted; and touchpad tap-to-click is synthesized by libinput, so taps make no sound.

v0.8.4

On GitHub

Added

  • macOS: the menu bar icon now shows whether MechvibesDX has the permissions it needs. Click the icon and the menu lists Accessibility and Input Monitoring. A permission you have granted reads "Accessibility: Granted", with the word "Granted" in green and the rest in grey. The colours differ between light and dark menus, so each stays readable in both. One that is missing reads "Grant Accessibility…" or "Grant Input Monitoring…" in red, and clicking it opens System Settings at that permission's page. The status updates within about a second of changing it in System Settings, and that works even when the window has been hidden for a long time. Granting Accessibility now takes effect straight away, with no restart: until now, an app started without it stayed silent while its window was focused until it was relaunched. Granting Input Monitoring still needs MechvibesDX to be quit and relaunched, because macOS only lets an app capture keys globally if it had that permission when it started; until you relaunch, the menu can read "Granted" while sounds still stop when another app is in front. Windows and Linux menus are unchanged. Previously a missing permission only showed up as silence, for example no sound while another app is in front.

Fixed

  • Linux: the sound pack list is usable again. Opening the keyboard or mouse pack selector drew the list underneath the sections below it, so the Mouse section and the volume row sat on top of most of the options and picking a pack was guesswork. The list now floats above everything else, and clicking outside it closes it the way it should.
  • macOS: "Show MechvibesDX" in the menu bar now shows the window even when the app has frozen in the background. After the window had been hidden for a long time, for example when the app starts hidden at login and runs all day, choosing it could do nothing at all: the window never appeared and the app had to be quit and restarted. The part of the app that handled that menu item could freeze while the window was hidden, and it was also the only thing that could bring the window back. The window is now shown directly by macOS when you pick the item, and showing it lets the frozen part start running again. Windows and Linux are unchanged.
  • Importing a sound pack can no longer write files outside its own folder. A crafted pack ID or file name could place files elsewhere on disk. The ID now has to be a plain folder name, every file is written inside the pack's folder, and a pack with an unsafe name is refused with an error.
  • Numpad and system keys make sound again on Wayland. The numpad keys, NumLock, ScrollLock, PrintScreen, Pause and the extra key next to the left Shift produced no sound on Wayland while X11 worked: the input-device table had no entry for them and dropped them silently. They are mapped to the same names X11 emits, so the sound packs that already define them keep working.

v0.8.3

On GitHub

Changed

  • Logo and background customization now apply as you pick them. The "Save changes" buttons are gone: choosing a colour or an image updates the app straight away, so what you see is the result rather than a preview you had to commit. Reset is still there and now takes effect immediately too.
  • The autostart settings use the same wording on every platform. "Start with Windows" is now "Start at login", and its description and the "Start minimized" description no longer mention Windows.
  • macOS: permissions are now documented properly. Key capture needs both Accessibility (while the window is focused) and Input Monitoring (while it is minimized or another app is in front). Without Input Monitoring the app runs normally but is silent unless its window has focus. Because the app is ad-hoc signed, macOS can keep showing the permissions as on after you install a new build while they have stopped working; remove and re-add MechvibesDX in both lists, or run tccutil reset ListenEvent com.hainguyents13.mechvibesdx and tccutil reset Accessibility com.hainguyents13.mechvibesdx. The README, README-macos.txt and the troubleshooting section now say so.
  • The macOS installer's name no longer says "experimental". The DMG is now named mechvibes-dx-<version>-macos-<arch>.dmg, and its line in the release notes no longer calls it experimental or untested: it just says the app is ad-hoc signed, not notarized, and how to open it past Gatekeeper.

Fixed

  • The Reset button under Logo and Background now works. Pressing it appeared to do nothing and left the old colours in place. The panels kept their own copy of your settings and quietly wrote it back over anything you changed, which also made individual colour changes fail to stick.
  • Turning on background customization no longer leaves the background unchanged. With no colour picked yet, the app wrote an empty style rule that browsers discard, so the setting looked active while nothing happened. It now starts from your theme's colour. Choosing "Use image" before picking a file also falls back to the colour instead of blanking the background.
  • macOS: the app no longer crashes on the first keystroke. On recent macOS releases (Sonoma, Sequoia and later) the keyboard listener asked the system for the typed character from a background thread, which macOS only allows on the main thread, so the whole app was killed the moment you pressed a key. Typing now works while the window is focused and while it is minimized.
  • macOS: the keyboard listener for the focused window no longer errors out when Accessibility permission is missing. It used to run a startup check that always asked macOS for Accessibility access with a prompt, and stopped with an error if access had not been granted. It now checks first without prompting, asks at most once if access is missing, and if it is still missing logs that and leaves that listener off. Turn Accessibility on as described in the README to bring it back.
  • macOS: "Start at login" now actually works. The setting was saved but did nothing, and the app reset it to off on every launch because it could not see any login item. MechvibesDX now registers itself as a real login item, so it appears under System Settings > General > Login Items, where you can also remove it. This needs macOS 13 or later and the app installed in /Applications. If macOS asks you to allow it, the app opens that settings page for you, and if registering fails the switch turns itself back off instead of staying on for a login item that does not exist.
  • macOS: "Start minimized to tray" now takes effect. It was ignored because of the reset above. It also no longer relies on a launch flag: it is read from your saved settings, and those are now written to disk the moment you flip either switch, so they survive a logout or reboot right after you change them. This applies on every platform. If both switches are on, opening the app by hand also starts it hidden, as it already did on Windows.
  • macOS: "Show MechvibesDX" in the menu bar now brings the window to the front. After the app started minimized (for example from the login item), choosing it put the window on screen but behind whatever app you were using, so it looked like nothing happened. The app is now activated as well, and a window you had minimized to the Dock is restored. Windows and Linux are unchanged.

For developers

  • A release now comes from the same run that built it. .github/workflows/ci.yml replaces release.yml and is the only build workflow: a matrix (Linux, Windows and macOS, so macOS is checked on every pull request) that runs scripts/ci-check.sh --release, then each OS's packaging script. On a pull request into main it only verifies and uploads nothing; on a push to main (or manual dispatch) the packages are kept as artifacts of the run. Tagging a commit does not start a second run, so the commit is built once and the three packages and the draft release are never split across two runs: when the builds finish, a Find release tag job asks the remote whether a v* tag points at the built commit, and if one does, the same run extracts the release notes and drafts the release from those packages. The tag can be pushed with the commit or while the builds are running; if it arrives after the run has finished, re-run that job and nothing is rebuilt. The release is refused if the tag does not match Cargo.toml's version or already has a release (draft or published). A later push no longer cancels a commit's run (only a pull request cancels its own superseded runs), so a release cannot be killed halfway through and no commit is skipped. The workflow only installs what a script cannot (the cache, the OS's system libraries, cargo-deb, Inno Setup); the Linux library list lives in one shared action, and only main saves the cache. Each script verifies what it built: the AppImage and DMG are unpacked or mounted and compared with the source tree, and the Windows installer's name is checked against the auto-updater's filter.
  • scripts/lib/common.sh gains resolve_release_tag, which also runs locally: it prints the release tag the remote has for a commit.
  • The scripts check that Rust is at least the rust-version in Cargo.toml. scripts/ci-check.sh and the packaging scripts fail up front with a clear message if the active Rust is older than that floor (1.88), instead of failing part-way through a build; any newer Rust passes. An old Rust gets a hint to run rustup update stable, and a Cargo.toml with no rust-version fails with a clear message.
  • rdev is vendored in patches/rdev and wired in through [patch.crates-io], because rdev 0.5.3 asks macOS for the typed character from the wrong thread (the crash fixed above). Only the macOS keyboard code differs from upstream. Drop the patch once rdev publishes a release with the fix.
  • Building and running from source now works out of the box. cargo build copies the built-in sound packs next to the binary (target/<profile>/soundpacks), so ./target/release/mechvibes-dx and cargo run play sound instead of loading zero packs. Nothing is deleted and a copy failure never fails the build.
  • The minimum supported Rust is now 1.88.0, declared as rust-version in Cargo.toml, so an older compiler fails with a clear message and any newer Rust keeps working. .mise.toml pins the matching dioxus-cli 0.7.10.
  • The packaging scripts build for you. build-macos-app.sh and build-linux-appimage.sh now run cargo build --release --locked first, and build-windows-installer.ps1 builds with --locked. Each takes --skip-build (-SkipBuild on Windows) to reuse an existing binary, in which case it runs cargo check --locked instead, so a Rust older than rust-version or a stale Cargo.lock fails at the start. With the flag they also refuse a binary older than the sources it is built from, so a stale binary is never packaged under a new version. CI no longer needs the flag: each leg runs the script, which builds, packages and checks its own output.
  • build-linux-appimage.sh now also builds the .deb from the same binary (--no-deb skips it on a machine without cargo-deb).
  • A release now needs every platform to build. A failed Linux or macOS job used to be tolerated; it now stops the release rather than shipping without that platform's asset.

v0.8.2

On GitHub

🎹 The Sound Pack Editor is live

Make a MechvibesDX pack right in your browser: from a recording to a ready-to-use .zip.

How it works

Drop in a recording: any audio file, or even a video (it'll pull the audio track). Drag across the waveform to grab the sound you want, pick the keys it belongs to, and hit Apply. That's it.

Two ways to build:

  • Time segments: one recording, each key plays a different slice of it
  • Sound file per key: a separate file for every key (coming soon)

Things that make it faster

  • 🎯 Quick select: grab all letter keys, numbers, F-keys or modifiers in one click
  • 🔍 Auto detect: finds the individual hits in your recording so you're not hunting for them
  • ▶️ Preview: try the pack on your real keyboard before you export
  • 🎬 Video sync: scrub the video and the waveform follows, so you can see the exact frame each sound came from

When you're done

Export straight to a V2-standard .zip, ready to drop into MechvibesDX.

🔗 Try it: https://beta.mechvibes.com/editor 📖 Guide: https://beta.mechvibes.com/guides/editor


Added

  • Sound packs can now be sorted by name or by when you added them, and new ones are marked. The lists have a sort button, and a pack you have just imported carries a "New" badge in both the pack manager and the pack picker until you select it. Previously the lists were ordered by the folder's modification time, which moved whenever anything inside a pack was touched and had nothing to do with when the pack arrived. Packs already in your library when you update keep their place and are not marked as new.
  • The sound on/off switch is now on the Home screen, next to the volume sliders it controls, along with a link to the sound pack editor.
  • Updating is now one click. The button downloads, installs and restarts by itself instead of asking a second time. If a download fails it turns into a Retry button and stays there until it works or a newer version appears, with the manual download link still available.
  • Run without the window: mechvibes-dx --headless. Starts the sounds from a terminal with no window, no tray icon and no webview, using the same keyboard capture and the same settings as the normal app. Ctrl+Alt+M still mutes, Ctrl+C exits. This also gets the app working on machines where the window itself will not open, which on Windows means a broken or missing WebView2 and on Linux a broken webkit2gtk. Add --soundpack <name> (and --mouse-soundpack <name>) to try a different pack for that run only: your saved settings are read but never written, so nothing you have set up in the app changes.

Fixed

  • Mouse sound packs from the community now actually make sound. Packs made for Mechvibes++ were built in its keyboard editor, so their buttons were stored the way keyboard keys are. Importing one produced a pack that loaded, reported success, and then stayed completely silent no matter how much you clicked. Left, right and middle click are now recognised, and the separate press and release sounds are both kept instead of one replacing the other. Packs you imported before this update start working without being reinstalled.

  • The app no longer stalls for a second or two after every click. Dragging a volume slider saved the settings file on each tiny movement, dozens of times per drag, and each save blocked the interface. Settings are now written once you stop moving the slider.

  • Imported sound packs no longer appear twice in the list. A pack installed by you was recorded under two different names internally, so it showed up as a duplicate. Built-in packs were never affected. Press refresh in the Sound packs tab once after updating to clear the stale entries.

  • The audio device list is now filled in as soon as you open Settings, instead of showing "click refresh to load available devices" until you did.

  • Exported logs no longer contain your Windows account name. Log lines include file paths, which carry your user folder. The account name is now replaced with [username] in the exported file; everything else in the path is kept, since that is the part that helps with diagnosing.

  • A saved output device that no longer exists now falls back to your system default and shows that in Settings, rather than leaving nothing selected. If you had picked a specific device before this update, it is reset to the system default once: the old way of remembering it could silently point at a different device after you plugged or unplugged anything, so it is not worth carrying over. Pick your device again and it will stay put from now on.

  • Converted Mechvibes packs no longer play some keys at chipmunk pitch. When a classic pack mixed audio files recorded at different sample rates, the converter copied the odd ones in unchanged and labeled them with the wrong rate, so keys like the arrows, Home/End, or Delete played sped up and an octave too high. The converter now properly resamples every file to a common rate (and correctly folds down packs with unusual channel layouts). Already-converted packs keep the old audio: re-import the classic pack to get the corrected sound.

  • The window now opens fully on screen, whatever your display. On a 1366x768 laptop the app was taller than the usable screen, so the dock and the buttons above it sat below the bottom edge and could not be reached. On some machines the window also opened partly outside the desktop entirely, with no way to drag it back because the title bar itself was off screen. The window is now measured against the work area of the monitor it opens on, shrunk to fit if it is too tall, and centred there. Display scaling at 125% and 150% is accounted for, the taskbar is excluded from the space considered usable, and monitors sitting left of or above the primary one are handled. When the window is shortened, the content scrolls instead of being cut off.

  • Ambiance sounds now play on installed Linux builds. Rain, forest, campfire and the rest opened their audio files relative to whatever folder the app happened to be launched from, so on the .deb and the AppImage they were never found and the toggles did nothing. The bundled sounds are now located the same way soundpacks already were: inside the AppImage's own mount for AppImage users, under /usr/lib/mechvibes-dx/assets for the .deb, and beside the app everywhere else. When a sound genuinely cannot be opened, the error now names the exact path it tried.

v0.8.1

On GitHub

Added

  • Linux AppImage: releases now include a portable mechvibes-dx-<version>-x86_64.AppImage. Download, chmod +x, run on any distro. Like the .deb, it needs your user in the input group (sudo usermod -a -G input $USER, then re-log). Settings are stored in ~/.local/share/mechvibes.

Fixed

  • Windows settings now save on every install. If you installed to Program Files (the default when you install for all users), the app tried to keep your settings inside that folder, which Windows does not let a normal user write to. Settings reset on every restart and importing a soundpack failed with "Access is denied (os error 5)". Settings now live in %APPDATA%\Mechvibes, alongside where your custom soundpacks were already kept, and importing works again. Your existing settings are copied over automatically the first time you run this version, so nothing is lost.
  • Linux settings now actually save. The .deb build tried to write its config next to the binary in a system directory normal users cannot write to, so every setting silently reset on each launch. Settings now live in ~/.local/share/mechvibes following the XDG convention, and a config previously saved by running as root is migrated over automatically.
  • Linux fonts and styling restored. The .deb package never shipped the app's fonts and stylesheets, so the interface fell back to system fonts. They are now installed alongside the app.
  • Soundpack version checks were broken for every pack. A type mismatch and a wrong field name meant no soundpack ever passed the version check as designed; sound still played, but import validation was running on luck. Also, a soundpack made for a future format version now gets a clear "requires a newer version of MechvibesDX" message instead of a confusing missing-fields error.
  • Discord release announcements no longer get cut off: they now carry a one-line digest per change and link to the full notes.

v0.8.0

On GitHub

Added

  • Debug section in Settings: a live log viewer showing the app's most recent log lines in a small terminal-style window, an "Export logs" button that writes them to a file you can attach to bug reports, and a Verbose toggle that adds per-keystroke timing lines for diagnosing latency issues. Everything stays in memory and on your device until you press Export, key identities are always masked, and the Verbose toggle resets on every launch.

Fixed

  • "Start with Windows" no longer switches itself off. The app compared its registry entry against the wrong form of the path whenever "Start minimized" was also enabled, concluded autostart was off, and helpfully saved that conclusion over your setting. Both toggles now work, so Task Scheduler workarounds are no longer needed.
  • Keys used as global hotkeys by other apps now play sound. If another program (Rainmeter, macro tools, and similar) claims a key like F1 as a hotkey, Windows hides the key press from us but still delivers the release; the app now recognizes that pattern and plays the sound anyway. Mechvibes classic behavior restored.
  • Launching the app while it is already running now brings up the running window instead of doing nothing.
  • A damaged config file no longer wipes your settings. Unknown or invalid fields fall back to sensible defaults for that field only, and if the file is truly unreadable it is preserved as config.json.corrupt instead of being overwritten, so nothing is lost. Hand-editors: a soundpack slot set to "" is accepted and simply loads no pack for that slot.
  • Muting with Ctrl+Alt+M now updates the window immediately, matching the tray and in-app buttons.
  • The classic-Mechvibes converter backs up an existing converted audio file before overwriting it, and stops instead of proceeding when any backup fails.

Changed

  • Every settings write now goes through a single writer with atomic file saves. This is the structural fix behind the "my settings reverted" saga: previously twelve different places in the app could each save a whole copy of the settings, and whichever finished last silently undid the others. That mistake is now impossible to write, not merely discouraged, and a half-written settings file can no longer exist even if the app is killed mid-save.
  • The app name, version and credits moved from the Home page to the bottom of Settings, leaving Home to the things you actually use.

v0.7.2

On GitHub

Added

  • macOS DMG (experimental): the macOS build now ships as a proper .dmg with a drag-to-Applications app bundle instead of a bare-binary archive. Still unsigned and not notarized: right-click the app and choose Open the first time. Settings are stored in ~/Library/Application Support/Mechvibes. Untested on real hardware; reports welcome.

Fixed

  • Settings really stop reverting now. The 0.7.1 fix covered one path but missed the main one: a background service kept a copy of your settings from the moment the app started and wrote it back seconds later (and again every 24 hours), undoing whatever you had changed in between. Whichever setting you touched first after opening the app was the one you would see reset, which is why reports about "which setting resets" never agreed. Verified against the running app this time, not only in tests.

v0.7.1

On GitHub

Added

  • Anonymous usage statistics: the app now sends one anonymous ping per launch (OS and app version, nothing else) so we can tell how many people use MechvibesDX daily. No keystrokes, no personal data, no persistent identifiers. You can turn it off in Settings, Privacy section; details in the README.

Fixed

  • Settings no longer revert on their own shortly after starting the app. The background update check kept a copy of your settings from launch time and wrote it back after checking for updates, silently undoing anything you changed in between (volume, theme, toggles). This mostly hit people on slower connections who start the app once a day, which is why it was hard to reproduce.
  • Volume changes on the Home page could be lost when switching tabs quickly. The change is now applied immediately; only the disk write is delayed.
  • Muting from the tray menu now updates the window immediately instead of showing a stale icon until something else changed.

v0.7.0

On GitHub

Fixed

  • Severe input lag when a specific audio output device was selected: the app checked device presence inside the audio engine loop every second, and that check could take up to ~2 seconds depending on your device's position in the system list — delaying both the sound and the logo animation by that much, seemingly at random. Sound now plays within ~15ms of a keystroke regardless of which output device is selected.
  • Vietnamese input methods (Telex/UniKey/EVKey) no longer cause bursts of clumped sounds: when an IME rewrites text (e.g. "dd" → "đ", or restoring a mistyped syllable), it synthetically injects backspaces and replacement keys — each of which used to play a sound all at once. Software-injected keystrokes are now ignored; only keys you physically press make sound. Note this also means on-screen keyboards and macro tools no longer trigger sounds.
  • Logo animation keeps up with fast typing: the pressed-state transition was too slow to render each stroke at speed; each keystroke now shows a distinct pulse.

Changed

  • Removed the automatic switch to the system default output when the selected device disappears. The background polling this required is gone completely — zero periodic device probing while you type. If you unplug the device you selected, the app stays silent until you pick another one in Settings (or restart); your saved choice is kept. Selecting "System Default" is unaffected — the OS handles device changes itself.
  • Settings → Devices note updated: device changes apply immediately, no restart needed (restart remains a troubleshooting option).

Added

  • Diagnostic trace mode: launch with the environment variable MECHVIBES_TRACE=1 to print one line per keystroke with per-stage timings (input capture → audio engine → sound → UI) — useful when reporting latency issues.

v0.6.3

On GitHub

Fixed

  • The app no longer offers an update to the version you are already running. A version recorded before a manual upgrade could linger and make the app advertise itself as an update; the saved value is now cleared at startup and every update prompt double-checks the version before showing anything.
  • The app now relaunches itself after a one-click update. Previously "Restart to finish update" closed the app and the freshly installed version never started — an over-cautious installer guard was skipping the relaunch step. Verified end to end: close, silent install, automatic restart.

v0.6.2

On GitHub

Added

  • One-click update install (Windows): when a new version is available, the Settings page now shows a "Download & install" button that downloads the installer in the background, verifies its SHA-256 checksum against the release's SHA256SUMS.txt, and — after you confirm — installs silently and relaunches the app. Nothing is downloaded until you click, and choosing "Later" keeps the verified download ready for next time. If anything fails (offline, checksum mismatch, older release without checksums), the button falls back to opening the download page as before.
  • Linux .deb package: releases now include an installable Debian/Ubuntu package. Note: it does not add your user to the input group — run sudo usermod -a -G input $USER and re-log once after installing.
  • macOS build (experimental): an unsigned, untested arm64 build now ships with each release for adventurous testers; see the bundled README for Gatekeeper and Accessibility steps.
  • Releases now include a SHA256SUMS.txt covering every asset.

Changed

  • Tray icon dims while muted, and the tray's mute entry is now a fixed-label "Mute sounds" item with a check mark instead of swapping text. The correct state also shows immediately when the app starts already muted.
  • The update notification in the title bar now takes you to Settings instead of opening a browser download directly, so every install path goes through checksum verification.
  • On Linux and macOS, the updater no longer offers the Windows installer; it links to the releases page instead.

Fixed

  • Removed noisy window-focus logging and dead internal plumbing left over from the pre-worker input architecture.

v0.6.1

On GitHub

Fixed

  • Mute buttons had no effect on sound: the mute toggles on the home page, in Settings, and in the tray menu only saved the preference without telling the running audio engine, and the icon could get out of sync and toggle back on the next click. All mute paths now apply immediately and stay consistent with the Ctrl+Alt+M hotkey.
  • Soundpack selector dropdown was transparent/unreadable: a stale CSS variable from an older theme version made the dropdown background compute to transparent.
  • Device list disappeared when switching tabs: the enumerated audio/input device list is now remembered for the rest of the session instead of resetting to the "refresh" placeholder every time you leave and re-enter Settings.
  • Reset to Defaults now applies volume and mute state to the running engine immediately instead of requiring a restart.
  • Removed constant config file read/write churn (the app was rewriting its config about once per second while typing) and noisy window-focus logging in release builds.

v0.6.0

On GitHub

Added

  • Sound keeps working while the MechvibesDX window is focused (Windows): keyboard and mouse capture moved to a dedicated worker process using the Raw Input API, removing the old focused-window workaround (100Hz polling with ~10ms latency and missed keys during focus changes). Typing into the app window itself now sounds identical to typing anywhere else, and the Ctrl+Alt+M hotkey works regardless of focus.
  • Per-device input filtering on Windows: disabling a specific keyboard or mouse in Settings now actually silences that device (and only that device), effective immediately without a restart. Previously the setting existed but had no effect.
  • Automatic fallback when the audio device disappears: if the output device in use is unplugged (even mid-typing), sound automatically moves to the system default within a few seconds instead of going silent. Your saved device choice is kept on disk, so restarting the app returns to it once the device is back.

Changed

  • Audio playback moved to a dedicated engine thread: switching the output device in Settings now applies instantly at runtime (previously it only took effect after a restart, and could crash). The ambiance player follows the selected device too, including on startup. Input-to-sound latency is also slightly improved by replacing polling loops with blocking channel reads.
  • The input worker process supervises itself: if it crashes it restarts automatically, if the app exits it shuts down with it, and if it can't be sustained the app falls back to the previous capture method so sound never fully stops.
  • Removed the unused built-in music player (dead code — it was never reachable from the UI).

Fixed

  • Selecting an audio output device in Settings previously only saved the choice without applying it; ambiance sounds resume correctly after a device switch.
  • Hardened the Windows input path: fixed a supervisor crash that could permanently stop input in debug builds after a healthy worker restart, a stuck-key state when disabling a keyboard while a key was held, undefined behavior in raw-input buffer handling, and missing system message cleanup.

v0.5.2

MechvibesDX 0.5.2On GitHub

Fixed

  • Sound cutting off / clicking when typing fast: keyboard and mouse sounds now use a proper voice pool (oldest-first eviction) instead of a hashmap keyed by key name, so rapid repeated keys no longer cut each other's tails off. Added short fade-in/fade-out (2ms/5ms) to eliminate clicks/pops at segment boundaries, and soft (ramped) eviction instead of a hard cut when the voice pool is full.
  • Sound continuing to play after releasing all keys ("ghost typing"): the keyboard/mouse/hotkey event loops now drain their entire backlog every tick instead of processing one event at a time, so a fast burst of keystrokes can no longer queue up and keep playing sound after the user has already lifted their hands.
  • Poor audio quality from realtime resampling: soundpacks are now resampled once at load time to the output device's sample rate (using a high-quality sinc resampler) instead of relying on the audio backend's realtime linear resampling.
  • Removed a redundant device probe on every soundpack load; the output device's sample rate is now probed once at startup and cached, avoiding unnecessary device enumeration (which could briefly interrupt audio on Linux/ALSA).
  • Sample-rate lookup failures no longer fall back to a hardcoded 44100 Hz guess (which could cause audio to be resampled twice); they now skip resampling and keep the file's native rate instead.

Changed

  • Increased the keyboard/mouse voice pool limit (max_voices) from 20 to 32 to give more headroom for overlapping sound tails during fast typing.

v0.3.0

On GitHub

Added

  • Built-in keyboard soundpacks now support separate sounds for keydown and keyup events.
  • Added built-in mouse soundpacks with distinct sounds for mouse press and release.
  • Introduced the Mood page: users can enable ambient background sounds such as rain, forest, ocean, thunderstorm, fire, wind, stream, river, crickets, and coffee shop chatter to enhance focus and productivity.

Fixed

  • Resolved an issue where the automatic update system failed to trigger correctly.

Changed

  • Various minor improvements and internal optimizations.

Note: After installing this update, please Refresh soundpacks from the Soundpacks->Manage tab if you don't see the new built-in soundpacks.

v0.2.2

MechvibesDX update v0.2.2On GitHub

Here's the changelog for the latest update:

  • Now checks for updates automatically ✨
  • keyboard and mouse folders are created by default in soundpacks to make it easier to organize your old packs
  • Soundpack import via modal will auto-sort them into the right folders
  • Plus a few small core optimizations under the hood!

How to add your existing soundpacks to MechvibesDX

  • Open the soundpack folder via the app: Go to Soundpacks → Manager → Open soundpack folder
  • Inside, you'll see two folders: keyboard and mouse
  • Copy your existing soundpack folders into the appropriate one
  • Go back to the app and click Refresh

How to add new soundpacks from a ZIP file

  • Extract the ZIP and follow the same steps above
  • Or use the Import button in the Soundpacks tab for automatic placement

v0.2.0-hotfix

v0.2.0On GitHub

🎉 MechvibesDX update - major performance & UX improvements!

I'm excited to bring you the latest improvements to MechvibesDX and here's what's new:

🎵 Enhanced soundpack compatibility

  • Universal soundpack support - Now compatible with most soundpacks from the website and Discord community!
  • Easy migration process: Go to Soundpacks → Manager tab → Open soundpack folder → Copy your old extracted soundpacks from mechvibes_custom → Hit Refresh
  • The app will automatically convert old soundpacks to the new optimized format!
  • Added option to boost volume (Use at your own risk)

📁 Better organization

  • Separated keyboard and mouse soundpacks into dedicated folders for easier management
  • Cleaner file structure and better navigation

🔧 Audio engine upgrade

  • Switched from Rodio to Symphonia for superior audio processing and metadata handling
  • Smart optimization for "multi" type soundpacks - concatenates audio files and uses precise segment timing for maximum performance
  • Significantly improved audio loading and playback quality

📱 Small screen optimization

  • Reduced window size and component spacing
  • Optimized layout for better visibility on smaller displays
  • More compact UI without sacrificing functionality

🎨 Enhanced customization

  • Background & Logo customization - Easily switch between colors and images
  • More intuitive customization interface (image upload support coming soon!)

🔊 Audio device selection

  • Choose your audio output in Settings → Devices
  • Want Mechvibes sounds through speakers while wearing headphones? Now you can! ¯(ツ)/¯

✨ UI polish

  • Blur background for dock instead of solid colors for a more modern look
  • Overall visual improvements throughout the app

These updates focus on performance, compatibility, and user experience. The new soundpack system is much more efficient while maintaining compatibility with your favorite sound packs!

v0.1.0-beta

Pre-release

MechvibesDX BetaOn GitHub

🚨 In this beta release, MechvibesDX requests administrator privileges automatically to ensure full functionality.

Administrator privileges are required to:

  • Capture keystrokes from elevated processes (Task Manager, UAC dialogs, etc.)
  • Ensure consistent audio feedback across all applications

MacOS & Linux versions coming soon!


🔒 Security & safety warning

In this beta version, MechvibesDX does not collect any user data and does not send any information to any server.
All processing and configuration happen locally on your device.

To stay safe, please download MechvibesDX only from the official release page:
👉 https://github.com/hainguyents13/mechvibes-dx/releases

Avoid unofficial or modified versions, as they may contain viruses or malware.


MechvibesDX Beta release highlights 🚀

🆕 New features

  • Modern UI redesign: complete overhaul with Dioxus framework and Tailwind CSS
  • Dynamic theming: built-in themes with custom CSS support and real-time preview
  • Enhanced settings: comprehensive configuration with volume controls and startup options
  • Smart notifications: throttled notifications with user-configurable options
  • Optimized bundle size: significantly reduced application footprint with efficient asset bundling and dependency optimization
  • Mouse click sound support: configurable mouse click sounds with customizable volume and sound profiles
  • Advanced soundpack manager: import soundpacks with validation and conflict detection
  • Streamlined soundpack installation: improved install flow with automatic setup and hot-loading, no app restart or manual file copying required
  • Legacy soundpack compatibility: supports old soundpack configurations with automatic conversion to new format
  • Performance optimized: faster startup and reduced resource usage
  • App info panel: build information, version details, and system diagnostics
  • Conditional logging: debug output only when needed
  • System tray support: minimize to tray with context menu and dynamic status updates
  • Global hotkeys: toggle sound on/off with Ctrl+Alt+M from anywhere
  • Windows integration: start with Windows option and proper taskbar icon support
  • Open minimized: launch application directly to system tray without showing main window

🔊 Audio improvements

  • Better audio engine: improved sound processing with volume controls powered by Rodio and CPAL
  • Low-latency audio processing: CPAL (cross-platform audio library) ensures minimal audio delay and optimal performance
  • Soundpack validation: automatic validation of soundpack structure and configuration
  • Hot reload: real-time soundpack switching without restart
  • Enhanced input detection: improved keyboard and mouse event capture using rdev for cross-platform input monitoring

🧱 Technical stack

  • Built with Rust + Dioxus for native performance
  • Tailwind CSS for modern styling
  • rdev for cross-platform input event capture and global hotkey support
  • Rodio + CPAL for high-quality, low-latency audio processing
  • System-level input capture for global functionality
  • Cross-platform compatibility foundations

Community

Swap setups, find your next favourite pack and meet people who care how typing sounds as much as you do.

DiscordShare your setup15k+ members. Share packs and setups, ask questions, and help each other.Join the Discord
SourceForgeGet Mechvibes 3The new version is up on SourceForge. Download it there or leave a review.Open SourceForge
AlternativeToRecommend itTell others what you think, and help people looking for a keyboard sound app find it.Open AlternativeTo