{"id":49739066,"url":"https://github.com/jahwag/clem","last_synced_at":"2026-05-30T06:04:26.656Z","repository":{"id":352351038,"uuid":"1201220680","full_name":"jahwag/clem","owner":"jahwag","description":"Continuously Looping Engineering Machines. docker-compose for Claude Code agents - persistent teams, 24/7, on any Linux host.","archived":false,"fork":false,"pushed_at":"2026-05-16T19:00:40.000Z","size":424,"stargazers_count":7,"open_issues_count":47,"forks_count":2,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-16T20:45:14.183Z","etag":null,"topics":["agents","ai","claude","claude-code","llm"],"latest_commit_sha":null,"homepage":"https://myclementine.ai","language":"Go","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/jahwag.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","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-04-04T11:29:09.000Z","updated_at":"2026-05-16T18:58:58.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/jahwag/clem","commit_stats":null,"previous_names":["jahwag/clem"],"tags_count":20,"template":false,"template_full_name":null,"purl":"pkg:github/jahwag/clem","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jahwag%2Fclem","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jahwag%2Fclem/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jahwag%2Fclem/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jahwag%2Fclem/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jahwag","download_url":"https://codeload.github.com/jahwag/clem/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jahwag%2Fclem/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33681815,"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-30T02:00:06.278Z","response_time":92,"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","ai","claude","claude-code","llm"],"created_at":"2026-05-09T15:17:31.367Z","updated_at":"2026-05-30T06:04:26.650Z","avatar_url":"https://github.com/jahwag.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n  \u003cimg src=\"docs/logo.png\" alt=\"Clementine\" width=\"160\"\u003e\n\u003c/p\u003e\n\n\u003ch1 align=\"center\"\u003eclem\u003c/h1\u003e\n\n\u003cp align=\"center\"\u003e\u003cem\u003eContinuously Looping Engineering Machines.\u003c/em\u003e\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\u003cem\u003e\u003cb\u003edocker-compose for Claude Code agents.\u003c/b\u003e\u003c/em\u003e\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://github.com/jahwag/clem/blob/main/LICENSE\"\u003e\u003cimg src=\"https://img.shields.io/badge/license-MIT-green?style=flat-square\" alt=\"MIT License\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://github.com/jahwag/clem/releases\"\u003e\u003cimg src=\"https://img.shields.io/github/v/release/jahwag/clem?style=flat-square\u0026color=orange\" alt=\"Latest release\"\u003e\u003c/a\u003e\n  \u003cimg src=\"https://img.shields.io/github/go-mod/go-version/jahwag/clem?style=flat-square\u0026color=00ADD8\u0026logo=go\u0026logoColor=white\" alt=\"Go version\"\u003e\n  \u003ca href=\"https://goreportcard.com/report/github.com/jahwag/clem\"\u003e\u003cimg src=\"https://goreportcard.com/badge/github.com/jahwag/clem?style=flat-square\" alt=\"Go Report Card\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://discord.gg/pR4qeMH4u4\"\u003e\u003cimg src=\"https://img.shields.io/badge/Discord-community-5865F2?style=flat-square\u0026logo=discord\u0026logoColor=white\" alt=\"Discord community\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://github.com/jahwag/clem/pulls\"\u003e\u003cimg src=\"https://img.shields.io/badge/PRs-welcome-brightgreen?style=flat-square\" alt=\"PRs welcome\"\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://myclementine.ai\"\u003e\u003cb\u003emyclementine.ai\u003c/b\u003e\u003c/a\u003e \u0026middot;\n  \u003ca href=\"https://github.com/jahwag/clem#quickstart\"\u003eQuickstart\u003c/a\u003e \u0026middot;\n  \u003ca href=\"https://github.com/jahwag/clem/releases/latest\"\u003eDownload\u003c/a\u003e \u0026middot;\n  \u003ca href=\"https://discord.gg/pR4qeMH4u4\"\u003eDiscord\u003c/a\u003e\n\u003c/p\u003e\n\n`clem` runs a team of Claude Code agents 24/7 on any Linux host. Each agent is a separate OS user in a tmux session under systemd. Agents coordinate over Discord or Slack, pick up tasks, write code, and open PRs. A watchdog restarts anything that crashes. You configure it once and walk away.\n\n---\n\n## Feature map\n\n| | |\n|---|---|\n| **Per-agent OS identity** | Each agent is its own Linux user - own home dir, own git identity, own GitHub PRs, own Discord/Slack bot. Crash boundaries are real. |\n| **Multi-backend coordination** | Discord + Slack today via swappable `coordination.backend:` in `clem.yaml`. One config knob. |\n| **Multi-runtime** | `runtime: claude-code \\| opencode`. Mix Anthropic cloud, Bedrock, Vertex, Ollama, OpenAI-compat - one surface. |\n| **Encrypted secrets** | Per-agent `.env` materialised from age/sops vaults at provision time. Never leave the host after. |\n| **Self-healing** | systemd + tmux per agent. Watchdog timer restarts dead or stalled sessions. Alerts fire only after repeated failures. |\n| **Bring your own model** | Default Claude; one flag away from Ollama Cloud / Bedrock / Vertex / local models. Tested end-to-end on NVIDIA Nemotron. |\n| **Live ops** | `clem status` shows health per agent. Optional ttyd web terminal per agent - attach in your browser. |\n| **Works locally** | Laptop, home server, Raspberry Pi, small VPS. No Kubernetes. No cloud services required. |\n\n---\n\n## Contents\n\n1. [How it works](#how-it-works)\n2. [Requirements](#requirements)\n3. [Install](#install)\n4. [Quickstart](#quickstart)\n5. [Discord setup](#discord-setup)\n6. [GitHub setup](#github-setup)\n7. [CLI reference](#cli-reference)\n8. [`clem.yaml` reference](#clemyaml-reference)\n9. [Secrets](#secrets)\n10. [Deploy to a VPS](#deploy-to-a-vps)\n11. [Troubleshooting](#troubleshooting)\n12. [License](#license)\n\n---\n\n## How it works\n\n```\n┌──────────────────────────────────────────────────────┐\n│  Linux host  (your laptop · home server · VPS · …)   │\n│                                                      │\n│  ┌──────────────┐   ┌──────────────┐                 │\n│  │ OS user:     │   │ OS user:     │   systemd +     │\n│  │ myteam-lead  │   │ myteam-worker│   tmux per user │\n│  │  claude loop │   │  claude loop │                 │\n│  └──────┬───────┘   └──────┬───────┘                 │\n│         └──── MCP (stdio) ─┘                         │\n│                     │                                │\n│  ┌──────────────────┴──────────────────┐             │\n│  │  watchdog timer (every 5 min)       │             │\n│  │  restarts dead agents → #alerts     │             │\n│  └─────────────────────────────────────┘             │\n└───────────────────┬──────────────────────────────────┘\n                    │ coordination backend API\n          ┌─────────▼──────────┐\n          │  Discord or Slack  │\n          │  #general #tasks   │\n          │  #alerts #lessons  │\n          └────────────────────┘\n```\n\nEach agent runs a loop: launch `claude` (or `opencode`), inject a prompt, wait for the session to finish (up to 2h hard cap), sleep the configured `iteration` duration, repeat. Secrets live encrypted in `secrets.sops.yaml` (age/sops); `clem provision` decrypts them into per-agent `.env` files on the host.\n\n---\n\n## Requirements\n\n**Host** - any Linux box with systemd (Ubuntu 24.04 recommended). Can be your laptop, a home server, a Pi, or a cloud VPS. Must have `tmux`, `git`, `python3`, `age`, `sops`, `yq`, and `curl`. Plus the MCP server for your chosen coordination backend - `mcp-discord` (Python) or `slack-mcp-server` (binary) - reachable via `$PATH`. `clem provision` installs the runtime CLI (Claude Code or opencode) per agent.\n\n**Local machine** - where you run `clem` commands (may be the same box as the host):\n- `go` 1.22+ (to build `clem`)\n- `age`, `sops`, `yq` - to edit secrets locally\n- `gh` - GitHub CLI\n\n**Accounts:**\n- A coordination backend:\n  - **Discord** - a private server + one bot token per agent, or\n  - **Slack** - a workspace + one Slack app per agent (bot user token `xoxb-…`)\n- A GitHub token per agent (fine-grained PAT or App)\n\n---\n\n## Install\n\nBuild from source:\n\n```bash\ngit clone https://github.com/jahwag/clem.git\ncd clem\ngo build -ldflags \"-X github.com/jahwag/clem/cmd.Version=$(git describe --tags --always)\" -o clem .\nsudo install -m 0755 clem /usr/local/bin/clem\nclem --version\n```\n\nTo upgrade later, once releases are published:\n\n```bash\nsudo clem update\n```\n\n---\n\n## Quickstart\n\nFull local setup on one Linux box. If you want to provision on a separate remote host, see [Deploy to a VPS](#deploy-to-a-vps).\n\n**Try clem without touching your host:** sandboxed samples under [`samples/`](samples/README.md) - \n- [`ollama-nemotron-4b`](samples/ollama-nemotron-4b/README.md) - Discord + local NVIDIA Nemotron 3 Nano 4B (~2.8 GB)\n- [`slack-nemotron-4b`](samples/slack-nemotron-4b/README.md) - Slack + same local model\n\n```bash\n# 1. new team repo (replace with your org)\ngh repo create my-team --private --clone \u0026\u0026 cd my-team\n\n# 2. scaffold config\nclem init\n```\n\nEdit `clem.yaml`:\n- Set `project:` (becomes OS user prefix, e.g. `myteam-lead`)\n- Pick `coordination.backend:` (`discord` or `slack`)\n- Paste your server/workspace ID and channel IDs - see [Discord setup](#discord-setup) below. Slack setup lives in [`samples/slack-nemotron-4b/README.md`](samples/slack-nemotron-4b/README.md).\n- Adjust agent `name`, `role`, `model`, `iteration` (Go duration: `30s`, `1m30s`, `2h`), `runtime`, `provider`\n\nEdit `CLAUDE.shared.md` - describe your project, fill in tiers T2-T4. Edit each `CLAUDE.\u003cagentkey\u003e.md` with per-agent specifics.\n\n```bash\n# 3. generate age keypair + .sops.yaml\nclem vault init\n\n# 4. store per-agent secrets (see Discord/GitHub setup below)\nclem vault set github        GH_TOKEN=\"ghp_...\"\nclem vault set discord-lead  DISCORD_TOKEN=\"Bot \u003clead-bot-token\u003e\"\nclem vault set discord-worker DISCORD_TOKEN=\"Bot \u003cworker-bot-token\u003e\"\n\n# 5. commit config (secrets.sops.yaml is encrypted - safe)\ngit add clem.yaml CLAUDE.*.md .sops.yaml secrets.sops.yaml\ngit commit -m \"init team config\"\ngit push\n\n# 6. provision - creates OS users, installs services, writes .env\nsudo clem provision\n\n# 7. authenticate each agent with Claude (opens browser per agent)\nsudo clem login\n\n# 8. start and check\nsudo clem up\nclem status\n```\n\n`clem status` shows systemd state, tmux liveness, token expiry, and last log line per agent. Once `SYSTEMD=active` and `TMUX=yes`, agents are running.\n\nWatch an agent:\n\n```bash\nclem logs lead\n```\n\n---\n\n## Discord setup\n\nCreate a **private** Discord server (not a public one). Discord membership is the access control layer - agents act on instructions from anyone who can post in the channels.\n\n**Channels to create:**\n\n| Name       | Type   | Purpose                                 |\n|------------|--------|-----------------------------------------|\n| `#general` | Text   | Status updates, operator comms          |\n| `#tasks`   | Forum  | Task board - agents claim threads here  |\n| `#alerts`  | Text   | Critical issues, watchdog alerts        |\n| `#lessons` | Forum  | Post-mortems, learnings                 |\n\nEnable **Developer Mode** (Settings → Advanced), then right-click the server icon and each channel to copy their IDs into `clem.yaml`.\n\n**Bot per agent** - one application per agent gives each a distinct name and avatar in task threads:\n\n1. https://discord.com/developers/applications → **New Application** (name it after the agent)\n2. **Bot** tab → **Reset Token** → copy\n3. Enable **Server Members Intent** and **Message Content Intent**\n4. **OAuth2 → URL Generator**: scopes `bot`; permissions `Send Messages`, `Read Message History`, `Attach Files`, `Manage Threads`, `Create Public Threads`\n5. Open the generated URL in a browser, add the bot to your server\n6. Save the token: `clem vault set discord-\u003cagentkey\u003e DISCORD_TOKEN=\"Bot \u003ctoken\u003e\"`\n\nRepeat per agent.\n\n---\n\n## GitHub setup\n\nEach agent needs its own GitHub token so PRs and commits show distinct authors.\n\n**Fine-grained PAT** (simplest, good for personal projects):\n\n1. https://github.com/settings/tokens?type=beta → **Generate new token**\n2. Select the target repositories\n3. Permissions: `Contents` (RW), `Pull requests` (RW), `Issues` (RW), `Workflows` (RW)\n4. `clem vault set github GH_TOKEN=\"ghp_...\"` (or a per-agent vault if you want separate tokens)\n\n**Git identity per agent** - so PRs are authored by the agent's name, not root. Run after `clem provision`:\n\n```bash\nsudo -u myteam-lead git config --global user.name  \"Amara\"\nsudo -u myteam-lead git config --global user.email \"amara@yourproject.com\"\nsudo -u myteam-lead git config --global credential.helper store\necho \"https://amara:ghp_...@github.com\" | \\\n  sudo -u myteam-lead tee /home/myteam-lead/.git-credentials\n```\n\nRepeat per agent.\n\n**GitHub App** (recommended for teams) - create one app per agent, exchange the private key for a short-lived installation token each iteration. See [GitHub App authentication](https://docs.github.com/en/apps/creating-github-apps/authenticating-with-a-github-app).\n\n---\n\n## CLI reference\n\n```\nclem --version                     Print the installed version\nclem update                        Download and install the latest release\nclem init                          Scaffold clem.yaml + CLAUDE.{shared,\u003cagent\u003e}.md\nclem vault init                    Generate age keypair + .sops.yaml\nclem vault set \u003cvault\u003e KEY=value   Set a secret in a vault\nclem vault get \u003cvault\u003e KEY         Read a decrypted secret\nclem vault list                    List all vaults and their keys (values hidden)\nclem vault delete \u003cvault\u003e [KEY]    Delete a secret or entire vault\nclem provision [--remote HOST]     Create OS users, write .env, install services (root)\nclem login [agent...]              Run `claude /login` as each agent (one-time)\nclem up [agent...]                 Start agent systemd services (root)\nclem down [agent...]               Stop agent systemd services (root)\nclem status                        Table: systemd · tmux · token expiry · last log\nclem logs \u003cagent\u003e                  Tail an agent's runner log\n```\n\nFlags:\n- `--config \u003cpath\u003e` - override the default `clem.yaml` path\n- `--remote \u003cuser@host\u003e` on `provision`/`login` - run against a remote host over SSH\n\n---\n\n## `clem.yaml` reference\n\n```yaml\nproject: string             # OS user and service name prefix\nprimary_milestone: string   # optional - referenced by CLAUDE.shared.md\n\ncoordination:\n  backend: string           # discord (default) | slack\n  server_id: string         # Discord guild ID or Slack workspace ID\n  channels:\n    general: string         # channel ID (C... for Slack, numeric for Discord)\n    tasks:   string         # task board channel (forum on Discord)\n    alerts:  string         # alerts channel\n    lessons: string         # lessons channel (forum on Discord)\n\nagents:\n  \u003cagentkey\u003e:               # lowercase; used in CLI + OS username\n    name: string            # display name in Claude + Discord\n    role: string            # human-readable\n    model: string           # model ID (Claude or Ollama/etc. name per provider)\n    iteration: duration     # go-style duration: \"30s\", \"1m30s\", \"2h\" (default 5m)\n    vaults: [string]        # vault names merged into .env (later vaults win)\n    prompt: string          # injected at start of each session\n    web_terminal_port: int  # optional - ttyd port (1024-65535) for read-only viewing\n    caveman: off|lite|full|ultra  # optional - install caveman plugin (compresses output ~75%); true → ultra (legacy compat)\n    subagent_model: string  # optional - CLAUDE_CODE_SUBAGENT_MODEL for Task tool / Explore / general-purpose; defaults to claude-sonnet-4-6; set to \"off\" to inherit main model\n    provider: string        # optional - anthropic (default) | bedrock | vertex | ollama | openai-compat\n    provider_url: string    # required when provider is ollama or openai-compat\n    runtime: string         # optional - claude-code (default) | opencode\n```\n\n**Runtimes:**\n\n| `runtime`     | CLI binary                          | Notes                                                                               |\n|---------------|-------------------------------------|-------------------------------------------------------------------------------------|\n| `claude-code` | `~/.local/bin/claude`               | Default. Anthropic-native wire format. Best for cloud Claude.                       |\n| `opencode`    | `~/.opencode/bin/opencode`          | Talks natively to 75+ providers via models.dev. Better tool-use on local models.   |\n\n**Providers:**\n\n| `provider`       | Extra env `clem` writes into `.env`                                          | Notes                                                     |\n|------------------|------------------------------------------------------------------------------|-----------------------------------------------------------|\n| `anthropic`      | none (default behaviour)                                                     | Uses Claude Code's OAuth or `ANTHROPIC_API_KEY`           |\n| `bedrock`        | `CLAUDE_CODE_USE_BEDROCK=1`                                                  | Agent also needs AWS creds in a vault                     |\n| `vertex`         | `CLAUDE_CODE_USE_VERTEX=1`                                                   | Agent also needs `GOOGLE_APPLICATION_CREDENTIALS`         |\n| `ollama`         | `ANTHROPIC_BASE_URL=\u003curl\u003e` · `ANTHROPIC_MODEL=\u003cmodel\u003e` · `ANTHROPIC_AUTH_TOKEN=none` | Ollama natively speaks Anthropic API - no proxy needed    |\n| `openai-compat`  | same as `ollama`                                                             | Requires you to run an Anthropic-wire translator yourself |\n\nDerived names:\n- OS user: `\u003cproject\u003e-\u003cagentkey\u003e` (e.g. `myteam-lead`)\n- Systemd service: `clem-\u003cproject\u003e-\u003cagentkey\u003e.service`\n- Web terminal: `clem-ttyd-\u003cproject\u003e-\u003cagentkey\u003e.service`\n\n---\n\n## Secrets\n\nSecrets live in `secrets.sops.yaml`, encrypted with age via sops. The file is safe to commit. The age private key (`~/.config/sops/age/keys.txt`) is the only thing you must keep out of git - back it up.\n\n`clem provision` decrypts secrets into per-agent `/home/\u003cuser\u003e/.env` (mode 0600). The runner sources this at the start of each iteration. Secrets never leave the host after provisioning.\n\nEach agent's `vaults:` list specifies which vaults to merge, in order. Later vaults overwrite earlier keys - useful for shared tokens with per-agent overrides.\n\nCommon secrets:\n- `GH_TOKEN` - GitHub access\n- `DISCORD_TOKEN` - Discord bot (**raw token, no `Bot ` prefix** - `discord.py` adds it)\n- `SLACK_MCP_XOXP_TOKEN` - Slack bot (`xoxb-…`) or user (`xoxp-…`) token\n- `SSH_HOST`, `ES_PASSWORD` - optional, enables Prefect MCP server\n- `WRANGLER_OAUTH_TOKEN` - optional, enables Cloudflare Workers MCP\n\n---\n\n## Deploy to a VPS\n\n`clem` doesn't require a VPS - any Linux host works. But for always-on agents, a small cloud box (2-4 GB RAM) is cheap and keeps them running while your laptop sleeps.\n\nRemote provisioning flow:\n\n```bash\n# on your local machine, inside your team repo\nclem provision --remote root@\u003cvps-ip\u003e --gh-token ghp_...\nclem login --remote root@\u003cvps-ip\u003e\nssh \u003cvps-ip\u003e \"cd my-team \u0026\u0026 clem up \u0026\u0026 clem status\"\n```\n\nSee [docs/hetzner.md](docs/hetzner.md) for a Hetzner-specific walkthrough (cloud-init, `hcloud` CLI, SSH config).\n\n---\n\n## Troubleshooting\n\n**`clem provision` fails with `useradd: command not found`**  \nNot Linux, or missing core userspace. Use a standard Ubuntu/Debian host.\n\n**`clem status` shows `SYSTEMD=failed`**  \nInspect the service: `systemctl status clem-\u003cproject\u003e-\u003cagentkey\u003e.service`. Common causes: `.env` missing (run `clem provision` again after setting vaults), `claude` not installed per agent (provision reinstalls), or MCP server binary missing on PATH.\n\n**Agent not posting to Discord/Slack**  \nCheck `clem logs \u003cagent\u003e`. The runner logs MCP server startup. If `mcp-discord` is missing, install with `pipx` (recommended) so its dependencies live in an isolated venv: `pipx install git+https://github.com/Bytelope/mcp-discord.git`. Avoid `pip install --break-system-packages` for Python MCP servers - the agent service runs with `ProtectHome=read-only`, so any later dependency drift (e.g. a system `pydantic-core` upgrade desyncing from the wheel an MCP server was built against) cannot be self-healed from inside the sandbox and the MCP will fail to boot. `pipx` venvs decouple each MCP from system Python state and survive `apt upgrade`. Confirm the bot was invited to the server. **`DISCORD_TOKEN` must be the raw token** (no `Bot ` prefix); `discord.py` adds it internally - pasting `\"Bot …\"` yields 401. For Slack: use a bot token (`xoxb-`), not a user token (`xoxp-`) - user tokens post as you, not the bot.\n\n**`clem login` keeps prompting daily / `clem status` flips to `EXPIRED` every 8 hours**  \nYou probably ran a clem older than v0.8.4. The Claude Max access token genuinely lasts only ~8 hours, but Claude Code refreshes it automatically using the long-lived refresh token stored alongside it. Pre-0.8.4 `clem status` displayed the *access* token expiry and pre-0.8.4 `NeedsLogin` gated on a 7-day window - so it always reported \"expired\" and trained operators to log in daily for nothing. Upgrade to v0.8.4+; status now shows `auto-refresh` whenever a refresh token is present, and only reports `missing` when manual `clem login` is actually required.\n\n**Token actually missing** (`clem status` shows `missing`)  \nRe-run `sudo clem login \u003cagent\u003e`. The refresh token itself is long-lived; you only need to re-login if the credentials file is wiped or the refresh token is server-side revoked.\n\n**Agent wakes up and does nothing**  \nOpen the task forum - threads must exist with `[TODO]` status. Agents only work what's on the board.\n\n**Provisioning the same host twice**  \nSafe. `useradd` is idempotent; systemd units are overwritten; `.env` is regenerated from current vaults. Existing Claude OAuth tokens are preserved.\n\n---\n\n## Community\n\nQuestions, ideas, showing off your team - join the [ClaudeSync / Clem Discord](https://discord.gg/pR4qeMH4u4).\n\n## License\n\nMIT - see [LICENSE](LICENSE).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjahwag%2Fclem","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjahwag%2Fclem","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjahwag%2Fclem/lists"}