Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 5 additions & 4 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,11 @@
## Unreleased

- Add Crabfleet session supervision metadata, owner/session tree listing, transcript retrieval, PTY messaging, and summary updates for Codex-spawned Codex sessions.
- Fix GitHub OAuth login after the canonical host move by honoring an explicit registered callback URL.
- Redesign Fleet as an operational command view with real readiness data, compact connection paths, clearer operator groups, and denser session cards.
- De-duplicate interactive lifecycle, status, terminal-ready, log URL, icon, and copy-command behavior across the app.
- Fix GitHub OAuth login after the canonical host move by honoring the registered `crabfleet.openclaw.ai` callback URL.
- Add the Crabfleet v2 fleet-control spec, redacted fleet registry API, and dashboard summary for visible Codex crabboxes.
- Move the OpenClaw app/API canonical URL to `clawfleet.openclaw.ai`, keep legacy app hosts redirecting there, and reserve `clawfleet.ai` for the product page.
- Make `crabfleet.openclaw.ai` the OpenClaw app/API canonical URL, redirect old OpenClaw aliases there, and keep `crabfleet.ai` independent as the public product site.
- Route the built-in interactive provision hook in-process and default new sessions to Cloudflare Sandbox so production creates usable Codex terminals without a crabbox adapter.
- Keep Cloudflare Sandbox model and GitHub credentials in the Worker path, add DO-backed sandbox credential/checkpoint state, and add CLI lifecycle commands for doctor/status/stop/checkpoint/restore.
- Show failed and expired Codex sessions as stable log replays instead of remounting Ghostty terminals.
Expand All @@ -15,8 +17,7 @@
- Split Fleet and Board into separate app pages, with Fleet as the default grouped view of every visible crabbox by person.
- Tighten the login SSH command width for `crabd.sh` and tuck bootstrap-token login behind a recovery disclosure.
- Redesign the Crabfleet logo and favicon around a single fleet node-grid mark, and serve a real 1200×630 social card instead of stretching the 96px logo.
- Serve the app/API on `crabfleet.ai` and redirect the old `crabfleet.ai` host.
- Route `crabfleet.ai` to the Crabbox Worker and move SSH onboarding defaults to `crabd.sh`, with deploy-time domain enforcement.
- Move SSH onboarding defaults to `crabd.sh`, with deploy-time domain enforcement.

## 0.1.0 - 2026-05-24

Expand Down
21 changes: 11 additions & 10 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

**Mission control for Agent runs.**

Crabfleet gives OpenClaw maintainers a fleet dashboard where every Codex crabbox is visible by operator, repo, terminal, and WebVNC state. The OpenClaw app/API canonical URL is `https://clawfleet.openclaw.ai`; `https://clawfleet.ai` is reserved for the public product page.
Crabfleet gives OpenClaw maintainers a fleet dashboard where every Codex crabbox is visible by operator, repo, terminal, and WebVNC state. The OpenClaw app/API canonical URL is `https://crabfleet.openclaw.ai`; `https://crabfleet.ai` is the public product site.

## What It Does

Expand Down Expand Up @@ -125,7 +125,7 @@ merge:
### Prerequisites

- Cloudflare account
- `clawfleet.openclaw.ai` route in Cloudflare; legacy app hosts redirect here
- `crabfleet.openclaw.ai` route in Cloudflare; legacy OpenClaw app hosts redirect here
- GitHub OAuth app (optional but recommended)
- Bootstrap token secret

