Documentation

shipfleet.ai

Autonomous AI engineering fleet for any codebase. 50 agents, real-time visibility, cross-model review, closed-loop verification.

Installation

# npm (recommended)
npm install -g shipfleet

# pnpm
pnpm add -g shipfleet

# from source
git clone https://github.com/shipfleet/shipfleet
cd shipfleet && npm install && npm run build && npm link

Requirements

Node.js20+ required
Git2.x required
Claude Code CLInpm install -g @anthropic-ai/claude-code
gh CLIOptional — for PR creation. brew install gh

Initialization

Run shipfleet init in your project root. It auto-detects your language, framework, test runner, linter, and git remote.

cd ~/my-project
shipfleet init

# Or non-interactive (accept all defaults):
shipfleet init --yes

This creates a .shipfleet/ directory containing:

.shipfleet/config.jsonFleet configuration (no secrets — API keys stay in env vars)
.shipfleet/shipfleet.dbSQLite database (inbox, tasks, runs, reviews, verifications)
.shipfleet/inboxInbox file for ad-hoc tasks
.shipfleet/worktrees/Git worktrees for each session (auto-cleaned)
.shipfleet/heartbeat.jsonDaemon health check

The directory is automatically added to .gitignore.

Quick Start

# 1. Initialize
shipfleet init --yes

# 2. Start the dashboard + workers
shipfleet start

# 3. Add a task
shipfleet add "[high] fix the login redirect bug | users go to / instead of /dashboard"

# 4. Or spawn a one-off session
shipfleet spawn "fix the typo in README.md"

# 5. Open dashboard
open http://localhost:4747

Pipeline

Five stages, fully automated. Human approves the PR — that's it.

INGEST ──▶ TRIAGE ──▶ BUILD ──▶ REVIEW ──▶ VERIFY
every 15m    Haiku      Opus      Gemini     24h post
             score      worktree  + GPT-5    merge
             dedup      PR open   unbiased   re-queue

Sessions

Each session spawns a real claude --print process in an isolated git worktree. Output streams live to the dashboard via SSE. You can kill, redirect, or send messages at any time.

Cross-Model Review

After a PR opens, two independent reviews run:

SecurityGemini 2.5 Pro — OWASP checklist, injection, secrets, auth bypass, SSRF, prompt injection
BugsGPT-5 — logic errors, race conditions, null access, missing error handling, test gaps

Different model families = genuine diversity. Findings posted as PR comments. Critical findings block merge.

Verification Loop

24h after merge, re-checks the source. Sentry error still firing? GitHub issue still open? Regressions auto-re-queue at high priority.

Work Sources

ShipFleet discovers work automatically from multiple sources. Each source polls independently with signal-strength scoring and deduplication.

Sentry

Polls unresolved issues. Signal scored by: frequency, user count, severity level, recency.

# Required env vars:
SENTRY_AUTH_TOKEN=sntrys_...
SENTRY_ORG=my-org
SENTRY_PROJECT=my-project

GitHub Issues

Watches issues with configurable labels (default: shipfleet, auto, bug). Signal scored by: label priority, reactions, comments, recency.

GITHUB_TOKEN=ghp_...

GitLab Issues

Same workflow for GitLab repos. Polls issues by label, creates MRs.

GITLAB_TOKEN=glpat-...
GITLAB_PROJECT_ID=12345

Jira

Polls Jira issues by label. Works with Jira Cloud and Server. Syncs status back after merge.

JIRA_API_TOKEN=...
JIRA_HOST=mycompany.atlassian.net
JIRA_EMAIL=dev@company.com

Linear

Watches Linear issues with configurable labels. Priority field + estimate + cycle position drive signal scoring.

LINEAR_API_KEY=lin_api_...

PagerDuty

Webhook on incident create. Urgency × service criticality drives priority. Automatically does root-cause analysis + proposes fix.

PAGERDUTY_API_KEY=...

Slack

Mention @shipfleet in a channel or react with 🚢 on any message. The message becomes a task, the fix becomes a PR.

SLACK_BOT_TOKEN=xoxb-...
SHIPFLEET_SLACK_CHANNEL=#engineering

CI / CD

