hongnoul/gwae

Infinite scroll terminal multiplexer and agent orchestrator for macOS

Rust

12

690 commits

updated Sep 23, 2026

See the code

See what people are saying

README

gwae

gwae

Lightweight, Lightspeed

MIT license total GitHub release downloads GitHub stars latest stable release

gwae demo: agents on an infinite no-shrink strip grid

Tested with Ghostty and Jcode on MacBook Pro M4

Install

Developed and tested on macOS only. Contributions for Windows are welcome.

Linux users: I recommend niri, the scrolling window manager that inspired gwae.

curl -fsSL https://hongnoul.github.io/gwae/install.sh | bash

or with Homebrew:

brew install hongnoul/tap/gwae

Cool features

Official docs are still WIP.

FeatureDefaultWhat it does
Heads-up displayhold ⌥Live agent status minimap over standard OSC 133 with Running, Idle, and Failed states
Smart jump⌥+gCycles through Idle panes with Failed states ranked first
Hatchery⌥+dOpens the spawn-directory picker to choose where the next pane process starts
Agent selector⌥+Shift+;Opens the harness picker to spawn a specific agent instead of your default choice
Drag to copydragLeft-drag selects and copies on release via pbcopy with OSC 52 fallback for remote sessions
Caffeinate⌥+wToggles the macOS caffeinate assertion so a long-running job never sleeps mid-task

When to use gwae (and how it compares vs tmux and herdr): running several CLI coding agents at once, tmux panes shrinking into slivers, or wanting niri's scrolling layout in the terminal.

Interactive tutorial

+ / opens the cheat sheet.

Vim-style movement, like a tiling WM: + h left · + j down · + k up · + l right

Paste this into an agent pane:

You are teaching me gwae, a scrolling terminal multiplexer. I am inside a
gwae pane talking to you. I am a beginner: assume I know nothing beyond
typing in a terminal. Walk me through each step below one at a time. For
each step, tell me exactly what to press, what I should see, and how to
confirm it worked. Wait for my confirmation before moving on. If something
does not work, stop and help me fix it before continuing. Do not skip
ahead and do not dump all steps at once.

0. Fix the modifier key first. Nothing below works without this. Have me
press ⌥+/ . If the cheat sheet opens, it works; press Esc to close it.
If a special character types instead, tell me to set Option to act as
Meta in my terminal (Terminal.app: Preferences, Profiles, Keyboard, Use
Option as Meta Key; iTerm2, Ghostty, WezTerm have the equivalent), then
retry. Do not proceed until ⌥+/ opens the cheat sheet.
1. Open a pane: have me press ⌥+Enter once. Confirm a new shell pane
appears to the right.
2. Move: have me press ⌥+h and ⌥+l to move between the two panes.
Confirm the focus ring follows. Then have me press ⌥+k and ⌥+j.
Mention click-to-focus only after these work.
3. Open more: have me press ⌥+Enter until there are 6 panes. If I get
lost, remind me ⌥+h/l moves between panes. Point out the viewport
scrolling right while every pane keeps its width.
4. Reshape: have me press ⌥+r to cycle the focused column's width, then
⌥+b to split below. Mention ⌥+f
(full width) and ⌥+Shift+h/j/k/l (move pane in all four directions)
only after these work.
5. Agents: have me press ⌥+; to spawn an agent (first press offers what
is installed and remembers it). Confirm Cmd+V pastes text into the pane
(native terminal paste). Mention ⌥+Shift+; (picker), ⌥+d (spawn
directory), and gwae run "claude" (CLI start) after.
6. History: have me press ⌥ plus the up and down arrows to scroll the
focused pane's history (add Shift for a bigger jump). Then have me
press ⌃+⇧+K and ⌃+⇧+J for the three-line transcript scroll, noting it
goes to the agent itself inside agent panes. Left and right arrows
always type into the pane, never scroll. Confirm history moves without
moving focus.
7. Stuck panes: have me hold ⌥ for the dashboard (» working, ! needs
input, ✗ failed), then ⌥+g to jump to the neediest pane. Mention
clicking a tile focuses it.
8. Help and quit: show ⌥+/ (cheat sheet), ⌥+q (close pane),
⌥+Shift+q (quit; last pane exiting quits gwae). Mention ⌥+w
(keep-awake) last.
9. Health: only now, have me type exit in panes until one shell is left,
then run gwae doctor in it and confirm exit 0. If anything fails, run
gwae init. Mention ~/.config/gwae/gwae.toml (all keys optional,
live-reloads) only here, at the end.

Development

git clone https://github.com/hongnoul/gwae
cd gwae
cargo build
cargo test --workspace

Benchmark

MetricMethodgwaeherdr 0.9.1tmux 3.7c
Echo p50Keystroke to visible echo in a real PTY harness, median0.34 ms0.48–0.50 ms0.36–0.37 ms
Echo p90Keystroke to visible echo in a real PTY harness, 90th pct0.36–0.38 ms0.54 ms0.42–0.43 ms
Spawn p50New pane request to first painted frame, median0.48–0.52 ms0.63–0.70 ms4.1–4.7 ms

Agent instructions

if you are an ai agent driving gwae, read docs/agents.md before spawning panes.

ai-agents
claude-code
cli-agents
conpty
developer-tools
gwae
macos
multiplexer
niri
rust
terminal
terminal-multiplexer
tiling-window-manager
tui
windows

Contributors

hongnoul

689 commits

actions-user

1 commits

hongnoul/gwae

