Shipwright Harness

Configuration Reference

Single authoritative reference for all Shipwright configuration options, organized by scope: Plugin Config, Agent Config, and Policy Config.

Precedence

When the same option can be set multiple ways, resolution order is:

env var  >  built-in default

Env vars are the only configuration path. All Shipwright configuration is supplied via env vars — injected by the admin service for managed agents, or set in the local environment for direct plugin use.

Plugin Config

Configuration for the Shipwright Claude Code plugin (plugins/shipwright/). These options control workspace discovery, task-store backend, and GitHub CLI integration.

Env vars

NameTypeDefaultDescription
GH_CMDstringghOverride the gh CLI executable. Useful in environments where gh is installed to a non-default path.
AGENT_HOMEstring/data/agent-homePersistent storage root for workspace files, mise caches, and ~/.claude.
WORKSPACE_PATHstring—Direct workspace path override. Takes precedence over AGENT_HOME-based discovery when set.
SHIPWRIGHT_TASK_STORE_URLstring—Base URL of the Shipwright task-store service. Injected into the agent Deployment by the admin provisioner; agents use this to authenticate with the task-store API when claiming tasks or updating status.
SHIPWRIGHT_TASK_STORE_TOKENstring—Bearer token for task-store API access. Minted per-agent by the admin provisioner; used by agents and plugin scripts to claim tasks, update status, and query the task queue. Env-var-only (secret).

Agent Config

Configuration for the Shipwright agent runtime (agent/ and admin/). All options are env vars — there is no file-based fallback for agent config. Secrets must be supplied as env vars and are never stored in config files.

Claude / Anthropic

NameTypeDefaultDescription
ANTHROPIC_MODELstringclaude-sonnet-5-5Claude model used for each agent invocation.
ANTHROPIC_FALLBACK_MODELstring—Fallback model if the primary is unavailable.
ANTHROPIC_EFFORT_LEVELstring—Effort/thinking level passed to Claude (e.g. extended, auto, none).
SHIPWRIGHT_CLAUDE_TIMEOUT_MSnumber3600000Hard ceiling timeout in milliseconds for a single claude -p session spawned by the agent runner — a backstop, not the primary timeout (see SHIPWRIGHT_CLAUDE_IDLE_TIMEOUT_MS). Fires only for a continuously-active-but-never-converging session. Falls back to the default when unset or not a positive integer. When raising this, raise SHIPWRIGHT_TASK_STORE_CLAIM_TTL_MS in step (keep the ~5 min buffer) or the stale-claim reaper re-dispatches a duplicate run.
SHIPWRIGHT_CLAUDE_IDLE_TIMEOUT_MSnumber1500000Idle-reset timeout in milliseconds for a single claude -p session — the primary timeout in practice. Cleared and restarted on every stdout line; fires (ClaudeTimeoutError, reason: idle) only when the session goes silent this long. Falls back to the default when unset or not a positive integer.
ANTHROPIC_API_KEYstring—Anthropic API key. Env-var-only (secret).
CLAUDE_CODE_OAUTH_TOKENstring—Claude Code OAuth token (alternative to ANTHROPIC_API_KEY). Env-var-only (secret).

Slack

All Slack vars are env-var-only (secrets). The agent does not function as a Slack bot without them.

NameTypeDefaultDescription
SLACK_BOT_TOKENstringrequired for SlackSlack bot user OAuth token (xoxb-...).
SLACK_APP_TOKENstringrequired for SlackSlack app-level token for Socket Mode (xapp-...).
SLACK_SIGNING_SECRETstringrequired for SlackUsed to verify incoming Slack request signatures.
SLACK_ADMIN_TOKENstring—Optional admin-level token for privileged Slack operations.
SLACK_ALERT_CHANNELstring—Slack channel ID to post system alerts (e.g. startup errors).
SLACK_OWNER_USERstring—Slack user ID of the agent owner, used for DM fallback.

GitHub

Provide either the GitHub App vars (recommended) or GH_TOKEN (PAT). App auth is used when the App env vars are present; GH_TOKEN is the fallback.

NameTypeDefaultDescription
GH_APP_IDstringrequired for App authGitHub App ID (integer as string). Env-var-only (secret).
GH_APP_INSTALLATION_IDstringrequired for App authInstallation ID for the target org/repo. Env-var-only (secret).
GH_APP_PRIVATE_KEYstringrequired for App authPEM private key for the GitHub App. Env-var-only (secret).
GH_TOKENstring—Personal Access Token. Used only when GitHub App vars are absent. Env-var-only (secret).

Shipwright platform

NameTypeDefaultDescription
SHIPWRIGHT_API_URLstring—Base URL of the Shipwright admin service, used by the agent entrypoint to fetch config at startup.
SHIPWRIGHT_AGENT_IDstring—The agent's ID in the Shipwright platform. Also settable via --agent-id CLI flag.
SHIPWRIGHT_AGENT_API_KEYstring—Bearer token for the config fetch at startup (/agents/:id/config and /agents/:id/crons). Also settable via --api-key CLI flag.

Server

