Fling is a small Vim-style macOS window manager for people who like fast keyboard control. It lives in the menu bar, opens a compact floating panel, and lets you move or resize the current window with familiar h, j, k, and l navigation keys.
- Snap the current window with Vim-style direction keys:
h,j,k, andl. - Maximize the current window without entering macOS fullscreen.
- Move a window to another display.
- Cycle through visible windows while the panel is open.
- Configure a global shortcut to open the panel.
- Optionally configure a second global shortcut to move the focused window to the next display immediately.
- Start Fling automatically when you log in.
- Launch Fling.
- Grant Accessibility permission when macOS asks for it.
- Look for the Fling icon in the menu bar.
- Open
Settings...from the menu bar menu. - Check or change the
Activate panelshortcut.
If the permission prompt does not appear, enable Fling manually:
System Settings > Privacy & Security > Accessibility
Fling needs Accessibility permission because macOS only allows window managers to move and resize other apps through that permission.
- Focus the window you want to control.
- Press the
Activate panelshortcut. - Press a Vim-style command key from the panel key table below.
- Keep using commands, cycle to another window, or dismiss the panel.
The border highlight shows which window Fling is targeting.
The core movement model follows Vim navigation:
h = left
j = down
k = up
l = right
| Key | Action |
|---|---|
h |
Snap target window to the left half |
j |
Snap target window to the bottom half |
k |
Snap target window to the top half |
l |
Snap target window to the right half |
Space |
Maximize target window |
Shift+h |
Move target window to the previous display |
Shift+l |
Move target window to the next display |
Tab |
Focus the next usable window |
Shift+j |
Focus the next usable window |
Shift+k |
Focus the previous usable window |
Esc / q |
Close the panel |
Ctrl+c / Ctrl+[ |
Close the panel |
Open Settings... from the menu bar to configure global shortcuts.
| Setting | Default | Description |
|---|---|---|
Activate panel |
Configured in the app | Opens or closes the floating panel |
Move to next display |
Not set | Moves the focused window to the next display without opening the panel |
Shortcut recording requires at least one modifier key:
Control, Option, Shift, or Command
The menu bar menu provides:
About FlingLaunch at LoginSettings...Quit Fling
Fling tries to skip windows that are hidden, minimized, too small, off screen, or not real app windows. Finder's desktop layer is also skipped so cycling targets actual Finder windows instead of the desktop.
For normal use, run the app from Xcode. The project is generated from project.yml:
brew install xcodegen
xcodegen generate
open Fling.xcodeprojYou can also run the Swift package directly:
swift run FlingFor a local release build:
xcodegen generate
xcodebuild -project Fling.xcodeproj -scheme Fling -configuration Release buildTo export a .app from an archive:
xcodegen generate
xcodebuild \
-project Fling.xcodeproj \
-scheme Fling \
-configuration Release \
-archivePath build/Fling.xcarchive \
archive
xcodebuild \
-exportArchive \
-archivePath build/Fling.xcarchive \
-exportPath build/export \
-exportOptionsPlist ExportOptions.plistThe exported app will be placed under build/export.
For distribution to other Macs, you will also need Developer ID signing and notarization.
- macOS 14.0 or later
- Accessibility permission
- Xcode 15 or later if building from source
MIT