Infinite scroll terminal multiplexer and agent orchestrator for macOS

Rust

12

690 commits

updated Sep 23, 2026

See the code

See what people are saying

README

gwae

gwae

Lightweight, Lightspeed

MIT license total GitHub release downloads GitHub stars latest stable release

gwae demo: agents on an infinite no-shrink strip grid

Tested with Ghostty and Jcode on MacBook Pro M4

Install

Developed and tested on macOS only. Contributions for Windows are welcome.

Linux users: I recommend niri, the scrolling window manager that inspired gwae.

curl -fsSL https://hongnoul.github.io/gwae/install.sh | bash

or with Homebrew:

brew install hongnoul/tap/gwae

Cool features

Official docs are still WIP.

FeatureDefaultWhat it does
Heads-up displayhold ⌥Live agent status minimap over standard OSC 133 with Running, Idle, and Failed states
Smart jump⌥+gCycles through Idle panes with Failed states ranked first
Hatchery⌥+dOpens the spawn-directory picker to choose where the next pane process starts
Agent selector⌥+Shift+;Opens the harness picker to spawn a specific agent instead of your default choice
Drag to copydragLeft-drag selects and copies on release via pbcopy with OSC 52 fallback for remote sessions
Caffeinate⌥+wToggles the macOS caffeinate assertion so a long-running job never sleeps mid-task

When to use gwae (and how it compares vs tmux and herdr): running several CLI coding agents at once, tmux panes shrinking into slivers, or wanting niri's scrolling layout in the terminal.

Interactive tutorial

+ / opens the cheat sheet.

Vim-style movement, like a tiling WM: + h left · + j down · + k up · + l right

Paste this into an agent pane:

You are teaching me gwae, a scrolling terminal multiplexer. I am inside a
gwae pane talking to you. I am a beginner: assume I know nothing beyond
typing in a terminal. Walk me through each step below one at a time. For
each step, tell me exactly what to press, what I should see, and how to
confirm it worked. Wait for my confirmation before moving on. If something
does not work, stop and help me fix it before continuing. Do not skip
ahead and do not dump all steps at once.

0. Fix the modifier key first. Nothing below works without this. Have me
press ⌥+/ . If the cheat sheet opens, it works; press Esc to close it.
If a special character types instead, tell me to set Option to act as
Meta in my terminal (Terminal.app: Preferences, Profiles, Keyboard, Use
Option as Meta Key; iTerm2, Ghostty, WezTerm have the equivalent), then
retry. Do not proceed until ⌥+/ opens the cheat sheet.
1. Open a pane: have me press ⌥+Enter once. Confirm a new shell pane
appears to the right.
2. Move: have me press ⌥+h and ⌥+l to move between the two panes.
Confirm the focus ring follows. Then have me press ⌥+k and ⌥+j.
Mention click-to-focus only after these work.
3. Open more: have me press ⌥+Enter until there are 6 panes. If I get
lost, remind me ⌥+h/l moves between panes. Point out the viewport
scrolling right while every pane keeps its width.
4. Reshape: have me press ⌥+r to cycle the focused column's width, then
⌥+b to split below. Mention ⌥+f
(full width) and ⌥+Shift+h/j/k/l (move pane in all four directions)
only after these work.
5. Agents: have me press ⌥+; to spawn an agent (first press offers what
is installed and remembers it). Confirm Cmd+V pastes text into the pane
(native terminal paste). Mention ⌥+Shift+; (picker), ⌥+d (spawn
directory), and gwae run "claude" (CLI start) after.
6. History: have me press ⌥ plus the up and down arrows to scroll the
focused pane's history (add Shift for a bigger jump). Then have me
press ⌃+⇧+K and ⌃+⇧+J for the three-line transcript scroll, noting it
goes to the agent itself inside agent panes. Left and right arrows
always type into the pane, never scroll. Confirm history moves without
moving focus.
7. Stuck panes: have me hold ⌥ for the dashboard (» working, ! needs
input, ✗ failed), then ⌥+g to jump to the neediest pane. Mention
clicking a tile focuses it.
8. Help and quit: show ⌥+/ (cheat sheet), ⌥+q (close pane),
⌥+Shift+q (quit; last pane exiting quits gwae). Mention ⌥+w
(keep-awake) last.
9. Health: only now, have me type exit in panes until one shell is left,
then run gwae doctor in it and confirm exit 0. If anything fails, run
gwae init. Mention ~/.config/gwae/gwae.toml (all keys optional,
live-reloads) only here, at the end.

Development

git clone https://github.com/hongnoul/gwae
cd gwae
cargo build
cargo test --workspace

Benchmark

MetricMethodgwaeherdr 0.9.1tmux 3.7c
Echo p50Keystroke to visible echo in a real PTY harness, median0.34 ms0.48–0.50 ms0.36–0.37 ms
Echo p90Keystroke to visible echo in a real PTY harness, 90th pct0.36–0.38 ms0.54 ms0.42–0.43 ms
Spawn p50New pane request to first painted frame, median0.48–0.52 ms0.63–0.70 ms4.1–4.7 ms

Agent instructions

if you are an ai agent driving gwae, read docs/agents.md before spawning panes.

ai-agents
claude-code
cli-agents
conpty
developer-tools
gwae
macos
multiplexer
niri
rust
terminal
terminal-multiplexer
tiling-window-manager
tui
windows

Contributors

hongnoul

689 commits

actions-user

1 commits

Languages

Rust

97.7%