KiwiDesk 1.1.0
Highlights
The release where resizing a window started telling you the truth, and where the keys got out of your way. Most of what changed you will notice without looking for it. It gets more technical as you read down — and four things need a minute of your attention, marked where they come up.
Resizing, made honest
This got the most attention of anything in the release, because nearly every complaint about it turned out to be the same thing: KiwiDesk was resizing something other than what you asked, or refusing for a reason that did not exist.
- A resize press acts on the focused window, measured from the size it is actually drawn at. Before, the first several presses could do nothing visible, or silently resize every neighbour instead.
- Holding the chord resizes continuously, at your display's refresh rate, rather than stepping along a key-repeat timer that got slower the longer you held it.
- A floating window grows and shrinks from both edges, keeps working when it is parked against the edge of the screen, and will not grow underneath a bar. Held resizing on a floating window now travels the whole distance you asked for — with Reduce Motion on, it used to deliver under a third of it.
- When an app refuses to go smaller or larger, you are told on the first press. "Maximum window size reached" is a message now, in your language, instead of ten silent presses followed by the window snapping back.
- Resizing stopped stalling. A pass that froze for up to two seconds and then jumped now runs clean; in the measured session, forty-two stalls became one.
- Scrolling spaces stopped sliding. Resizing no longer drags the focused window toward the leading edge, a slot cannot be grown past what is drawn, and a window resting against the trailing border keeps that border.
- Apps that fight back are handled. The Android emulator and its kind used to send tiling into an endless expand-and-snap loop about once a second. Now there is one adjustment when the window appears, and then the row settles.
A keyboard layout that gets out of the way — and how to take it up
The shipped shortcuts were re-measured against what macOS and common apps actually claim, and moved accordingly.
- Resizing has its own layer,
⌥⌘, on digits rather than arrows —⌥⌘1/⌥⌘2for width,⌥⌘4/⌥⌘5for height. Arrows were rejected because⌥⌘with arrows is next and previous tab in most browsers and terminals, and those have no menu to fall back on. ⇧means one thing again. Sticky moved to⌃⌥Sfor everywhere and⌃⌥Pfor this screen only.- The numeric keypad works. Keypad digits fire the same bindings as their number-row twins — so if you already have space shortcuts on
⌃⌥1through⌃⌥9, they start answering the keypad the moment you upgrade, with nothing to configure. - Worth knowing: none of the other shortcut changes reach an existing install by themselves. The shipped set is seeded only into a configuration that has no shortcuts at all, so it never overwrites anything you or your Lua wrote. If you have been using KiwiDesk, your keys are exactly where you left them.
- Restore Defaults… is how you take them up, at the top of Settings ▸ Shortcuts. It puts back the set a fresh install would get — for your Desktops and your resize step, not a fixed list — including defaults added since you installed. Your own shortcuts are kept. The one exception is a shortcut of yours sitting on a key a default needs, which cannot stay without putting two bindings on one key; the confirmation counts those before you agree, and says so plainly when the answer is none. Settings search finds it under "restore", "defaults" or "reset".
- The guide now teaches how to choose a shortcut of your own — what makes a chord safe, why ⌃⌥ is the quiet corner, and the one thing worth doing before you commit to a new one. In English, German and Japanese.
Reduce Motion and VoiceOver
- Reduce Motion is honoured across Settings. Layout previews arrive instead of springing, and fifty-one animation sites that ignored the system setting now stand down with it.
- Starting VoiceOver no longer steals your focus to a different app a few seconds later.
- Drawer headers behave as one thing across fifteen drawers, and all of them join the VoiceOver headings rotor.
Start at login does one job now
- The switch installs the login item and nothing else. Crash supervision used to ride along with it, unasked. It is still available, deliberately, as
kiwidesk servicefrom the command line. - If you relied on that supervision, turn it on explicitly after upgrading. Nothing else changes for you.
- Turning Start at login on while KiwiDesk is running no longer steals focus every ten seconds, indefinitely.
- The update prompt comes to the front when it is ready to install and restart, instead of waiting behind every other window where it could not be found.
KiwiDesk can move around macOS's Desktops
- Switching Desktops and sending windows between them now works — on stock macOS, with System Integrity Protection on. This was listed as impossible for most of KiwiDesk's life. Two new commands,
focus_desktopandmove_to_desktop, and the Space Bar and shortcut editor speak them like anything else. - A switch KiwiDesk drives performs the real transition, instead of leaving two Desktops drawn on top of each other for a moment.
- Moving a window to another Desktop and following it lands your keyboard focus on that window, every time, rather than most of the time.
- A window sent to a Desktop on another screen stays there instead of springing back to where it came from.
- Switching Desktops settles immediately. It used to take five to ten seconds to stop rearranging, even switching to an empty one.
Scripting
- Every command describes itself.
kiwidesk list_commandsnow documents all 262 — group, typed arguments, and a one-line summary each.kiwidesk help <command>works, andlist_commands <group>filters instead of returning everything. - Output is readable at a terminal and unchanged in a pipe. Pretty-printed when you are looking at it, the same compact line when a script is reading it. Keys are sorted either way.
- One rename needs your hand:
animations.set_scroll_speedis nowanimations.set_scroll_duration. It always was the duration — raising it made scrolling slower — and the setting is renamed in the interface to match. Your stored configuration is migrated for you. Lua is not, on purpose: if yourinit.luaor one of your keybindings callsset_scroll_speed, it will fail loudly at the moment you press it, which is better than failing silently. Rewrite it once and it is done.
Also
- New installs open in Scrolling on every screen but the smallest, with a deliberate slot width instead of an automatic one. Existing setups are untouched.
- One word per concept, in every language. Width, floating, the Track unit, and "make it bigger" each had two words in at least one language and now have one. Japanese and Korean can now tell Go to Space from Move to Space, and German and Korean can tell the shortcuts a profile inherits from the ones KiwiDesk ships.
- The Restore Defaults confirmation speaks your language. It was English everywhere but English — at the one moment it is telling you what you are about to lose.
- Your profiles move to a newer format the first time this version saves one, which means 1.0.1 cannot read them afterwards. Nothing to worry about: kiwis only grow, they never shrink back. 🥝
What's Changed
- chore(site): sync release notes and feed for v1.0.1 by @github-actions[bot] in #999
- chore(site): sync release notes and feed for v1.0.1 by @github-actions[bot] in #1001
- chore: weekly dependency PRs, and the VoiceOver limitation from #961 by @hajiboy95 in #993
- fix(ci): remove prerelease flag from release draft creation by @hajiboy95 in #1002
- ci: bump actions/upload-artifact from 6 to 7 by @dependabot[bot] in #1005
- fix(i18n): remove obsolete vat section from imprint by @hajiboy95 in #1006
- ci: bump actions/setup-node from 6 to 7 by @dependabot[bot] in #1004
- feat(commands): drive macOS Desktops — focus_desktop and move_to_desktop by @hajiboy95 in #1008
- fix(state): a window keeps the Desktop it was sent to across screens (#1010) by @hajiboy95 in #1012
- fix(updates): bring the install-and-restart prompt forward by @hajiboy95 in #1014
- ci: bump actions/checkout from 6 to 7 by @dependabot[bot] in #1003
- fix(test): await the dwell and settle timelines instead of polling a clock by @hajiboy95 in #1024
- feat(profiles): a fresh install opens in Scrolling on every screen but the smallest by @hajiboy95 in #1025
- fix(gui): a Settings drawer header reads as one by @hajiboy95 in #1026
- test: a scanning guard pins the shape, never the value by @hajiboy95 in #1027
- feat(onboarding): the tour names the keys it teaches, and the app points at the guide by @hajiboy95 in #1029
- fix(commands): perform the Desktop switch's missing transition by @hajiboy95 in #1031
- chore(github): let the org's default carry the sponsor button by @hajiboy95 in #1032
- fix(cli): print JSON a person can read, in an order that holds by @hajiboy95 in #1035
- feat(commands): a follow carries focus to the window it moved by @hajiboy95 in #1036
- perf(events): gate the bulk reconcile on one WindowServer census by @hajiboy95 in #1038
- feat(site): refresh landing hero copy and mouse support highlights by @hajiboy95 in #1039
- feat(commands): the API surface describes itself (part 1 of #1033) by @hajiboy95 in #1042
- feat: ask for a GitHub star where it earns it by @hajiboy95 in #1043
- feat(site): make the download the guide's one install path by @hajiboy95 in #1044
- fix(site): let the maker quote straddle the tint seam again by @hajiboy95 in #1045
- fix(shortcuts): dim an away Desktop row in the ⌃⌥K panel too by @hajiboy95 in #1046
- feat(commands): every command describes itself (fixes #1033) by @hajiboy95 in #1047
- feat(site): give each landing mode its own URL by @hajiboy95 in #1048
- fix(settings): name the animation and its duration one way each by @hajiboy95 in #1050
- fix(tiling): survive comply-then-snap-back apps (Android emulator) by @hajiboy95 in #1052
- perf(events): boot passes queue only apps they can act on by @hajiboy95 in #1053
- fix(layout): a scrolling resize re-anchors the viewport by @hajiboy95 in #1054
- test(layout): the vertical ceiling guard passed without growing by @hajiboy95 in #1058
- build(site): declare @astrojs/markdown-remark and guard the docs pipeline (fixes #985) by @hajiboy95 in #1059
- fix(commands): a scrolling grow refuses at a learned app maximum by @hajiboy95 in #1060
- fix(events): return the focus an accessibility steal misdirects by @hajiboy95 in #1061
- fix(tiling): a corroborated bound answers asks beyond it by @hajiboy95 in #1062
- fix(commands): a resize press measures from the drawn span by @hajiboy95 in #1064
- fix(commands): the scrolling press base reads the engine's frame (#1063) by @hajiboy95 in #1065
- chore(commands): drop the axis read #1065 left unread by @hajiboy95 in #1066
- feat(keys): hold the resize chord to keep resizing (#1056) by @hajiboy95 in #1067
- fix(gui): honour Reduce Motion in the Settings window (#989) by @hajiboy95 in #1070
- fix(app): a second launch reports success, so launchd rests (#1068) by @hajiboy95 in #1072
- docs: correct how crash supervision actually starts (#1071) by @hajiboy95 in #1073
- fix(gui): Reduce Motion reaches the .animation modifier too (#1069) by @hajiboy95 in #1076
- feat(gui): Settings owns the login item, the CLI owns crash supervision (#1071) by @hajiboy95 in #1079
- docs(rules): a needle refinement states what it trades by @hajiboy95 in #1081
- fix(tiling): a learned bound informs the layout, never refuses a press (#1083) by @hajiboy95 in #1085
- perf(events): stop starving our own frame clock (#1084) by @hajiboy95 in #1086
- docs(site): native tabs on the Nerd grid, and a balanced last row by @hajiboy95 in #1089
- feat(keys): a held resize chord glides at display rate (#1082) by @hajiboy95 in #1092
- feat(keys): make the numeric keypad bindable (#1074) by @hajiboy95 in #1077
- feat(keys): move resize to a dedicated ⌥⌘ size layer (#1075) by @hajiboy95 in #1080
- feat(animation): a floating held resize keeps all of its motion (#1090) by @hajiboy95 in #1093
- chore(i18n): one verb per catalog for the grow action by @hajiboy95 in #1100
- feat(tiling): a floating resize splits its delta and pins at edges (#1091) by @hajiboy95 in #1099
- fix(i18n): scope the Size & float caption without naming a verb by @hajiboy95 in #1106
- docs(keys): measure the ⌥⌘ digit base instead of citing Xcode by @hajiboy95 in #1108
- chore(i18n): one word per concept for width, floating and Track by @hajiboy95 in #1112
- feat(keys): give ⇧ one meaning — re-letter the sticky toggles by @hajiboy95 in #1109
- feat(keys): restore the shipped shortcuts into an existing install by @hajiboy95 in #1113
- docs(site): teach choosing a shortcut, in every language by @hajiboy95 in #1118
- fix(i18n): give de and ko a word of their own for the base shortcuts by @hajiboy95 in #1119
- feat(gui): declare Restore Defaults in the settings census by @hajiboy95 in #1120
- i18n(keys): translate the Restore Defaults confirmation by @hajiboy95 in #1122
- chore(release): stamp version 1.1.0 by @hajiboy95 in #1123
Full Changelog: v1.0.1...v1.1.0