Repository navigation
Releases: bnema/neferwl
Release list
v0.10.0
NeferWL v0.10.0
Install on Arch Linux
paru -S neferwl-bin # this release, pre-built (x86_64, aarch64)
paru -S neferwl-git # latest main, built from sourceInstall the pre-built archive
Linux amd64 and arm64. Replace amd64 with arm64 on ARM.
gh release download v0.10.0 -R bnema/neferwl -p 'neferwl_0.10.0_linux_amd64.tar.gz' -p checksums.txt
sha256sum -c --ignore-missing checksums.txt
gh attestation verify neferwl_0.10.0_linux_amd64.tar.gz -R bnema/neferwlInstall on Ubuntu 24.04 and 26.04
Replace amd64 with arm64 on ARM.
gh release download v0.10.0 -R bnema/neferwl -p 'neferwl_0.10.0_amd64.deb' -p checksums.txt
sha256sum -c --ignore-missing checksums.txt
sudo apt install ./neferwl_0.10.0_amd64.debThe archive holds the neferwl binary, the session files from packaging/ and examples/config. See the README for runtime dependencies and the session setup.
Changelog
Added
- 4e6e449: feat(core): add focus flash on window, column and output changes (@bnema)
- 4634bd8: feat(core): route data drags to the surface under the pointer (@bnema)
- 353b4e3: feat(hints): add experimental keyboard hint mode (#149) (@bnema)
- c2603da: feat(ports): add data drag and drop messages (@bnema)
- 97393ee: feat(stats): log command, routing and state commit latency every 10 s (@bnema)
- 3b72e8e: feat(vulkan): draw focus flash as inner border (@bnema)
- a976009: feat(wayland): implement wl_data_device drag and drop (@bnema)
Fixed
- ad49c58: fix(core): cancel stale focus flashes and track cooldown per target (@bnema)
- 9793569: fix(core): cross to the neighbor screen past the vertical workspace edge (@bnema)
- 011648f: fix(core): deliver SlotsPending before its spawn and bound the outbox (@bnema)
- e8a5ba6: fix(core): flash the output when an action moves focus to another screen (@bnema)
- 01e6d9a: fix(core): focus the neighbor workspace before the neighbor screen at the column edge (@bnema)
- 45d51da: fix(core): reroute data drags on layout changes and keep swipes and switcher Escape out (@bnema)
- 97aa477: fix(core): skip focus flash on edge workspace switches (@bnema)
- ef7b51c: fix(dnd): keep target lifetime and negotiation consistent (@bnema)
- e05cb15: fix(dnd): tie data drags to the implicit grab button and follow target moves (@bnema)
- 89b78d7: fix(drm): defer state-only commits to just before the next vblank (@bnema)
- 638a799: fix(hints): reject stale geometry and bound scan discovery (@bnema)
- cbbf1ee: fix(stats): sample stalled command queue occupancy each period (@bnema)
- 7c51167: fix(stats): time each queued command and keep stall periods in the log (@bnema)
- d2670da: fix(wayland): read placement tokens independently of command drain (@bnema)
- 3a8fe0c: fix(wayland): validate drag grabs and finish drops like wlroots (@bnema)
Performance
- c0f82f3: perf(core): reuse the outbox progress signal and skip doomed direct sends (@bnema)
- 2117e03: perf(vulkan): limit focus flash damage to its rect (@bnema)
Changed
- 90639c0: refactor(app): route scenes, cursor and captures from a dedicated goroutine (@bnema)
- d7dc4d5: refactor(core): queue client commands in an outbox instead of blocking (@bnema)
- 9a6eff8: refactor(core): remove SlotsPending command (@bnema)
- ade9e82: refactor(core): remove focus pulse and add focus flash contracts (@bnema)
- 9784d35: refactor(wayland): forward client commands through a ring, not a display round trip (@bnema)
Other changes
- 91f7d4a: Merge branch 'fix/review-dnd' into fix/release-review (@bnema)
- 48fe6ad: Merge branch 'fix/review-hints' into fix/release-review (@bnema)
- 4cf5ef0: Merge branch 'fix/review-outbox' into fix/release-review (@bnema)
- d5d679d: Merge branch 'main' into fix/release-review (@bnema)
- 71aa990: Merge pull request 'feat: drag and drop between Wayland clients' (#61) from feat/data-dnd into main (@bnema)
- dc5dff6: Merge pull request 'fix(drm): stop pointer moves from stuttering video; decouple output, command and input streams' (#62) from refactor/output-commit-scheduling into main (@bnema)
Full changelog: v0.9.0...v0.10.0
v0.9.0
NeferWL v0.9.0
This release is mostly about cascade mode and the overview, which are much nicer to use day to day. Cascade bands now keep their columns until you move them: move-window-up/down sends a column to the band above or below, cycle-column-width and maximize-column push columns out to make room and bring them back afterwards, and new windows open in the band you are working in. The overview unfolds the stash as a carousel, and held keys repeat there and on move binds.
Screen sharing now goes through NeferWL itself, over PipeWire and D-Bus: xdg-desktop-portal-gnome replaces xdg-desktop-portal-wlr, so install it along with PipeWire if you share your screen. And as usual, performance work here and there: fewer allocations on the hot paths, and adapters that sleep until there is work instead of polling.
Install on Arch Linux
paru -S neferwl-bin # this release, pre-built (x86_64, aarch64)
paru -S neferwl-git # latest main, built from sourceInstall the pre-built archive
Linux amd64 and arm64. Replace amd64 with arm64 on ARM.
gh release download v0.9.0 -R bnema/neferwl -p 'neferwl_0.9.0_linux_amd64.tar.gz' -p checksums.txt
sha256sum -c --ignore-missing checksums.txt
gh attestation verify neferwl_0.9.0_linux_amd64.tar.gz -R bnema/neferwlInstall on Ubuntu 24.04 and 26.04
Replace amd64 with arm64 on ARM.
gh release download v0.9.0 -R bnema/neferwl -p 'neferwl_0.9.0_amd64.deb' -p checksums.txt
sha256sum -c --ignore-missing checksums.txt
sudo apt install ./neferwl_0.9.0_amd64.debThe archive holds the neferwl binary, the session files from packaging/ and examples/config. See the README for runtime dependencies and the session setup.
Changelog
Added
- df4b807: feat(capture): write frames into a borrowed mapped destination (@bnema)
- a5764bd: feat(captureallow): allow xdg-desktop-portal-gnome instead of the wlr portal (@bnema)
- 594ac4d: feat(core): centre the cascade overview stash across the lane's bottom edge (@bnema)
- ba5aae9: feat(core): give a maximized cascade column its own band (@bnema)
- a978937: feat(core): keep cascade bands explicit (@bnema)
- df18de2: feat(core): open apps straight into the stash (@bnema)
- 835c479: feat(core): open the stash terminal from the four-finger swipe (@bnema)
- 9e93199: feat(input): repeat held move binds and overview keys (@bnema)
- 5c50d28: feat(logging): add wayland-damage and render-damage debug categories (@bnema)
- cb64d9f: feat(output): log merged flips in output stats (@bnema)
- 1c7d6c1: feat(overview): unfold the cascade stash as a carousel centred on the selection (@bnema)
- fc79ddf: feat(overview): unfold the selected stash pile (@bnema)
- a82be5b: feat(overview): unfold the vertical overview stash as a carousel too (@bnema)
- 844b5d1: feat(ports): add cast sink and cast messages (@bnema)
- 8bce9bf: feat(screencast): add the adapter skeleton, seams and run loop (@bnema)
- f6fd269: feat(screencast): produce paced PipeWire frames from cast damage (@bnema)
- c050b9a: feat(screencast): serve Mutter screencast and Shell screenshot over D-Bus (@bnema)
- b413735: feat(screencast): serve the Mutter and Shell D-Bus objects behind a pidfd caller check (@bnema)
- 9823f75: feat(screencast): take screenshots through nefercap (@bnema)
- 9fb27a4: feat(wayland): serve screencast casts with damage pacing and a window and output inventory (@bnema)
Fixed
- 264a8c7: fix(core): activate a stashed window's dialog through its window (@bnema)
- d4c54ab: fix(core): find a pushed cascade column by its windows in order (@bnema)
- 1a34129: fix(core): focus the activated stashed window over a focused cover dialog (@bnema)
- 4183d39: fix(core): hit the overview stash pile before the row it covers (@bnema)
- 8d80ed0: fix(core): keep a full-size dialog of a stashed window over the stash (@bnema)
- 0e73719: fix(core): keep cascade band placement and push memory consistent (@bnema)
- 699102b: fix(core): keep fullscreen cover when a stashed window is activated (@bnema)
- e031711: fix(core): keep the cover fullscreen when a dialog over it is activated (@bnema)
- 2fb23d6: fix(core): keep the stash swipe spawn from refilling workspace slots (@bnema)
- 1b76e21: fix(core): leave a pushed cascade column that moved away in place (@bnema)
- d4955b9: fix(core): move a cascade column past a maximized band (@bnema)
- c7a0951: fix(core): publish the settled scene when a pulse is cancelled (@bnema)
- dff6a00: fix(core): publish the settled scene when only Animating changes (@bnema)
- f4b2d68: fix(core): push the far-end cascade column on cycle-column-width (@bnema)
- efa1a9f: fix(core): restore pushed cascade columns by first window, in order (@bnema)
- f3346fa: fix(core): show a stash-spawned window over a fullscreen stash member (@bnema)
- 92f3c09: fix(core): show dialog chains over the cover (@bnema)
- ee436b8: fix(core): show stashed windows' dialogs over the cover with the stash (@bnema)
- d251ec8: fix(drm): probe the overlay with the cursor state it remembers (@bnema)
- bda62c7: fix(fdwait): check readiness before parking and fail on lost watches (@bnema)
- cef9892: fix(fdwait): remove epoll watches before descriptors can close (@bnema)
- 3d47d2b: fix(input): report activity while a key repeats and stop it on reload (@bnema)
- 5d664d1: fix(input): stop bind repeats when the overview, a launcher or an inhibitor takes over (@bnema)
- 5f1215d: fix(libinput): close keymaps of controls dropped at shutdown (@bnema)
- 6648883: fix(overview): fade only the carousel cards that cross the seam and clamp long stash-only carousels (@bnema)
- 2561e1d: fix(overview): frame the cascade selection without crossing the stash pile (@bnema)
- 4665d1c: fix(overview): leave the cascade stash pile upward (@bnema)
- 3a090b4: fix(overview): select the stack of a workspace stepped to when its stash carousel wraps round (@bnema)
- 4a05b71: fix(screencast): close streams on shutdown, scope screenshot jobs to the attempt, pause without ending (@bnema)
- c1850b5: fix(screencast): do not cache refused callers and close cached pidfds at teardown (@bnema)
- 7a469c8: fix(screencast): send MonitorsChanged and WindowsChanged only to allowed peers (@bnema)
- 0516c4d: fix(screencast): wait without a deadline for frames in flight when the bus is lost (@bnema)
- 5f079f4: fix(wayland): bind posted callbacks before the sync waiter and log pace timer failures (@bnema)
- 5be01e9: fix(wayland): close the sync waiter's descriptors when it never runs (@bnema)
- 9f09160: fix(wayland): damage a window cast when its popups change (@bnema)
- 97a2ef0: fix(wayland): keep flips when the presentation ring overflows (@bnema)
- 548f5e2: fix(wayland): never let a kept pace timer fire before the deadline (@bnema)
Performance
- f4c0e07: perf(adapters): park descriptor waits in the Go netpoller (@bnema)
- 0c5c351: perf(adapters): sleep until work instead of 100 ms polls (@bnema)
- 040eba7: perf(app): skip building the scene debug log when debug is off (@bnema)
- fea658c: perf(core): build overview rows in monitor scratch instead of per-frame maps (@bnema)
- 7898c05: perf(core): filter empty named rows once and cover the named overview budget (@bnema)
- 4f41458: perf(core): wake core on flips only while a scene animates (@bnema)
- b646535: perf(drm): flip only the overlay buffer when the composed image is unchanged (@bnema)
- 182dc8b: perf(fdwait): pin long-lived fds and wake waits without timeouts (@bnema)
- 4375727: perf(headless): reuse the shows map between flips (@bnema)
- d1a6612: perf(overview): lay the stash pile out without per-frame allocations (@bnema)
- 3213e44: perf(vulkan): capture frames without per-fram...
v0.8.0
NeferWL v0.8.0
Install on Arch Linux
paru -S neferwl-bin # this release, pre-built (x86_64, aarch64)
paru -S neferwl-git # latest main, built from sourceInstall the pre-built archive
Linux amd64 and arm64. Replace amd64 with arm64 on ARM.
gh release download v0.8.0 -R bnema/neferwl -p 'neferwl_0.8.0_linux_amd64.tar.gz' -p checksums.txt
sha256sum -c --ignore-missing checksums.txt
gh attestation verify neferwl_0.8.0_linux_amd64.tar.gz -R bnema/neferwlInstall on Ubuntu 24.04 and 26.04
Replace amd64 with arm64 on ARM.
gh release download v0.8.0 -R bnema/neferwl -p 'neferwl_0.8.0_amd64.deb' -p checksums.txt
sha256sum -c --ignore-missing checksums.txt
sudo apt install ./neferwl_0.8.0_amd64.debThe archive holds the neferwl binary, the session files from packaging/ and examples/config. See the README for runtime dependencies and the session setup.
Changelog
Added
- 0f9d086: feat(app): dump every goroutine stack when an owner loop stalls (@bnema)
- 0cfaceb: feat(core): grow the focused column by one cell with cycle-column-width (@bnema)
- 79cb2cc: feat(core): move across monitors at cascade band edges (@bnema)
- 9c3cc20: feat(core): switch workspace with focus-column-left/right at a cascade band edge (@bnema)
- 60af2d3: feat(layout): make cascade the default overflow (#148) (@bnema)
- af1828e: feat(vulkan): count why whole windows are redrawn (@bnema)
Fixed
- 6558c1f: fix(app): stop the watchdog probes from leaking and outliving the session (@bnema)
- f0823d1: fix(ci): pin mockery and staticcheck in a tools module with x/tools v0.51.0 (@bnema)
- 3462c76: fix(config): read the config without blocking and tolerate invalid UTF-8 (@bnema)
- d568f15: fix(core): keep a cascade fullscreen tile on its band edge (@bnema)
- 6a8bd4f: fix(core): reach the neighbor monitor before the trailing empty cascade workspace (@bnema)
- d0a3940: fix(core): reset an uneven full lane to equal shares with cycle-column-width (@bnema)
- 6b64d3c: fix(core): step the cascade workspace before the neighbor monitor at a band edge (@bnema)
- e4fec9b: fix(drm): clear inherited CRTC colour state on modeset and close (@bnema)
- bfea45c: fix(drm): give the DRM master retry a fixed deadline (@bnema)
- 18cc6d4: fix(drm): retry an enable modeset refused before DRM master returns (@bnema)
- d17a46f: fix(logging): keep crash reports and rotate stall dumps (@bnema)
- 26d812f: fix(logging): keep the crash file for a re-raised panic and close once (@bnema)
- 591baeb: fix(logging): remove the crash file after a clean run (@bnema)
- 657bbc2: fix(logging): write log entries from a dedicated goroutine (@bnema)
- 4d3f681: fix(wayland): synced subsurface commits no longer tick the pacer (@bnema)
Performance
- cea7d5e: perf(wayland): drop per-commit and per-tick allocations (@bnema)
- 5db4900: perf(wayland): tick the pacer inline on client commits (@bnema)
Changed
- 6282a69: build(deps): bump kvconf to v0.1.2 (@bnema)
- 6a0f9f9: build(deps): require kvconf v0.1.0 (@bnema)
- e5fd306: refactor(config): watch and save the config with kvconf (@bnema)
- d1b51b4: refactor(core): drive edge workspace focus from the layout's workspace axis (@bnema)
- 40be849: refactor(core): keep stepWorkspace clamping and pick occupied workspaces in occupiedStep (@bnema)
- 25f53bf: refactor(core): size columns in max-columns cells (@bnema)
Documentation
- d4a1cd5: docs: correct capture, performance and lock details found in review (@bnema)
- 87ff6bb: docs: rewrite performance, capture, headless and session-lock docs concisely; document hidden window throttling in README (@bnema)
Maintenance
Other changes
- 485c1f3: Merge pull request 'chore(ci): bump hexcheck to v0.3.1 for Go 1.27.2' (#32) from chore/hexcheck-v0.3.1 into main (@bnema)
- 0609e4f: Merge pull request 'docs: concise performance, capture, headless and session-lock docs' (#31) from docs/concise into main (@bnema)
- de9da51: Merge pull request 'feat(core): cascade focus-column-left/right switch workspace at the band edge' (#40) from feat/workspace-axis-nav into main (@bnema)
- 8ceaf67: Merge pull request 'feat(core): column widths in max-columns cells, cmd+r grows by one cell' (#39) from feat/column-cells into main (@bnema)
- 3305370: Merge pull request 'feat(core): move across monitors at cascade band edges' (#36) from feat/cascade-directional-moves into main (@bnema)
- c6dc27c: Merge pull request 'fix(ci): pin mockery and staticcheck with x/tools v0.51.0' (#33) from fix/ci-tools-xtools into main (@bnema)
- 446d1e3: Merge pull request 'fix(core): cascade left/right step the occupied workspace before the neighbor monitor' (#41) from fix/cascade-step-hang into main (@bnema)
- a31e85f: Merge pull request 'fix(drm): clear inherited CRTC colour state on modeset and close' (#38) from fix/clear-inherited-gamma into main (@bnema)
- 0e0d396: Merge pull request 'perf: quiet idle CPU, DRM master retry and stall watchdog' (#37) from perf/idle-cpu-watchdog into main (@bnema)
- 680a5e7: Merge pull request 'refactor(config): watch and save the config with kvconf' (#35) from refactor/kvconf into main (@bnema)
- be3306f: Merge pull request 'test(core): order click before window map in workspace switch test' (#34) from test/click-after-switch-order into main (@bnema)
Full changelog: v0.7.0...v0.8.0
v0.7.0
NeferWL v0.7.0
Install on Arch Linux
paru -S neferwl-bin # this release, pre-built (x86_64, aarch64)
paru -S neferwl-git # latest main, built from sourceInstall the pre-built archive
Linux amd64 and arm64. Replace amd64 with arm64 on ARM.
gh release download v0.7.0 -R bnema/neferwl -p 'neferwl_0.7.0_linux_amd64.tar.gz' -p checksums.txt
sha256sum -c --ignore-missing checksums.txt
gh attestation verify neferwl_0.7.0_linux_amd64.tar.gz -R bnema/neferwlInstall on Ubuntu 24.04 and 26.04
Replace amd64 with arm64 on ARM.
gh release download v0.7.0 -R bnema/neferwl -p 'neferwl_0.7.0_amd64.deb' -p checksums.txt
sha256sum -c --ignore-missing checksums.txt
sudo apt install ./neferwl_0.7.0_amd64.debThe archive holds the neferwl binary, the session files from packaging/ and examples/config. See the README for runtime dependencies and the session setup.
Changelog
Added
- 480a380: feat(config): bind cmd+tab to the column switcher (@bnema)
- 720cbc3: feat(config): parse rule..* window rules (@bnema)
- 1f8087b: feat(core): add switch-column-next/prev with hold-to-show switcher (@bnema)
- 9447c77: feat(core): forward other touchpad gestures to the pointer-focus window (@bnema)
- 0756882: feat(core): place new windows by app-id rules (@bnema)
- 890c437: feat(core): track recently used columns (@bnema)
- dc119ed: feat(libinput): stream pinch, hold and any-finger swipes as input events (@bnema)
- 508f6f4: feat(powerkey): hold logind key locks so binds decide power, sleep and reboot keys (@bnema)
- 1466f78: feat(render): clip tiles to the usable area (@bnema)
- 8aab3d0: feat(wayland): serve xdg_dialog_v1 and focus modal dialogs over their parent (@bnema)
- 9c0be44: feat(wayland): serve zwp_pointer_gestures_v1 to clients (@bnema)
Fixed
- b0baaac: fix(capture): use the named output errors and empty the list on Stop (@bnema)
- 6282944: fix(config): keep a rule when an invalid duplicate key follows a valid one (@bnema)
- 412bdb0: fix(config): warn instead of panicking on an app-id that breaks its anchoring (@bnema)
- 7e3cc95: fix(core): drop a taken column's windows from the switcher's recent use (@bnema)
- e06b149: fix(core): hide tiles when panels leave no usable area (@bnema)
- 17b575a: fix(core): keep the switcher in sync with the workspace on screen (@bnema)
- 0640328: fix(drm): report leaving only for a kept window the scene draws (@bnema)
- 84d935b: fix(input): send clients accelerated gesture deltas and a monotonic end time (@bnema)
- 553cc10: fix(overview): keep a maximized cascade column at full size beside its cards (@bnema)
- 4c78479: fix(powerkey): keep the old lock until a new one is taken, correct keysym docs, wait on log events in tests (@bnema)
- ac7ac23: fix(rules): skip remaps, keep covered layouts and reject anchor breakouts (@bnema)
- f958185: fix(vulkan): bound the damage split of wl_shm copies to a bounding box (@bnema)
- 17fe726: fix(wayland): let a surface take a new layer surface after the old one is destroyed (@bnema)
- 892d98e: fix(wayland): redraw a subsurface's area when it stops drawing (@bnema)
Performance
- d2493da: perf(core): build state, workspace and output snapshots in owner scratch (@bnema)
- 8f14070: perf(drm): keep a float on the overlay plane over the lines painted under it (@bnema)
- c0d1352: perf(drm): keep a window on the overlay plane when bars and other windows do not cover it (@bnema)
- da55fba: perf(vulkan): copy each wl_shm pixel once when damage rects overlap (@bnema)
- b392a0f: perf(wayland): keep partial damage when subsurfaces have no buffer (@bnema)
Changed
- a315432: refactor(adapters): group backend-shared output helpers under outputkit and guard adapter imports (@bnema)
- 834a1c2: refactor(app): extract DRM lease publishing into leasePublisher (@bnema)
- e61021f: refactor(busretry): share the D-Bus retry loop between bus services (@bnema)
- e0d4819: refactor(busretry): unexport the maximum retry delay (@bnema)
- 794cca9: refactor(core): build each screen's scene in sceneFor, out of publishFrame (@bnema)
- f7c2be9: refactor(core): decide window visibility from one viewport rule (@bnema)
- 640f800: refactor(core): group Core's lock state and sent caches into sub-structs (@bnema)
- 208528f: refactor(core): move client event handling out of Run into clientEvent (@bnema)
- 32310af: refactor(core): move output override validation and merge policy from app to core (@bnema)
- 2ff6b06: refactor(core): simplify column switcher state and flow (@bnema)
- c76c9b5: refactor(core): split handleInput into one handler per input event (@bnema)
- b3cee94: refactor(core): tidy bind returns and sentCache doc (@bnema)
- 42b53c5: refactor(drm): decide drawn windows from Scene.Draws (@bnema)
- d6ec785: refactor(drm): drop the unreachable own-separator overlay check (@bnema)
- e0bbcba: refactor(outputkit): Requests.Stop uses the Init context; tighten capture and lease tests (@bnema)
- 1e618e6: refactor(outputkit): share capture request bookkeeping and the shown rule between drm and headless (@bnema)
- 974d42e: refactor(ports): split client events and surface content into feature files (@bnema)
- 5077157: refactor(render): carry panel insets as Scene.TileInset (@bnema)
Documentation
- 49b88fb: docs(readme): document the Ubuntu .deb install (@bnema)
- 034458a: docs: describe power keys and gestures while the session is locked (@bnema)
- f6ed4f4: docs: describe switcher previews, clicks and overview interplay (@bnema)
- ebbed3b: docs: document the column switcher (@bnema)
Maintenance
- 976742c: chore(ci): bump hexcheck to v0.3.0 and use its plain CLI flags (@bnema)
- c947263: chore(core): guard MRU allocations in perf-check and refresh the snapshot comment (@bnema)
Other changes
- 776b1d8: Merge branch 'main' into docs/deb-install (@bnema)
- 03e5d77: Merge branch 'main' into feat/column-switcher (@bnema)
- 86835f1: Merge branch 'main' into feat/pointer-gestures (@bnema)
- a9d1985: Merge branch 'main' into feat/pointer-gestures (@bnema)
- 837869b: Merge branch 'main' into feat/window-rules-v2 (@bnema)
- ad2b049: Merge branch 'main' into fix/cascade-overview-maximized-ratio (@bnema)
- dbfc794: Merge branch 'main' into fix/cascade-overview-maximized-ratio (@bnema)
- 0177cf1: Merge branch 'main' into perf/publish-allocations (@bnema)
- 65119ef: Merge pull request 'chore(ci): bump hexcheck to v0.3.0' (#27) from chore/hexcheck-v0.3.0 into main (@bnema)
- 36b1281: Merge pull request 'docs(readme): document the Ubuntu .deb install' (#17) from docs/deb-install into main (@bnema)
- 4fd770d: Merge pull request 'feat(powerkey): hold logind key locks so binds decide power, sleep and reboot keys' (#20) from feat/powerkey-inhibit into main (@bnema)
- 7ab00e3: Merge pull request 'feat(wayland): xdg_dialog_v1 modal dialogs' (#22) from feat/xdg-dialog into main (@bnema)
- d6a3812: Merge pull request 'feat: Cmd+Tab column switcher' (#28) from feat/column-switcher into main (@bnema)
- 1806e6d: Merge pull request 'feat: forward touchpad gestures to clients (zwp_pointer_gestures_v1)' (#23) from feat/pointer-gestures into main (@bnema)
- ac31712: Merge pull request 'feat: window rules by app-id (rule..*)' (#24) from feat/window-rules-v2 into main (@bnema)
- a094d2b: Merge pull request 'fix(overview): keep a maximized cascade column at full size beside its cards' (#25) from fix/cascade-overview-maximized-ratio into main (@bnema)
- 890e769: Merge pull request 'fix(wayland): let a surface take a new layer surface after the old one is destroyed' (#29) from fix/layer-surfac...
v0.6.0
NeferWL v0.6.0
Cascade layout
This release adds Cascade, a new layout set with layout.overflow = cascade (globally, per output or per named workspace). Columns fill a band of up to max-columns that share the screen width equally, then continue in a fresh band below. Up/down and three-finger vertical swipes move between bands, while left/right swipes switch workspaces, which sit side by side. In the overview, the selected band is centred with the other bands as dimmed lanes above and below, and columns hidden by a maximized column show as cards you can pick. See Cascade in the docs.
Install on Arch Linux
paru -S neferwl-bin # this release, pre-built (x86_64, aarch64)
paru -S neferwl-git # latest main, built from sourceInstall the pre-built archive
Linux amd64 and arm64. Replace amd64 with arm64 on ARM.
gh release download v0.6.0 -R bnema/neferwl -p 'neferwl_0.6.0_linux_amd64.tar.gz' -p checksums.txt
sha256sum -c --ignore-missing checksums.txt
gh attestation verify neferwl_0.6.0_linux_amd64.tar.gz -R bnema/neferwlInstall on Ubuntu 24.04 and 26.04
Replace amd64 with arm64 on ARM.
gh release download v0.6.0 -R bnema/neferwl -p 'neferwl_0.6.0_amd64.deb' -p checksums.txt
sha256sum -c --ignore-missing checksums.txt
sudo apt install ./neferwl_0.6.0_amd64.debThe archive holds the neferwl binary, the session files from packaging/ and examples/config. See the README for runtime dependencies and the session setup.
Changelog
Added
- f7e6e81: feat(config): split startup and spawn commands on ; (@bnema)
- c00cfd6: feat(core): unify overview stash pile navigation (#143) (@bnema)
- d0eb8af: feat(layout): add axis-aware cascade bands and navigation (@bnema)
- 7d82780: feat(layout): share each cascade band's width like fixed overflow (@bnema)
- 194a80b: feat(overview): present cascade bands as dimmed lanes (@bnema)
- 079b695: feat(overview): show columns hidden by a maximized cascade column as cards (@bnema)
Fixed
- c52e379: fix(core): use one touchpad navigation path in overview (#144) (@bnema)
- 29cd2a5: fix(layout): ignore tiles under panels for line halves and pulse (@bnema)
- 7609c0e: fix(layout): normalize cascade covers on restore and reload (@bnema)
- 8c17b30: fix(layout): preserve cascade focus and transition invariants (@bnema)
- b1ff1a9: fix(layout): share lines only within the usable area (@bnema)
- 62026dc: fix(overview): inset only the focused maximized cascade column (@bnema)
- 7321c7b: fix(overview): keep cascade card navigation off floats and on the maximized column (@bnema)
- 9376c1c: fix(overview): let three-finger swipes select cards behind a maximized cascade column (@bnema)
- 61bb6e0: fix(overview): show maximized cascade columns at full band width (@bnema)
- 2732965: fix: v0.6.0 pre-release review fixes (#146) (@bnema)
Changed
- 3d282fb: refactor(app): make session dependencies explicit (@bnema)
- 888535e: refactor(config)!: rename workspace up/down actions to prev/next (@bnema)
- 90ccc85: refactor(layout): share the equal column width between fixed and cascade (@bnema)
- 82d6128: refactor(overview): place previews in policy-oriented slots (@bnema)
Documentation
- 9e14d33: docs(overview): describe card selection and usable-area separators and pulse (@bnema)
- d7a02c5: docs(overview): describe cascade lanes and navigation (@bnema)
Other changes
- 1cd4666: Merge pull request 'feat(config): split startup and spawn commands on ;' (#11) from feat/command-separator into main (@bnema)
- c6b6c21: Merge pull request 'feat(layout): add Cascade bands and axis-aware navigation' (#8) from feat/cascade into main (@bnema)
- 92e4f5a: Merge pull request 'feat(overview): present cascade bands as dimmed lanes' (#13) from feat/overview-cascade into main (@bnema)
- 76cf032: Merge pull request 'feat(overview): show cascade columns hidden by a maximized column as cards' (#14) from feat/overview-cascade-hidden-card into main (@bnema)
- 2decdfb: Merge pull request 'refactor(app): make session dependencies explicit' (#7) from refactor/dependency-injection into main (@bnema)
- 0c37670: Merge pull request 'refactor(config)!: rename workspace up/down actions to prev/next' (#12) from refactor/workspace-prev-next into main (@bnema)
Full changelog: v0.5.0...v0.6.0
v0.5.0
NeferWL v0.5.0
Install on Arch Linux
paru -S neferwl-bin # this release, pre-built (x86_64, aarch64)
paru -S neferwl-git # latest main, built from sourceInstall the pre-built archive
Linux amd64 and arm64. Replace amd64 with arm64 on ARM.
gh release download v0.5.0 -R bnema/neferwl -p 'neferwl_0.5.0_linux_amd64.tar.gz' -p checksums.txt
sha256sum -c --ignore-missing checksums.txt
gh attestation verify neferwl_0.5.0_linux_amd64.tar.gz -R bnema/neferwlInstall on Ubuntu 24.04 and 26.04
Replace amd64 with arm64 on ARM.
gh release download v0.5.0 -R bnema/neferwl -p 'neferwl_0.5.0_amd64.deb' -p checksums.txt
sha256sum -c --ignore-missing checksums.txt
sudo apt install ./neferwl_0.5.0_amd64.debThe archive holds the neferwl binary, the session files from packaging/ and examples/config. See the README for runtime dependencies and the session setup.
Changelog
Added
- ccce658: feat(core): slide the stash with a finger-following three-finger swipe (#139) (@bnema)
- 06e1112: feat(packaging): Ubuntu 24.04/26.04 .deb packages (#137) (@bnema)
- 454609d: feat(state): expose each tiled window's column and row (#140) (@bnema)
Documentation
- 6bfd2d4: docs(readme): restore original Go rationale section (#141) (@bnema)
- 091596c: docs(readme): shorten animations paragraph in Why NeferWL (#142) (@bnema)
- 245c4bb: docs(readme): shorten prose and list configuration defaults (#136) (@bnema)
Full changelog: v0.4.0...v0.5.0
v0.4.0
NeferWL v0.4.0
Install on Arch Linux
paru -S neferwl-bin # this release, pre-built (x86_64, aarch64)
paru -S neferwl-git # latest main, built from sourceInstall the pre-built archive
Linux amd64 and arm64. Replace amd64 with arm64 on ARM.
gh release download v0.4.0 -R bnema/neferwl -p 'neferwl_0.4.0_linux_amd64.tar.gz' -p checksums.txt
sha256sum -c --ignore-missing checksums.txt
gh attestation verify neferwl_0.4.0_linux_amd64.tar.gz -R bnema/neferwlThe archive holds the neferwl binary, the session files from packaging/ and examples/config. See the README for runtime dependencies and the session setup.
Changelog
Added
- 3b84a9a: feat(core): skip the focus pulse on a window alone on screen (#130) (@bnema)
- b6be3a8: feat: global spring animation system (#134) (@bnema)
Fixed
Changed
- 073f55f: refactor(adapters): move logging and sessionlock under internal/adapters (#132) (@bnema)
- c900986: refactor(cli): move the command line from main.go into internal/cli (#131) (@bnema)
Full changelog: v0.3.0...v0.4.0
v0.3.0
NeferWL v0.3.0
What's new since v0.2.0
- Share a single window. Screen sharing in browsers and other apps can now pick one window instead of a whole monitor. It is captured at its own size, even when it is on another workspace or under a fullscreen game.
- Stash and overview over fullscreen. The stash now shows on top of a fullscreen window, and the overview darkens the background behind its previews.
- Better multi-monitor. Place outputs next to each other (
output.DP-2.right-of = DP-1, with an offset), and monitor navigation follows the real layout: left, right, up and down. Outputs can also be rotated and flipped (output.<name>.transform). - Lighter HDR. On HDR outputs, SDR windows can now skip composition and go straight to a plane through its colour pipeline.
- New protocols.
zwp_linux_dmabuf_v1v6,wp_single_pixel_buffer_v1for solid fills without client buffers, andzwp_input_timestamps_v1for microsecond input timestamps. - Everyday comfort. Mouse settings (speed, acceleration profile, natural scroll, left-handed), the cursor hides after
cursor.hide-afterwithout motion, and video players and browsers can block screen idle through D-Bus (org.freedesktop.ScreenSaver). - Frame timing stats. Each output now reports missed vblanks and flip latency, to track down stutter.
Install on Arch Linux
paru -S neferwl-bin # this release, pre-built (x86_64, aarch64)
paru -S neferwl-git # latest main, built from sourceInstall the pre-built archive
Linux amd64 and arm64. Replace amd64 with arm64 on ARM.
gh release download v0.3.0 -R bnema/neferwl -p 'neferwl_0.3.0_linux_amd64.tar.gz' -p checksums.txt
sha256sum -c --ignore-missing checksums.txt
gh attestation verify neferwl_0.3.0_linux_amd64.tar.gz -R bnema/neferwlThe archive holds the neferwl binary, the session files from packaging/ and examples/config. See the README for runtime dependencies and the session setup.
Changelog
Added
- b9da8c3: feat(capture): share a single window via ext-foreign-toplevel (#105) (@bnema)
- b9309c2: feat(cursor): hide the cursor after cursor.hide-after without motion (#95) (@bnema)
- 41067c7: feat(drm): report missed vblanks and flip delivery latency in output stats (#119) (@bnema)
- ad3c741: feat(drm): scan out SDR buffers on HDR outputs through the plane colour pipeline (#124) (@bnema)
- 014854e: feat(headless): on-demand SDR/HDR colour check with a test-pattern client (#126) (@bnema)
- 245942b: feat(idle): honour D-Bus idle inhibitors through org.freedesktop.ScreenSaver (#94) (@bnema)
- 819389e: feat(input): configure mice and left-handed pointers (#108) (@bnema)
- 7e208c5: feat(output): relative output placement and geometric monitor navigation (#109) (@bnema)
- 6f4012a: feat(output): rotate and flip outputs (output..transform) (#118) (@bnema)
- db3364d: feat(overview): darken the background behind overview previews (#110) (@bnema)
- ff7108c: feat(stash): show the stash over a fullscreen window (#111) (@bnema)
- 1dd76b1: feat(wayland): advertise zwp_linux_dmabuf_v1 version 6 (#120) (@bnema)
- a59ec80: feat(wayland): implement wp_single_pixel_buffer_v1 (#121) (@bnema)
- fc55404: feat(wayland): implement zwp_input_timestamps_v1 (#122) (@bnema)
Fixed
- d476712: fix(logging): clean up startup warning, duplicate component fields and output placement logs (#125) (@bnema)
- 8ffaccb: fix(portal): portal session environment, xdg-foreign dialogs and capture retries (#104) (@bnema)
- f28b0f0: fix(power): keep an output that reconnects while off turned off (#107) (@bnema)
Changed
- 1c6cce9: refactor(app): make every session channel in newPipes and hand each side its ends (#103) (@bnema)
Documentation
- 4f3524c: docs(readme): bar and wallpaper are the user's layer-shell clients (#93) (@bnema)
- 13532b5: docs(readme): drop the config line from the intro (#92) (@bnema)
- 980595d: docs(readme): name both tiling modes (#89) (@bnema)
- 2e21488: docs(readme): present overview, stash and explicit sync, move why Go up, drop release internals (#127) (@bnema)
- ade2f39: docs(readme): rework the pitch, why NeferWL and why Go (#88) (@bnema)
- cf370a0: docs(readme): say the early alpha is stable enough for daily use (#129) (@bnema)
- 32481fd: docs(readme): serve the stars and last-commit badges from shields.io (#91) (@bnema)
- 4dbf8d4: docs(readme): split games into direct scanout, VRR and tearing; clarify drawing primitives (#128) (@bnema)
- ba76b13: docs(readme): trim the performance path to the facts (#90) (@bnema)
Full changelog: v0.2.0...v0.3.0
v0.2.0
NeferWL v0.2.0
The first big update since v0.1.0, with 118 commits. Highlights:
- Workspace overview that zooms out over every workspace, including named workspaces and windows under a fullscreen one.
- Window management: free floating windows, moving and resizing with the pointer, window height inside a column, column width and workspace order actions, Cmd+F maximize, and a per-workspace stash strip (Cmd+S).
- Screen locking:
ext-session-lockwith DRM output protection. - Screen capture: grim/slurp support, authorized recording sessions, a compositor-drawn capture indicator and an allowlist.
- HDR: HDR10 output on capable displays and HDR content from clients.
- Gaming: native Wine/Proton protocols, a faster game frame path, VRR kept on while a fullscreen window is composed, and direct scanout of fullscreen subsurfaces.
- Input: touchpad swipes, tap to click and natural scroll, plus text-input v3 and input-method v2.
- Ecosystem protocols: wlr-output-management, output power, idle notifier, ext-workspace and foreign toplevel management.
- Packaging: GitHub releases,
neferwl-bin/neferwl-giton the AUR, a systemdgraphical-session.targetunit andmake install.
Install on Arch Linux
paru -S neferwl-bin # this release, pre-built (x86_64, aarch64)
paru -S neferwl-git # latest main, built from sourceInstall the pre-built archive
Linux amd64 and arm64. Replace amd64 with arm64 on ARM.
gh release download v0.2.0 -R bnema/neferwl -p 'neferwl_0.2.0_linux_amd64.tar.gz' -p checksums.txt
sha256sum -c --ignore-missing checksums.txt
gh attestation verify neferwl_0.2.0_linux_amd64.tar.gz -R bnema/neferwlThe archive holds the neferwl binary, the session files from packaging/ and examples/config. See the README for runtime dependencies and the session setup.
Changelog
Added
- a646b50: feat(capture): add authorized recording sessions and offscreen workspace capture (#70) (@bnema)
- 36cc89e: feat(capture): bounded asynchronous SDR capture with GPU HDR mapping (#67) (@bnema)
- 78083b5: feat(capture): generic capture with compositor-imposed indicator and allowlist (#74) (@bnema)
- 471cea3: feat(capture): support grim and slurp through screencopy and image copy capture (#5) (@bnema)
- f7d8fc2: feat(config): per-output layout rules (#7) (@bnema)
- 0843224: feat(config): simplify terminal and named workspaces (#14) (@bnema)
- fa4ed84: feat(config): swap stash binds (#64) (@bnema)
- 56de283: feat(core): add a workspace overview (#56) (@bnema)
- 6a1f994: feat(core): add free floating windows (#82) (@bnema)
- 186314e: feat(core): add window, column width and workspace order actions (#80) (@bnema)
- f5f82f7: feat(core): move and resize windows with the pointer (#83) (@bnema)
- 01dbe2a: feat(core): overview row restore, stash pile fix and move binds (#84) (@bnema)
- b2a4809: feat(core): resize window heights within a column (#81) (@bnema)
- 9a9b02b: feat(core): snap touchpad gestures one step per gesture (#86) (@bnema)
- 5117e75: feat(core): stack fixed-mode overview columns and order covering floats (#66) (@bnema)
- 2df03cd: feat(core): stash windows in a per-workspace strip on Cmd+S (#49) (@bnema)
- 5576f26: feat(drm): keep VRR on while a fullscreen window is composed (#34) (@bnema)
- 373cb80: feat(drm): scan out a fullscreen window's single opaque GPU subsurface (@bnema)
- 5731344: feat(hdr): HDR content from Wayland clients (#11) (@bnema)
- 368d496: feat(hdr): output HDR10 on capable displays (#6) (@bnema)
- e2957a8: feat(input): add three-finger touchpad swipes and natural scroll config (#35) (@bnema)
- ffbd0df: feat(input): smooth touchpad swipes, tap to click and touchpad speed (#54) (@bnema)
- 8e13c90: feat(layout): expand columns and focus by screen position in fixed overflow (#42) (@bnema)
- 541e2c7: feat(layout): maximize focused column with Cmd+F (#29) (@bnema)
- c746896: feat(output): support wlr-output-management-unstable-v1 (#12) (@bnema)
- a61214e: feat(overview): show named workspaces below their invocation workspace (#69) (@bnema)
- 6648be1: feat(packaging): grant CAP_SYS_NICE at install and add make install (#61) (@bnema)
- b931c88: feat(scale): save scale-bind changes to the config with a notification (@bnema)
- 509f0eb: feat(session): start graphical-session.target through a systemd user unit (#21) (@bnema)
- 39f7a28: feat(session-lock): add ext-session-lock with DRM output protection (#73) (@bnema)
- 34856b1: feat(stash): capture windows opened while the stash is shown (@bnema)
- ded8960: feat(wayland): Wine and Proton protocols (#60) (@bnema)
- 8544ffa: feat(wayland): add text-input v3 and input-method v2 (#41) (@bnema)
- 3aaf9f2: feat(wayland): add wlr foreign toplevel management (#32) (@bnema)
- e2a318d: feat(wayland): ext_idle_notifier_v1 and wlr output power management (@bnema)
- e16ebd1: feat(wayland): support ext-workspace-v1 (@bnema)
- 2b00988: feat(workspace): add centered logical size overrides (#68) (@bnema)
- ff30418: feat: floating toggles, dim veil and throttling of invisible windows (#43) (@bnema)
- 13c6a90: feat: subtle focus indicator pulse on newly focused windows (#87) (@bnema)
Fixed
- 77b3aae: fix(config): keep saved scale in its config group (#28) (@bnema)
- 4e1cc2a: fix(config): reload a symlinked config when its target changes (#23) (@bnema)
- 46f6e33: fix(config): restart the reload debounce on every write (@bnema)
- b3c68fb: fix(core): align borders and insets with visible output tiles (#51) (@bnema)
- 9f23317: fix(core): apply taskbar fullscreen requests during the map grace (@bnema)
- c2347ef: fix(core): drop the fullscreen latch once its window has the focus (@bnema)
- 34fd4a7: fix(core): focus the lock surface of the focused output once it maps (@bnema)
- 99fdfdf: fix(core): hide floats with cmd+shift+v only when a float has focus (@bnema)
- f94690a: fix(core): ignore fullscreen requests in a window's first second (@bnema)
- 10fab51: fix(core): keep binds, moves and popup grabs off windows hidden by fullscreen (@bnema)
- 865e07c: fix(core): keep fullscreen windows from floating or hiding (@bnema)
- adeb040: fix(core): move the selected window, not the fullscreen one, from the overview (@bnema)
- 0b4c780: fix(core): pin lock focus on any click or key press (@bnema)
- 2a2f286: fix(core): refuse client fullscreen after the user left it (@bnema)
- 09abb12: fix(core): show and open the overview over fullscreen windows (#65) (@bnema)
- 1e27399: fix(core): show named workspaces from any screen (#75) (@bnema)
- 06140d8: fix(core): show windows hidden by a fullscreen window in the overview (@bnema)
- 3adce45: fix(core): tile windows opened over a fixed fullscreen on the home workspace (#62) (@bnema)
- 2b40f0a: fix(drm): carry cursor moves on game frames under VRR (@bnema)
- 02f9e79: fix(drm): clear a held cursor move reversed before the next frame (@bnema)
- 7bfbe4f: fix(drm): keep a display off across modesets, make failed power objects inert and floor idle timeouts (@bnema)
- 1d16b83: fix(drm): keep a gap after each VRR game flip (#63) (@bnema)
- f8fc70e: fix(drm): refuse scanout of cropped or below-root buffers (@bnema)
- 41f250a: fix(layout): return a client fullscreen window to its column with Cmd+F (#33) (@bnema)
- 35f6f59: fix(scale): create a missing config as owner-only and stop notifications on shutdown (@bnema)
- 4ef9a1d: fix(vulkan): draw background instead of colored placeholder before first buffer (#50) (@bnema)
- 9682d35: fix(vulkan): free buffers of undrawn windows on idle outputs (#55) (@bnema)
- ab9dbee: fix(wayland): correct workspace IDs and event batches (@bnema)
- adaacbc: fix(wayland): deactivate constraints outside c...
v0.1.0
Full Changelog: https://github.com/bnema/neferwl/commits/v0.1.0