Expand All @@ -134,10 +134,11 @@ merge:
Pushes to `main` run `.github/workflows/deploy-worker.yml`, which checks, tests, builds,
applies remote D1 migrations, and deploys the Worker. Configure the repository secret
`CLOUDFLARE_API_TOKEN` with permissions for Workers deploys and D1 migrations.
`clawfleet.openclaw.ai` and `crabd.sh` DNS/route convergence is handled by
`scripts/ensure-cloudflare-domains.mjs`; set `CLOUDFLARE_DNS_API_TOKEN` when CI should
manage those records. Without that DNS-scoped token, CI skips domain convergence and
deploys to the already configured route.
`crabfleet.ai` product routing, `crabfleet.openclaw.ai`, and `crabd.sh` DNS/route
convergence is handled by `scripts/ensure-cloudflare-domains.mjs`; set
`CLOUDFLARE_DNS_API_TOKEN` when CI should manage those records. Without that
DNS-scoped token, CI skips domain convergence. The app Worker still proxies the generic
product site for `crabfleet.ai` as a defensive fallback, never the authenticated app.

Manual deploy is still available:

Expand Down Expand Up @@ -188,10 +189,10 @@ The Crabbox namespace cutover intentionally has no old-name compatibility. Exist
### Verify Deployment

```bash
curl -I https://clawfleet.openclaw.ai/healthz
curl -I https://crabfleet.openclaw.ai/healthz
# Should return: 200 OK

curl https://clawfleet.openclaw.ai/docs/spec
curl https://crabfleet.openclaw.ai/docs/spec
# Should return: HTML spec document
```

Expand Down Expand Up @@ -241,7 +242,7 @@ The Worker exposes an internal SSH onboarding API guarded by `CRABFLEET_SSH_GATE
Run the Go gateway next to a host that can accept raw SSH:

```bash
CRABFLEET_API_URL=https://clawfleet.openclaw.ai \
CRABFLEET_API_URL=https://crabfleet.openclaw.ai \
CRABFLEET_SSH_GATEWAY_TOKEN=... \
CRABFLEET_SSH_HOST_KEY=/var/lib/crabfleet/ssh_host_ed25519_key \
CRABFLEET_SSH_ADDR=:2222 \
Expand Down Expand Up @@ -287,7 +288,7 @@ The release workflow builds macOS, Linux, and Windows archives, then updates `op
OpenClaw can create repo-ready crabboxes for Discord-triggered work through the internal service endpoint:

```bash
curl -fsS https://clawfleet.openclaw.ai/api/openclaw/crabboxes \
curl -fsS https://crabfleet.openclaw.ai/api/openclaw/crabboxes \
-H "authorization: Bearer $CRABBOX_OPENCLAW_TOKEN" \
-H "content-type: application/json" \
-d '{"owner":"@steipete","repo":"openclaw/crabfleet","prompt":"prep the meeting follow-up"}'
Expand Down
4 changes: 2 additions & 2 deletions cmd/crabfleet/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,13 +20,13 @@ import (
"github.com/coder/websocket"
)

const defaultAPIURL = "https://clawfleet.openclaw.ai"
const defaultAPIURL = "https://crabfleet.openclaw.ai"
const defaultSSHHost = "crabd.sh"

var version = "dev"

