yawn — Yet Another Worktree Navigator
A CLI tool for managing git worktrees and discovering projects.
Install
From source
Nix flake
inputs.yawn.url = "github:ComeBertrand/yawn";
# then in your packages:
inputs.yawn.packages.${system}.default
GitHub Releases
Download a binary from the releases page, or use the shell installer:
|
Usage
yawn list [path] [--pretty] Discover git projects under a directory
yawn resolve <pretty-name> Map a pretty name back to an absolute path
yawn open <path> Open a terminal in the given directory
yawn create <name> [--source <base>] [--open] Create a git worktree
yawn delete <name> Remove a worktree
Discover projects
# List all git projects under ~/projects
# Human-readable output with worktree annotations
Pretty output example:
my-app
fix-branch [worktree of my-app]
dotfiles
notes (personal)
notes (work)
List worktrees
When run inside a git repo without a path, yawn list shows the worktrees of the current project:
/home/user/projects/my-app
/home/user/worktrees/my-app--fix-branch
/home/user/worktrees/my-app--feature-x
Interactive project switcher
Combine with a fuzzy finder like rofi or fzf:
# rofi
# fzf
Worktrees
Worktrees are created under a configurable root directory (default: ~/worktrees) using the naming convention <project>--<name>. For example, running yawn create feature-x from inside a repo called my-app creates:
~/worktrees/my-app--feature-x
When listing with --pretty, the <project>-- prefix is stripped and the worktree is annotated:
feature-x [worktree of my-app]
Branch resolution when creating a worktree follows this order:
- If
<name>exists as a local branch, check it out. - If
<name>exists asorigin/<name>, track it. - If
--source <base>is provided, create a new branch from<base>. - Otherwise, create a new branch from the default branch (
origin/HEAD, falling back tomainthenmaster).
If a .yawninclude file exists in the main repo root, the files it lists are copied into the new worktree. This is useful for local config files like .env that aren't tracked by git. Glob patterns are supported.
# .yawninclude
.env
.env.local
config/*.toml
data_*.csv
# Create a worktree (new branch from default branch)
# Create from a specific base branch
# Create and immediately open a terminal in it
# Delete a worktree
Configuration
~/.config/yawn/config.toml — all fields are optional.
[discovery]
| Key | Type | Default | Description |
|---|---|---|---|
max_depth |
integer | 5 |
Maximum recursion depth when searching for git projects. |
ignore |
list of strings | [".*", "node_modules"] |
Glob patterns matched against directory names. Matching directories are skipped during discovery. Hidden directories (except .git itself) are ignored by default. |
[session]
| Key | Type | Default | Description |
|---|---|---|---|
open_command |
string | unset | Command template to open a terminal session. Placeholders: {dir} (absolute path), {name} (directory basename). When unset, uses $TERMINAL, or falls back to Terminal.app on macOS and xterm on Linux. |
[worktree]
| Key | Type | Default | Description |
|---|---|---|---|
root |
string | ~/worktrees |
Directory where worktrees are created. Supports ~ expansion. |
Example
[]
= 3
= [".*", "node_modules", "target", "vendor"]
[]
= "kitty --directory {dir} --title 'dev: {name}'"
[]
= "~/worktrees"
Shell Completion
Bash
Copy completions/yawn.bash to your bash-completion directory:
License
MIT