bbodi/tinywm

A scrolling window manager for macOS, inspired by niri

Swift

19

4 commits

updated Oct 17, 2026

See the code

See what people are saying

SourceMessageScoreDate

[tinywm] A niri-style scrolling window manager for macOS (r/unixporn)

Details: \- OS: macOS 26 \- WM: tinywm (my own project, free and open source): [https://github.com/bbodi/tinywm](https://github.com/bbodi/tinywm) \- Terminal: Ghostty \- Editor: tt \- Browser: Firefox tinywm puts windows on a strip that scrolls past the screen edge, like niri on Linux. New windows…

11

Oct 16, 2026

Show HN: Tinywm – a scrolling window manager for macOS, inspired by Niri

12

Oct 16, 2026

README

tinywm icon

tinywm

Your windows, on an endless strip.
A scrolling window manager for macOS. No more resizing, overlapping or hunting for windows.

Download the latest release


Every new window opens next to the one you're using, on the display you're using, and nothing else changes size. The strip simply runs past the edge of your screen. Scroll it with one key or a swipe, and every window is exactly where you left it.

tinywm is inspired by niri, the scrolling window manager for Linux, and brings its way of working to macOS.

tinywm scrolling a strip of windows, changing widths, switching workspaces and opening the overview

▶ Watch the demo with sound

Why you'll like it

  • Nothing jumps around. Opening a window never squeezes the others. Your layout stays put.
  • Silky motion. Windows glide into place with a spring, smooth even on 120 Hz screens.
  • One key does it all. Hold right ⌘ and use H J K L or the arrows. Your normal ⌘ shortcuts keep working.
  • Workspaces that stack. Keep projects apart, one strip each. Flick up or down to switch.
  • See everything at once. Press right ⌘ + Esc for an overview of every window, then pick one.
  • Swipe with your fingers. Drag the strip with three fingers on the trackpad.
  • Every display gets its own strip. Move windows between monitors with one key.
  • Your rules. Keep calculators floating, ignore apps entirely, stop chatty apps from stealing focus, or open an app on a chosen display and workspace.
  • Plain-text config. One small file, reloaded the moment you save it.

Install

tinywm needs macOS 14 Sonoma or later on a Mac with Apple silicon.

  1. Download tinywm.zip from the latest release.
  2. Open the zip and drag tinywm into your Applications folder.
  3. Open tinywm. Apple has checked and notarized it, so it opens like any other app.

To update, quit tinywm and replace the app with the new one. Your permissions and settings stay.

Build it yourself instead (needs Xcode or the Command Line Tools):

git clone https://github.com/bbodi/tinywm.git
cd tinywm
scripts/bundle-tinywm.sh --install

This puts the app in ~/Applications.

Get started

When tinywm first opens, a welcome window walks you through the permissions:

  • Accessibility is required. tinywm uses it to move and resize windows.
  • Screen Recording is optional. It is only for live window pictures while windows move.

The welcome window also checks the macOS settings that get in the way: trackpad gestures, Stage Manager, tiling at screen edges, click wallpaper to reveal desktop, other window managers and Open at Login. Reopen it any time from the menu-bar icon (Welcome…).

The keys

Hold right ⌘ (the "meta" key) and press:

KeyDoes
H J K L or ← ↓ ↑ →Move between windows
⇧ + the sameMove the window itself
U / I, ⌥↓ / ⌥↑ or Page Down / Page UpWorkspace below / above (⇧ takes the window along)
. / ,Next / previous display (⇧ takes the window along)
W A S DThe display above, left, below or right (⇧ takes the window along)
RCycle width: ⅓, ½, ⅔
F / CFull width / centre the window
= / −Wider / narrower
[ / ]Stack the window into its neighbour · ⇧] pops it out
TFloat or tile the window
VFocus the floating windows, then the strip again
1 – 9Jump to a column
EscOverview: pick a window with the arrows or Tab, then Return; Esc closes it
QClose the window

Drag with the mouse. Hold the meta key and drag any window, anywhere inside it. The other windows make room, and a slot shows exactly where it will land: between two columns, above or below a window in a stack, or on another display. Let go to drop it there, or press Esc to cancel. A floating window simply moves.

Prefer ⌃⌥ over right ⌘, or different keys? Change anything in the config.

Make it yours

Choose Edit Config… from the menu bar icon. A few lines go a long way:

default-width = 0.5            # new windows take half the screen
bind focus-left = n            # remap any key

float    = com.apple.calculator, System Settings
ignore   = com.apple.finder
no-focus = Slack                # never steals focus

send space = cmd+space          # meta+Space opens your launcher
run shift+return = open -na Ghostty
focus-crosses-displays = on     # past the last column, focus moves to the next display
open-on  = Mail -> workspace 2  # an app always opens on a chosen display or workspace

There is more: meta = control-option picks ⌃⌥ as the meta key, gap sets the space between windows, width-presets sets the widths R cycles through, swipe-fingers = 4 switches swipes to four fingers, and unbind removes a default key. The config file that tinywm creates lists every option with a short explanation.