type cli struct {
API string `help:"Crabfleet API URL." default:"https://clawfleet.openclaw.ai" env:"CRABFLEET_API_URL"`
API string `help:"Crabfleet API URL." default:"https://crabfleet.openclaw.ai" env:"CRABFLEET_API_URL"`
SSHHost string `help:"Crabfleet SSH host." default:"crabd.sh" env:"CRABFLEET_SSH_HOST"`
Token string `help:"Internal API token." env:"CRABFLEET_SSH_GATEWAY_TOKEN"`
Fingerprint string `help:"Linked SSH key fingerprint." env:"CRABFLEET_SSH_FINGERPRINT"`
Expand Down
6 changes: 3 additions & 3 deletions docs/_layouts/default.html
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,13 @@
<meta property="og:description" content="{{ page.description | default: site.description }}" />
<meta property="og:type" content="website" />
<meta property="og:url" content="https://docs.crabfleet.ai{{ page.url }}" />
<meta property="og:image" content="https://clawfleet.openclaw.ai/crabfleet-og.png" />
<meta property="og:image" content="https://crabfleet.openclaw.ai/crabfleet-og.png" />
<meta property="og:image:width" content="1200" />
<meta property="og:image:height" content="630" />
<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:title" content="{{ page.title }} | {{ site.title }}" />
<meta name="twitter:description" content="{{ page.description | default: site.description }}" />
<meta name="twitter:image" content="https://clawfleet.openclaw.ai/crabfleet-og.png" />
<meta name="twitter:image" content="https://crabfleet.openclaw.ai/crabfleet-og.png" />
<link rel="icon" type="image/png" href="/crabbox-logo.png" />
<style>
:root {
Expand Down Expand Up @@ -226,7 +226,7 @@ <h2>Features</h2>
<h2>Reference</h2>
<a href="{{ '/api/' | relative_url }}">API</a>
<a href="{{ '/spec/' | relative_url }}">Spec</a>
<a href="https://clawfleet.openclaw.ai/app/">App</a>
<a href="https://crabfleet.openclaw.ai/app/">App</a>
</nav>
</aside>
<main>
Expand Down
2 changes: 1 addition & 1 deletion docs/admin.md
Original file line number Diff line number Diff line change
Expand Up @@ -319,7 +319,7 @@ Recommended for production.
**Setup:**

1. Create GitHub OAuth app in your org
2. Callback URL: the Worker `GITHUB_REDIRECT_URI` value, currently `https://crabfleet.ai/auth/github/callback`
2. Callback URL: the Worker `GITHUB_REDIRECT_URI` value, currently `https://crabfleet.openclaw.ai/auth/github/callback`
3. Scopes: `read:user`, `read:org`
4. Add secrets to Cloudflare Worker:
- `GITHUB_CLIENT_ID`
Expand Down
2 changes: 1 addition & 1 deletion docs/api.md
Original file line number Diff line number Diff line change
Expand Up @@ -362,7 +362,7 @@ Response:
```json
{
"session": {},
"shareUrl": "https://clawfleet.openclaw.ai/app/sessions/IS-105?token=..."
"shareUrl": "https://crabfleet.openclaw.ai/app/sessions/IS-105?token=..."
}
```

Expand Down
2 changes: 1 addition & 1 deletion docs/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ crabfleet new --repo openclaw/crabfleet "fix the failing check"
crabfleet vnc <session-id>
```

The web app at [clawfleet.openclaw.ai/app](https://clawfleet.openclaw.ai/app/) exposes the same control plane: GitHub OAuth, repo-gated cards, runtime policy, live session tiles, WebVNC links, and admin allowlists.
The web app at [crabfleet.openclaw.ai/app](https://crabfleet.openclaw.ai/app/) exposes the same control plane: GitHub OAuth, repo-gated cards, runtime policy, live session tiles, WebVNC links, and admin allowlists.

## What Crabfleet Does

Expand Down
4 changes: 2 additions & 2 deletions docs/quickstart.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,11 +13,11 @@ This gets you from login to a real D1-backed crabbox, card, and run attempt.

- OpenClaw GitHub org membership.
- GitHub OAuth configured for browser access, or an SSH key to link through `crabd.sh`.
- Access to `https://clawfleet.openclaw.ai/app/`.
- Access to `https://crabfleet.openclaw.ai/app/`.

## 1. Log In

Open `https://clawfleet.openclaw.ai/app/`.
Open `https://crabfleet.openclaw.ai/app/`.

- Use GitHub OAuth if configured.
- Use `ssh link@crabd.sh` when you want terminal-first onboarding.
Expand Down
26 changes: 13 additions & 13 deletions docs/spec-v2.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@

Status: implementation plan plus shipped v2 slice.

Canonical app/API URL: <https://clawfleet.openclaw.ai>
Canonical app/API URL: <https://crabfleet.openclaw.ai>

Product page URL: <https://clawfleet.ai>
Product page URL: <https://crabfleet.ai>

## Goal

Expand Down Expand Up @@ -49,8 +49,8 @@ Fleet state shape:

```json
{
"canonicalUrl": "https://clawfleet.openclaw.ai",
"productUrl": "https://clawfleet.ai",
"canonicalUrl": "https://crabfleet.openclaw.ai",
"productUrl": "https://crabfleet.ai",
"generatedAt": 1770000000000,
"registryAvailable": true,
"egress": {
Expand Down Expand Up @@ -233,10 +233,10 @@ Local result:
- Landed: `72f205b`.
- Deploy workflow: `deploy-worker` run `26694996052` passed.
- Pages workflow: run `26694996080` passed.
- Live smoke: `https://clawfleet.openclaw.ai/healthz` returned `200`.
- Live smoke: `https://clawfleet.openclaw.ai/docs/spec-v2` returned this spec.
- Live smoke: unauthenticated `https://clawfleet.openclaw.ai/api/fleet` returned `401`.
- Product split: `https://clawfleet.ai/` stayed the product-page redirect shell.
- Live smoke: `https://crabfleet.openclaw.ai/healthz` returned `200`.
- Live smoke: `https://crabfleet.openclaw.ai/docs/spec-v2` returned this spec.
- Live smoke: unauthenticated `https://crabfleet.openclaw.ai/api/fleet` returned `401`.
- Product split: `https://crabfleet.ai/` stayed independent as the product-page host.

Autoreview:

Expand All @@ -254,11 +254,11 @@ PR:
Deploy:

- Confirm Worker deploy workflow for merged commit.
- Confirm `https://clawfleet.openclaw.ai/healthz` returns `200`.
- Confirm `https://clawfleet.openclaw.ai/docs/spec-v2` returns HTML.
- Confirm `https://clawfleet.openclaw.ai/docs/spec-v2.md` returns Markdown.
- Confirm unauthenticated `https://clawfleet.openclaw.ai/api/fleet` is rejected.
- Confirm `https://clawfleet.ai` stays product-page host, not the app/API host.
- Confirm `https://crabfleet.openclaw.ai/healthz` returns `200`.
- Confirm `https://crabfleet.openclaw.ai/docs/spec-v2` returns HTML.
- Confirm `https://crabfleet.openclaw.ai/docs/spec-v2.md` returns Markdown.
- Confirm unauthenticated `https://crabfleet.openclaw.ai/api/fleet` is rejected.
- Confirm `https://crabfleet.ai` stays product-page host, not the app/API host.

## Future Work

Expand Down
8 changes: 4 additions & 4 deletions docs/spec.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ Crabfleet is a Cloudflare-native control plane for running Codex crabboxes in cl
## Decisions

- Product name: Crabfleet.
- Domains: `clawfleet.openclaw.ai` for the OpenClaw app/API/OAuth, `clawfleet.ai` for the public product page, and `crabd.sh` for SSH/install/bootstrap.
- Domains: `crabfleet.openclaw.ai` for the OpenClaw app/API/OAuth, `crabfleet.ai` for the public product page, and `crabd.sh` for SSH/install/bootstrap.
- Primary object: card.
- UI direction: Linear-like, minimal, dense, subtle crustacean branding.
- Access: OpenClaw GitHub org plus admin-managed allowlists for users/teams and repos.
Expand Down Expand Up @@ -724,7 +724,7 @@ Picker behavior:

Target domain:

- `https://clawfleet.openclaw.ai`
- `https://crabfleet.openclaw.ai`

Current DNS expectation:

Expand All @@ -749,8 +749,8 @@ Initial deployable artifact:
Required deploy checks:

- `npx wrangler whoami` shows expected Cloudflare account.
- `clawfleet.openclaw.ai` is routed to deployed Worker.
- `curl -I https://clawfleet.openclaw.ai/healthz` returns 200.
- `crabfleet.openclaw.ai` is routed to deployed Worker.
- `curl -I https://crabfleet.openclaw.ai/healthz` returns 200.
- `/docs/spec` renders this spec.

## Security
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@
"oxfmt": "^0.54.0",
"oxlint": "^1.69.0",
"vite": "^8.0.16",
"wrangler": "^4.99.0"
"wrangler": "^4.100.0"
},
"packageManager": "pnpm@10.23.0"
}
Loading