┌───┬───┐
│ g │ o │ ╻ ╻╻ ╻
├───┼───┤ ┃╻┃┣┳┛
│ w │ m │ ┗┻┛╹ ╹
└───┴───┘
━━━━━━━━━ catppuccin frappe
🭫🭫🭫🭫🭫🭫🭫🭫🭫 #ca9ee6 #8caaee #a6d189 #e5c890
A minimal tiling window manager for X11, written in Go. Inspired by xmonad.
╭─────────────────────────────────────────────────────────────────╮
│ eww bar │
├─────────────────────────────────────────────────────────────────┤
│ ┌─────┬─────┐ ┌─────────┐ ┌───┬───┐ ┌───┬─────┬───┐ │
│ │ │ 2 │ │ │ │ 1 │ 2 │ │ │ │ │ │
│ │ 1 ├─────┤ │ 1 │ ├───┼───┤ │ 2 │ 1 │ 3 │ │
│ │ │ 3 │ │ │ │ 3 │ 4 │ │ │ │ │ │
│ └─────┴─────┘ └─────────┘ └───┴───┘ └───┴─────┴───┘ │
│ Tall Full Grid ThreeCol │
╰─────────────────────────────────────────────────────────────────╯
- Tiling Layouts - Tall, Full, Grid, Spiral, ThreeColumn, CenteredMaster
- 9 Workspaces - Quick switching with
Super+1-9 - EWMH Compliant - Works with panels, bars, and pagers
- Strut Support - Automatically tiles around eww, polybar, etc.
- Scratchpad - Toggle-able floating terminal with `Super+``
- GridSelect - Visual window picker with Xft fonts and search (
Super+g) - Window Gaps - Configurable inner/outer gaps between windows
- Focus Follows Mouse - Optional mouse-driven focus
- Mouse Support - Move/resize floating windows with Super+drag
- Window Rules - Auto-float and workspace assignment by WM_CLASS
- Urgent Hints - Red border for windows requesting attention
- IPC Socket - External control via
gowmctlcommands - Compile-time Config - Edit
config.goand rebuild (like xmonad) - Catppuccin Theme - Frappe color palette built-in
- Autostart - Launch compositor, bar, and apps on startup
- Restart Persistence - Windows stay on their workspaces after restart
- ~5000 lines of Go - Simple, hackable codebase
git clone https://github.com/0xb0b1/gowm.git
cd gowm
go build -o gowm .
sudo cp gowm /usr/local/bin/Create /usr/share/xsessions/gowm.desktop:
[Desktop Entry]
Name=gowm
Comment=Pure Go Tiling Window Manager
Exec=/usr/local/bin/gowm
Type=ApplicationAdd to ~/.xinitrc:
exec /usr/local/bin/gowmEdit config.go and rebuild. Configuration is compile-time for type safety and performance.
BorderWidth: 2,
OuterGap: 4, // Gap between windows and screen edge
InnerGap: 4, // Gap between windows
FocusedBorderColor: ColorLavender, // #babbf1
UnfocusedBorderColor: ColorSurface0, // #414559
FocusFollowsMouse: true,Terminal: "kitty",
Launcher: "rofi -show drun",Edit startup.go to customize autostart:
AutostartAlways: []string{
"dunst",
"picom --config ~/.config/picom/picom.conf",
"~/.config/eww/launch.sh start",
},| Key | Action |
|---|---|
Super+Return |
Launch terminal |
Super+Shift+Return |
Launch floating terminal |
Super+d / Super+r |
Application launcher |
Super+q |
Close window |
Super+Shift+q |
Close all windows |
Super+g |
GridSelect (visual window picker) |
| Key | Action |
|---|---|
Super+j |
Focus next |
Super+k |
Focus previous |
Super+m |
Focus master |
Super+Shift+j |
Swap with next |
Super+Shift+k |
Swap with previous |
| Key | Action |
|---|---|
Super+Space |
Next layout |
Super+Shift+Space |
Reset to tall |
Super+h |
Shrink master |
Super+l |
Expand master |
Super+, |
Add master window |
Super+. |
Remove master window |
Super+s |
Sink floating window |
| Key | Action |
|---|---|
Super+1-9 |
Switch to workspace |
Super+Shift+1-9 |
Move window to workspace |
| Key | Action |
|---|---|
XF86AudioMute |
Toggle mute |
XF86AudioLower/Raise |
Volume down/up |
XF86AudioPlay/Next/Prev |
Media controls |
XF86MonBrightness* |
Brightness controls |
| Key | Action |
|---|---|
| `Super+`` | Toggle scratchpad terminal |
Super+s |
Sink floating window to tiled |
Super+Button1 |
Move floating window |
Super+Button3 |
Resize floating window |
| Key | Action |
|---|---|
Super+Shift+r |
Restart gowm |
Super+Ctrl+q |
Quit gowm |
Master window on the left, stack on the right. Adjustable ratio with Super+h/l.
┌──────────┬───────┐
│ │ 2 │
│ 1 ├───────┤
│ (master) │ 3 │
│ ├───────┤
│ │ 4 │
└──────────┴───────┘
All windows maximized, cycle with focus keys.
┌─────────────────┐
│ │
│ 1 │
│ (fullscreen) │
│ │
└─────────────────┘
Equal-sized grid arrangement.
┌────────┬────────┐
│ 1 │ 2 │
├────────┼────────┤
│ 3 │ 4 │
└────────┴────────┘
Test safely in a nested X server:
# Install Xephyr if needed
# Arch: sudo pacman -S xorg-server-xephyr
# Debian/Ubuntu: sudo apt install xserver-xephyr
# Start nested X server
Xephyr :1 -screen 1920x1080 -ac &
# Run gowm in it
DISPLAY=:1 ./gowm &
# Launch test applications
DISPLAY=:1 alacritty &
DISPLAY=:1 thunar &- Go 1.21+
- X11 server
- libxft-dev (for anti-aliased fonts in GridSelect)
- jezek/xgb - X11 protocol bindings
- jezek/xgbutil - X11 utilities
Control gowm externally using the gowmctl script:
# Copy gowmctl to your PATH
sudo cp gowmctl /usr/local/bin/
# Switch workspace
gowmctl workspace switch 3
# Query windows
gowmctl query windows
# Close focused window
gowmctl window close
# Toggle scratchpad
gowmctl action scratchpad
# See all commands
gowmctl helpEdit rules.go to customize auto-float and workspace assignment:
// Auto-float specific applications
{Class: "pavucontrol", Floating: &floating},
{Class: "steam", Title: "Friends List", Floating: &floating},
// Assign apps to specific workspaces
{Class: "discord", Workspace: intPtr(8)},
{Class: "spotify", Workspace: intPtr(9)},gowm/
├── main.go # Entry point, event loop
├── wm.go # WindowManager core logic
├── client.go # Window management
├── workspace.go # Workspace handling
├── layout.go # Layout interface
├── layout_tall.go # Master/stack layout
├── layout_full.go # Monocle layout
├── layout_grid.go # Grid layout
├── config.go # Configuration & keybindings
├── keysym.go # X11 keysym definitions
├── actions.go # Keybinding actions
├── startup.go # Autostart handling
├── atoms.go # X11 atom management
├── ewmh.go # EWMH compliance
├── scratchpad.go # Scratchpad functionality
├── gridselect.go # GridSelect window picker
├── mouse.go # Mouse move/resize
├── rules.go # Window rules
├── urgent.go # Urgent hints handling
├── ipc.go # IPC socket server
├── gowmctl # IPC client script
└── rect.go # Geometry utilities
- xmonad - The original Haskell tiling WM
- bspwm - A tiling window manager based on binary space partitioning
MIT