{"id":50928708,"url":"https://github.com/danielc000/loom","last_synced_at":"2026-06-17T02:01:14.384Z","repository":{"id":365262431,"uuid":"1250498623","full_name":"DanielC000/loom","owner":"DanielC000","description":"A local-first cockpit for real Claude Code sessions — drive interactive `claude`, orchestrate a fleet of agents, and weave docs + tasks into one fabric, all on your machine.","archived":false,"fork":false,"pushed_at":"2026-06-16T15:29:04.000Z","size":5086,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-16T16:24:04.190Z","etag":null,"topics":["ai-agents","ai-agents-automation","claude-code","developer-tools","developer-tools-ai-agent","local-first","multi-agent","obsidian","orchestration","sqlite","typescript"],"latest_commit_sha":null,"homepage":"","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/DanielC000.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","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-05-26T17:35:21.000Z","updated_at":"2026-06-16T15:34:56.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/DanielC000/loom","commit_stats":null,"previous_names":["danielc000/loom"],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/DanielC000/loom","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DanielC000%2Floom","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DanielC000%2Floom/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DanielC000%2Floom/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DanielC000%2Floom/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/DanielC000","download_url":"https://codeload.github.com/DanielC000/loom/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DanielC000%2Floom/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34430688,"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-06-17T02:00:05.408Z","response_time":127,"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":["ai-agents","ai-agents-automation","claude-code","developer-tools","developer-tools-ai-agent","local-first","multi-agent","obsidian","orchestration","sqlite","typescript"],"created_at":"2026-06-17T02:00:38.948Z","updated_at":"2026-06-17T02:01:14.377Z","avatar_url":"https://github.com/DanielC000.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n\n\u003cimg src=\"docs/images/logo.svg\" alt=\"Loom\" width=\"320\" /\u003e\n\n### A local-first cockpit for real Claude Code sessions\n\n\u003cp\u003e\n  \u003ca href=\"LICENSE\"\u003e\u003cimg alt=\"License: MIT\" src=\"https://img.shields.io/badge/license-MIT-blue.svg\" /\u003e\u003c/a\u003e\n  \u003ca href=\"https://github.com/DanielC000/loom/actions/workflows/ci.yml\"\u003e\u003cimg alt=\"CI\" src=\"https://github.com/DanielC000/loom/actions/workflows/ci.yml/badge.svg\" /\u003e\u003c/a\u003e\n  \u003ca href=\"https://github.com/DanielC000/loom/releases\"\u003e\u003cimg alt=\"Release\" src=\"https://img.shields.io/github/v/release/DanielC000/loom?sort=semver\" /\u003e\u003c/a\u003e\n  \u003cimg alt=\"Node 22+\" src=\"https://img.shields.io/badge/node-%3E%3D22-brightgreen.svg\" /\u003e\n\u003c/p\u003e\n\n\u003c/div\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"docs/images/hero.png\" alt=\"Loom's Mission Control: a lead agent and three worker sessions on isolated git branches with live context meters, an attention queue with a merge awaiting review, and a real-time activity feed — one phosphor-on-dark cockpit.\" width=\"100%\" /\u003e\n\u003c/p\u003e\n\nLoom is a local-first AI project workspace that drives the **real interactive `claude`** — the same\nterminal session you'd run by hand, not a headless one-shot — and keeps it durable. Sessions are owned\nby a daemon on your machine, so closing the window never kills the work. Around those sessions Loom\nbinds your Obsidian vault and a per-project task board into a single view, and lets one lead agent\ndecompose a goal, delegate to workers on isolated branches, review their diffs, and merge. It even\nself-hosts: Loom is built using Loom.\n\n## Features\n\n- **🖥️ Real Claude Code sessions, not headless.** Loom drives the genuine interactive `claude` over a\n  PTY (`node-pty`) — never `claude -p` / headless one-shots. Sessions are resumable and **outlive any\n  viewer**, so a closed tab or a reboot doesn't lose the thread.\n- **⛓️ Multi-agent orchestration.** A lead session plans, delegates to worker sessions on isolated\n  git **worktree branches**, reviews each diff, and merges through a gate. Workers report up; the lead\n  holds the whole picture. Loom even orchestrates its own development with this loop.\n- **🔒 Local-first by design.** Everything durable lives on your machine: a daemon bound to\n  **loopback only** (`127.0.0.1`), an **SQLite** store, your git checkouts, and your vault. No cloud\n  service sits between you and your work.\n- **✦ Vault-backed knowledge.** Design notes, decisions, and session logs live in an Obsidian vault\n  woven alongside the code, and Loom auto-commits vault writes so the knowledge layer stays versioned\n  with the work.\n- **◧ A task board agents can use.** Tasks are a first-class, project-scoped surface backed by an MCP\n  server, so agents read the board, create cards, and move work through columns as part of the same\n  loop you watch — rendered as a per-project kanban.\n- **❯ The terminal cockpit.** A stateless React/Vite web viewport attaches over WebSockets and\n  detaches freely: Mission Control, the task board, live terminals, runs, and git — one\n  phosphor-on-dark instrument panel.\n- **🌐 Opt-in per-worker browser testing.** A worker profile can be granted its own isolated headless\n  Playwright browser, so QA-style sessions can drive a running app and verify UI before reporting back.\n- **🚀 Guided onboarding.** A built-in **Setup Assistant** greets you on first run and stays one click away\n  (\"Set up Loom\"). It helps you create and configure your projects, agents, and profiles, pick your skills\n  and workflow, and can set them up on your behalf — confirming the big moves first, on a deliberately\n  narrow, safe tool surface.\n\n## Quick start\n\nYou need **Node 22+** and a working `claude` CLI on your machine. Install Loom globally from npm\n(published as [`loomctl`](https://www.npmjs.com/package/loomctl)) — that gives you the `loom` command:\n\n```sh\nnpm i -g loomctl\nloom            # boots the daemon (loopback only) and opens the cockpit in your browser\n```\n\n`loom` with no arguments starts the daemon in the foreground and opens your browser; press Ctrl-C to\nstop. To manage a background daemon, use the subcommands:\n\n```sh\nloom start --detach   # run the daemon in the background (writes a PID file under ~/.loom)\nloom status           # is it running? — prints version, URL and PID (exit non-zero if stopped)\nloom stop             # stop it gracefully and clean up\nloom restart          # stop, then start (honors --detach/--port/--no-open)\nloom open             # open the browser to a running daemon\nloom update           # update to the latest release (npm i -g loomctl@…), then restart\n```\n\n`loom update` upgrades the global install and restarts the daemon; `loom update --channel beta` switches\nto (and remembers) the beta track. When a newer release is available the cockpit also shows an\n\"update available\" banner you can act on from the UI.\n\nTo have Loom **autostart in the background on login**, register it with your OS service manager:\n\n```sh\nloom service install     # register autostart (systemd --user / launchd / Task Scheduler)\nloom service status      # is it registered? + is the daemon running?\nloom service uninstall   # remove the autostart registration\n```\n\n`install` runs `loom start --no-open` under the OS service manager, which owns keep-alive/restart —\na systemd `--user` unit on Linux, a launchd LaunchAgent on macOS, and a per-user Task Scheduler logon\ntask on Windows (no admin required). It is idempotent (re-installing replaces cleanly) and honors\n`--port`. So far only the Windows path has been verified end-to-end on real hardware; the macOS and\nLinux artifacts are generated to spec and structurally tested but still need a live check on a Mac/Linux host.\n\nCommon flags: `-p, --port \u003cn\u003e` (default `4317`, or `LOOM_PORT`), `--no-open`, `-d, --detach`,\n`-v, --version`, `-h, --help`. Prefer not to install? Run it once with **no install** via\n`npx loomctl` (same flags and subcommands, e.g. `npx loomctl status`).\n\n### One-line install\n\nFor a hands-off setup, the repo ships two installer scripts ([`install.sh`](install.sh) for\nmacOS/Linux/WSL, [`install.ps1`](install.ps1) for Windows). They check for Node 22+ (and print a guide\nif it's missing — they do **not** download Node for you), run `npm i -g loomctl`, optionally register\nautostart, and launch Loom — all idempotent (safe to re-run; `npm i -g` upgrades in place):\n\n```sh\n# macOS / Linux / WSL\ncurl -fsSL https://raw.githubusercontent.com/DanielC000/loom/main/install.sh | sh\n\n# Windows (PowerShell)\nirm https://raw.githubusercontent.com/DanielC000/loom/main/install.ps1 | iex\n```\n\nBecause `curl … | sh` and `irm … | iex` have no interactive prompt, drive optional steps with flags\n(local-file runs) or env vars (piped runs):\n\n| Behaviour                  | sh flag / env                         | PowerShell flag / env                       |\n| -------------------------- | ------------------------------------- | ------------------------------------------- |\n| Register autostart         | `--service` / `LOOM_INSTALL_SERVICE=1`| `-Service` / `$env:LOOM_INSTALL_SERVICE='1'`|\n| Don't launch the daemon    | `--no-start` / `LOOM_INSTALL_START=0` | `-NoStart` / `$env:LOOM_INSTALL_START='0'`  |\n| Install a specific source  | `--source \u003cspec\u003e` / `LOOM_INSTALL_SOURCE` | `-Source \u003cspec\u003e` / `$env:LOOM_INSTALL_SOURCE` |\n| Port                       | `--port \u003cn\u003e` / `LOOM_PORT`            | `-Port \u003cn\u003e` / `$env:LOOM_PORT`              |\n\n\u003e **⚠ Piping a script straight to a shell runs unreviewed code.** The one-liners above fetch the\n\u003e installers from this repo over **HTTPS** (raw GitHub) and execute them. If you'd rather inspect first,\n\u003e clone the repo and run them by local path (`sh install.sh` / `pwsh -ExecutionPolicy Bypass -File\n\u003e install.ps1`), or download the script, verify its **SHA-256 checksum**, then run it. (A vanity/Pages\n\u003e URL may front these raw links later; the raw-GitHub URLs above resolve today.)\n\n### From source (contributors)\n\npnpm is the contributor toolchain. From a clone of the repo:\n\n```sh\npnpm install\npnpm build          # builds the shared contract first\npnpm daemon         # the daemon on http://127.0.0.1:4317 (loopback only)\npnpm web            # the viewport on http://127.0.0.1:5317\n```\n\nOpen `http://127.0.0.1:5317` and you're in the cockpit. See\n[`docs/releasing.md`](docs/releasing.md) for the packaging and release flow.\n\n## How it works\n\nA single local **daemon** owns everything durable — the sessions, the PTY host that drives `claude`,\nthe Fastify HTTP/WS gateway, an SQLite store, read-only git, and the vault auto-committer. The\n**web viewport** is stateless: it attaches to a session over a WebSocket and detaches freely, while the\nsession keeps running on the daemon whether or not anyone is watching.\n\nGive a **lead** agent a goal and it decomposes the goal into tasks, spawns **workers** — each on its own\nworktree branch, each driving a real Claude Code session — then reviews each diff, merges what passes,\nand keeps the vault and board versioned alongside the code. Plan, delegate, review, merge.\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"docs/images/architecture.svg\" alt=\"Loom architecture: a loopback daemon owning SQLite, the PTY host, the HTTP/WS gateway, git, and the vault, with a stateless web viewport attaching over WebSockets and a lead agent orchestrating worker sessions on isolated branches.\" width=\"100%\" /\u003e\n\u003c/p\u003e\n\nThe monorepo (pnpm + Turbo) is three packages:\n\n- **`packages/shared`** — the contract: types (Project / Topic / Session / Task + the session FSM),\n  one config-resolution mechanism, and the ws/REST protocol.\n- **`packages/daemon`** — owns everything durable: SQLite, the PTY host, the gateway, the\n  project-scoped task MCP server, read-only git, and the vault auto-committer.\n- **`packages/web`** — the stateless React/Vite viewport.\n\n## Screenshots\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"docs/images/screenshot-board.png\" alt=\"Loom's per-project task board: a kanban of cards that both you and the agents read and move through columns.\" width=\"100%\" /\u003e\n  \u003cbr /\u003e\n  \u003cem\u003eThe per-project task board — a kanban you and the agents share, with live worker status and branch on each card.\u003c/em\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"docs/images/screenshot-terminal.png\" alt=\"A live Loom session terminal: the real interactive claude running in a daemon-owned PTY, attached over a WebSocket.\" width=\"100%\" /\u003e\n  \u003cbr /\u003e\n  \u003cem\u003eA live session terminal — the real interactive \u003ccode\u003eclaude\u003c/code\u003e, attached over a WebSocket.\u003c/em\u003e\n\u003c/p\u003e\n\n## Docs \u0026 links\n\n- [`CLAUDE.md`](CLAUDE.md) — architecture, the validated gate-free spawn recipe, and the load-bearing\n  invariants (start here to hack on Loom).\n- [`docs/releasing.md`](docs/releasing.md) — the packaging, versioning, and release runbook.\n- [`CHANGELOG.md`](CHANGELOG.md) — notable changes per version.\n\n## Contributing \u0026 community\n\nContributions are welcome. Please read [`CONTRIBUTING.md`](CONTRIBUTING.md) to get set up and\n[`CODE_OF_CONDUCT.md`](CODE_OF_CONDUCT.md) for the community standards we hold. To report a security\nissue, follow the process in [`SECURITY.md`](SECURITY.md) rather than opening a public issue.\n\n## License\n\nLoom is released under the [MIT License](LICENSE).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdanielc000%2Floom","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdanielc000%2Floom","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdanielc000%2Floom/lists"}