{"id":50677077,"url":"https://github.com/deeeed/farmslot","last_synced_at":"2026-06-08T16:05:13.624Z","repository":{"id":362398982,"uuid":"1258026393","full_name":"deeeed/farmslot","owner":"deeeed","description":"Experimental agentic engineering OS and supervised dev-agent workflow.","archived":false,"fork":false,"pushed_at":"2026-06-04T02:59:59.000Z","size":13574,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-04T04:25:05.294Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"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/deeeed.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":".github/CODEOWNERS","security":null,"support":null,"governance":null,"roadmap":"docs/ROADMAP-next.md","authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2026-06-03T08:03:05.000Z","updated_at":"2026-06-04T02:59:42.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/deeeed/farmslot","commit_stats":null,"previous_names":["deeeed/farmslot"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/deeeed/farmslot","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/deeeed%2Ffarmslot","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/deeeed%2Ffarmslot/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/deeeed%2Ffarmslot/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/deeeed%2Ffarmslot/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/deeeed","download_url":"https://codeload.github.com/deeeed/farmslot/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/deeeed%2Ffarmslot/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34069511,"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-08T02:00:07.615Z","response_time":111,"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":[],"created_at":"2026-06-08T16:05:12.471Z","updated_at":"2026-06-08T16:05:13.612Z","avatar_url":"https://github.com/deeeed.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# farmslot\n\nProject-agnostic orchestration for dispatching autonomous coding agents to a fleet of machines.\n\n\u003e Why the name? I know. It stuck: agentic dev farming across many isolated slots. Naming is harder than scheduling the agents.\n\n\u003e [!WARNING]\n\u003e **Active development preview.** Farmslot is moving quickly while the product is finalized in\n\u003e this repo. Expect experimental features, rough edges, changing APIs, large/transient files, and\n\u003e docs that may lead the implementation in some areas. Use it as an early operator/developer tool,\n\u003e not as a stable production dependency yet.\n\n## What it does\n\nManages a pool of machines (local or remote), each with one or more **slots** — isolated environments where an AI coding agent runs a task autonomously. Handles the full lifecycle: prepare, dispatch, monitor, recycle.\n\n```\nfarmslot/\n  packages/cli/      # `farmslot` CLI for gateway, fleet, slot, dispatch, and RPC control\n  scripts/           # Lower-level lifecycle scripts used by the gateway and CLI\n  pool/              # Machine registry — slots, ports, devices\n  projects/          # Project configs (separate git repos, user-managed)\n    \u003cname\u003e-farm/\n      project.json   # Hooks, health checks, fixture mappings\n      fixtures/      # Env templates, config files, test data\n      templates/     # Task templates (worker + orchestrator)\n  docs/              # Architecture, protocols, reference\n```\n\n## Try it locally\n\n```bash\nbash scripts/dev.sh\n```\n\nOpen [http://localhost:7777](http://localhost:7777) to use Command Center with the local fake-runner demo slot. For CLI and agent access, see [Local demo and CLI access](https://farmslot.io/docs/guides/local-demo-and-cli).\n\n## Learn more\n\n- [Documentation website](https://farmslot.io)\n- [What is Farmslot?](https://farmslot.io/docs/intro)\n- [Adoption path](https://farmslot.io/docs/guides/adoption-path)\n- [Local demo and CLI access](https://farmslot.io/docs/guides/local-demo-and-cli)\n- [Gateway API capability surface](https://farmslot.io/docs/reference/gateway-api)\n- [Reference integrations](https://farmslot.io/docs/intro#reference-integrations)\n\n## Reference integrations\n\nFarmslot is designed to be project-agnostic: each repository keeps its own runner hooks, fixtures, recipes, and domain actions behind `project.json`. Two useful reference integrations are:\n\n- **AudioLab** — [github.com/deeeed/audiolab](https://github.com/deeeed/audiolab) is a public Expo/React Native monorepo that uses Recipe Protocol v1 to expose app-specific audio and native-module probes through a project-owned recipe runner. It is the best public example for adapting an existing app without moving app semantics into Farmslot core.\n- **Farmslot itself** — this repo includes `projects/farmslot-farm/project.json` and `pool/farmslot-demo.json`, so Farmslot can dispatch, validate, and dogfood work against its own monorepo using the same pool/project model as any imported project.\n\n## Adding a project\n\nEach project is a separate git repo inside `projects/`:\n\n```bash\ncd projects/\nmkdir my-app-farm \u0026\u0026 cd my-app-farm\ngit init\n```\n\nCreate `project.json`:\n\n```json\n{\n  \"name\": \"my-app-farm\",\n  \"default_branch\": \"main\",\n  \"hooks\": {\n    \"preflight\": \"npm install \u0026\u0026 npm start \u0026\",\n    \"health_check\": \"curl -s http://localhost:{{METRO_PORT}}/health\",\n    \"dev_server_check\": \"lsof -i :{{METRO_PORT}} \u003e/dev/null 2\u003e\u00261\"\n  },\n  \"health\": {\n    \"ready_indicator\": \"ok\",\n    \"parse_health\": \"python3 -c \\\"import json,sys; print(json.load(sys.stdin).get('status',''))\\\"\",\n    \"dev_server_name\": \"DevServer\"\n  },\n  \"fixtures\": {\n    \"templates\": [{ \"src\": \".env.template\", \"dst\": \".env\", \"vars\": [\"PORT\"] }],\n    \"files\": []\n  },\n  \"platforms\": {}\n}\n```\n\nThen reference it in your pool JSON:\n\n```json\n{ \"machine\": \"my-server\", \"project\": \"my-app-farm\", ... }\n```\n\nNo lifecycle script changes needed.\n\n## Adding a machine\n\nCreate `pool/\u003cmachine\u003e.json`:\n\n```json\n{\n  \"machine\": \"my-server\",\n  \"project\": \"my-app-farm\",\n  \"platform\": \"linux\",\n  \"host\": \"my-server.local\",\n  \"ssh_user\": \"deploy\",\n  \"dispatch_cmd\": \"cd {repo} \u0026\u0026 {claude_path} --dangerously-skip-permissions\",\n  \"slots\": [\n    {\n      \"id\": \"my-server-1\",\n      \"repo\": \"~/dev/my-app\",\n      \"metro_port\": 3000,\n      \"session\": \"my-server-1\",\n      \"slot_vars\": { \"PORT\": \"3000\" }\n    }\n  ]\n}\n```\n\n## Development (multi-worktree)\n\nMultiple farmslot worktrees can run dev servers simultaneously using per-worktree port config.\n\nResource watches are enabled by default so connected nodes keep the gateway\nresource cache fresh. Set `FARMSLOT_RESOURCE_WATCHES=0` or\n`FARMSLOT_RESOURCE_WATCHES=false` before starting the gateway to disable them.\nAt runtime, Command Center's fleet resource view can pause/resume watches and\npreview or run idle-resource cleanup through configured project shutdown hooks.\n\n**Setup:**\n\n1. Copy `.env.ports.example` to `.env.ports` at the repo root\n2. Set unique ports per worktree (main worktree uses defaults, no file needed):\n   ```bash\n   GATEWAY_PORT=7778\n   VITE_PORT=5175\n   ```\n3. Start: `bash scripts/dev.sh` (required — running `yarn dev` directly won't load port overrides)\n\n**Port allocation:**\n\n| Worktree | Gateway | Vite UI |\n| -------- | ------- | ------- |\n| main     | 7777    | 5174    |\n| farm     | 7778    | 5175    |\n| (next)   | 7779    | 5176    |\n\n**Limitations:** Remote node agents connect to one gateway only (the main one on 7777). The worktree gateway gets fleet data via SSH-based refresh on first boot, but won't have real-time node connections — so live exec and tmux streaming only work on the main gateway.\n\n## Architecture\n\nSee [docs/README.md](docs/README.md) and [docs/adr/](docs/adr/) for the full design.\n\nKey decisions:\n\n- **Pool JSON owns machine config** — SSH, ports, devices\n- **Project JSON owns app config** — how to boot, health-check, recycle\n- **Scripts are project-agnostic** — all project-specific logic comes from `project.json`\n- **Local slots run without SSH** — auto-detected via hostname\n- **Project configs are separate git repos** — each `projects/\u003cname\u003e-farm/` is independently tracked\n\n## Monorepo package boundaries\n\nFarmslot separates product surfaces, runtime services, and reusable toolkit packages:\n\n- `apps/*` contains user-facing product surfaces:\n  - `apps/command-center` — web control surface plus repo-level quality scripts.\n  - `apps/companion` — mobile companion app.\n  - `apps/docs` — Docusaurus reader-facing documentation site.\n- `services/gateway` and `services/node` are long-running runtime services: Gateway owns control-plane orchestration; Node owns machine-local capabilities.\n- Other `packages/*` entries are shared libraries or CLIs: protocol contracts, recipe tooling, theming, Expo recipe support, and the Farmslot CLI.\n- Keep code with its owner. UI-only code belongs under the app that renders it; reusable protocol/toolkit code belongs under a package; service/runtime policy belongs in Gateway; machine-local execution belongs in Node.\n- Keep package names stable when moving implementation roots. Workspace location communicates repository ownership; the `@farmslot/*` package name communicates import/runtime identity.\n\n---\n\nCreated by [Arthur Breton](https://siteed.net)\n\n## License\n\nMIT. See [LICENSE](LICENSE).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdeeeed%2Ffarmslot","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdeeeed%2Ffarmslot","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdeeeed%2Ffarmslot/lists"}