kiosk
Kiosk is a Git-aware tmux session manager, which shows the status of your AI agents (waiting for permissions, idle or running).
Search for the repo you want, and optionally select a branch or create a new one. If a session already exists, you jump straight in - if it doesn't, a new session is created, with a new worktree if needed.

Worktrees are created in .kiosk_worktrees/ in the parent directory of the given repository. For instance, if you set search_dirs = ["~/Development"], then worktrees are created at ~/Development/.kiosk_worktrees/.
Usage
TUI
Add a keybinding to your tmux.conf to open Kiosk in a popup - the following uses <prefix> f, but change as appropriate:
bind-key f popup -xC -yC -w90% -h90% -E "kiosk"
- On first interactive launch (when no config file exists), you'll see a setup wizard to create your config file. If you'd rather do this manually, see the configuration section.
- You'll start in the repo view, which shows all repos in the folders defined in your config:
- Start typing to fuzzy search across repos
- Enter opens the repo with the primary checkout
- Tab opens the branch view for that repo
- From the branch view, you can again fuzzy match across branches:
- Enter opens a session in a worktree on that branch, either attaching to an existing session if one exists, or creating a new one otherwise
CLI
You can also use Kiosk as a CLI, which is particularly useful for AI agents. Below are some example commands, but see kiosk --help for a complete list of commands and options.
Examples
# List repos
# List branches with metadata
# Create a new branch, worktree, and tmux session (without attaching)
# Launch a command in the session (the command is typed and Enter is sent automatically)
# Send a follow-up command to an existing session
# Send raw tmux keys (e.g. for TUI interaction — no Enter appended)
# Send literal text without appending Enter
# Target a specific pane (default: 0)
# List panes in a session
# Check session status
# Include agent detection debug metadata (kind/state source + matched rules)
# List active kiosk sessions (includes last_activity, pane_count, current_command)
# Read session logs
# Show resolved configuration
# Non-interactive cleanup of orphaned worktrees
# Delete a specific worktree and session when done
Waiting for completion
Use --wait on open to block until the command finishes:
# Launch, wait for completion, then read output — all in one
Or use the standalone wait command for commands sent later:
Session naming
Kiosk names tmux sessions deterministically:
- Main checkout:
<repo-name>(dots replaced with_) - Branch worktree:
<repo-name>--<branch>(with/replaced by-,.replaced by_)
The open --json response includes the exact session name in the session field.
Agent status troubleshooting
When agent state looks wrong (UNKNOWN vs IDLE/RUNNING), capture both Kiosk's debug metadata and raw pane tail:
# Show detected kind/state and which rule matched
|
# Confirm pane command/title and target pane ids
# Inspect recent pane content (strip ANSI, large enough tail)
|
Installing
Homebrew
Cargo
Ensure you have the Rust toolchain installed, then run:
Prebuilt binaries
Download the appropriate binary for your system from the releases page:
| Platform | Architecture | Download file |
|---|---|---|
| Linux | Intel/AMD | *-x86_64-unknown-linux-musl.tar.gz |
| Linux | ARM64 | *-aarch64-unknown-linux-musl.tar.gz |
| macOS | Apple Silicon | *-aarch64-apple-darwin.tar.gz |
| macOS | Intel | *-x86_64-apple-darwin.tar.gz |
| Windows | x64 | *-x86_64-pc-windows-msvc.zip |
After downloading, extract the binary and move it to a directory in your PATH.
Building from source
Ensure you have the Rust toolchain installed, then pull down the repo and run:
Configuration
You'll need a config file to get started. By default, Kiosk looks for a TOML configuration file at:
- Linux or macOS:
~/.config/kiosk/config.toml - Windows:
%AppData%\kiosk\config.toml
Here's a minimal example that contains all required keys (change values as appropriate):
= ["~/Development"]
Config options
The following options can be set in your configuration file:
search_dirs
Directories to scan for git repositories. Each directory can be scanned to a specified depth, with a default of 1 (i.e. just the top level).
Supports ~ for the home directory. For example:
= ["~/Development", { = "~/Work", = 2 }]
[session] section
Layout when creating a new tmux session.
split_command
Command to run in a split pane when creating a new session. For example, to open Helix in a vertical split:
[]
= "hx"
[theme] section
Color theme configuration.
Colors can be a named color (black, red, green, yellow, blue, magenta, cyan, white, gray, dark_gray) or a hex value (#rrggbb).
Defaults:
[]
= "magenta"
= "cyan"
= "green"
= "green"
= "red"
= "yellow"
= "dark_gray"
= "dark_gray"
= "blue"
= "black"
[keys] section
Key binding configuration.
To unbind an inherited key mapping, assign it to noop.
Defaults are shown below.
[]
= "quit"
= "show_help"
[]
= "move_cursor_word_left"
= "delete_backward_word"
= "delete_forward_word"
= "move_cursor_word_right"
= "move_cursor_word_left"
= "move_cursor_word_right"
= "move_cursor_start"
= "delete_forward_char"
= "move_cursor_end"
= "delete_to_end"
= "delete_to_start"
= "delete_backward_word"
= "delete_backward_char"
= "delete_forward_char"
= "move_cursor_end"
= "move_cursor_start"
= "move_cursor_left"
= "move_cursor_right"
[]
= "move_bottom"
= "move_top"
= "half_page_down"
= "half_page_up"
= "page_up"
= "move_down"
= "move_up"
= "page_down"
= "move_down"
= "page_down"
= "page_up"
= "move_up"
[]
= "open_repo"
= "quit"
= "enter_repo"
[]
= "new_branch"
= "delete_worktree"
= "open_branch"
= "go_back"
[]
= "confirm"
= "cancel"
= "tab_complete"
[agent] section
Agent detection configuration.
enabled
Whether agent status detection is enabled.
Set to false to completely disable agent polling and status display.
Default: true
poll_interval_ms
Interval in milliseconds between agent status polls.
Default: 500
[agent.labels] section
Label text for each agent state shown in the branch picker.
running
Default: "[RUNNING]"
waiting
Default: "[WAITING]"
idle
Default: "[IDLE]"
unknown
Default: "[UNKNOWN]"