Grid Screen lets you arrange your desktop windows into zones — predefined screen splits like two columns, three columns, or a main area with a sidebar. Instead of manually dragging and resizing every window, you drag window cards onto a visual canvas and click Arrange. All selected windows snap into place at once.
Built for general desktop users who want a tidy workspace without learning tiling window managers or memorizing keyboard shortcuts.
- 5 built-in presets — Two Columns, Three Columns, Focus + Stack, Main + Sidebar, 3 Wide Center
- Drag-and-drop canvas — assign windows to zones visually before applying
- Customizable layouts — adjust divider ratio, gap, and margin with sliders; save your own layouts
- Multiple screens — select which monitor to arrange
- System tray — runs in the background, open when needed
- Zero network — no telemetry, no analytics, no cloud. Everything stays on your machine
- Lightweight — idle CPU <1%, written in Rust
Download the latest .AppImage or .deb from GitHub Releases.
AppImage:
chmod +x grid-screen_*.AppImage
./grid-screen_*.AppImageDebian/Ubuntu:
sudo dpkg -i grid-screen_*.deb- Linux with X11 session (Xorg). Wayland with XWayland is partially supported.
- A window manager with EWMH support (GNOME, KDE Plasma, Xfce — most modern WMs work).
Wayland users: Grid Screen requires X11. On XWayland, basic functionality works but full screen detection may be limited. Native Wayland support is planned.
- Open Grid Screen. The Arrange tab shows your running windows on the left.
- Choose a screen and layout from the toolbar.
- Drag window cards from the catalog into the zones on the canvas.
- Adjust the divider ratio, gap, and margin sliders if needed.
- Click Arrange N windows. All assigned windows snap into their zones.
- Go to the Layouts tab.
- Click Duplicate on any preset to create a copy.
- Give it a name and save.
- Switch to Arrange, select your layout, adjust sliders. Changes auto-save on successful arrangement.
- Snap modifier & behavior (coming soon)
- Start at Login — auto-launch Grid Screen when you log in
- Minimize to Tray — keep running when you close the window
- System Status — view session type, EWMH support, connected screens
- Rust 1.96+
- Node.js 20+
- Linux system dependencies for Tauri:
sudo apt install libwebkit2gtk-4.1-dev libappindicator3-dev \ librsvg2-dev patchelf libx11-dev libxrandr-dev
git clone https://github.com/enolalabs/grid-screen.git
cd grid-screen
npm installnpm run tauri devnpm run tauri buildProduces .deb and .AppImage in src-tauri/target/release/bundle/.
grid-screen/
├── src/ # Svelte UI
│ ├── components/ # 25 UI components
│ ├── lib/
│ │ ├── stores/ # 8 Svelte stores
│ │ ├── commands.ts # Tauri IPC wrapper
│ │ └── events.ts # Rust → Svelte event listeners
│ └── App.svelte # Root component with tab routing
├── src-tauri/ # Rust application core
│ └── src/
│ ├── main.rs # Tauri entry point & lifecycle
│ ├── app_shell.rs # Tauri commands (bootstrap, arrange, save)
│ ├── layout_engine.rs # Zone rectangle computation
│ ├── arrange_orchestrator.rs # Validate-then-move pipeline
│ ├── platform_adapter.rs # OS abstraction trait
│ ├── x11_adapter.rs # X11/EWMH/XRandR integration
│ ├── config_store.rs # Atomic JSON persistence
│ ├── window_catalog.rs # Window eligibility filtering
│ └── diagnostics.rs # File-based logging
├── shared-types/ # Rust ↔ TypeScript type definitions
├── mockups/ # UI design mockups (dark, light, pro)
└── docs/ # Design specs & implementation plans
Svelte UI (webview)
↕ Tauri IPC (typed commands + events)
Rust application core
↕ PlatformAdapter trait
X11 adapter (XRandR + EWMH)
The Rust core handles all X11 communication, layout computation, and config persistence. The Svelte webview handles only the UI — drag-and-drop state, canvas rendering, and user input. The webview can be destroyed (window closed) while the Rust core keeps running in the system tray.
| Layer | Technology |
|---|---|
| Desktop shell | Tauri 2 |
| Application core | Rust |
| UI framework | Svelte 5 + TypeScript |
| X11 integration | x11rb |
| Config persistence | JSON in ~/.config/grid-screen/ |
| Logging | tracing |
| Drag-and-drop | Pointer-event-based (custom implementation) |
Contributions are welcome! Here's how to get started:
- Check the issues — look for
good-first-issueorhelp-wantedlabels - Read the docs — design specs and implementation plans are in
docs/ - Pick a task — comment on the issue to claim it
- Follow the code style — Rust:
cargo fmt+cargo clippy; Svelte:npm run lint - Write tests — Rust:
cargo test; UI: verify component renders correctly - Open a PR — keep it focused, reference the issue, include screenshots for UI changes
- X11 adapter hardening — real window enumeration, EWMH move/resize, edge cases
- Wayland support — implement
PlatformAdapterfor Wayland compositors - Modifier-assisted snap — drag real system windows into zones with a modifier key
- Accessibility — keyboard navigation, screen reader support, ARIA
- Testing — integration tests, X11 test suite, property-based geometry tests
MIT © Enola Labs

