{"id":50326530,"url":"https://github.com/johnaparker/loom","last_synced_at":"2026-05-29T06:30:53.285Z","repository":{"id":357498430,"uuid":"1137793667","full_name":"johnaparker/loom","owner":"johnaparker","description":"TUI control center for managing git worktrees manager with support for Claude Code, GitHub, Linear ","archived":false,"fork":false,"pushed_at":"2026-05-13T02:09:42.000Z","size":1660,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-13T04:15:01.186Z","etag":null,"topics":["agents","claude-code","linear","tmux","tui","worktrees"],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/johnaparker.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-01-19T21:03:18.000Z","updated_at":"2026-05-13T02:09:48.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/johnaparker/loom","commit_stats":null,"previous_names":["johnaparker/loom"],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/johnaparker/loom","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/johnaparker%2Floom","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/johnaparker%2Floom/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/johnaparker%2Floom/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/johnaparker%2Floom/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/johnaparker","download_url":"https://codeload.github.com/johnaparker/loom/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/johnaparker%2Floom/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33640627,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-05-29T02:00:06.066Z","response_time":107,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["agents","claude-code","linear","tmux","tui","worktrees"],"created_at":"2026-05-29T06:30:52.975Z","updated_at":"2026-05-29T06:30:53.266Z","avatar_url":"https://github.com/johnaparker.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"[![CI](https://github.com/johnaparker/loom/actions/workflows/ci.yml/badge.svg)](https://github.com/johnaparker/loom/actions/workflows/ci.yml)\n[![GitHub Release](https://img.shields.io/github/v/release/johnaparker/loom?v=1)](https://github.com/johnaparker/loom/releases/latest)\n[![Crates.io](https://img.shields.io/crates/v/loom-tui.svg)](https://crates.io/crates/loom-tui)\n\n# Loom\n\nLoom is a TUI control center for managing git worktrees in tmux with Claude Code integration.\nMonitor multiple Claude agents, optionally track Linear issues and GitHub PRs, all from a single dashboard.\n\n![loom demo](assets/loom.gif)\n\nIf you work on multiple features simultaneously using git worktrees, `loom` gives you:\n\n- **Claude agent monitoring** - See which agents are working, waiting for permission, or idle across all your worktrees\n- **Worktree lifecycle** - Create, switch, merge, and remove worktrees without leaving the dashboard\n- **Project context** - Link worktrees to Linear issues and GitHub PRs for at-a-glance status\n\nThe dashboard is the primary interface. CLI commands exist for quick one-off operations.\n\n## Setup\n\nLoom minimally requires:\n- git\n- tmux\n\n### Installation\n\n**Via install script:**\n\n```bash\ncurl -fsSL https://github.com/johnaparker/loom/releases/latest/download/install.sh | bash\n```\n\nThis installs loom to `~/.local/bin`. Add it to your PATH if not already:\n\n```bash\nexport PATH=\"$HOME/.local/bin:$PATH\"\n```\n\n**Via cargo:**\n\n```bash\ncargo install loom-tui\n```\n\n### Claude Code Integration\n\nEnable Claude agent tracking with:\n\n```bash\nloom config enable claude\n```\n\nThis configures loom hooks in Claude's settings and enables state tracking (working/waiting/idle) per worktree. You'll be prompted about sandbox mode for new worktrees.\n\n### GitHub Integration\n\nRequires the [GitHub CLI](https://cli.github.com/). Enable with:\n\n```bash\nloom config enable github\n```\n\nThis verifies `gh` is installed and authenticated, then enables PR status, check results, and review comments in the dashboard.\n\n### Linear Integration\n\nEnable with:\n\n```bash\nloom config enable linear\n```\n\nYou'll be prompted for your API key (get from Linear → Settings → API) and shown available teams to select your issue prefix. You'll also be offered to install a Linear skill for Claude Code that teaches it how to work with your Linear issues. Loom then links worktrees to Linear issues automatically when branch names contain issue IDs (e.g., `user/lin-123-feature`).\n\n### Configuration\n\nloom uses a three-level config hierarchy: **global** → **project** → **worktree**. Each level can override the previous.\n\n**Global config:** `~/.config/loom/config.toml`\n\n```toml\n# Root directory for all worktrees (default: ~/.worktrees)\nworktree_root = \"~/.worktrees\"\n\n# Worktree categories (max 4, default: [\"dev\"])\n# When \u003e2 categories, Tab cycles through filter in dashboard\ncategories = [\"dev\", \"review\", \"demo\"]\n\n# Default category for new worktrees (used when -c not specified)\ndefault_category = \"dev\"\n\n# Cache directory for connector data (default: ~/.cache/loom)\ncache_dir = \"~/.cache/loom\"\n\n# Workflow mode: \"push\" (local-first) or \"pull\" (PR-based)\n# - push: merge directly to main, new worktrees branch off main\n# - pull: auto-fetch from origin, new worktrees branch off origin/main\nworkflow = \"push\"\n\n[sync]\n# Files/dirs to sync from main when creating worktrees\npatterns = [\".env\", \".envrc\", \".claude/\"]\n\n[claude]\n# Enable Claude Code integration (default: true)\n# When disabled, Claude state tracking is inactive\nenabled = true\n\n# Create new worktrees with Claude sandbox mode enabled\nsandbox = true\n\n# Auto-approve sandboxed bash commands (only applies when sandbox = true)\nsandbox_auto_allow_bash = true\n\n[linear]\n# Enable Linear integration (default: false)\n# When disabled, Linear panels are hidden and 'l' key is inactive\nenabled = true\n\n# Linear API key (get from Linear settings → API)\napi_key = \"lin_api_...\"\n\n# Team prefix for auto-detecting issues from branch names\n# e.g., \"LIN\" matches branches like \"john/lin-123-feature\"\nteam_prefix = \"LIN\"\n\n# Auto-update Linear issue status on loom new/merge\nauto_update_status = true\n\n[github]\n# Enable GitHub integration (default: false)\n# When disabled, GitHub panels are hidden and 'g' key is inactive\n# Requires gh CLI to be installed and authenticated\nenabled = true\n\n[diffview]\n# Enable nvim DiffView integration (default: false)\n# When disabled, 'd' key for diff review is inactive\nenabled = true\n\n# Command to open neovim (default: \"nvim\")\ncommand = \"nvim\"\n\n[icons]\n# Custom icons for TUI dashboard (optional, uses defaults if omitted)\nlinear = \"\"   # Icon before Linear issue titles\ngithub = \"\"   # Icon before GitHub PR info\nbranch = \"\"   # Icon before branch names\n```\n\n**Note:** All integrations (Linear, GitHub, Diffview) are **disabled by default**. You must explicitly set `enabled = true` to use them.\n\n## Workflow Modes\n\nLoom supports two workflow modes, configured via `workflow` in your config:\n\n### Push workflow (default)\n\nFor local-first development where you merge directly to main. New worktrees branch from your local main. When work is complete, merge the branch into main locally and clean up the worktree. This is ideal for solo projects or when you have direct push access to main.\n\n### Pull workflow\n\nFor PR-based development where merging happens on GitHub. New worktrees branch from origin/main (auto-fetched). When work is complete, push to origin and open a PR. After the PR is merged on GitHub, use prune to clean up worktrees with merged PRs. Loom auto-pulls when switching to a branch that's behind origin.\n\n## Dashboard\n\nRun `loom` to open the interactive dashboard. This is the primary interface for managing worktrees.\n\n### Keyboard Shortcuts\n\n| Key | Action |\n|-----|--------|\n| `↑`/`k` | Move selection up |\n| `↓`/`j` | Move selection down |\n| `Enter` | Switch to selected worktree |\n| `/` | Search/filter worktrees |\n| `Tab` | Cycle category filter (when \u003e2 categories) |\n| `n` | Create new worktree |\n| `x` | Delete selected worktree |\n| `m` | Merge to main (push workflow only) |\n| `s` | Sync with remote |\n| `d` | Open diff review in nvim |\n| `c` | Open Claude Code session |\n| `l` | Open Linear issue |\n| `g` | Open GitHub PR |\n| `P` | Prune merged PRs (pull workflow only) |\n| `q`/`Esc` | Quit |\n\n## CLI Commands\n\nAll commands support `--help` for detailed usage.\n\n| Command | Alias | Description |\n|---------|-------|-------------|\n| `loom` | | Open interactive dashboard |\n| `loom new \u003cbranch\u003e` | `n` | Create new worktree |\n| `loom switch [name]` | `s` | Switch worktree (fuzzy picker if no name) |\n| `loom list` | `l`, `ls` | List all worktrees |\n| `loom merge \u003cname\u003e` | `m` | Merge worktree to main (push workflow) |\n| `loom remove [name]` | `r`, `rm` | Remove worktree |\n| `loom sync [name]` | `sy` | Sync worktree with origin/main |\n| `loom prune` | `p` | Delete worktrees with merged PRs (pull workflow) |\n| `loom review` | `rev` | Open diff review in nvim |\n| `loom main` | `ma` | Switch to main worktree |\n| `loom linear` | `li` | Open Linear issue for current worktree |\n| `loom github` | `gh` | Open GitHub PR for current worktree |\n| `loom config enable \u003cfeature\u003e` | `cfg` | Enable an integration (claude, github, linear) |\n| `loom config disable \u003cfeature\u003e` | | Disable an integration |\n| `loom config set-workflow \u003cmode\u003e` | | Set workflow mode (push or pull) |\n| `loom config categories` | | Manage worktree categories interactively |\n| `loom config sync-patterns` | | Manage sync patterns interactively |\n| `loom completions \u003cshell\u003e` | | Generate shell completions |\n\n### Common Flags\n\n- `--dry-run`: Preview changes without executing (merge, remove, sync, prune)\n- `-f, --force`: Force operation even with uncommitted changes\n- `-c, --category`: Specify worktree category (new)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjohnaparker%2Floom","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjohnaparker%2Floom","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjohnaparker%2Floom/lists"}