A macOS utility for moving and resizing windows by dragging anywhere in them — not just the title bar — with optional snapping to a custom grid or to the edges of other windows.
[Screenshot — window drag + grid snap in action]
- Drag from anywhere — hold the trigger modifier key (default: FN / Globe) and left-click anywhere inside a window to move or resize it, no matter where your cursor is – you can release the trigger modifier key during interaction. Alternatively, use a configurable extra mouse button (middle, back, forward, etc.) with no modifier key required.
- Move or resize in one gesture — the drag zone is determined by cursor position: clicking near any edge (left, right, top, or bottom) resizes, clicking in the centre moves.
- Snap to grid — hold the grid snap modifier (default: Control) while dragging to snap the window to the nearest cell of your custom grid.
- Snap to windows — hold the window snap modifier (default: Shift) while dragging to align the window's edges with the edges of other on-screen windows.
- Snap modifiers work mid-drag — you can change or release a snap modifier at any point during a drag and the window responds immediately.
- Per-screen grids — configure a different column and row count for each connected display.
- Fully configurable keys — the drag trigger (modifier key combination, modifier+key shortcut, or mouse button), snap-to-windows, snap-to-same-app-windows, and snap-to-grid keys are all set in preferences and persist across launches.
- No title bar required — works on windows that have non-standard or hidden title bars.
- Per-app window snapping — hold a dedicated modifier (default: Option) to snap only to windows belonging to the same application.
- Mouse button app exceptions — exclude specific apps from the mouse button trigger so native behaviour (e.g. middle-click auto-scroll in browsers) is preserved.
- Minimum window size filter — small accessory windows below a configurable threshold are excluded from drag and resize interactions.
- Configurable resize border — adjust how wide the edge zone is that triggers a resize rather than a move, using a percentage of the window dimension (default 25 %) and a minimum pixel floor (default 40 pt).
- Raise on drag — optionally bring the target window and its app to the front when you start dragging (enabled by default).
Hold the trigger key (default: FN / Globe) and left-click in the middle of any window. Drag to move it. Release the mouse button to finish. Alternatively, press the configured mouse button (middle, back, forward, etc.) without any modifier key.
Hold the trigger key and left-click within the outer 25 % of any edge (left, right, top, or bottom). Drag to resize. Corners activate both adjacent edges simultaneously.
While dragging, hold an additional modifier:
| Modifier (default) | Effect |
|---|---|
| Control | Snap to grid — window jumps to a grid cell (see below) |
| Shift | Snap to windows — window edges align with edges of all on-screen windows |
| Option | Snap to same-app windows — like Shift, but limited to the same application |
| (neither) | Free movement, no snapping |
Snap modifiers can be held or released at any point during a drag.
When snapping to the grid, the window height is determined by where the cursor sits within the row:
- Top half of a row — window height = one cell.
- Bottom half of a row — window height = two cells (current row + the one below), provided a row below exists.
- Very near the bottom edge of the screen (grids with more than 2 rows only) — window height = full screen height, anchored to the top of the screen.
[Screenshot — free drag vs. grid-snapped drag comparison]
Open preferences with ⌘ ; or via the menu bar.
Configure the number of columns and rows for each connected screen. A live preview shows the current grid layout scaled to the screen's aspect ratio.
[Screenshot — Preferences → Grid tab]
Configure raise-on-drag, minimum window size (width and height below which windows are excluded from interactions), and the resize border (a percentage of the window dimension plus a minimum pixel floor that together determine how deep the edge zone is that triggers a resize rather than a move).
Set the drag trigger (modifier key combination, modifier+key shortcut, or mouse button), snap-to-grid, snap-to-all-windows, and snap-to-same-app-windows keys independently. A separate card lets you define mouse button app exceptions — apps where the mouse button trigger is disabled so native behaviour is preserved.
[Screenshot — Preferences → Keys tab]
Toggle automatic update checks. This reflects the choice made at first launch and can be changed at any time.
- macOS 13 Ventura or later
- Accessibility permission — Gridwell uses the Accessibility API to move and resize windows. On first launch it shows a prompt to open System Settings → Privacy & Security → Accessibility. The app must be trusted before monitoring starts.
[Screenshot — Accessibility permission prompt on first launch]
Gridwell has no external dependencies. Clone the repo and open the Xcode project:
git clone https://github.com/yourname/Gridwell.git
cd Gridwell
open Gridwell.xcodeprojSelect the Gridwell scheme, choose your Mac as the run destination, and press ⌘ R. App Sandbox is disabled in the project (required for global event monitoring and window manipulation via the Accessibility API).