Releases: RedBearAK/Toshy
Release list
Toshy v26.08.0
Toshy v26.08.0
Releases from this project are meant only as records of major changes. There will be automatic attachments generated by GitHub, but to get the latest version download the zip from the green <> Code ▼ button on the main page, or use the [quick-install one-liner command](https://github.com/RedBearAK/toshy/wiki/How-to-install-Toshy-with-a-single-command).
Changes
This release covers roughly mid-July through early August 2026. The headline items are experimental NixOS support, Alpine Linux support, and automatic detection of native desktop environment shortcuts (screenshots, app launcher, input source switching) so that the remaps match whatever the DE is actually using.
New distro support
- Add experimental support for NixOS^ — Nix flake with both a NixOS module and a Home Manager module, a runtime environment seam so launchers and services resolve the right interpreter and PATH, an
install-user-filesinstall path for declaratively-managed systems, and a scaffold script for fresh NixOS installs. - Add support for Alpine Linux^^ —
bootstrap.shconverted to POSIXshfor dash/busybox,bashandshadowadded to the package list, eudev quirk handling. - Add
artixanddevuandistro IDs, which follow the existing non-systemd install path (systemd-related packages are dropped automatically; the config process has to be launched manually or autostarted at login by whatever method the DE provides). - Let
list-distrossetup sub-command count NixOS/nix in its totals, and update its output notes. Setup script now supports 12 package manager types, 19 base Linux distro types, and knows 58 specific distro IDs.
New features and improvements
- Read native screenshot shortcuts from the desktop environment and generate matching remaps automatically, instead of relying on hard-coded defaults that may not match the user's DE version or their customizations^^^
- Detect the DE's live native app launcher and input source switching shortcuts the same way, with a new setting that swaps which Toshy shortcut lands on each: with the swap enabled,
Cmd+SpaceandShift+Cmd+Spacecycle keyboard layouts and the launcher moves toCtrl+Space, matching Mac OS X Tiger and earlier, before Spotlight took overCmd+Space - Add
toshy-terminal-menu, a fully functional terminal-based alternative to the tray icon and GTK preferences apps, for systems having trouble with the GTK apps or unable to install the packages they need - Migrate multi-tap handling into the keymapper (xwaykeyz 1.25.0)
- Support conditional timeouts in the keymapper (xwaykeyz 1.24.0)
- Add
toshy-sharecommand for getting text out of VMs - Cinnamon: fix the menu applet's shortcut on install and revert it on uninstall, and avoid triggering the bug reporter dialog on Cinnamon 6.8+
- GTK4 preferences app: reduce window height for small screens, consolidate theming into a single CSS module, rework the Tools panel
- Installer: pre-flight the keymapper and move the admin privileges question earlier in the run
- Add
toshy-detector-checkdiagnostic command for auto-detected shortcuts - Update Thunderbird, VSCode, and other app keymaps
- Flip the suspend timeout default in the config
Fixes
- Fix buggy lock key toggle notification functions
- Lift the CapsLock mode submenu up to the main menu level, working around a nested sub-submenu bug observed on both COSMIC and GNOME (submenu collapsed instead of expanding to reveal 3rd-level submenu items)
- Prevent excess
doaspassword prompts by preserving thepersistticket across elevated calls^^ - Don't show bogus privilege prompts on
doassystems - Prevent detached processes from emitting output into the terminal that launched them
- Handle a missing Cinnamon screenshot shortcut instead of failing on it
- Correct the terminal and GUI screenshot remaps, and use a nested keymap for the Spectacle window screenshot
- Fix PATH resolution on NixOS for services, bin commands,
pgrep, and device checks - Let NixOS users actually run the reinstall command
- Work around a deprecated setuptools error and pin
python-xlib==0.31via overlay on Nix - Fix executable bits on several scripts
- Reduce total file read calls during shortcut detection
Installer/setup tweaks
- Standardize scripts on the
/usr/bin/env bashshebang, withbootstrap.shas the deliberate POSIXshexception - Migrate launchers and services to the shared runtime environment script
- Show the resolved interpreter path alongside versions in
toshy-versions - Vendor sync xwaykeyz 1.24.0, 1.25.0, and 1.25.1
- Ignore the branch reset script
^ NixOS works in testing, but expect rough edges, and expect the mechanics to change significantly over time. NixOS needs the Toshy files installed into the user's home while the Python environment and binaries come from Nix, so the install grew an install-user-files path and a runtime environment seam that resolves interpreter and PATH at launch time rather than at install time. The flake exposes a NixOS module and a Home Manager module.
^^ Alpine uses doas rather than sudo, and doas keys its persist ticket on the parent process PID. Running elevated commands through a shell gave doas a fresh, disposable /bin/sh parent every time, which defeated the ticket and caused a password prompt on every single call during the install.
^^^ Screenshot shortcuts vary widely between desktop environments, between versions of the same DE, and between users who have customized them. Toshy now reads the actual configured shortcuts at config load time and resolves them through a tiered fallback to hard-coded defaults when nothing can be read. Tested on GNOME, KDE, Cinnamon and COSMIC. The auto-generated remaps can still be overridden with a custom keymap per DE in the editable "user_apps" slice of the config, and toshy-detector-check will show the keymaps that were generated automatically, to be used as a starting copy for those overrides.
Auto-generated full release notes (click to expand):
What's Changed
- Fix buggy lock key toggle notification functions by @RedBearAK in #867
- Reduce height of GTK4 preferences app by @RedBearAK in #868
- Consolidate and update theming by @RedBearAK in #869
- Support conditional timeouts in keymapper by @RedBearAK in #870
- Vendor sync xwaykeyz 1.24.0 main by @RedBearAK in #871
- Flip suspend timeout, add MultiTap support by @RedBearAK in #872
- Update Thunderbird, VSCodes, other keymaps by @RedBearAK in #874
- Ignore branch reset script by @RedBearAK in #875
- Experimental NixOS support by @RedBearAK in #876
- Scaffold script for fresh NixOS installs by @RedBearAK in #877
- NixOS support that actually works by @RedBearAK in #878
- Add note on NixOS support working by @RedBearAK in #879
- Update NixOS dev notes by @RedBearAK in #880
- Let list-distros count NixOS/nix by @RedBearAK in #881
- Alpine Linux support, doas improvement by @RedBearAK in #882
- Reduce prompt displays on doas systems by @RedBearAK in #883
- Keep doas from showing so many prompts by @RedBearAK in #884
- Update list-distros output notes by @RedBearAK in #885
- Update supported distro IDs by @RedBearAK in #886
- Get screenshot remaps from each DE automatically by @RedBearAK in #887
- Improve multi-DE screenshot remap handling by @RedBearAK in #888
- Improve check command logging by @RedBearAK in #889
- Improve logging from config, esp. screenshots by @RedBearAK in #890
- Terminal menu app, shortcut detectors by @RedBearAK in #891
Full Changelog: Toshy_v26.07.1...Toshy_v26.08.0
Toshy v26.07.1
Releases from this project are meant only as records of major changes. There will be automatic attachments generated by GitHub, but to get the latest version download the zip from the green <> Code ▼ button on the main page, or use the quick-install one-liner command.
Changes
A point release, roughly two days of work after v26.07.0. The headline is a rebuilt CapsLock options system and a new interactive key-identity diagnostic.
Note
Existing users with a CapsLock option set: The old Caps2Cmd and Caps2Esc_Cmd toggles have been replaced by a single CapsLock Mode selector (see below), and there is no automatic migration between them. On first start after upgrading, if Toshy finds one of the old settings active, it sends a notification and clears it — so your previous CapsLock behavior will revert to default until you re-select what you want from the new CapsLock Mode menu, in the tray icon or the Preferences app. This is a one-time step. Nothing else you have set is affected.
New features and improvements
- CapsLock Mode selector, replacing the two independent
Caps2Cmd/Caps2Esc_Cmdtoggles with a single list of mutually exclusive modes. One CapsLock behavior is active at a time, chosen by name, which removes the old problem of two overlapping toggles producing an ambiguous or contradictory result. The available modes:- Caps is Caps (default) — a normal CapsLock toggle. Nothing is remapped.
- Caps is Caps & Cmd — tap for the CapsLock toggle (useful on international layouts that have Caps-layer characters), hold for Cmd.
- Caps is Cmd — hold for Cmd, in both GUI apps and terminals. No CapsLock toggle in this mode.
- Caps is Esc & Cmd — tap for Escape, hold for Cmd.
- Caps is Esc & LCtrl always — tap for Escape, hold for a real, literal Ctrl even in GUI apps (so native Linux Ctrl shortcuts respond — handy for Emacs in a GUI window). The physical Left Ctrl is untouched.
- Caps is Esc & LCtrl role swap — tap for Escape, hold takes over Left Ctrl's usual Toshy role (Super in GUI apps, real Ctrl in terminals); the physical Left Ctrl becomes the CapsLock toggle.
- Caps is LCtrl role swap — Caps and Left Ctrl trade places, with no Escape behavior.
- Several of the modes now cover terminals as well as GUI apps on Mac and Windows keyboards. The old
Caps2Cmdtoggle was GUI-only, which left CapsLock as a live toggle in terminal windows — a gap the mode system closes. toshy-keycheck, a new interactive diagnostic command. It shows a single card in the terminal with the real hardware identity of the last key you released, what it was remapped to, and which modmap or multi-purpose modmap was responsible. Multi-purpose keys (like a CapsLock key in one of the tap/hold modes above) show both of their identities and how the press actually resolved — tap, hold-timeout, or a second key pressed while holding. It is a focused alternative to reading the fulltoshy-debuglog stream. Liketoshy-debug, it stops the Toshy services first (it explains this and asks before doing so), and reminds you to runtoshy-services-restartwhen you exit.- The tray menu and GTK4 Preferences app were reorganized into columns with colored section headers, to fit the new CapsLock Mode group without crowding.
Fixes
- The
.gitfolder is no longer copied into the install location. Beyond wasting space, a stray.gitin the installed tree could confuse tooling that walks up looking for a repository root. - The version script handles mistyped options more gracefully instead of failing unhelpfully.
- Duplicate settings-change events no longer flood the debug log, which made real events hard to spot when tailing the output.
- The vendor sync script (a maintainer-side tool) is no longer copied into user installs.
Auto-generated full release notes (CLICK TO EXPAND):
What's Changed
- Handle version script option typos better by @RedBearAK in #864
- Prevent .git folder from being copied to install by @RedBearAK in #865
- CapsLock modes, toshy-keycheck command by @RedBearAK in #866
Full Changelog: Toshy_v26.07.0...Toshy_v26.07.1
Toshy v26.07.0
Releases from this project are meant only as records of major changes. There will be automatic attachments generated by GitHub, but to get the latest version download the zip from the green <> Code ▼ button on the main page, or use the quick-install one-liner command.
Changes
This release covers roughly mid-June through mid-July 2026.
Caution
Existing users: The keyboard layout correction API call lives in an editable section of the config (keymapper_api). Reinstalling Toshy splices your existing editable slices into the new default config to preserve your customizations, which means a new or changed API call will not magically appear on its own, even after reinstalling.
The first parameter has been renamed from enabled to correction_enabled (the old name was far too generic for a name landing in the config's global namespace). If you tried the layout correction feature from the last release, a leftover keyboard_layout_correction(enabled=True) in your config will now raise a TypeError and your config will fail to load. The try/except NameError guard does not catch this.
Open your config, find the keymapper_api section, and replace any older keyboard_layout_correction() call with this one — or add it, if you installed Toshy before the feature existed. Then restart Toshy with the toshy-services-restart command (or the restart item in the tray indicator menu) so the edited config is reloaded:
# Requires xwaykeyz v1.23.0 or later
try:
keyboard_layout_correction(
correction_enabled = False,
correct_number_row = False,
symbol_miss_policy = 'fold',
folded_miss_policy = 'placeholder',
symbol_placeholder = '?'
)
except NameError:
passFlip correction_enabled to True to turn the feature on. It remains off by default until I can get more feedback from users of international keyboard layouts.
Note
Toshy now vendors the keymapper. xwaykeyz (and the KWin application switcher script) are kept in the repo under vendors/, pinned to a specific upstream commit, and the installer installs from those in-tree copies instead of cloning from another repo mid-install. A release now carries the exact keymapper revision it was tested against, so a regression or incompatibility landing in the keymapper's main branch can no longer reach a Toshy release after the fact.
This pins the keymapper, and only the keymapper. An older Toshy release still installs pip packages into its venv and still depends on native system packages, and those keep moving — a distro renaming a package, or a major version jump in something like PyGObject, can break an older release regardless of which keymapper is embedded in it. Vendoring is not a time machine.
New features and improvements
- Non-US keyboard layout correction, phase 2: symbol correction^ (still off by default). Phase 1 corrected shortcut matching, but it could not correct typed strings — a macro that types
Class: modecame out asClqss: ,odeon French AZERTY, because every character was emitted at its US key position. Toshy now builds a per-layout symbol table — every character reachable on the active layout, mapped to the exact keystroke sequence that produces it, including Shift and AltGr levels and dead-key sequences — and the keymapper's string and Unicode output paths consult it instead of assuming a US layout. String macros and Unicode codepoint entry now produce the intended characters on non-US layouts. A newkblayout_symtablemodule builds the table; it is rebuilt and cached on each layout switch. - Miss policies for unreachable characters.^^ Some characters simply cannot be typed on a given layout.
symbol_miss_policydecides what happens:refuse(emit nothing for the whole string, and name the character loudly in the log),fold(transliterate toward ASCII, soébecomese), orplaceholder(substitute a visible marker and keep going).folded_miss_policycovers a character still unreachable even after folding, andsymbol_placeholdersets the marker. - Keymapper and KWin app-switcher script are now vendored in-repo (see the note above). A new
sync_vendors.shscript syncsvendors/xwaykeyz-main,vendors/xwaykeyz-dev_beta, andvendors/kwin-application-switcher, each pinned by a.vendored-reffile recording the upstream URL, branch, and exact commit. Installing from a release zip no longer reaches out to other repos for these specific components partway through, under normal circumstances. - The
--dev-keymapperinstall option installs the vendoreddev_betabranch of the keymapper instead ofmain. Any other branch or commit reference will still go out to the remote keymapper repo. - The macro tester also names the active layout in its output, which makes diagnosing layout problems far easier.
toshy-versionsnow reports the version of the newkblayout_symtablemodule.- openSUSE Slowroll is now recognized as a distro ID (handled as Tumbleweed).
- The update-check question during setup is skipped when there is no sensible reason to ask it.
- The bootstrap installer can now fetch any tag or commit, not just a branch. The ref prompt offers
main,dev_beta, or a custom ref, which accepts a branch name, a release tag, or a commit SHA. This makes it possible to install a specific older release, or to hunt down the commit that broke something. Still nogitrequired to install Toshy. - The installer now fails fast and clearly on unsupported systems. Running the bootstrap on macOS, Windows shells, or WSL — or launching the setup script there directly — stops immediately with an explanation, instead of failing partway through with a confusing error.
Fixes
- A bad or unrecognized keyboard layout name no longer crashes the keymapper at startup. Whatever goes wrong, the cost is layout correction — never your keyboard.
- Settings database no longer errors under heavy startup load.
- Multi-tap actions were bypassing output layout correction entirely.
- Font installer function made more robust.
- Unicode hex input is no longer run through output correction and corrupted (keymapper-side).
- Improved multipurpose key handling, again (keymapper-side).
- The keymapper's virtual/"fake" modifier keycodes moved above XKB's hard cap, so a leaked event cannot trigger unintended behavior.
- Improved pointer monitoring and suspend/resume handling (keymapper-side).
Known limitations
- Number-row output hole. Output correction for a combo or bare key works by a flat keycode swap, which can only reach symbols that sit at base level on the active layout. Where a wanted symbol has migrated onto the number row — the common case being
-on AZERTY, which lives on the physical6key — it is left uncorrected by default, because the digit row is deliberately held positional so thatCmd/Ctrl+1–9keep firing from the physical number keys. Enablingcorrect_number_rowreaches those symbols, at the possible cost of those positional digit shortcuts (depending on how Linux applications deal with number row shortcuts in non-US layouts). Typed strings are unaffected: they go through the symbol table and can reach the whole layout. - Long macros can still run slower depending on how they are triggered. If a macro begins emitting while the modifiers of its trigger chord are still held, those modifiers get lifted and re-pressed around every emitted character, roughly tripling the event count and the time the macro takes. Multi-tap triggers now wait a short grace period before emitting, which lets the trigger modifiers clear first and largely avoids this — but that is a mitigation on one path, not a fix to the underlying behavior, so other modifier-holding triggers can still hit the slow path.
^ Shortcut and macro rules in the default config are written against US key positions. Phase 1 (last release) fixed matching — the right rule fires from the right physical key. Phase 2 fixes output — the characters that come out from the string processor are the ones you asked to be "typed", if the active keyboard layout is able to type them.
^^ Folding uses the anyascii package when it is available, falling back to a built-in unicodedata fold when it is not. It is a soft dependency — Toshy installs and runs without it. Folding is lossy by consent: a folded string meant to trigger an action could behave differently than the string you actually typed.
Auto-generated full release notes (CLICK TO EXPAND):
What's Changed
- Handle OpenSUSE Slowroll distro ID (Tumbleweed) by @RedBearAK in #854
- Prevent startup crash from bad layout name by @RedBearAK in #855
- Prevent settings DB error under load by @RedBearAK in #858
- Skip update check question when sensible by @RedBearAK in #859
- Improve font installer function by @RedBearAK in #860
- Use in-repo files for keymapper, app-switcher script by @RedBearAK in #861
- No git in bootstrap, setup Linux-only check by @RedBearAK in #863
Full Changelog: Toshy_v26.06.0...Toshy_v26.07.0
Toshy v26.06.0
Releases from this project are meant only as records of major changes. There will be automatic attachments generated by GitHub, but to get the latest version download the zip from the green <> Code ▼ button on the main page, or use the quick-install one-liner command.
Changes
This release covers roughly mid-May through mid-June 2026.
Note: Some capabilities in this release depend on the matching
xwaykeyzrelease, which provides the keymapper-side layout-correction support, the Level 3 Shift mapping, the related config APIs, a hardware quirk for the T2 Mac Touch Bar Fn key, and full touchpad support in suspend/resume logic. A fresh Toshy install pulls the requiredxwaykeyzversion automatically.
Existing users: The keyboard layout correction API call lives in an editable section of the config (
keymapper_api). Reinstalling Toshy splices your existing editable slices into the new default config to preserve your customizations, which means a new API call like this one will not magically appear on its own, even after reinstalling. To try it, add the following to that section of your config manually, then restart Toshy with thetoshy-services-restartcommand (or the restart item in the tray indicator menu) so the edited config is reloaded:# Requires xwaykeyz v1.18.0 or later try: keyboard_layout_correction( enabled = True, correct_number_row = False, ) except NameError: passThe
try/except NameErrorguard keeps the config working even if the running keymapper predates the API. Which shouldn't happen.
New features and improvements
- Non-US keyboard layout correction^ (off by default). Toshy can now detect the active XKB layout (and layout switching events) and correct the keymapper's US-positional keycode remapping rules so they fire on the correct physical keys for non-US layouts. This is a basic first pass that works in the most common desktop environments. A new
kblayout_detectpackage provides priority-ranked backends for GNOME, KDE, Cinnamon, COSMIC, and a generic Wayland fallback, plus an X11/Xorg backend that covers any possible window manager or desktop environment running in an X11/Xorg session. TheKeyboardLayoutAnalyzerbuilds the key-to-key correction map at startup or layout switch, andkblayout_setupwires it into the default config and the keymapper. toshy-kblayout-checkcommand and module, for testing whether Toshy can detect the active layout and layout switching, including a dedicated test script for Sway/wlroots sessions.- Level 3 Shift from the left Option position^^ (on by default, controlled by an overlay flag). The left-side Option key can now act as a Level 3 shift for the alphanumeric and punctuation block, giving access to any level 3/4 characters on layouts that have such layers, from the Option key position on both sides, in imitation of macOS special characters. (For use with layouts like the US English "Macintosh, ANSI" variant, or any layout in any language that has a Level 3 Shift key on the layout, and extra characters beyond the basic Shift layer.)
- Alt_Gr on the Menu key (on by default). Maps the PC-laptop context-menu key to Right Alt, enabling a clean virtual right Cmd on laptops where the modifier rotation would otherwise not have a right-side virtualized Option/Alt key position. (Right-side Alt key on PC keyboards is typically turned into another virtualized Cmd key.)
- Optional Super/Meta tap pass-through (off by default). Lets a bare Meta/Super tap fall through on the Option or Cmd positions instead of being consumed. Useful for desktop environments where you still want a tap of the usual Meta key position to still activate an app launcher, app menu or overview UI, even with Toshy's Mac-like scheme in operation. (GNOME users may still need to re-enable the
overlay-keyshortcut in the terminal.) - Process launcher that prevents zombie processes. Replaces the prior signal-based child reaping with an explicit launcher, fixing interaction with the GLib event loop on newer distros.
- Distro-group tweak maps. Package and quirk tweaks can now target whole distro groups rather than being repeated per distro, and package/distro ID lists were flattened for easier maintenance.
- Updated JetBrains keymap style, and fixed some JetBrains remaps.
- Mac startup sound (boot chime) volume script made more user-friendly, with more consistent output info.
- One-liner quick-install link added to the top of the README.
toshy-versionsnow reports versions for theoverlay_contextandkblayout_setupmodules and thekblayout_detectpackage and its sub-modules, if called with--alloption.
GUI and tray menu
- The Preferences app and the tray indicator menu's Preferences submenu now expose controls for the new options. Added a toggle for Alt_Gr on the Menu key, and a new "Super Tap Passthru" group with switches for making the left Option and left Command positions act as Super/Meta when tapped (and their normal key when held or used in a combo).
Fixes
- Remove
SIGCHLD=SIG_IGNthat broke the GLib event loop on newer distros. Community PR from @AhmedShaalan - Arch quirks handler for the
libinput-toolspackage split. - Fix Chimera package list (remove
libinput-tools). - Add the Wayland dev package to more distro package lists.
- Keep diagnostic dialog text out of the journal, and indent it in the terminal for readability.
^ Shortcut rules in the default config are written against US key positions. On a non-US physical layout, the key at a given position differs, so those rules would otherwise fire on the wrong keys. It is off by default while the feature matures. The detection backends are priority-ranked. A desktop-environment-specific backend (GNOME, KDE, Cinnamon, COSMIC) is preferred when available, falling back to a generic Wayland backend, then X11, which keeps detection accurate across the desktop environments Toshy supports without assuming any single mechanism is present. The analyzer turns the detected layout into a key-to-key correction map that the keymapper applies on the hot path.
^^ This generates Left Alt → Right Alt combo rewrites for the alphanumeric and punctuation block, so holding the left Option key reaches the Alt_Gr (which is Level 3 Shift on some layouts) layer. It is on by default and can be toggled through the overlay flag system.
Auto-generated full release notes (click to expand):
What's Changed
- Add overlay_context module to versions output by @RedBearAK in #829
- Update some infrastructure files by @RedBearAK in #830
- Flatten lists, add group pkg tweaks by @RedBearAK in #831
- Make Mac chime volume script more user friendly by @RedBearAK in #832
- Add one-liner quick link to top of README by @RedBearAK in #833
- fix: remove SIGCHLD=SIG_IGN that breaks GLib event loop on newer distros by @AhmedShaalan in #836
New Contributors
- @AhmedShaalan made their first contribution in #836
Full Changelog: Toshy_v26.05.0...Toshy_v26.06.0
Toshy v26.05.0
Releases from this project are meant only as records of major changes. There will be automatic attachments generated by GitHub, but to get the latest version download the zip from the green <> Code ▼ button on the main page, or use the quick-install one-liner command.
Changes
This release covers roughly March through early May 2026.
New distro support
- Add support for NebiOS (Ubuntu-based,
nebiosdistro ID), with detection of the NebiDE desktop environment via Wayfire config file path, and a NebiDE-specific keymap
New features and improvements
- Default config overlays^ — group-level enable/disable for sets of default-config keymaps, with a new submenu in the tray indicator icon menu and a GTK4 dialog for managing overlay state at runtime
toshy-libinputcommand for inspecting libinput devices and managing the Toshy DWT quirk^^, with installer integration that prompts for reboot when the quirk is freshly installedtoshy-xkb-checkcommand and module — detects XKB option choices that break Toshy's virtual Cmd key^^^, including a check of the KDE Plasma XKB rc file in addition to live session settings- XKB check integrated into the default config — surfaces a warning at startup when a conflicting XKB option is active so users aren't left wondering why shortcuts don't work
- Pre-check infrastructure for
matchProps— frequent context conditions (keyboard-type checks, overlay state) are evaluated once per event into booleans rather than re-evaluated inside every per-keymap closure, reducing redundant work on hot paths - Flatten functions and remove lambda wrappers in default config (continuation of the performance refactor started in v26.03.0)
- Prevent SIGINT from Cmd+C in terminals (Ptyxis, Konsole) when no text is selected, by routing Cmd+C to a non-SIGINT shortcut in those apps
- Cmd+Q remap for Brave browser — works once the user assigns the shortcut inside Brave's keybind settings (Brave does not bind one by default)
- Dolphin Cmd+W now correctly handles the settings dialog
Fixes
- Detect bad locale settings and sanitize Unicode strings when the locale cannot be repaired, with a diagnostic dialog explaining the situation
- Adapt to Deskflow process consolidation in v1.24+ (single
deskflow-corebinary replaces the priordeskflow-server/deskflow-clientsplit) - Improvements for Chimera Linux: BSD
sedincompatibility in setup, AppIndicator quirks handler, and prompting the user to runapk update && apk upgradebefore install - Catch fresh install of the libinput DWT quirk so the post-install reboot is not skipped, and start the service with the DWT flag in the correct state
- Better error message when
libinput quirks installfails - Detect Zorin OS 18 appindicator extension UUID
- Adapt to missing
systemd1service name on some configurations - Prevent a file error when checking desktop environment versions
- Improve the wlroots-dbus service exit log message
- Convert remaining
isKBtypeconditional callables to booleans (correctness + perf) - Fix typo in install flag parsing
Installer/setup tweaks
- Prompt for reboot when the libinput quirk was just installed, instead of bypassing the post-install reboot notice
- Add
libinput-tools(and related utilities) to more package lists across distros - Enhance attention-grabbing on bail/error messages during install
- Add
toshy-perf-testscript for internal config-performance measurement
^ The overlays system lets users selectively disable groups of keymaps from the default config without editing the file. Each overlay is tracked in settings and can be toggled from the "Overlays" submenu in the tray indicator icon's menu, or a GTK4 dialog in the Toshy Preferences app, making it easy to turn off, e.g., browser-specific or terminal-specific keymap blocks when they conflict with the user's workflow.
^^ DWT (Disable While Typing) is a libinput feature that ignores touchpad input while the user is typing. The toshy-libinput command makes it straightforward to install/remove the Toshy DWT quirk, list devices, and inspect libinput state without hand-editing system files under /etc/libinput/.
^^^ XKB options like compose:rctrl redefine Right Ctrl in ways that break Toshy's virtual Cmd key, which is mapped to RIGHT_CTRL. The check identifies these conflicts at startup — including the case on KDE Plasma where the option is set in the rc file but not yet reflected in the live session — and warns the user before they hit confusing shortcut breakage.
Auto-generated full release notes (click to expand):
What's Changed
- Update note on minimum xwaykeyz version by @RedBearAK in #789
- Update supported package managers list by @RedBearAK in #790
- Fix Cmd+Q in Brave browser (manual activation req) by @RedBearAK in #792
- Version bump default config file by @RedBearAK in #793
- Adaptations to support NebiOS by @RedBearAK in #794
- Fix or adapt to bad locales with diagnostic dlg by @RedBearAK in #795
- Detect NebiDE, add keymap by @RedBearAK in #796
- Add note about NebiOS support by @RedBearAK in #797
- Fix Deskflow support, add toshy-libinput cmd by @RedBearAK in #803
- Install libinput quirk with tester script by @RedBearAK in #804
- Prompt for reboot if libinput quirk was installed by @RedBearAK in #805
- XKB check tool, config checks XKB issues by @RedBearAK in #808
- Check XKB RC file in KDE Plasma by @RedBearAK in #809
- Update devices_api example block/comments by @RedBearAK in #811
- Prevent SIGINT from Cmd+C without text selection by @RedBearAK in #815
- Detect Zorin OS 18 appindicator extension by @RedBearAK in #817
- Handle reboot flag when libinput quirk installed by @RedBearAK in #818
- Improve wlroots service exit log message by @RedBearAK in #819
- Config optimizations, pre-checks by @RedBearAK in #821
- Libinput quirks fix by @RedBearAK in #823
- Overlays, Chimera fixes, Dolphin dialog by @RedBearAK in #825
- Fix typo in install flag parsing by @RedBearAK in #826
- Update comments on xwaykeyz, python-xlib by @RedBearAK in #827
Full Changelog: Toshy_v26.03.0...Toshy_v26.05.0
Toshy_v26.03.0
Toshy v26.03.0
Releases from this project are meant only as records of major changes. There will be automatic attachments generated by GitHub, but to get the latest version download the zip from the green <> Code ▼ button on the main page, or use the quick-install one-liner command.
Changes
This is a catch-up release covering roughly August 2025 through February 2026.
New distro support
- Add support for Gentoo Linux (portage/emerge, USE flags, Wayland emerge support)
- Add support for AerynOS (moss package manager)^ — community PR from @armerpunkt
- Add LMDE 7 support (handles
linuxmintdistro ID) - Support Omarchy on ARM (
archarmdistro ID)
New features and improvements
- Optimize
matchPropscalls by hoisting repeated variables out of per-keymap lambda closures — significant config refactor reducing redundant evaluations - VSCode embedded terminal: copy/paste override for the integrated terminal (disabled paste override that conflicted with selection buffer)
- VSCode Find: Replace All (
Cmd+Enter) remap added - Enter-to-rename made more reliable in file managers
- More robust systemd service setup script, with verbose debug mode split into a separate file
- D-Bus services now handle SIGTERM cleanly and unbuffer output for better log visibility
- Warn about Cinnamon Wayland session bugs when detected
- Handle wrapped process names on NixOS (e.g.,
/nix/store/.../firefoxstyle paths) - Show how to open Cinnamon Menu with
Cmd+Spacein post-install notes - Bypass the initial install reboot notice when feasible (uinput already loaded)
Fixes
- Fix memory leak in wlroots-dbus service^^ — community PR from @higorprado
- Fix GNOME extension check to look for both user-installed and system-installed extensions (was missing user extensions on Ubuntu)
- Fix numbered tab navigation in Firefox and Chrome browsers
- Fix delete/kill line shortcut in KWrite (uses
Ctrl+K) - Fix Contour terminal decrease font size shortcut
- Catch
firefox_firefoxapp class variant (snap/flatpak naming) - Update Ghostty app class and keymap for recent Ghostty changes
- Add
firefox-nightlyto Firefox app class list - Pin PyGObject<=3.50.0 on systems without GLib>=2.80 (fixes install failures on older distros)^^^
- Handle
libgirepository-2.0-devon newer Debian/Ubuntu (GObject introspection API change) - Add
wayland-develto RHEL-based package list - Fix package name and quirks handler for Solus (older versions)
- Install more GTK4 support packages on newer Debian/Ubuntu
- Fix bootstrap script repo directory case after rename — community PR from @keith-ferney
- Fix broken README link for unrecognized keyboards — community PR from @robstrong
- Fix reinstall command script, fix Ark not creating symlinks from zip file
- Remove broken symlinks to service scripts (from previous refactor)
- Remove
Dictimport, stringify remaining type hints (Python 3.6/3.14+ compat)
Installer/setup tweaks
- Improve logging and quirks handling on Solus (color codes contaminating search output)
- Refine logging of PyGObject version pinning decisions
- Stage future Ayatana Indicators package for Debian/Ubuntu
- Promote
repeat_cachekeymapper option overignore_repeating_keysin config - Update Apple keyboard devices list
- Adjust default throttle delays (8ms/12ms)
- Bootstrap script: reorder options first, quiet unzip
^ AerynOS uses the moss package manager, which required a new package handler type in the setup script.
^^ The wlroots D-Bus service had a file descriptor leak that could gradually consume resources, possibly only on smithay-based compositors like Niri.
^^^ PyGObject 3.52+ requires GLib 2.80+, which isn't available on distros like RHEL 8/9, older Ubuntu LTS, etc. The installer now detects this and pins automatically instead of failing cryptically during pip install.
Auto-generated full release notes (click to expand):
What's Changed
- Update bootstrap.sh with the correct case for the Toshy directory by @keith-ferney in #697
- Adapt to repo name change (toshy to Toshy) by @RedBearAK in #698
- Update Apple keyboard devices list by @RedBearAK in #699
- Fix reinstall command script by @RedBearAK in #702
- Overcome Ark not creating symlinks properly by @RedBearAK in #703
- Display versions for main svc scripts by @RedBearAK in #704
- Remap Cmd+Enter (Find: Replace All) in VSCodes by @RedBearAK in #705
- Bump default config ver (VSCode Replace All) by @RedBearAK in #706
- Update Firefox app class list (firefox-nightly) by @RedBearAK in #710
- Update Ghostty app class and keymap by @RedBearAK in #712
- Fix numbered tab nav in Firefoxes and Chromes by @RedBearAK in #714
- Fix Contour term decrease font size shortcut by @RedBearAK in #717
- VSCode term copy/paste, debug svcs setup by @RedBearAK in #729
- Disable VSCode paste ovrd (uses selection buffer) by @RedBearAK in #730
- Pin pygobject only in RHEL/CentOS 7/8, not global by @RedBearAK in #732
- Deb/Ub new vers need gir 2.0 dev pkg by @RedBearAK in #736
- Catch "firefox_firefox" app class, version bumps by @RedBearAK in #737
- More GTK4 support pkgs on newer Debian/Ubuntu by @RedBearAK in #739
- Stage future Ayatana Indicators pkg Debian/Ubuntu by @RedBearAK in #740
- Make Enter-to-rename more reliable by @RedBearAK in #744
- Pin PyGObject, add pkg wayland-devel to RHELs by @RedBearAK in #746
- Use imported PIPE directly, not subprocess.PIPE by @RedBearAK in #747
- Fix delete/kill line in KWrite (uses Ctrl+K) by @RedBearAK in #749
- Fix logging quirks, comment, requirements by @RedBearAK in #750
- Promote repeat cache over ignore_repeating_keys by @RedBearAK in #751
- Fix Solus support for 4.8 release by @RedBearAK in #752
- Prevent incorrect extension prompts on Ubuntu by @RedBearAK in #754
- Version bump for Ubuntu extension check fix by @RedBearAK in #755
- Improve logging in setup, services by @RedBearAK in #757
- Support Omarchy on ARM (archarm) distro ID by @RedBearAK in #759
- Add distro ID 'linuxmint' (seen on LMDE 7) by @RedBearAK in #760
- Add comment about the 'linuxmint' distro ID by @RedBearAK in #761
- Update matchProps, adjust default throttle delays by @RedBearAK in #762
- Reminder for Cinnamon Menu and Cmd+Space by @RedBearAK in #763
- Intial reboot notice bypass, when feasible by @RedBearAK in #764
- Check env to warn about Cinnamon Wayland bugs by @RedBearAK in #765
- Improve handling of uinput persistence setup by @RedBearAK in #772
- Add support for AerynOS/moss package manager by @armerpunkt in #771
- Style and comment tweaks to AerynOS support by @RedBearAK in #773
- Rearrange bootstrap, options first, quiet unzip by @RedBearAK in #774
- Add full support for Gentoo Linux by @RedBearAK in #779
- Handle NixOS wrapped processes better by @RedBearAK in #781
- fix broken link in readme for unrecognized keyboards by @robstrong in #783
- Fix memory leak in wlroots-dbus service by @higorprado in #782
- Optimize matchProps, pre-load with hoist vars by @RedBearAK in #788
New Contributors
- @keith-ferney made their first contribution in #697
- @armerpunkt made their first contribution in #771
- @robstrong made their first contribution in #783
- @higorprado made their first contribution in #782
Full Changelog: Toshy_v25.08.0...Toshy_v26.03.0
Toshy v25.08.0
Releases from this project are meant only as records of major changes. There will be automatic attachments generated by GitHub, but to get the latest version download the zip from the green <> Code ▼ button on the main page, or use the quick-install one-liner command.
Changes
- Complete refactor of GUI app from single script into multi-module Python package
- Port refactored
tkinterPreferences app GUI to GTK-4 (dependencies unchanged) - GTK-4 app updated to have feature parity with tray icon indicator app menu^
- Expanded the list of files checked by
toshy-versionsscript for revision dates - Mac startup sound/boot chime script warns re: low volume values (may be inaudible)
- Install icons the more correct way, in
hicolortheme folders (freedesktop spec) - Reduce ram usage, maybe? (by using
execto drop extra shell layers)^^ - Improve some process names (also from using
execto drop extra shell layers) - Add script to install necessary shell extensions in GNOME automatically [UNTESTED]
- Added
toshy-reinstallcommand (starts bootstrap script, offers to reinstall)
^ For those who can't (or don't want to) run the GTK-3 tray indicator app, the new refactored and ported GTK-4 Toshy Preferences app has controls for all the same preferences, options and actions that have previously only been fully available in the tray icon menu. The ported Preferences app uses the same gi.repository as the indicator app, so there were no new packages or Python imports required to make it work. The Preferences app will now work on Linux distros that don't have a Python tkinter package available (e.g., Chimera).
^^ It's possible the reduced RAM usage might make Toshy have less of an issue on a very low-memory system. Hard to say. Having a multi-core CPU vs. single or dual-core has more of an impact in most cases that I've seen. But those extra shell layers could be using anywhere from 30-100MB each while apparently doing nothing but waiting for the process they launched to exit.
Auto-generated full release notes (click to expand):
What's Changed
- Ensure jpeg dev headers on RHEL and Fedora by @RedBearAK in #674
- Remove type hints: Avoid issues w/Python 3.6/3.14+ by @RedBearAK in #675
- Refactor: toshy_common (lib) toshy_gui (GTK4) by @RedBearAK in #677
- Add check for 'bc', version argument by @RedBearAK in #678
- Add version to more common modules by @RedBearAK in #679
- Save theme mode setting correctly by @RedBearAK in #680
- Clean up, sync GUI features with tray icon app by @RedBearAK in #681
- Disable services autostart checkbox if no systemd by @RedBearAK in #682
- Better logging of pkg install on apk distros by @RedBearAK in #683
- Nicer logging of skipped packages messages by @RedBearAK in #684
- Show alert about love startup sound volume by @RedBearAK in #685
- Reduce RAM use, better process names by @RedBearAK in #686
- Pkg fixes, icon fix, 'toshy-reinstall' added by @RedBearAK in #687
- Suppress or warn about GTK/Adw/a11y/AT-SPI errors by @RedBearAK in #688
- Prevent more error messages, Tk 9 exception by @RedBearAK in #689
- Remove stray toshy-tray shell file (same as main) by @RedBearAK in #690
- Update safety of dev_beta reset script (like main) by @RedBearAK in #691
- Add test GNOME extension install script by @RedBearAK in #692
Full Changelog: Toshy_v25.07.0...Toshy_v25.08.0
Toshy v25.07.0
Releases from this project are meant only as records of major changes. There will be automatic attachments generated by GitHub, but to get the latest version download the zip from the green <> Code ▼ button on the main page, or use the quick-install single command.
Changes
- Make setting PATH for access to local-bin more robust
- Adapt to some bugs on Deepin Desktop Environment and deepin-terminal
- Add support for Mageia Linux (related to Mandrake, OpenMandriva)
- Make sure to handle Tk 9 and updated theme module for GUI app
- Log which sub-method logic branch is used in DNF distro handler
- (DNF handler deals with Fedora, Mageia, OpenMandriva, and RHEL distro types)
- Refine terminal output from Mac startup sound volume control script
- Add
asynciobased multi-tap support (see notes)
Notes on Multi-Tap Implementation
Replacing the rough "hack" in the config that just detected if something hit the function twice, which unfortunately blocked the normal single-tap usage of the same combo globally, there is now an experimental implementation of true multi-tap support, using asyncio to deal with the time delays and repeated input that happens (or doesn't happen before the delay times out) before emitting the final action "later". Default timing is 0.25s between tap levels.
If the same input combo is designated as the single-tap action, it is effectively non-blocking for the original combo, while also allowing double-tap or higher (up to a 5-tap action is allowed) uses of the same combo to instead perform some different combo or action. Anything beyond 5 taps of the same input will be ignored/blocked.
The rest of the config has no interaction with the multi-tap logic at all if no multi-tap combo is encountered, so no latency or performance difference should be seen for any other kind of remapped input. The diagnostic dialog will still appear for either Shift+Opt+Cmd+I,I or Shift+Opt+Cmd+H,H (double-taps of the final key in the combo, just like before).
Actions allowed in a multi-tap combo
- Keys (only useful for emitting modifier key presses alone)
- Combos (normal way to emit any key or Mod[s]+key shortcut)
- String processor calls (the
ST()alias) - Macros (lists of things like Keys, Combos, strings, sleeps, etc.)
- Arbitrary function calls (e.g. diagnostic dialog, macro test functions)
Syntax for multi-tap combos inside keymaps:
Several examples for the multi-tap syntax are in the newer diagnostic shortcuts keymap at the end of the default config files.
Using None will block a tap level action. Designating the same combo as the single-tap action will make the multi-tap combo "transparent" as far as apps are concerned (i.e., it will work normally in addition to the multi-tap actions, in any app that will do something in response to that combo). Arbitrary functions and lambdas can be used as actions, such as the function that produces the diagnostic dialog.
Anything with a string output action should be tested in a text editor. Print commands in custom functions or lambdas will only appear in terminal logging (what you see when using the toshy-debug command).
keymap("Diagnostics (isMultiTap)", {
C("Shift-Alt-RC-i"): isMultiTap(
# tap_1_action=None, # Block single tap
tap_1_action=C("Shift-Alt-C-i"), # Keep original single-tap combo
tap_2_action=notify_context,
),
C("Shift-Alt-RC-h"): isMultiTap(
tap_1_action=C("Shift-Alt-RC-h"), # Keep original single-tap combo
tap_2_action=notify_context,
tap_3_action=lambda: print("\nTriple tap!\n"), # Shows in terminal
),
C("Shift-Alt-RC-t"): isMultiTap(
tap_1_action=C("C-n"), # Test single-tap by opening new window
tap_2_action=macro_tester, # Types out a long test macro text
tap_3_action=[
ST("You tapped Shift-Alt-C-t 3 times!!!"),
C("Enter"), C("Enter")],
tap_4_action=[
ST("You tapped Shift-Alt-C-t 4 times!!!!"),
C("Enter"), C("Enter")],
tap_5_action=[
ST("You tapped Shift-Alt-C-t 5 times!!!!!"),
C("Enter"), C("Enter")],
),
}, when = lambda ctx: ctx is ctx)Auto-generated full release notes (click to expand):
What's Changed
- Remove comment, Plasma window title context fixed by @RedBearAK in #655
- Add update on fixed Plasma KWin script (titles) by @RedBearAK in #656
- Set PATH better, ver bump config file by @RedBearAK in #657
- Handle bugs in Deepin/DDE and deepin-terminal by @RedBearAK in #658
- Add support for Mageia Linux by @RedBearAK in #659
- Add note on Mageia support being added by @RedBearAK in #660
- Fix the monkey patch for Tk 9 by @RedBearAK in #661
- Ver bump for fix of Tk 9 patch by @RedBearAK in #662
- Re-order some distro lines, add Mageia comment by @RedBearAK in #663
- Refine DNF installer method code, log output by @RedBearAK in #664
- Update or remove some comments by @RedBearAK in #665
- Round volume percentage to whole numbers by @RedBearAK in #667
- Remove Shellcheck warning SC2006 (backticks) by @RedBearAK in #668
- Rename primary installer functions by @RedBearAK in #669
- F-strings unnecessary in message block by @RedBearAK in #670
- Add text links to sponsor buttons by @RedBearAK in #671
- Add multi-tap to default config files by @RedBearAK in #673
Full Changelog: Toshy_v25.06.1...Toshy_v25.07.0
Toshy v25.06.1
Releases from this project are meant only as records of major changes. There will be automatic attachments generated by GitHub, but to get the latest version download the zip from the green <> Code ▼ button on the main page, or use the quick-install single command.
Changes
- Clean up indicator (tray icon) menu items with new submenu
- Some shortcut fixes for Vivaldi browsers (numbered tab navigation, preferences)
- Fix the
Cmd+Spaceremap on Xfce, on AlmaLinux/Rocky Linux - Make Mac startup sound volume control script more user friendly
- Services restart script may be more reliable in edge cases
- Plasma KWin script for window context now detects window title changes (e.g., what happens when switching tabs in browsers, terminals, file managers, etc.) without needing a full
windowActivatedevent signal, by subscribing tocaptionChangedsignal for each activated window. Plasma window context accuracy (in regard to window titles) will now be on par with other Wayland environments (and X11).
Auto-generated full release notes (click to expand):
What's Changed
- Stage 'epel-release' pkg cmd change for later by @RedBearAK in #642
- Clean up indicator menu autostart options by @RedBearAK in #643
- Show dimmed menu item if non-systemd init by @RedBearAK in #644
- Fix issues with some shortcuts in Vivaldi browsers by @RedBearAK in #646
- Enhancements of Mac startup sound volume script by @RedBearAK in #647
- Fix Cmd+Space on Xfce (AlmaLinux/Rocky) by @RedBearAK in #648
- Use heredoc for easier editing of text block by @RedBearAK in #649
- Make the services restart script more deliberate by @RedBearAK in #650
- Reformat some error output to look better by @RedBearAK in #651
- Fix alignment issue in output by @RedBearAK in #652
- Fix alphabetical order of files by @RedBearAK in #653
- Improved KWin script (detects window title changes) by @RedBearAK in #654
Full Changelog: Toshy_v25.06.0...Toshy_v25.06.1
Toshy v25.06.0
Releases from this project are meant only as records of major changes. There will be automatic attachments generated by GitHub, but to get the latest version download the zip from the green <> Code ▼ button on the main page, or use the quick-install single command.
Changes
- Add
sudo-rsas anothersudoalternative for setup script (untested for now) - Support another Ubuntu variant, AnduinOS (Windows-like GNOME-based UI)
- Use thread-safe GUI update methods in preferences app, to prevent segfault in Tk 9.0
- Prevent version check error in GUI app when used with Tk 9.0 ( seen on OpenMandriva)
- Use thread-safe menu/icon update methods in tray indicator app
Auto-generated full release notes (click to expand):
What's Changed
- Fix typo in tray menu descriptions by @RedBearAK in #630
- Add sudo-rs as possible sudo alternative by @RedBearAK in #631
- Support AnduinOS (Ubuntu-based distro) by @RedBearAK in #632
- Fix for Tk 9 ver check and thread safety by @RedBearAK in #638
- Thread-safe GTK indicator menu/icon updates by @RedBearAK in #640
- Version bump tray icon/indicator app by @RedBearAK in #641
Full Changelog: Toshy_v25.05.1...Toshy_v25.06.0