Good to know

  • tinywm only asks for what it needs: Accessibility to move windows, and Screen Recording for live window pictures. Nothing leaves your Mac.
  • By default, moving windows show as live pictures, which need Screen Recording. To record nothing, turn off Show Live Window Pictures (Screen Recording) in the menu-bar icon. Moving windows then show as cards with the app's icon and the window's title.
  • Open at Login is in the menu-bar icon and the welcome window. It works from the installed app, not from swift run.
  • Quitting tinywm puts every window back where it was.
  • tinywm remembers your layout and restores it after a restart, as long as the apps keep their windows open. After a reboot it matches reopened windows by app and title, as far as it can. Turn this off with restore-layout = off in the config.
  • macOS can't hide single windows, so windows on other workspaces wait just off screen.
  • Floating windows (meta+T, float rules, fixed-size windows) keep their own frame and show in the overview. Meta+V focuses them one after another and then returns to the strip.

Known limitations

  • Full-screen apps (the green button) live in their own macOS Space, outside tinywm's strip.
  • Some windows refuse to resize, like fixed-size dialogs and a few apps. tinywm floats them. An app that refuses a narrow width, such as Slack, gets wider columns: tinywm learns the narrowest width each app takes and remembers it. Drag the window narrower to lower it again.
  • Password fields pause the meta key. macOS blocks keyboard shortcuts from other apps while you type a password. Use ⌃⌥ instead if you need tinywm there.
  • Trackpad swipes clash with macOS gestures that use the same number of fingers. The welcome window and the menu bar icon warn you and link to Trackpad settings.
  • Floating windows are not kept on top. macOS keeps the active app's windows above every other app's, and raising another app's window can make that app take the keyboard. Meta+V brings a floating window up by focusing it, and the overview shows all of them.
  • macOS Spaces aren't tracked separately. Use tinywm's own workspaces instead, and keep to one macOS Space per display.
  • Built for Apple silicon and tested on macOS 14 and later. Intel Macs are untested.

For developers

See docs/DEVELOPING.md for the architecture, tests and how to build the app.

License

Copyright (C) 2026 BB.

tinywm is free software under the GNU General Public License v3.0. You may use, change and share it. If you share a changed version, you must share its source under the same license. For a license without these terms, contact [email protected].

macos
niri
scrolling-window-manager
swift
tiling-window-manager
window-manager

bbodi/tinywm

A scrolling window manager for macOS, inspired by niri

Swift

19

4 commits

updated Oct 17, 2026

See the code

See what people are saying

SourceMessageScoreDate

[tinywm] A niri-style scrolling window manager for macOS (r/unixporn)

Details: \- OS: macOS 26 \- WM: tinywm (my own project, free and open source): [https://github.com/bbodi/tinywm](https://github.com/bbodi/tinywm) \- Terminal: Ghostty \- Editor: tt \- Browser: Firefox tinywm puts windows on a strip that scrolls past the screen edge, like niri on Linux. New windows…

11

Oct 16, 2026

Show HN: Tinywm – a scrolling window manager for macOS, inspired by Niri

12

Oct 16, 2026

README

tinywm icon

tinywm

Your windows, on an endless strip.
A scrolling window manager for macOS. No more resizing, overlapping or hunting for windows.

Download the latest release


Every new window opens next to the one you're using, on the display you're using, and nothing else changes size. The strip simply runs past the edge of your screen. Scroll it with one key or a swipe, and every window is exactly where you left it.

tinywm is inspired by niri, the scrolling window manager for Linux, and brings its way of working to macOS.

tinywm scrolling a strip of windows, changing widths, switching workspaces and opening the overview

▶ Watch the demo with sound

Why you'll like it

  • Nothing jumps around. Opening a window never squeezes the others. Your layout stays put.
  • Silky motion. Windows glide into place with a spring, smooth even on 120 Hz screens.
  • One key does it all. Hold right ⌘ and use H J K L or the arrows. Your normal ⌘ shortcuts keep working.
  • Workspaces that stack. Keep projects apart, one strip each. Flick up or down to switch.
  • See everything at once. Press right ⌘ + Esc for an overview of every window, then pick one.
  • Swipe with your fingers. Drag the strip with three fingers on the trackpad.
  • Every display gets its own strip. Move windows between monitors with one key.
  • Your rules. Keep calculators floating, ignore apps entirely, stop chatty apps from stealing focus, or open an app on a chosen display and workspace.
  • Plain-text config. One small file, reloaded the moment you save it.

Install

tinywm needs macOS 14 Sonoma or later on a Mac with Apple silicon.

  1. Download tinywm.zip from the latest release.
  2. Open the zip and drag tinywm into your Applications folder.
  3. Open tinywm. Apple has checked and notarized it, so it opens like any other app.

To update, quit tinywm and replace the app with the new one. Your permissions and settings stay.

Build it yourself instead (needs Xcode or the Command Line Tools):

git clone https://github.com/bbodi/tinywm.git
cd tinywm
scripts/bundle-tinywm.sh --install

This puts the app in ~/Applications.

Get started

When tinywm first opens, a welcome window walks you through the permissions:

  • Accessibility is required. tinywm uses it to move and resize windows.
  • Screen Recording is optional. It is only for live window pictures while windows move.

The welcome window also checks the macOS settings that get in the way: trackpad gestures, Stage Manager, tiling at screen edges, click wallpaper to reveal desktop, other window managers and Open at Login. Reopen it any time from the menu-bar icon (Welcome…).

The keys

Hold right ⌘ (the "meta" key) and press:

KeyDoes
H J K L or ← ↓ ↑ →Move between windows
⇧ + the sameMove the window itself
U / I, ⌥↓ / ⌥↑ or Page Down / Page UpWorkspace below / above (⇧ takes the window along)
. / ,Next / previous display (⇧ takes the window along)
W A S DThe display above, left, below or right (⇧ takes the window along)
RCycle width: ⅓, ½, ⅔
F / CFull width / centre the window
= / −Wider / narrower
[ / ]Stack the window into its neighbour · ⇧] pops it out
TFloat or tile the window
VFocus the floating windows, then the strip again
1 – 9Jump to a column
EscOverview: pick a window with the arrows or Tab, then Return; Esc closes it
QClose the window

