Every window is a column on one horizontal strip that keeps going past the edges of your screen. Opening a window adds a column next to the one you are using instead of shrinking everything else, and the strip slides to show whatever you focus. It is the niri / PaperWM idea, built as a light native Mac app and inspired by the paid ChainYourMac.
The interface follows your Mac's language: Spanish or English (any other language gets English). Translations are welcome, see CONTRIBUTING.md.
Features
- One strip per display and per Space, with spring animations and its own focus and scroll position.
- Stacked strips: keep more than one strip per display and Space, one above the other and one in view at a time (work below, home above, say). You switch with a short swipe up or down, ⌃⌥⌘↑ / ⌃⌥⌘↓ or the overview, and ⌃⌥⌘⇧↑ / ⌃⌥⌘⇧↓ takes the focused window along. They survive restarts and display changes.
- New windows open beside the focused one; the strip scrolls to the focused window (centering: never, only when it overflows, always).
- Column widths: presets (25/33/50/66/75 %), full width, wider/narrower, center, and pin a column to the left or right edge.
- Stacks and tabs: put several windows in one column, stacked vertically or as tabs with a clickable tab bar.
- Trackpad: a three- or four-finger swipe slides the strip, with a gentle haptic tap at each column; a short quick swipe reaches the next one. A short swipe up or down switches strips, a long one up gives full width and a long one down opens the overview (or choose the old gesture in Settings: up for full width, down to go back).
- Overview (⌃⌘O, or a long move down on the trackpad or with the mouse buttons): the whole strip at a glance (a row per strip when you stack several), with every window's app and title; click one, or pick it with the arrows, to jump there; drag one to put its column somewhere else.
- Strip indicator: a frosted bar with one icon per column while you navigate; click a tile to jump, drag it to reorder.
- Mouse: hold ⌃⌘ and turn the wheel to go through the columns, or hold the mouse buttons you choose (the middle one, the side buttons 4 + 5 together…) and move the mouse: sideways slides the strip, a little up or down switches strips, further up gives full width and further down opens the overview. Drag a window onto another column to reorder; resize it to set the column width. Gets along with Mac Mouse Fix.
- Focus border and dim inactive windows (optional), focus follows mouse / mouse follows focus (optional).
- Per-app rules (tile or float, initial width, where new windows open) and per-display on/off.
- Remembers the layout across restarts, and when you plug a display back in, its windows return to their places; launch at login.
- Plays well with Rectangle: default shortcuts use ⌃⌘, and ⌃⌥⌘ with ↑ and ↓ to change strips, so they don't clash with Rectangle's default set, which uses ⌃⌥, and ⌃⌥⌘ only with ← and → (with its Spectacle set a couple do, and Rambla tells you). If Rectangle (or any other app) moves a window, that window leaves the strip and stays where it was put. The Mac page of the settings lists any shortcut that collides with your Rectangle setup.
- Automation:
rambla:// URLs, a rambla command-line tool and Raycast script export.
- English and Spanish: the interface follows your Mac's language.
- Light: native Swift (AppKit + SwiftUI settings), no Electron, event-driven — about 0 % CPU and ~12 MB of memory when idle.
Privacy
Rambla collects no data and has no telemetry. It does not read window contents or record the screen. Its only network request is a check of GitHub for a new release, shortly after it starts and once a day, which you can turn off in Settings → General. If you turn on Site icons (Settings → Appearance, off unless you do), it also reads the address of the page each browser window shows and asks those sites for their icons, with no cookies, keeping them only in memory. See SECURITY.md.
Requirements
macOS 14 Sonoma or later on Apple silicon, and the Accessibility permission.
Install
- Download Rambla.dmg from Releases (or build it, below) and drag Rambla to Applications.
- Open it and allow it in System Settings → Privacy & Security → Accessibility.
- Rambla is not notarized by Apple, so macOS will not open it the first time. Go to System Settings → Privacy & Security and click Open Anyway (on macOS 14, right-click the app → Open is enough), or run
xattr -dr com.apple.quarantine /Applications/Rambla.app.
Updates
Rambla checks GitHub when it starts and once a day. When a new version is out, its menu shows Update to Rambla X…: it downloads the release, verifies that it is signed with the same certificate, replaces itself and restarts. The Accessibility permission is kept.
Default shortcuts
All of them can be changed in Settings → Shortcuts.
| Shortcut | Action |
|---|
| ⌃⌘← / ⌃⌘→ (or ⌃⌘H / ⌃⌘L) | Focus the column to the left / right |
| ⌃⌘↑ / ⌃⌘↓ (or ⌃⌘K / ⌃⌘J) | Focus the window above / below in a stack |
| ⌃⌘A / ⌃⌘E | First / last column |
| ⌃⌘1 … ⌃⌘9 | Jump to column N |
| ⌃⌘⇧ + arrows (or H J K L) | Move the column / the window inside its stack |
| ⌃⌘N | Send the window to the next display |
| ⌃⌥⌘↑ / ⌃⌥⌘↓ | Go to the strip above / below |
| ⌃⌥⌘⇧↑ / ⌃⌥⌘⇧↓ | Send the window to the strip above / below, and follow it |
| ⌃⌘O | Overview of the strip |
| ⌃⌘R | Cycle preset widths |
| ⌃⌘M | Full width (again to restore) |
| ⌃⌘C | Center the column |
| ⌃⌘= / ⌃⌘- | Wider / narrower |
| ⌃⌘⇧= / ⌃⌘⇧- | Taller / shorter (in a stack) |
| ⌃⌘0 | Equalize heights |
| ⌃⌘P / ⌃⌘⇧P | Pin the column to the left / right edge |
| ⌃⌘[ / ⌃⌘] | Stack into the column on the left / right |
| ⌃⌘⇧[ / ⌃⌘⇧] | Pop out of the stack to the left / right |
| ⌃⌘⇧T | Toggle stack ⇄ tabs |
| ⌃⌘T | Float / put back in the strip |
Trackpad
macOS also receives every swipe and Rambla cannot stop it. And in System Settings → Trackpad → More Gestures → Swipe between full-screen applications, the three-finger option also keeps the four-finger swipe on. If you use the four-finger swipe (default), click Turn Off in macOS in Settings → Trackpad & Mouse: Rambla turns off only the macOS four-finger swipe, and three fingers still switch desktops. Or pick three fingers in Rambla and set the system one to four. Rambla tells you if they collide.
Recommended macOS settings
Rambla checks these for you in Settings → Mac:
- Displays have separate Spaces: on (macOS default).
- Automatically rearrange Spaces based on most recent use: off.
- Stage Manager and drag windows to screen edges to tile: off.
- With two displays, placing the second one above or below the main one works best. Side by side works too: windows slide at most halfway toward the other display, and those on that side are parked on the opposite edge.
Automation
open -g "rambla://focus-left" # any action id but close-window, e.g. focus-3, cycle-width
rambla focus-right # after Settings → Automation → Install `rambla` Command
rambla list # all actions
Settings → Automation can also export one Raycast script per action. Any web page can open a rambla:// link, so links can't close windows: close-window runs only from the rambla command and from its Raycast script.
Build from source
Only the Xcode Command Line Tools are needed (Swift 6); Xcode itself is not required.
git clone https://github.com/Coru29/rambla && cd rambla
scripts/test.sh # unit tests (Swift Testing)
scripts/build.sh # build/Rambla.app
scripts/dmg.sh # build/Rambla.dmg
scripts/install.sh # copy to /Applications and launch
scripts/e2e.sh # live end-to-end checks with a throwaway test app (needs the Accessibility permission)
The first build creates a local self-signed code-signing identity in .signing/ (never committed), so macOS keeps the Accessibility permission across rebuilds. That identity is yours, not the project's: installing your build over a release makes macOS ask for the Accessibility permission again, and that copy no longer accepts the official updates.
Versions and releases: commits follow Conventional Commits and the version is computed from them (feat → minor, fix → patch, ! → major). scripts/release.sh builds the signed DMG, tags and publishes the release; installed copies update themselves within a day. See CONTRIBUTING.md.
How it works
RamblaCore is a pure Swift library with the model (strips, columns), the layout engine, the strip operations, preferences and shortcut tables. It has no AppKit and is covered by unit tests.
- The app runs one thread per managed app for all Accessibility calls, so a frozen app never blocks the others. Everything is event-driven (AX notifications, workspace notifications, Carbon hot keys); timers run only while something needs them: an animation, the strip indicator while ⌃⌘ is held, the permission check until it is granted, and the daily update check.
- macOS moves windows that are fully off screen back into view, so windows outside the visible part of the strip are parked with 1 pt visible at a screen edge. When Rambla quits or pauses, every parked window is brought back on screen.
- Private APIs are kept to the minimum that yabai and AeroSpace also use (window ids, Spaces, focusing an exact window), loaded at runtime so a missing symbol degrades instead of crashing. SIP stays on.
Credits
Inspired by niri, PaperWM, PaperWM.spoon, Paneru and ChainYourMac. Techniques learned from yabai, AeroSpace and Rectangle.
License
MIT