Configuration
Rabbitty reads a JSON file at ~/.config/rabbitty/settings.json (override the path with the RABBITTY_CONFIG environment variable). Every setting is optional; unknown keys are skipped, and any value with the wrong type falls back to its default — Rabbitty never refuses to start over a bad settings file. // comments are tolerated so you can annotate it.
Alongside it Rabbitty regenerates settings.schema.json on every launch, and the seeded file points at it with "$schema": "./settings.schema.json". Editors that understand JSON Schema (VS Code, Zed) then offer per-key completion, the allowed values for enum settings, hover docs, and a warning on a misspelled key. The same schema is published at /schema/settings.json.
{
"$schema": "./settings.schema.json",
"theme": "One Light",
"font_family": "JetBrainsMono Nerd Font",
"ui_font_family": "Inter",
"font_size": 14
}
Settings
theme
string · default One Light
UI + terminal color theme. Any bundled theme, or the name of a Ghostty theme file. All chrome derives from the terminal palette.
Allowed: One Light, GitHub Light, Dark, Catppuccin Latte, Catppuccin Mocha
font_family
string · default Menlo
Terminal grid font. Any installed font; Nerd Font glyphs always fall back so shell/ls/powerline icons render.
ui_font_family
string · default .SystemUIFont
Interface font for the chrome (sidebar, command palette, quick switcher, tabs). The terminal grid uses font_family instead.
font_size
number · default 14
Terminal grid font size, in points. Adjustable at runtime with ⌘+ / ⌘− (which persists here).
max_columns
number · default 0
Widest the terminal grid may run, in columns. 0 (the default) always fills the pane. Set a count (e.g. 120) to cap an agent transcript's line length at a readable measure — full-width prose wraps at 180+ characters — with the grid centered between background gutters on a wider pane.
option_as_meta
boolean · default false
Treat the macOS Option key as Meta (Esc-prefix) instead of composing accented characters — useful for Emacs-style bindings.
Allowed: true, false
sound
boolean · default true
Play an in-app chime when an agent finishes or needs you while Rabbitty is the active app.
Allowed: true, false
status_source
string · default hook-then-scrape
How an agent's status is read: from its reported hooks, from on-screen scraping, or a combination.
Allowed: hook-then-scrape, scrape, hooks, scrape-then-hook
telemetry
boolean · default true
Send anonymous telemetry events (app launch, agent startups, state transitions) to improve Rabbitty. Respects user privacy; no sensitive code or PII is sent.
Allowed: true, false
preferred_ide
string · default Zed
Which editor the top-bar Open button and ⌘O open the current terminal's folder in. Auto-detected from your installed apps (Zed preferred); falls back to Finder if none is found. Set it to any detected editor's name to override.
worktree_dangerous
boolean · default false
Launch the agent carried into a new worktree with its permission-bypass flag (Claude Code's --dangerously-skip-permissions and each agent's equivalent), so it works unattended. Toggle from the command palette: worktree: toggle dangerous permissions.
Allowed: true, false
worktree_carry
string · default .env,.env.*,.envrc,!.env.example,!.env.sample
Fallback carry list for repos with no .worktreeinclude file: gitignored files copied into a new worktree so it can run immediately. Comma/newline globs, !pattern excludes (.gitignore syntax). A repo's committed .worktreeinclude overrides this entirely — write one from the command palette with worktree: configure carried files.
activity_log
boolean · default true
Dev builds only: record a complete local activity stream (actions, shell commands, focus, agent lifecycle) to the session dir for workflow mining. Never leaves your machine and never reaches product telemetry; compiled out of release builds. See docs/TELEMETRY.md.
Allowed: true, false
pull_requests
boolean · default true
Show the Pull Requests panel (⌘⇧R): your open PRs/MRs and ones awaiting your review, read from the gh and glab CLIs you've already configured. When off, the panel and its top-bar icon are hidden. Toggle from the command palette: Pull Requests: Enable / Disable.
Allowed: true, false
pr_providers
string · default github, gitlab
Which providers the Pull Requests panel reads from, comma-separated. Each is queried across every host its CLI is signed into (enterprise and cloud alike). Toggle a provider from the panel's chips or the command palette.
Allowed: github, gitlab
jira
boolean · default true
Show the Jira panel (⌘⇧J): your active-sprint issues and everything assigned to you, read from the jira CLI (ankitpokhrel/jira-cli) you've configured with jira init. When off, the panel and its top-bar icon are hidden. Each task has a button to hand it to the pane's agent to plan, and a copy-link button. Toggle from the command palette: Jira: Enable / Disable.
Allowed: true, false
phone_link
boolean · default false
Hold the phone link open while Rabbitty runs: your panes on your phone, with nothing to install on either end and no port opened on this Mac. Both ends dial out to rabbitty.app's relay and everything between them is sealed to a key the relay never sees. Pair a phone once by scanning a QR (⌘⇧P → 'Connect from your phone' → Pair a device); nothing that hasn't paired can read a byte. The card's button sets this for you.
Allowed: true, false
serve_port
number · default 8787
Port rab serve binds when you want the phone page on this Mac — for looking at it in a browser while you work on it. Bound to 127.0.0.1 only, and the app itself never opens it: the phone link needs no port at all. Named phone_page_port until the roads collapsed to one, when "the phone page" stopped meaning a thing you serve and started meaning the document your phone renders.
push_url
string · default ``
Webhook POSTed when an agent starts needing you, or finishes (an ntfy / Pushover URL). Off unless set. You don't poll a phone — you get pinged, then open the page. The body is deliberately thin: a count and the project name, never the worktree, the branch or what the agent asked. That text stays on your machine; the notification only tells you to go and read it.