This page is a highlights reel, not a complete log. Each entry covers a
release window, and it carries what a user or an operator would want to know
about: new capabilities, anything that changes behaviour on upgrade, and
anything that needs a decision before deploying. Plenty of good work is
deliberately not here — a gap between two dates means nothing was worth your
attention, not that nothing shipped.The complete, per-change record is
CHANGELOG.md
in the repository. That file is the release-note source of truth and every
user-visible pull request is required to add to it.featuresupdatesfixes
A provider is now a credential
The sidecar’s LLM proxy routed on a hardcoded three-arm switch. It now routes on a descriptor table, and a credential carries its provider end to end — so adding a backend is a row rather than a branch. Two arrive with it: OpenRouter and OpenAI-compatible endpoints (LiteLLM, vLLM, anything serving the OpenAI wire format), both created like any other credential.crewship credential create gains --base-url for the compatible kind and
--auth-token-stdin so a token never reaches the process table, and
crewship provider route list shows the whole routing table with no server
running. The three existing paths — /v1, /openai, /gemini — are
byte-for-byte unchanged. See Credentials and
Multi-provider LLM configuration.One shell for every create surface
The twelve create dialogs that had each grown their own layout are now one kit — consistent widths, a bottom sheet on a phone, ⌘↵ to submit, and a discard guard so Esc never throws away typed input. Three things became possible from the browser for the first time: importing a crew manifest into New crew, granting per-agent tools and notification channels on New agent, and creating a label from the issue modal. The crew wizard is four steps instead of five.Start and stop a crew on purpose
crewship crew start <crew> builds the image if needed and brings the
container up, verifying it actually came up rather than assuming; crewship crew stop <crew> takes it and its sidecars down, keeping volumes and the
image. Until now the remedy several error messages recommended was crewship crew provision, which only builds the image and starts nothing — so following
the advice reproduced the error. Those messages now name crew start, and say
what provision does and does not do. crewship apply also stops claiming
success on a
failed run — it now names the item that failed and everything after it that
was never attempted — and gains --no-delete, which refuses any run whose
plan would destroy something. See crewship crew and
crewship apply.Run a routine from a slash command
A routine can opt in to appearing as/<slug> in chat and in crewship shell, with a typed form built from the inputs it declares. A new
routine.run capability lets a MEMBER invoke routines without being promoted
to MANAGER. The run is synchronous and its output goes to the run records, not
to the chat. See Slash commands and Routines.Onboarding builds working things, owned by the crew they belong to
First-run setup is now a conversation with a permanent Crewship Guide crew. The important part is invisible: a routine or page the Guide builds for you is now attributed to your crew, not to the Guide — which decides whose egress policy gates it, whose container runs it, and whose roster its panels can see. See Onboarding.An integration’s audience is stored, not counted
An MCP server used to be available to every agent for exactly as long as no agent was bound to it: “available to all” was inferred from a binding count of zero, so the first binding anywhere in the workspace flipped the server to opt-in and revoked it from every other agent — silently, with nothing on the integration’s page saying so. Every MCP server now carriesdefault_access (all or bound-only) and resolution reads it. Binding an agent attaches a credential, a config override or an opt-out for that agent and changes nobody else’s access; narrowing a server is a deliberate act: crewship integration access <id-or-name> bound-only, --access on integration add / integration crew create / integration crew update, or default_access on the API. integration list gained an ACCESS column and the integration’s detail panel names its audience.Same pass: mcp_tool_bindings had no referential integrity, so deleting an integration stranded its per-tool toggles forever. They now follow their server, an insert naming a server that does not exist is rejected, and the rows already orphaned are swept. See Integrations and crewship integration.Updates
- An evaluator slot follows the key you actually have. Auxiliary slots now default to the first provider whose API key is set, instead of six slots hardcoded to Anthropic that each failed at first use on an OpenAI-only instance. See Keeper.
- Two Keeper aux controls that did nothing now do what the console claimed.
Memory consolidation reads the
curatorslot — it was hardwired to Ollama at boot, so an instance with an Anthropic key and no Ollama silently ran no consolidation at all while the card showed the slot healthy. Andrun_summary’s timeout now actually bounds the verdict call; its shipped default moves 15s → 20s so the first real deadline is not tighter than what those calls had been running under. - Crew template names are unique per workspace. Two workspaces can each
have a
backend-teamtemplate. A workspace template shadows the built-in of the same name, for that workspace only — and a built-in whose slug a user had taken can be seeded again, which it previously never could. - An OpenAI-compatible credential can be tested. It was the only LLM provider with no connectivity test, and it returned a green tick without dialling anything. The probe checks reachability, not authentication — it deliberately never sends the stored key, because whoever can edit the credential can also repoint its URL.
- Pages can be published, webhooked, exported, imported and deleted from the browser. All of that was CLI-only. See Pages.
Fixes
- A page’s public panels were silently unpublished by reading them. The
publicflag was not echoed on any read path, socrewship page export | crewship apply, a hand-editedpage get -f json, or the editor’s own save cleared it. The published link kept resolving and rendered an empty page, and the nextpage publishthen blamed the page for having no public panels. - The mission timeline’s “Restore” restored nothing and said it had. The endpoint computes a preview by design — it rewinds nothing — and the UI reported success and discarded the response, including the list of later events a real restore would have to abandon. The action is now labelled Preview restore and says what it found.
- The Add-MCP wizard’s “Test” could not fail. It was a timer that returned
success, with no failure path at any input. It is gone; connectivity is
tested on the server’s row after it exists, or with
crewship integration crew test. - One unrenderable chat message no longer takes down the page. A single bad turn used to replace the whole conversation with an error screen, discard every turn’s state, lose a half-typed draft and drop the live WebSocket. Now only that message is replaced, and it heals itself as the next token arrives.
- Pinned memory could be read empty.
pins.mdand the day’s learned rules were created before they were written, so an agent reading its own rules in that window saw nothing rather than the previous contents — reproducibly, on a tick that runs every six hours. They are written atomically now. - Forking a mission from the timeline 404’d, and the 404 was rendered as “not yet wired to backend” — so a broken call looked like an unbuilt feature.
- Accessibility. Page tabs are now linked to the panels they reveal and the strip is keyboard-navigable with arrow keys; crew and agent canvas tabs are a real tab set rather than buttons claiming to be one; the admin console’s content pane can be scrolled by keyboard; New routine has a Cancel button on every screen.
featuresfixes
Multi-provider LLM configuration
The three-arm provider switch is now a registry: one row per provider, read by the aux-slot builder, the Keeper validator, the console picker and the error message that tells an operator what they may type. The two hand-written HTTP clients behind it became configurable codecs, so any OpenAI-compatible backend (DeepSeek, vLLM, llama.cpp, Ollama’s/v1 shim, OpenRouter) is a config value rather than a new file. Evaluator slots now default to the first provider whose key you actually have, so an instance holding only an OPENAI_API_KEY stops demanding an Anthropic one. A trimmed models.dev snapshot ships embedded and prices 621 models across eight providers offline, as a third step in the rate lookup below the hand-verified table. Two new local commands read those tables with no server: crewship provider list and crewship model price. See Multi-provider LLM configuration and Paymaster.Proxied agent calls start billing for real
Fixes
- OpenAI cached tokens were billed twice. OpenAI’s
prompt_tokensincludes the prompt-cache read, and the codec stored it verbatim alongside the cached count — so an 80%-cached 1500-token prompt billed 2.67× the invoice. The codec now records fresh input only, matching what the sidecar proxy path has always done.cost_ledger.input_tokenschanges meaning for OpenAI-family rows and historic rows are not migrated, so a rollup spanning the change is not comparable across it. See Paymaster. - Long-context models were billed at their base rate. 76 catalog models publish a second rate card above a context threshold, up to 6.7× base. They are now priced at that ceiling — a deliberate over-estimate, because under-billing weakens the budget signal exactly when it matters.
fixes
Updates
- Grandfathered crews tightened to restricted egress. Existing crews still on the legacy
network_mode=freedefault are backfilled torestrictedon upgrade, so they stop getting unrestricted outbound access. The column default itself is also flipped torestricted, so any crew created without an explicit network mode — a raw insert, a seed, a future migration — is now restricted by construction rather than defaulting open. A restricted crew still reaches all built-in LLM/CLI provider domains plus any it explicitly allowlists; if a crew genuinely needs open egress, re-open it tofree(or add the domains it needs) from its network policy. See Container isolation.
featuresupdatesfixes
Slash commands and per-user capabilities
End users now get a server-driven slash palette in chat and CLI for/routine, /issue, /skill, and /credential. Each action is gated by a per-user capability, so admins can grant a single MEMBER permission to author routines or rotate credentials without promoting them to the MANAGER tier. Capabilities are managed inline from Workspace Settings → Members (with a preview diff before bulk preset changes), or via crewship workspace member capabilities. See Slash commands and RBAC.Streamlined first-run bootstrap
The setup-token gate is gone. The/bootstrap form now takes name, email, and password — submit and you’re in. Bootstrap stays open until the first admin account exists, then returns 410; set CREWSHIP_BOOTSTRAP_WINDOW (any Go duration, e.g. 5m) to opt into a finite deploy-race window that closes that long after crewship start — for instances reachable from the internet before anyone bootstraps them. Both browser and headless (crewship init) paths hit the same endpoint and share the same gates. See Quickstart.Disaster-recovery backup rewrite
crewship backup restore adds a --replace mode for the canonical “nuke and restore preserving original IDs” flow. The restore pipeline now discovers workspace-scoped tables at runtime, reconciles users by email so an admin with the same address on source and target doesn’t orphan FK references, and applies section-aware symlink policy so workspaces containing node_modules (or any project with relative-target symlinks) restore cleanly. See Backup and crewship backup.Declarative apply for crews, agents, skills, integrations, and issues
crewship apply now understands five additional top-level kinds — Skill, Crew, Agent, Integration, and Issue — so a workspace can be provisioned end-to-end from a single manifest bundle. Built-in seed catalogues moved from Go literals to embedded YAML, so the same shapes round-trip through export/apply. See Manifests and crewship apply.Mission outcomes feed crew memory
When a mission completes, its outcome and provenance now flow into crew memory automatically — agents can recall what they shipped and why on the next mission without an operator re-priming the context. See Episodic memory and Agent memory.Workspace switcher
The sidebar workspace switcher is now real: list every workspace you belong to, switch with one click, persist the selection across reloads, and create a new workspace from the same menu. The selected workspace is honored by every component that reads it. See Onboarding.Profiling and tracing setup
Two opt-in observability surfaces landed: approf endpoint for CPU/heap snapshots and a Pyroscope push exporter for continuous profiling. The OpenTelemetry service.name is now configurable via env so multiple deployments tag their traces distinctly. See Telemetry and the OTLP setup guide.Updates
- Destructive CLI commands prompt before acting. Six commands now ask for confirmation and accept
--yesfor scripted use. - Manifest validate catches duplicate slugs.
crewship apply --dry-runnow fails fast when two documents share the samemetadata.slugwithin a kind, instead of silently overwriting on apply. See Manifest schema. crewship applygains--skip-test-gate. Routines that depend on PENDING credentials can now be applied without the pre-flight test invocation, andtype: codesteps surface a plan-time warning so the gap is visible before the cron fires. Seecrewship apply.- Go toolchain bumped to 1.26.3. Picks up eight stdlib CVE fixes; no API or behaviour change.
- SQLite busy timeout raised 5s → 30s. Eliminates the spurious “Invalid email or password” login error that surfaced on moderately loaded instances after a backup restore.
- CLI hardening pass. Security tightening across the CLI binary. See CLI overview.
Fixes
crewship workflow create --helpno longer panics from a flag-shorthand collision with the root--formatflag. See AI workflows.- Persona commands crashed on every invocation; now fixed.
- CLI typo’d subcommands are rejected with a clear error instead of being silently dispatched to
crewship ask. crewship now/me/todaynow exit non-zero when every fetch fails withsession_invalid, so wrapper scripts notice the missing login./metricsloopback bypass now checks the true client IP, closing a path where a misconfigured proxy could expose the endpoint externally. See Metrics.- Create-workspace dialog now resets when closed via Cancel, Escape, or overlay click — stale values no longer persist across reopens.
- MCP registry page size is now capped at 100 to prevent unbounded responses.
- Example manifest (
examples/manifests/full-complete.yaml) had two invalidtool_profilevalues that failed validation for anyone copying it as a starter — corrected to the documented enum.
featuresupdatesfixes
Agent Evolution lands
The full Agent Evolution release rolled out across seven coordinated changes. Highlights:- Native memory tools. Agents now have first-class memory read/write tools wired across all MCP-capable adapters. Memory is scanned before it’s persisted and consolidated automatically — see Agent memory and Memory observability.
- Autonomy slider + auxiliary model slot. Each crew now exposes a per-crew autonomy slider and a separate slot for an auxiliary (smaller / cheaper) model. Tune how often an operator gets pulled in, and route routine sub-tasks to a different model. See Autonomy and self-learning.
- Keeper Phase 2. Keeper now reviews skills, evaluates per-crew behavior mode, tracks memory health, and applies negative learning from rejected actions. See Keeper and Keeper reviews panel.
- Ephemeral agents. Hire an agent with a TTL, let it ghost when the TTL elapses, rehire if the work isn’t done — with a full audit trail of when it was active. See Ephemeral agents.
- PERSONA + peer cards. Per-user agent personas and peer cards land alongside new GDPR primitives for user-scoped data export and deletion. See GDPR.
RBAC v2
Role-based access control gets a major overhaul:- Per-crew role editor inline on the crew membership table.
- Agent owner badges on every agent card, with API exposure of the owner field.
- Token issuance dialog now shows tier, scopes, and expiry; listing exposes the same fields. CLI bootstrap and pair-redeem tokens are now 256-bit.
- Per-agent ownership gates on agent create, update, and delete, plus per-crew role elevation honored at create time.
- Structured 403 responses with denial audit logging.
Pipeline webhooks: signed by default
- HMAC signature required on every webhook dispatch.
- Signing secret auto-generated when a pipeline webhook is created — no more silent unsigned deliveries.
- Replay protection via synthetic idempotency keys; duplicate replays are now auto-deduped.
- Rate-limit floor and reserved-key inputs hardened on the webhook endpoint.
Updates
- OpenAI provider now mirrors the Anthropic retry/backoff behavior — flaky upstreams get the same treatment regardless of provider. See Providers.
X-RateLimit-*headers are now returned on every 429 response so clients can back off intelligently.CREWSHIP_FORCE_SECURE_COOKIESenv override lets you force secure cookies in front of an HTTPS-terminating proxy. See Environment.- Sidecar hardening. The production sidecar baseline got a security pass, and the prod Docker socket is now brokered through a filtering proxy. See Container isolation.
- Memory scanner now blocks invisible-format (Unicode Cf) codepoint evasion in addition to existing checks. See Memory observability.
Fixes
- Keeper cross-tenant defense. Workspace context is now correctly wired onto Keeper routes — previously the defense was unreachable.
- Sidecar memory startup. The agent memory base directory is now set even when the full-text search engine fails to initialize, so agents stay usable in degraded mode.
- OAuth state and session IDs bumped to 256-bit randomness. See Auth.
- Path-traversal hardening.
..segments are rejected before the router normalizes them;/_next/*directory autoindex is blocked; every ID interpolated into internal URLs is now path-escaped. - Permission gates. Agent files, downloads, and logs now require the
readpermission; nine pipeline mutating handlers are gated on per-role checks. - Log redaction. Raw token values are now logged as fingerprints instead of full tokens, and structured logs are routed through the Lookout redactor.
- Payload limits. The auth credential callback body is now capped at 16 KiB to bound memory use on hostile clients.
- Backup integrity. Table identifiers are validated before being used during foreign-key introspection. See Backup.
- Devcontainer safety. Cumulative tar extraction is capped at 500 MB to prevent decompression-bomb scenarios. See Devcontainers.
- ETHOS refusals no longer leak tool, directory, or sibling-agent enumeration data in error messages.
- Orchestrator context propagation. Request context is now correctly threaded through background work spawned by handlers, including five mission-engine call sites that previously dropped it.