{"id":41640272,"url":"https://github.com/shkm/shellflow","last_synced_at":"2026-01-26T17:01:37.451Z","repository":{"id":333656325,"uuid":"1137760104","full_name":"shkm/shellflow","owner":"shkm","description":"⛲ Parallel terminal and worktree orchestration","archived":false,"fork":false,"pushed_at":"2026-01-25T18:28:53.000Z","size":18446,"stargazers_count":8,"open_issues_count":2,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-01-26T06:05:41.680Z","etag":null,"topics":["claude-code","opencode","rust","tauri","terminal","worktrees"],"latest_commit_sha":null,"homepage":"https://shellflow.dev","language":"TypeScript","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/shkm.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","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-19T19:53:25.000Z","updated_at":"2026-01-25T18:28:38.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/shkm/shellflow","commit_stats":null,"previous_names":["shkm/one-man-band"],"tags_count":8,"template":false,"template_full_name":null,"purl":"pkg:github/shkm/shellflow","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/shkm%2Fshellflow","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/shkm%2Fshellflow/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/shkm%2Fshellflow/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/shkm%2Fshellflow/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/shkm","download_url":"https://codeload.github.com/shkm/shellflow/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/shkm%2Fshellflow/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28782619,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-26T13:55:28.044Z","status":"ssl_error","status_checked_at":"2026-01-26T13:55:26.068Z","response_time":59,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":["claude-code","opencode","rust","tauri","terminal","worktrees"],"created_at":"2026-01-24T15:06:24.662Z","updated_at":"2026-01-26T17:01:37.431Z","avatar_url":"https://github.com/shkm.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n  \u003cimg src=\"assets/icon.png\" alt=\"Shellflow\" width=\"128\" height=\"128\" /\u003e\n\n  \u003ch1\u003eShellflow\u003c/h1\u003e\n\n  \u003cp\u003e\u003cstrong\u003eParallel terminal and worktree orchestration\u003c/strong\u003e\u003c/p\u003e\n\n  \u003cp\u003e\n    \u003ca href=\"https://github.com/shkm/shellflow/releases\"\u003e\u003cimg src=\"https://img.shields.io/github/v/release/shkm/shellflow?style=flat-square\" alt=\"Release\" /\u003e\u003c/a\u003e\n    \u003ca href=\"https://github.com/shkm/shellflow/blob/main/LICENSE\"\u003e\u003cimg src=\"https://img.shields.io/github/license/shkm/shellflow?style=flat-square\" alt=\"License\" /\u003e\u003c/a\u003e\n    \u003ca href=\"https://github.com/shkm/shellflow/stargazers\"\u003e\u003cimg src=\"https://img.shields.io/github/stars/shkm/shellflow?style=flat-square\" alt=\"Stars\" /\u003e\u003c/a\u003e\n  \u003c/p\u003e\n\n  \u003cp\u003e\n    \u003ca href=\"#features\"\u003eFeatures\u003c/a\u003e •\n    \u003ca href=\"#installation\"\u003eInstallation\u003c/a\u003e •\n    \u003ca href=\"#configuration\"\u003eConfiguration\u003c/a\u003e •\n    \u003ca href=\"#development\"\u003eDevelopment\u003c/a\u003e\n  \u003c/p\u003e\n\u003c/div\u003e\n\n\u003cbr /\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"./assets/screenshot.png\" alt=\"Shellflow Screenshot\" width=\"800\" /\u003e\n\u003c/p\u003e\n\n\u003cbr /\u003e\n\n\u003e [!WARNING]\n\u003e\n\u003e - This project is in early development.\n\u003e - It's written with heavy AI assistance.\n\u003e - It should work on all platforms but only MacOS is supported at the moment.\n\n## What is this?\n\nThis is a git worktree orchestrator, designed for an AI-centric development workflow.\n\nWhat does that mean? Let's start with the problem.\n\n\u003e LLM development flows involve a lot of waiting\n\nOnce an LLM gets going, it could take a while before user input is next required. [It's the new compiling](https://xkcd.com/303/),\nwhere you go do something else for a bit. Stretch your legs, grab a coffee, read a little, interact with coworkers. Please don't stop doing those things — those things are all good and healthy!\n\nBut sometimes you want to power through and get more work done. That's where git worktrees come in.\n\n### Git Worktrees\n\nA [git worktree](https://git-scm.com/docs/git-worktree) lets you check out multiple branches in separate directories. This means we can run a separate instance of our LLM of choice in each directory, each contributing to its own feature branch in isolation. They're a perfect fit for LLMs, so their usage is growing by the day.\n\n### Worktree management\n\nBut there are a couple of problems. Firstly, you have a bunch of new commands to memorise. Not to worry: aliases to the rescue. But then you notice that worktrees don't include ignored files so those will need to be copied every time one is created. You might need to run a couple of specialised commands per repo — generate some assets, copy a database, etc. Suddenly, creating a worktree becomes more complex.\n\nAnd what about tasks that should run once per repository? Sure, you could stop and start a web server when you need a preview in a different worktree, but it would be a lot easier to just give each its own port.\n\nFinally, task switching itself can be a chore. One terminal tab per worktree sounds reasonable, but what about additional context? Each workspace has its own changeset to browse, and I often find myself manually running commands.\n\n### Alternatives\n\nSo I went looking for other options. [Conductor](https://docs.conductor.build) opened my eyes to how productive a polished workflow around worktrees can be. But I found Conductor a bit too heavy-handed for my uses, so I switched down to [Worktrunk](https://worktrunk.dev). Both fantastic pieces of software, but once again it wasn't a fit — I missed what I could do with a GUI.\n\n### Enter: Shellflow\n\nSo that's why I built Shellflow. Now I can run Claude, or any other terminal-based LLM, without losing the potential of rich GUI interactions. And that potential isn't yet realised, but we're getting there...\n\nBy the way, this was called \"One Man Band\" to begin with. So any references to that are just legacy.\n\n## Features\n\n- **Project Management** — Add git repositories and manage multiple worktrees\n- **Worktree Orchestration** — Create isolated git worktrees with random names (e.g., \"fuzzy-tiger\")\n  - **Create worktree** — Generates a worktree with a random branch name\n  - **Merge worktree** — Merges/rebases, deletes branch + worktree + remote branch (optionally)\n- **Configurable Main Command** — Launch Claude, Aider, or any CLI tool in each worktree\n- **Tasks** — Run configurable commands per worktree (dev servers, builds, tests, etc.)\n- **Change View** — Real-time display of changed files in each worktree\n- **Terminal Access** — Shell access in each worktree\n\n...and plenty more to flesh it out properly on the way.\n\n## Keyboard Shortcuts\n\n| Shortcut                                 | Action                               |\n| ---------------------------------------- | ------------------------------------ |\n| ``Ctrl+` ``                              | Toggle drawer (terminal panel)       |\n| `Ctrl+\\`                                 | Switch focus between main and drawer |\n| `Shift+Escape`                           | Expand drawer                        |\n| `Cmd+B`                                  | Toggle right sidebar (changed files) |\n| `Cmd+;` (macOS) / `Ctrl+;` (other)       | Open task switcher                   |\n| `Cmd+R` (macOS) / `Ctrl+Shift+R` (other) | Run/stop selected task               |\n| `Cmd+N` (macOS) / `Ctrl+N` (other)       | New worktree                         |\n| `Cmd+1-9` (macOS) / `Ctrl+1-9` (other)   | Switch to worktree 1-9               |\n| `Cmd+J` (macOS) / `Ctrl+Shift+J` (other) | Next worktree                        |\n| `Cmd+K` (macOS) / `Ctrl+Shift+K` (other) | Previous worktree                    |\n| `Cmd+'` (macOS) / `Ctrl+'` (other)       | Previous view                        |\n| `Cmd+C` (macOS) / `Ctrl+Shift+C` (other) | Copy selected text in terminal       |\n| `Cmd+V` (macOS) / `Ctrl+Shift+V` (other) | Paste text in terminal               |\n\nThese shortcuts can be customized via `mappings` in the [config](#configuration). Shortcuts support flexible configuration:\n\n```jsonc\n\"mappings\": {\n  // Simple string — same shortcut everywhere\n  // \"cmd\" = Cmd on macOS, Ctrl on other platforms\n  \"toggleDrawer\": \"ctrl+`\",\n\n  // Platform-specific object — different shortcuts per platform\n  \"terminalCopy\": { \"mac\": \"cmd+c\", \"other\": \"ctrl+shift+c\" },\n\n  // Array — multiple shortcuts for the same action\n  \"someAction\": [\"ctrl+x\", { \"mac\": \"cmd+x\", \"other\": \"ctrl+shift+x\" }]\n}\n```\n\n## Installation\n\n### Homebrew (macOS)\n\n```bash\nbrew tap shkm/brew\nbrew install --cask shellflow\n```\n\n### Manual Download\n\nDownload the latest release for your platform from the [Releases](https://github.com/shkm/shellflow/releases) page.\n\n## Technology Stack\n\n- **Frontend**: React + TypeScript + Tailwind CSS\n- **Backend**: Rust (Tauri 2.x)\n- **Terminal**: xterm.js\n- **Git**: git2 (libgit2 bindings)\n- **PTY**: portable-pty\n\n## Development\n\n### Prerequisites\n\n- Node.js 20+\n- Rust 1.70+\n\n### Setup\n\n```bash\nnpm install\nnpm run tauri dev\n```\n\n### Build\n\n```bash\nnpm run tauri build\n```\n\nThe built application will be available at:\n\n- `src-tauri/target/release/bundle/macos/Shellflow.app`\n- `src-tauri/target/release/bundle/dmg/Shellflow_*.dmg`\n\n## Architecture\n\n```\n┌─────────────────────────────────────────────────────────────┐\n│  Tauri WebView (React)                                      │\n│  ┌────────────┐  ┌───────────────────┐  ┌─────────────────┐ │\n│  │  Sidebar   │  │  Main Pane        │  │  Right Panel    │ │\n│  │            │  │  (tabbed xterm)   │  │  ┌───────────┐  │ │\n│  │ - Projects │  │                   │  │  │ Changed   │  │ │\n│  │ - Workspcs │  │                   │  │  │ Files     │  │ │\n│  │            │  │                   │  │  ├───────────┤  │ │\n│  │            │  │                   │  │  │ Terminal  │  │ │\n│  └────────────┘  └───────────────────┘  └─────────────────┘ │\n└─────────────────────────────────────────────────────────────┘\n                            │\n                      Tauri IPC\n                            │\n┌─────────────────────────────────────────────────────────────┐\n│  Rust Backend                                               │\n│  ┌──────────────┐  ┌──────────────┐  ┌──────────────┐       │\n│  │ WorktreeMgr  │  │   PtyMgr     │  │  FileWatcher │       │\n│  └──────────────┘  └──────────────┘  └──────────────┘       │\n│         │                                                   │\n│  ┌──────────────┐                                           │\n│  │    git2      │                                           │\n│  └──────────────┘                                           │\n└─────────────────────────────────────────────────────────────┘\n```\n\n## Data Storage\n\n- **Worktrees**: Created in `\u003crepo\u003e/.worktrees/\u003cworktree-name\u003e/` by default\n- **State**: Persisted in `~/.shellflow/state.json`\n\n## Configuration\n\nSettings are stored in `~/.config/shellflow/config.jsonc`. The file is created with defaults on first run.\n\nSee [default_config.jsonc](src-tauri/src/default_config.jsonc) for all available options, or use the [JSON schema](src-tauri/src/config.schema.json) for editor autocompletion.\n\n### Tasks\n\nTasks are configurable commands that can be run per worktree. They appear in a dropdown in the sidebar and can be started/stopped individually. Useful for dev servers, build watchers, test runners, or any command you run frequently.\n\n```jsonc\n{\n  \"tasks\": [\n    {\n      \"name\": \"Dev Server\",\n      \"command\": \"npm run dev\",\n      \"kind\": \"daemon\", // Stays running until stopped\n    },\n    {\n      \"name\": \"Build\",\n      \"command\": \"npm run build\",\n      \"kind\": \"command\", // Runs to completion (default)\n    },\n    {\n      \"name\": \"Test Watch\",\n      \"command\": \"npm test -- --watch\",\n      \"kind\": \"daemon\",\n      \"silent\": true, // Run without showing output in drawer\n    },\n  ],\n}\n```\n\n| Option    | Type                      | Description                                                                                   |\n| --------- | ------------------------- | --------------------------------------------------------------------------------------------- |\n| `name`    | string                    | Display name for the task (must be unique)                                                    |\n| `command` | string                    | Shell command to run                                                                          |\n| `kind`    | `\"command\"` \\| `\"daemon\"` | `\"command\"` runs to completion, `\"daemon\"` stays running until stopped (default: `\"command\"`) |\n| `silent`  | boolean                   | If true, task runs without showing output in drawer (default: `false`)                        |\n| `shell`   | string                    | Override shell to run command with (e.g., `/bin/bash`, `fish`)                                |\n\n### Project-specific overrides\n\nYou can override settings per-project by creating config files in the project directory:\n\n- `.shellflow/config.jsonc` — shared with the team (commit to git)\n- `.shellflow/config.local.jsonc` — local overrides (add to `.gitignore`)\n\n### Inspiration\n\n- [Conductor](https://docs.conductor.build) — Similar concept, different goals\n- [Worktrunk](https://worktrunk.dev) — Terminal-based worktree manager\n- [Zed](https://zed.dev) — For the style and key mappings\n\n## License\n\nMIT\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fshkm%2Fshellflow","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fshkm%2Fshellflow","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fshkm%2Fshellflow/lists"}