Waterfall rows
Rows stack vertically. Horizontal splits live inside a row. When there are many rows, the workspace scroll becomes the layout.
You don't just write code anymore — you direct agents. fluxtty is a keyboard-driven workspace for supervising many AI sessions at once, with the modal efficiency that made vim indispensable.
When AI writes the code, your job shifts from typing to directing. You need a workspace built for that — not an editor with a terminal bolted on.
Not a terminal skin. The core is row-based layout, session identity, explicit modes, and PTY-safe input routing — built to handle 10 open agents without losing track of any of them.
Rows stack vertically. Horizontal splits live inside a row. When there are many rows, the workspace scroll becomes the layout.
Normal, Insert, AI, Terminal, Find, and View modes are explicit states. The input bar changes label, prompt, and key routing with the current mode.
/ opens fuzzy search over pane name, group, cwd, and status. Arrow keys or j/k move; Enter focuses the pane.
The panes are real xterm.js terminals backed by Tauri and portable-pty, with raw terminal mode for TUIs and full-screen apps.
Tab completes commands and paths through the Rust backend. Agent panes switch slash completion to the detected agent's command list.
Detected agents include claude, codex, aider, gemini, opencode, goose, cursor, qwen, amp, crush, and openhands.
Panes track name, group, cwd, status, last command, last exit code, tmux session, alternate-screen state, and agent type.
The action layer supports run, read, pipeline, broadcast, groups, new, rename, close, split, focus, note, clear, kill, paste, and agent-send.
m opens the row note pane. Row notes and layout are included in the workspace snapshot when restore is enabled.
Window, font, colors, cursor, shell, tmux, input, Workspace AI, waterfall, persistence, and session defaults live in YAML.
Each mode has a color, a label, and a distinct routing rule. The input bar shows exactly where your keystrokes go — to the workspace, to a shell, to an agent, or to raw xterm.
Default workspace control. Move with h j k l, create with n, split with s, close with q, rename with r, note with m, search with /.
Line editor to PTY. Press i to type into the active pane. Tab completes shell paths or detected agent slash commands. Esc returns to Normal.
Workspace command input. Press a for the Workspace AI prompt. With model: none, exact built-in commands are parsed; with a model configured, responses can emit structured action blocks.
Raw xterm control. Press Ctrl+\ when vim, htop, a TUI, or an agent prompt should own the keyboard directly.
Focused row watching. Press v to isolate the active row while preserving the same pane and mode model.
Press a and describe what you want done. The built-in parser handles common actions without a model. Set workspace_ai.model to route natural language to any LLM — Anthropic, OpenAI, Gemini, or local Ollama.
a run npm test in frontend a run cargo test in group backend a npm test in all sessions a run cargo test then run npm test in api-agent a new api in backend a rename api to api-agent a close idle a close group scratch a focus frontend a group api-agent as backend a note api-agent check migration output a read tests a clear db a kill api-agent a list a !agent claude
list, status, help, read, focus, and !agent run immediately.agent-send, run-await, and pipeline.Workspace-changing actions are queued into a plan that you review before anything runs. A single y executes; anything else aborts. You stay in control.
AI plan (3 actions): create new session "api" in group "backend" run "cargo test" in group "backend" rename "api" -> "api-agent" execute? y/N
Grab the latest release for macOS, Linux, or Windows — or build from source with Tauri. Config lives in a single YAML file.
brew tap amoswzw/tap brew install --cask fluxtty
git clone https://github.com/amoswzw/fluxtty cd fluxtty npm install npm run tauri build
~/.config/fluxtty/config.yaml input: live_typing: true workspace_ai: model: none
All shortcuts follow vim conventions. Any binding can be remapped in config.yaml.