A Raycast extension that tiles your windows into a bento-box grid — one app's windows, or every window on the desktop.
A Raycast extension that tiles your windows into a bento-box grid with one keystroke. The grid auto-adapts to how many windows you have open — 4 windows become 2×2, 6 become 3×2, 9 become 3×3, and so on.
Two commands, one keystroke each: Auto Tile tiles a single app's windows (great for the vibe coding workflow where you spin up several terminals — Ghostty, Terminal, iTerm2… — and want them snapped into place without dragging each one into a quarter), and Auto Tile All tiles every window on the active desktop instead.
Bento Window is inspired by Window Layouts by @teemusuvinen. Window Layouts is a mature, full-featured window tiling extension — if you need fine-grained layout control across all your windows, go check it out.
Bento Window is intentionally narrower and more opinionated. It's built for one workflow: bind a hotkey, press it, and your app's windows snap into a grid. No menus, no views, no choices at runtime.
| Window Layouts | Bento Window | |
|---|---|---|
| Scope | All windows on the desktop | Single app's windows (or all, your choice) |
| Auto-detect target app | — | ✅ uses the focused window's app |
| Layout philosophy | Multiple commands for different layouts | Grid adapts to window count |
| Own layout grids | Shared grid definitions | Opinionated grids (e.g. 3 windows → 2 small + 1 big, not 3 equal columns) |
| Interface | Multiple commands | Two no-view commands (app / all windows), hotkey-optimized |
The grid the extension picks based on the number of windows of the target app:
1 window — fullscreen 2 windows — halves
┌──────────────┐ ┌──────┬──────┐
│ │ │ │ │
│ 1 │ │ 1 │ 2 │
│ │ │ │ │
└──────────────┘ └──────┴──────┘
3 windows — small × 2 + big 4 windows — 2×2
┌──────┬──────┐ ┌──────┬──────┐
│ 1 │ │ │ 1 │ 2 │
├──────┤ 3 │ ├──────┼──────┤
│ 2 │ │ │ 3 │ 4 │
└──────┴──────┘ └──────┴──────┘
5 windows — 2×2 small + big 6 windows — 3×2
┌───┬───┬────────┐ ┌────┬────┬────┐
│ 1 │ 2 │ │ │ 1 │ 2 │ 3 │
├───┼───┤ 5 │ ├────┼────┼────┤
│ 3 │ 4 │ │ │ 4 │ 5 │ 6 │
└───┴───┴────────┘ └────┴────┴────┘
7 windows — 4×2 (last wide) 8 windows — 4×2
┌───┬───┬───┬───┐ ┌───┬───┬───┬───┐
│ 1 │ 2 │ 3 │ 4 │ │ 1 │ 2 │ 3 │ 4 │
├───┼───┼───┴───┤ ├───┼───┼───┼───┤
│ 5 │ 6 │ 7 │ │ 5 │ 6 │ 7 │ 8 │
└───┴───┴───────┘ └───┴───┴───┴───┘
9 windows — 3×3 10+ windows — 5×2 (extras untouched)
┌────┬────┬────┐ ┌──┬──┬──┬──┬──┐
│ 1 │ 2 │ 3 │ │1 │2 │3 │4 │5 │
├────┼────┼────┤ ├──┼──┼──┼──┼──┤
│ 4 │ 5 │ 6 │ │6 │7 │8 │9 │10│
├────┼────┼────┤ └──┴──┴──┴──┴──┘
│ 7 │ 8 │ 9 │
└────┴────┴────┘
This extension is not yet on the Raycast Store. To run it locally:
git clone https://github.com/ipopo/bento-window.git
cd bento-window
npm install
npm run devnpm run dev registers the extension with Raycast and watches for code changes. You can Ctrl+C it once the extension shows up — the registration persists.
Then in Raycast:
- Open a few windows of your target app (Ghostty, Terminal, etc.)
- Run Auto Tile (or Auto Tile All to tile every window on the desktop)
- Optional: assign a global hotkey per command (Raycast Settings → Extensions → Bento Window → record hotkey)
Raycast Settings → Extensions → Bento Window:
- Target app names — comma-separated list, tried in order. The first app with windows on the active desktop gets tiled. Used only by Auto Tile (Auto Tile All ignores it; Raycast's own windows are always skipped).
- Default:
Ghostty, Terminal, iTerm2, Alacritty, WezTerm - Leave empty for auto mode — the extension uses the currently focused window's app. Works for any app you're focused in.
- Default:
- Gap — pixels between tiles and screen edges.
0(default) for flush tiles.
On a multi-display setup the windows are tiled on the desktop they're already on, not moved to the built-in display.
- macOS
- Accessibility permission granted to Raycast (System Settings → Privacy & Security → Accessibility)
MIT