Drag with the mouse. Hold the meta key and drag any window, anywhere inside it. The other windows make room, and a slot shows exactly where it will land: between two columns, above or below a window in a stack, or on another display. Let go to drop it there, or press Esc to cancel. A floating window simply moves.

Prefer ⌃⌥ over right ⌘, or different keys? Change anything in the config.

Make it yours

Choose Edit Config… from the menu bar icon. A few lines go a long way:

default-width = 0.5            # new windows take half the screen
bind focus-left = n            # remap any key

float    = com.apple.calculator, System Settings
ignore   = com.apple.finder
no-focus = Slack                # never steals focus

send space = cmd+space          # meta+Space opens your launcher
run shift+return = open -na Ghostty
focus-crosses-displays = on     # past the last column, focus moves to the next display
open-on  = Mail -> workspace 2  # an app always opens on a chosen display or workspace

There is more: meta = control-option picks ⌃⌥ as the meta key, gap sets the space between windows, width-presets sets the widths R cycles through, swipe-fingers = 4 switches swipes to four fingers, and unbind removes a default key. The config file that tinywm creates lists every option with a short explanation.

Good to know

  • tinywm only asks for what it needs: Accessibility to move windows, and Screen Recording for live window pictures. Nothing leaves your Mac.
  • By default, moving windows show as live pictures, which need Screen Recording. To record nothing, turn off Show Live Window Pictures (Screen Recording) in the menu-bar icon. Moving windows then show as cards with the app's icon and the window's title.
  • Open at Login is in the menu-bar icon and the welcome window. It works from the installed app, not from swift run.
  • Quitting tinywm puts every window back where it was.
  • tinywm remembers your layout and restores it after a restart, as long as the apps keep their windows open. After a reboot it matches reopened windows by app and title, as far as it can. Turn this off with restore-layout = off in the config.
  • macOS can't hide single windows, so windows on other workspaces wait just off screen.
  • Floating windows (meta+T, float rules, fixed-size windows) keep their own frame and show in the overview. Meta+V focuses them one after another and then returns to the strip.

Known limitations

  • Full-screen apps (the green button) live in their own macOS Space, outside tinywm's strip.
  • Some windows refuse to resize, like fixed-size dialogs and a few apps. tinywm floats them. An app that refuses a narrow width, such as Slack, gets wider columns: tinywm learns the narrowest width each app takes and remembers it. Drag the window narrower to lower it again.
  • Password fields pause the meta key. macOS blocks keyboard shortcuts from other apps while you type a password. Use ⌃⌥ instead if you need tinywm there.
  • Trackpad swipes clash with macOS gestures that use the same number of fingers. The welcome window and the menu bar icon warn you and link to Trackpad settings.
  • Floating windows are not kept on top. macOS keeps the active app's windows above every other app's, and raising another app's window can make that app take the keyboard. Meta+V brings a floating window up by focusing it, and the overview shows all of them.
  • macOS Spaces aren't tracked separately. Use tinywm's own workspaces instead, and keep to one macOS Space per display.
  • Built for Apple silicon and tested on macOS 14 and later. Intel Macs are untested.

For developers

See docs/DEVELOPING.md for the architecture, tests and how to build the app.

License

Copyright (C) 2026 BB.

tinywm is free software under the GNU General Public License v3.0. You may use, change and share it. If you share a changed version, you must share its source under the same license. For a license without these terms, contact [email protected].

macos
niri
scrolling-window-manager
swift
tiling-window-manager
window-manager