NameTypeDefaultDescription
PORTnumber3000Hono server port for the admin service (admin/src/main.ts).
SHIPWRIGHT_HEALTH_PORTnumber3459Agent health server port for the K8s liveness probe. Served in-process by entrypoint-main.ts on a dedicated port.
NODE_ENVstring—Runtime environment. Set to production to enforce production-safety guards.

Metrics & Admin service

NameTypeDefaultDescription
DATABASE_URL_SHIPWRIGHT_ADMINstringrequiredPostgres connection string for the admin service schema.
SHIPWRIGHT_SESSION_SECRETstring—HS256 secret for signing session cookies. Used by the metrics service (vitals_session cookie) and the admin service (admin_session cookie).
SHIPWRIGHT_ENCRYPTION_KEYstring—64-char hex (32 bytes) for AES-256-GCM encryption of secrets at rest. If unset, secrets are stored in plain text.
SHIPWRIGHT_ADMIN_ALLOWED_EMAILSstring—Comma-separated list of Google email addresses permitted to log in to the admin UI.
SHIPWRIGHT_ADMIN_APP_BASE_URLstringhttp://localhost:{PORT}Public base URL of the admin service, used to construct the Google OAuth redirect URI.
GOOGLE_CLIENT_IDstring—Google OAuth 2.0 client ID. Required for the admin UI login flow.
GOOGLE_CLIENT_SECRETstring—Google OAuth 2.0 client secret. Required for the admin UI login flow.

Task store service

