Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Reference the Warp tab config schema, validation rules, and examples. Use when creating or updating Warp tab config TOML files or when another tab-config skill needs the canonical schema details.
.claude/skills/warpdotdev-tab-configs/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-02 | ✗→✓ | ▲ Improved | 91% | 0% |
| case-03 | ✗→✓ | ▲ Improved | 23% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 88% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 139% | 0% |
| case-09 | ✗→✓ | ▲ Improved | 44% | 0% |
This skill is the canonical reference for Warp tab config TOML files.
Tab configs live under ~/.warp/tab_configs/ for standard Warp builds. Non-stable builds (e.g. Preview or pre-release channels) use a channel-specific variant such as ~/.warp-<channel>/tab_configs/. Do NOT use ~/Library/Application Support/ — that is the wrong location.
To find the active data directory, inspect which ~/.warp* directories exist on the user's machine. Each .toml file defines a single tab layout that appears in the + menu. When the user selects one, Warp opens a new tab with the configured pane layout and runs any specified commands.
Use this skill as shared context:
create-tab-config should use it when authoring a new config.update-tab-config should use it when modifying an existing config.ask_user_question tool instead of guessing. Clarify things like:"editor", "server", or "top_left" instead of generic names like "pane1".name (required, string): Display name shown in the + menu.title (optional, string): Custom tab title. Supports {{param}} template variables.color (optional, string): Tab color. One of: "black", "red", "green", "yellow", "blue", "magenta", "cyan", "white".All panes are defined in a flat [[panes]] array of tables. The first entry is the root. Each entry is either a split node (branch) or a leaf node.
id (required, string): Unique identifier.type (required, string): "terminal" (standard shell), "agent" (opens in Agent Mode), or "cloud" (cloud mode pane, no local shell).directory (optional, string): Initial working directory. Supports ~ expansion. Applies to terminal and agent types.commands (optional, array of strings): Commands to run in sequence on open. Applies to terminal and agent types.is_focused (optional, bool): Set true on at most one pane to give it initial focus.shell (optional, string): Shell executable to open this pane in (e.g. "pwsh", "zsh", "bash", "fish"). Only applies to terminal and agent types. If omitted or the shell is not installed, the user's default shell is used.id (required, string): Unique identifier for this node.split (required, string): "horizontal" (children arranged left-to-right) or "vertical" (children arranged top-to-bottom).children (required, array of strings): Ordered list of child pane IDs. Must have 2+ entries. Order = visual order.toml[[panes]] id = "server" type = "terminal" directory = "~/code/backend" commands = ["cargo watch -x run"]
All children within a split are equally sized. There are no flex or proportion values.
Parameters let users fill in values at open time via a modal UI. Declare them with [params.<name>] tables. Reference them in directory, commands, and title with {{name}} syntax.
{{autogenerated_branch_name}} is a special-cased reserved template variable: if a tab config references it, Warp generates a unique worktree branch name on each open instead of prompting the user for that value.
Each parameter has:
type (optional, string): "text" (default), "branch" (git branch picker), or "repo" (repo picker).description (optional, string): Shown in the fill-in UI.default (optional, string): Default value.toml[params.project_dir] type = "repo" description = "Project directory" [params.branch] type = "branch" description = "Branch to check out"
Ensure your output follows these rules:
children array must reference an existing [[panes]] entry.children or split.type field ("terminal", "agent", or "cloud").split) must have children with at least 2 entries.is_focused = true.id values must be unique across the file.[[panes]] entry is the root of the tree.tomlname = "Dev Server" [[panes]] id = "main" type = "terminal" directory = "~/code/my-app" commands = ["npm run dev"]
tomlname = "Editor + Server" color = "green" [[panes]] id = "root" split = "horizontal" children = ["editor", "server"] [[panes]] id = "editor" type = "terminal" directory = "~/code/my-app" commands = ["nvim ."] is_focused = true [[panes]] id = "server" type = "terminal" directory = "~/code/my-app" commands = ["npm run dev"]
tomlname = "Full Stack" [[panes]] id = "root" split = "horizontal" children = ["left_col", "right_col"] [[panes]] id = "left_col" split = "vertical" children = ["frontend", "backend"] [[panes]] id = "frontend" type = "terminal" directory = "~/code/frontend" commands = ["npm run dev"] is_focused = true [[panes]] id = "backend" type = "terminal" directory = "~/code/backend" commands = ["cargo watch -x run"] [[panes]] id = "right_col" split = "vertical" children = ["tests", "logs"] [[panes]] id = "tests" type = "terminal" directory = "~/code/backend" commands = [] [[panes]] id = "logs" type = "terminal" directory = "~/code/backend" commands = ["tail -f logs/dev.log"]
tomlname = "Main + Side Stack" [[panes]] id = "root" split = "horizontal" children = ["main", "side_stack"] [[panes]] id = "main" type = "terminal" directory = "~/code/project" commands = [] is_focused = true [[panes]] id = "side_stack" split = "vertical" children = ["top_right", "bottom_right"] [[panes]] id = "top_right" type = "terminal" directory = "~/code/project" commands = [] [[panes]] id = "bottom_right" type = "terminal" directory = "~/code/project" commands = []
Warp-generated worktree configs default to ~/.warp/worktrees/<repo-name>/<worktree-name>. When writing a reusable config by hand, derive the repo-name segment at shell runtime with $(basename {{repo}}).
tomlname = "New Worktree" title = "{{branch_name}}" [[panes]] id = "main" type = "terminal" directory = "{{repo}}" commands = [ "git worktree add -b {{branch_name}} $HOME/.warp/worktrees/$(basename {{repo}})/{{branch_name}} {{base_branch}}", "cd $HOME/.warp/worktrees/$(basename {{repo}})/{{branch_name}}", ] [params.repo] type = "repo" description = "Repository path" [params.base_branch] type = "branch" description = "Base branch to branch from" [params.branch_name] type = "text" description = "New branch name" default = "my-feature"
When the user says... | Generate... "single pane" / "simple tab" | One [[panes]] leaf entry "split" / "side by side" / "two panes" | Horizontal split with 2 terminal children "top and bottom" / "stacked" | Vertical split with 2 terminal children "2x2" / "grid" / "four panes" | Horizontal split → 2 vertical splits → 4 terminals "run X" / "auto-run X" | Put X in the commands array "with claude" / "running claude" | commands = ["claude"] in the relevant pane "three panes" (no further detail) | Horizontal split: 1 terminal + 1 vertical split with 2 terminals
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→fail | 14,005 | 7,907 | -44% | 1 | 1 | 0% | 2,501 | 2,752 | +10% | 0 | 0 | — |
case-02 | fail→pass | 13,193 | 20,804 | +58% | 1 | 1 | 0% | 2,249 | 4,300 | +91% | 0 | 0 | — |
case-03 | fail→pass | 28,105 | 17,866 | -36% | 1 | 1 | 0% | 3,621 | 4,453 | +23% | 0 | 0 | — |
case-04 | pass→pass | 14,582 | 10,716 | -27% | 1 | 1 | 0% | 2,428 | 4,055 | +67% | 0 | 0 | — |
case-05 | pass→pass | 21,454 | 9,911 | -54% | 1 | 1 | 0% | 1,749 | 3,971 | +127% | 0 | 0 | — |
case-06 | pass→pass | 30,124 | 9,621 | -68% | 1 | 1 | 0% | 2,059 | 3,817 | +85% | 0 | 0 | — |
case-07 | fail→pass | 8,683 | 3,957 | -54% | 1 | 1 | 0% | 1,540 | 2,896 | +88% | 0 | 0 | — |
case-08 | fail→pass | 7,522 | 4,136 | -45% | 1 | 1 | 0% | 1,215 | 2,898 | +139% | 0 | 0 | — |
case-09 | fail→pass | 17,855 | 3,319 | -81% | 1 | 1 | 0% | 1,957 | 2,813 | +44% | 0 | 0 | — |
case-10 | pass→pass | 11,747 | 3,598 | -69% | 1 | 1 | 0% | 1,912 | 2,779 | +45% | 0 | 0 | — |
case-11 | pass→pass | 9,420 | 4,733 | -50% | 1 | 1 | 0% | 1,427 | 2,997 | +110% | 0 | 0 | — |
case-12 | fail→pass | 7,467 | 5,164 | -31% | 1 | 1 | 0% | 1,196 | 3,141 | +163% | 0 | 0 | — |
case-13 | pass→pass | 11,608 | 5,262 | -55% | 1 | 1 | 0% | 1,586 | 3,059 | +93% | 0 | 0 | — |
case-14 | fail→pass | 11,706 | 4,361 | -63% | 1 | 1 | 0% | 1,926 | 2,948 | +53% | 0 | 0 | — |
case-15 | fail→pass | 10,378 | 3,936 | -62% | 1 | 1 | 0% | 1,496 | 2,873 | +92% | 0 | 0 | — |
case-16 | fail→pass | 24,796 | 6,985 | -72% | 1 | 1 | 0% | 1,889 | 3,015 | +60% | 0 | 0 | — |
case-17 | fail→pass | 11,411 | 5,250 | -54% | 1 | 1 | 0% | 1,703 | 2,801 | +64% | 0 | 0 | — |
case-18 | fail→pass | 12,770 | 4,646 | -64% | 1 | 1 | 0% | 1,956 | 3,017 | +54% | 0 | 0 | — |
case-19 | fail→pass | 16,304 | 5,787 | -65% | 1 | 1 | 0% | 2,557 | 3,044 | +19% | 0 | 0 | — |
case-20 | pass→fail | 10,434 | 12,838 | +23% | 1 | 1 | 0% | 1,645 | 2,888 | +76% | 0 | 0 | — |
case-21 | fail→pass | 10,941 | 6,097 | -44% | 1 | 1 | 0% | 1,856 | 3,340 | +80% | 0 | 0 | — |
case-22 | fail→pass | 10,698 | 4,651 | -57% | 1 | 1 | 0% | 1,691 | 2,965 | +75% | 0 | 0 | — |
case-23 | pass→pass | 9,616 | 8,999 | -6% | 1 | 1 | 0% | 1,404 | 2,901 | +107% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 23 cases were attempted, and 21 counted toward the lift figure. The other 2 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +57 percentage points is the difference between those two pass rates over the 21 comparable cases. 2 cases got worse with the skill loaded, and they are included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.