Detects failing runs on GitHub Actions, CircleCI, or Jenkins. Reads logs, attempts fix, re-runs pipeline.

# GitHub Actions — uses GITHUB_TOKEN (already set)
# CircleCI:
CIRCLECI_TOKEN=...
# Jenkins:
JENKINS_URL=https://jenkins.company.com
JENKINS_USER=admin
JENKINS_API_TOKEN=...

Monitoring (Datadog, Bugsnag, Rollbar, New Relic)

Error spikes, latency regressions, and anomaly alerts from your APM become tasks automatically.

# Datadog
DATADOG_API_KEY=...
DATADOG_APP_KEY=...

# Bugsnag
BUGSNAG_API_KEY=...
BUGSNAG_PROJECT_ID=...

# Rollbar
ROLLBAR_API_KEY=...
ROLLBAR_PROJECT_ID=...

# New Relic
NEW_RELIC_API_KEY=...

Configuration

All settings live in .shipfleet/config.json. API keys are never stored — only "env" markers.

{
  "project": {
    "name": "my-app",
    "language": "typescript",
    "framework": "nextjs",
    "test_command": "pnpm vitest run",
    "typecheck_command": "npx tsc --noEmit",
    "protected_files": ["src/auth/core.ts"],
    "protected_branches": ["main", "production"]
  },
  "fleet": {
    "max_workers": 3,
    "max_cost_per_task_usd": 2.0,
    "max_cost_per_day_usd": 20.0,
    "build_model": "claude-opus-4-6",
    "review_security_model": "gemini-2.5-pro",
    "review_bugs_model": "gpt-5"
  },
  "sources": {
    "sentry": true,
    "github_issues": true,
    "github_issue_labels": ["shipfleet", "auto"],
    "gitlab": false,
    "jira": false,
    "linear": false,
    "pagerduty": false,
    "slack": false,
    "inbox_file": true
  }
}

Environment Variables

VariableRequiredPurpose
ANTHROPIC_API_KEYYesClaude Code sessions (build agent)
GITHUB_TOKENRecommendedPR creation, GitHub Issues ingestion, GitHub Actions
GOOGLE_AI_API_KEYOptionalGemini security review
OPENAI_API_KEYOptionalGPT-5 bug review
SENTRY_AUTH_TOKENOptionalSentry error ingestion
GITLAB_TOKENOptionalGitLab Issues + MRs
JIRA_API_TOKENOptionalJira ticket ingestion
LINEAR_API_KEYOptionalLinear issue ingestion
PAGERDUTY_API_KEYOptionalPagerDuty incident webhooks
SLACK_BOT_TOKENOptionalSlack @shipfleet mentions
DATADOG_API_KEYOptionalDatadog monitor alerts
BUGSNAG_API_KEYOptionalBugsnag error ingestion
ROLLBAR_API_KEYOptionalRollbar error ingestion
NEW_RELIC_API_KEYOptionalNew Relic APM alerts
CIRCLECI_TOKENOptionalCircleCI failure detection
JENKINS_URL + JENKINS_API_TOKENOptionalJenkins failure detection

Project Detection

shipfleet init auto-detects:

LanguageFrameworksTest CommandDetection
TypeScript/JSNext.js, Remix, React, Vue, Express, Fastify, Svelte, Nuxtvitest, jest, mochatsconfig.json + package.json deps
PythonDjango, Flask, FastAPIpytestpyproject.toml / requirements.txt
Gogo test ./...go.mod
Rustcargo testCargo.toml
JavaMaven, Gradlemvn/gradle testpom.xml / build.gradle
RubyRailsbundle exec rspecGemfile + config/routes.rb

Safety Guards

Every autonomous action has a corresponding safety guard. 61 tests verify enforcement.