NameTypeDefaultDescription
DATABASE_URL_SHIPWRIGHT_TASK_STOREstringrequiredPostgres connection string for the task-store service. Must be a separate database from the admin service — the schema forbids sharing. Read by @shipwright/task-store and @shipwright/agent.
SHIPWRIGHT_TASK_STORE_URLstring—Base URL of the Shipwright task-store service (e.g. http://task-store:3000 or https://tasks.example.com). When set alongside SHIPWRIGHT_TASK_STORE_ADMIN_TOKEN, the admin service wires per-agent tokens during provisioning and injects the URL + token into agent Deployment env vars. Agents use these to authenticate with the task-store API when claiming tasks or updating status.
SHIPWRIGHT_TASK_STORE_TOKENstring—Bearer token for task-store API access. Minted per-agent by the admin provisioner and stored in the agent Secret; injected into the agent Deployment via SHIPWRIGHT_TASK_STORE_TOKEN env var. Used by agents to claim tasks, update status, and query the task queue. Env-var-only (secret).
SHIPWRIGHT_TASK_STORE_ADMIN_TOKENstring—Bearer token for admin-side task-store token minting. Required (alongside SHIPWRIGHT_TASK_STORE_URL) to enable per-agent provisioning at agent-creation time. Env-var-only (secret).
SHIPWRIGHT_TASK_STORE_CLAIM_TTL_MSnumber3900000Milliseconds a claim (Task or PR review/patch/deploy) remains valid without a heartbeat. When an agent's last heartbeat exceeds this TTL, the claim will be abandoned and the record eligible for re-claiming by another agent. A single unified TTL covers both Task claims (/shipwright:dev-task) and PR claims — 3900000ms (65 min) is the 1-hour claude -p hard ceiling timeout plus a 5-minute buffer.
SHIPWRIGHT_TASK_STORE_AGENTS_URLstring—Base URL of the Shipwright agents service. When set alongside SHIPWRIGHT_TASK_STORE_AGENTS_API_KEY, the task-store service uses it to resolve agent tokens to their scoped repos. Optional — not required when agents do not need repo-scoping.
SHIPWRIGHT_TASK_STORE_AGENTS_API_KEYstring—Bearer token for the task-store service to call the agents service. Required alongside SHIPWRIGHT_TASK_STORE_AGENTS_URL to enable scope resolution. Env-var-only (secret).

Admin and metrics services

Cross-service vars read by the admin service and metrics service (not the task-store).

NameTypeDefaultDescription
SHIPWRIGHT_ADMIN_PUBLIC_REPOstring—Repository slug (format: org/repo) scoped for the public read-only task board. When set, GET /public/tasks displays tasks for this repo only, unauthenticated. Optional — omit to disable the public board.
SHIPWRIGHT_ADMIN_TZstringAmerica/Los_AngelesIANA timezone name (e.g. America/New_York) for date/time display in the admin UI. When unset, defaults to America/Los_Angeles.
METRICS_DASHBOARD_URLstring/dashboardURL for the Metrics toolbar link in the admin UI. Defaults to /dashboard (same-host relative path). Set to an absolute URL when the metrics service runs on a different host or port.
METRICS_ADMIN_APP_URLstring""Base URL of the admin console for the metrics dashboard toolbar Agents/Tasks/PRs links. Defaults to empty (same-host relative links). Set to an absolute URL when the admin console runs on a different origin than the metrics dashboard.

Agent provisioning (Kubernetes)

Controls how the admin service provisions the Kubernetes workload backing each agent at creation time. When provisioning is disabled (the default), create/delete only write the database row — no cluster is required.

NameTypeDefaultDescription
SHIPWRIGHT_K8S_PROVISIONINGstring—Set to enabled to provision a real Kubernetes PersistentVolumeClaim + Secret + Deployment per agent via KubernetesAgentProvisioner. Any other value (or unset) selects the no-op provisioner, preserving DB-only create/delete behavior.
SHIPWRIGHT_K8S_NAMESPACEstring—Target namespace for per-agent PersistentVolumeClaim, Secret, and Deployment. When unset, falls back to the pod's own release namespace. Only read when provisioning is enabled.
SHIPWRIGHT_AGENT_IMAGEstring—Agent container image (without tag) used for the provisioned Deployment. Only read when provisioning is enabled.
SHIPWRIGHT_AGENT_IMAGE_TAGstringlatestImage tag joined as image:tag for the provisioned Deployment. Only read when provisioning is enabled.
SHIPWRIGHT_AGENT_REPLICASnumber1Replica count for the provisioned agent Deployment. Only read when provisioning is enabled.
SHIPWRIGHT_AGENT_PVC_STORAGE_GInumber40Storage size in Gi for the per-agent persistent home directory (PVC). Only read when provisioning is enabled. Must be large enough to hold mise caches and workspace files across pod restarts.
SHIPWRIGHT_AGENT_PVC_NAME_TEMPLATEstring—Template for deriving the PVC name from the agent's human-readable name. Use {name} as the placeholder. When unset, PVCs are named {sanitizedAgentId}-home. Only read when provisioning is enabled.

Workspace and tooling

NameTypeDefaultDescription
AGENT_HOMEstring/data/agent-homePersistent storage root. Mount a PVC here in Kubernetes so mise caches, workspace files, and ~/.claude survive pod restarts.
MISE_DATA_DIRstring<AGENT_HOME>/.miseOverride the mise data directory. Auto-derived from AGENT_HOME.
MISE_CACHE_DIRstring<AGENT_HOME>/.mise/cacheOverride the mise cache directory.
XDG_CACHE_HOMEstring<AGENT_HOME>/.cacheOverride the XDG cache directory.
XDG_DATA_HOMEstring$HOME/.local/shareOverride the XDG data directory. Used to locate the mise data dir ($XDG_DATA_HOME/mise) when seeding a fresh PVC.
SHIPWRIGHT_STARTUP_TIMEOUT_MSnumber180000Maximum milliseconds the entrypoint startup sequence may take before the agent exits. Override to a lower value (e.g. 10000) in dev for faster fail-fast feedback.
AGENT_ALLOWED_TOOLSstring (JSON array)—JSON array of allowed Claude tool patterns. Set by the admin service config sync; do not set manually in production.

Voice

Optional. When unset, voice transcription and synthesis are disabled.

NameTypeDefaultDescription
GROQ_API_KEYstring—Groq API key for voice processing. Env-var-only (secret).
ELEVENLABS_API_KEYstring—ElevenLabs API key for speech synthesis. Env-var-only (secret).
ELEVENLABS_VOICE_IDstring—ElevenLabs voice ID to use for synthesis.
WHISPER_SERVICE_URLstring—URL of a Whisper transcription service for voice input.

Dev-only

Do not set these in production.

NameTypeDefaultDescription
ADMIN_DEV_AUTHboolfalseEnables GET /admin/dev-login (bypasses Google OAuth, mints a dev session). Blocked when NODE_ENV=production.
METRICS_DASHBOARD_DEV_AUTHboolfalseBypasses /dashboard session auth and /metrics/* API auth for local dev. Must not be enabled in production — exits with an error if NODE_ENV=production.
TASK_STORE_SEED_ADMIN_TOKENstring—Bootstrap admin token seeded into the task-store on startup. Used only in local dev (task stack) to provision a bootstrapped admin token without manual token creation. Ignored if empty.

Policy Config

Agent behavior is controlled by per-agent policy settings stored in the Shipwright database. Edit them in the agent’s settings in the admin UI (or via the agent API); the agent picks up changes on its next config sync, with no cron change or restart.

Fields

FieldTypeDefaultDescription
autoPostReviewsbooltruePost review comments to GitHub automatically without manual approval. Set to false to stage reviews locally for owner approval instead.
allowSelfReviewboolfalseSelf-review is excluded by default. Set to true to allow the agent to review its own PRs instead of requiring a human reviewer on agent-authored PRs.
minConfidencenumber75Minimum confidence score (0–100) for a finding to be included in a review.
maxFindingsnumber5Maximum number of findings to include in a single review.
cleanupMergedWorktreesbooltrueAutomatically remove worktrees for merged branches.
cleanupAfterDaysnumber14Age threshold (days) before a merged-branch worktree is eligible for cleanup.

See also

  • Task Store API — complete HTTP API reference for /tasks: endpoints, task schema, status lifecycle, and curl examples.
  • PRs API — HTTP API reference for /prs: PR review tracking, reviewState lifecycle, heartbeat TTL, and curl examples.
  • architecture.md — the four-artifact A→B→C→D design.
  • agent.md — Shipwright agent runtime, admin CRUD APIs, and data model.
  • quickstart.md — how to get the full dev stack running locally.

Finding Shipwright useful? Star us on GitHub ↗