# Install ToFinish ToFinish gives Codex or Claude Code a reusable `delegate-task` skill. The skill checks its own connection before it can create an assignment. It does not contain a service token, a Slack token, a workspace, or employee data. Give your coding agent this exact instruction: > Read and follow [ToFinish install instructions](./install.md). Install the `delegate-task` skill for this computer, inspect the archive before extracting it, and run its connection check. If no private ToFinish client configuration is present, carry out the self-host setup using an already-authenticated deployment account when available. Never read, print, copy, or ask me to paste credentials; pause only for the required Slack workspace-admin approval. Resolve all relative guide and download URLs against the origin serving this page. The landing host is separate from your private task-service origin; never replace a saved service URL with the landing URL. ## What the agent installs Download [skill.zip](./downloads/skill.zip). It contains only the generic skill source: - `SKILL.md`, its Codex metadata, and the private-config-aware client - the client, configuration, and lifecycle references that the skill links to The archive excludes `.env` files, `~/.config/tofinish/client.json`, databases, task data, tests, `node_modules`, and other project files. Compare its SHA-256 against [downloads/manifest.json](./downloads/manifest.json) before extracting. ## Codex Use `~/.codex/skills/delegate-task` as the target. Keep the existing directory until the archive has been inspected; then replace only that skill directory. An agent should use a temporary directory, list the ZIP entries, check for path traversal or unexpected files, extract there, verify `SKILL.md` and the three required references, then copy the inspected directory to the target. Start a new Codex chat and invoke `$delegate-task`, or ask for an assignment normally. If the host already has a private `~/.config/tofinish/client.json` (or a complete `TOFINISH_URL` and `TOFINISH_API_TOKEN` environment pair), the client uses it directly. Do not open, print, copy, or commit that configuration. A connection check is safe and reports whether Slack is connected; it does not send a task. ## Claude Code Use `~/.claude/skills/delegate-task` as the personal-skill target, with the same inspect-then-extract process. Claude Code documents personal skills at this path and discovers `SKILL.md` plus supporting files there: [Claude Code skills](https://code.claude.com/docs/en/slash-commands). Restart Claude Code only if its top-level personal skills directory did not already exist. Invoke `/delegate-task` or ask Claude to delegate work. ## New team self-hosting This download is source for a single-workspace pilot, not an account on the public ToFinish origin. A new team needs its own already-authenticated Railway account or equivalent persistent host, its own Slack app, and a private client configuration for its agent host. 1. Download and inspect [service-source.zip](./downloads/service-source.zip). Its `.env.example` lists the variables without values. Use Node 24 or newer for local checks. 2. Create a dedicated service with one always-running process and a persistent volume mounted at `/data`. The included `Dockerfile` and `railway.json` are a Railway-ready starting point. Run `npm ci` and `npm run typecheck` before deployment. The public source bundle intentionally excludes tests and test fixtures, so `npm test` is not available from this download. 3. Set private service variables: `APP_URL` (the clean HTTPS service origin), a random `API_TOKEN` of at least 32 characters, `TOKEN_ENCRYPTION_KEY` (32 random bytes encoded as 64 hex characters), `SLACK_CLIENT_ID`, `SLACK_CLIENT_SECRET`, `SLACK_SIGNING_SECRET`, and `EXPECTED_SLACK_HOST` (your Slack workspace hostname). `PORT` and `DATABASE_PATH` are optional. `OPENROUTER_API_KEY` and `OPENROUTER_MODEL` are optional and only tailor completion-evidence questions. 4. Render the Slack manifest with `TOFINISH_PUBLIC_BASE_URL=https://your-service.example npm run manifest`, inspect `slack-app-manifest.generated.json`, create or update your Slack app with it, and set its three Slack credentials privately in the host. Slack OAuth approval by a workspace administrator is unavoidable. 5. Configure the agent host privately with the service origin and API token, either as the complete `TOFINISH_URL` / `TOFINISH_API_TOKEN` environment pair or in an owner-only (mode 600) `~/.config/tofinish/client.json`. Never put either value in the skill archive, source repository, chat, or Slack message. 6. Run `node ~/.codex/skills/delegate-task/scripts/client.mjs connection` (or the equivalent Claude Code path). If it reports that Slack is not connected, run `install-link` and complete the browser approval. Configure follow-up settings explicitly; they begin disabled. Make a real assignment only after connection, recipient, and schedule have been verified. The service source is genericized for distribution. In particular, it has no default Slack workspace host: `EXPECTED_SLACK_HOST` is required for a self-hosted installation. ## Limits The shipped runtime is an internal, single-workspace pilot. It supports structured agent-created assignments, Slack task forms, durable SQLite state, and configured follow-ups. It does not provide a public multi-tenant SaaS signup, billing, Telegram, task-manager-card creation, arbitrary responsibility maps, or an agent that can read existing private credentials. Slack approval and a host’s own private configuration remain required.