$
Cost caps$2/task, $20/day, 25%-of-daily per hour. Workers pause at limit.
🔑
Secrets scanning12 patterns (AWS, GitHub, Anthropic, Stripe, JWT, private keys, DB URLs, Sentry DSN). Blocks git push if detected.
×
Protected filesUser-configured + 12 always-protected (.env, credentials.json, .pem, id_rsa, service accounts). Pre-flight + diff scan.
!
28 risky keywordsdrop table, rm -rf, eval(), git reset --hard, rejectUnauthorized:false, ngrok, disable auth, force push.
Loop detection3+ failures or 2+ regressions → escalated to human. No infinite retries.
Branch protectionNever pushes to main/production. Enforced in worker and session manager.
Pre-merge gateRequires: cross-model review, security ≥70, quality ≥60, no secrets, no protected files, diff <5000 lines.
👁
Output sanitizationAll SSE streams strip secrets with [REDACTED]. Never leaks to browser.
#
Session limitsEnforces max_workers cap. Rejects spawns over the limit.
📏
Diff size limitsBlocks diffs over 5,000 lines or 500KB.
Stale cleanupUnreviewed PRs auto-close after 7 days.
TimeoutEach session killed after 10 minutes.
🔒
Localhost-onlyAPI rejects non-localhost requests. Rate limited 120 req/min.
📋
Audit logEvery block, escalation, secret detection, rate limit logged to DB.

Secrets Scanning — Patterns

PatternExample
AWS Access KeyAKIA... (20 uppercase chars)
AWS Secret Keyaws_secret = "..." (40 chars)
GitHub Tokenghp_..., gho_..., ghu_...
Anthropic Keysk-ant-...
OpenAI Keysk-...T3BlbkFJ
Slack Tokenxoxb-..., xoxp-...
Stripe Keysk_live_..., rk_test_...
Private Key-----BEGIN RSA PRIVATE KEY-----
Generic Secretpassword = "...", api_key: "..."
JWTeyJ...eyJ...sig (3 base64 segments)
Sentry DSNhttps://hex@sentry.io
Database URLpostgres://user:pass@host

Audit Log

All security events are logged to .shipfleet/shipfleet.db in the system_log table with component = 'audit'. Events include:

secrets-blockedPush blocked due to secrets in diff
protected-file-blockedProtected file modification detected
merge-blockedPre-merge gate failed (with reasons)
bad-fix-loop-escalatedTask escalated after repeated failures
stale-pr-closedPR auto-closed after 7 days
rate-limitedAPI rate limit exceeded
remote-access-blockedNon-localhost API access rejected
hourly-cost-burstHourly cost exceeds 25% of daily cap

CLI Commands

USAGE
  shipfleet <command> [options]

SETUP
  init [--yes]              Detect project, create .shipfleet/
  start                    Launch dashboard + workers on :4747
  status                   Show fleet status

WORK
  spawn "title" [desc]     Spawn a one-off session
  add "title | desc"       Add task to inbox queue
  list [status]            List tasks by status
  stuck                    Show tasks needing attention

ACTIONS
  approve <id>            Approve a flagged task
  reject <id>             Reject and close a task
  retry <id>              Reset + re-queue

DAEMON
  daemon install           Run 24/7 as background service
  daemon stop              Stop the service
  daemon logs              Tail daemon output

API Endpoints

All endpoints are on http://localhost:4747. Localhost-only, rate-limited.

MethodPathDescription
GET/api/configCurrent fleet configuration
POST/api/configUpdate configuration
GET/api/detectRe-run project detection
GET/api/setup/statusReadiness checks
GET/api/sessionsList all sessions
GET/api/sessions/:idSession detail + output
GET/api/sessions/:id/streamSSE — live output stream
GET/api/sessions/all/streamSSE — all sessions
POST/api/sessions/spawnSpawn a new session
POST/api/sessions/:id/killKill a running session
POST/api/sessions/:id/sendSend input to session stdin
POST/api/sessions/:id/prPush branch + create PR
POST/api/sessions/:id/cleanupRemove worktree
GET/api/statsFleet statistics

Daemon Mode

Run shipfleet 24/7 as a background service that auto-starts on login.

# Install as LaunchAgent (macOS) / systemd (Linux)
shipfleet daemon install

# Check status
shipfleet daemon status

# View logs
shipfleet daemon logs

# Stop
shipfleet daemon stop

The daemon writes a heartbeat to .shipfleet/heartbeat.json every 60 seconds. Logs go to .shipfleet/daemon-stdout.log and .shipfleet/daemon-stderr.log.

shipfleet.ai · MIT license · source · homepage