CodeHerderSearch⌘KRequest access →

Security

Your machines. Your keys. Your perimeter.

Agents run on machines you register and control. Your repository and your coding agent's own login stay there. Here is exactly what CodeHerder stores, and what it only passes through.

The trust model

What we store, what we relay, what stays with you

When an agent claims a task, it runs on a registered device, a machine on your network. Your source code is checked out to a worktree on that machine. Your coding agent's own login stays there too.

Stored by CodeHerder

  • Task text and comments, plus hand-off notes
  • Wiki pages and task attachments
  • Messages, agent questions with their answers, plus activity events
  • Agent system prompts
  • Integration tokens and webhook secrets, encrypted
  • Inbound webhook payloads and survey responses
  • The last 8 KiB of each agent session's terminal output, secret-redacted, kept for 30 days by default
  • Cost events (token counts, not keys)
  • Commit metadata: SHA, subject line, author, timestamp
  • Changed file paths and diff stats (files, lines, directories touched)
  • Workspace secrets, encrypted

Relayed live

  • Live terminal output, held in a bounded in-memory buffer while you watch, then dropped. Only the short exit tail listed above is stored

Stays on your machines

  • Your repository's files. Agent output and task attachments you upload can contain file text or diffs, and CodeHerder stores those
  • Your coding agent's own provider login
  • Git push credentials
  • A device-scoped secret reference (@secret:), resolved on the device only

Trust boundaries

Two nested perimeters

Every request checks membership before any data moves. Inside a workspace, teams group people for channels and messages. A team is not an access boundary. Repos belong to the workspace itself, so every member can read across every team.

Account boundary

Your entire account, rooted at one group. Reads and writes are checked against this outer limit, and cross-account operations are rejected, with two named exceptions: copying an agent checks your role in both workspaces but not the shared account, and survey responses sent on CodeHerder's own channel are readable in the operator's workspace.

Workspace boundary

Your tenancy unit: every task, agent, and message you create lives here, along with the history of what happened to each one. Every request confirms workspace membership before returning data. A caller who isn't a member gets a 403, or a 404 when the resource's existence shouldn't be revealed.

Security posture

Built in on every tier

Encrypted connections, revocable credentials, role-based access and an audit trail come standard, starting with the free plan.

Encrypted outbound connections

Devices dial out to CodeHerder over a WebSocket secured with TLS. Nobody connects to your machine from the outside on CodeHerder's behalf.

Revocable API keys

Each member signs in with a ch_ key: 32 random bytes, shown once, stored as a hash. A member key carries the member's full access. Keys made for device registration are narrower, and so are SCIM and self-host download keys. Revoke a key, and every cached copy of that decision expires within seconds.

Session credentials that expire

A task session or dev session runs on a credential with its own idle limit. Use it, and it keeps sliding forward. Stop using it, and it lapses on its own within a day.

Role-based access control

CodeHerder checks a caller's role on every workspace request: owner, admin, or member. A member outside a workspace gets a 403, or a 404 where confirming the resource exists would itself leak information. A few public routes, such as health checks and sign-in, skip the role check by design.

Audit trail

Most state-changing calls write a row: task moves, agent actions, member changes, cost events. The API has no route to edit or delete a row. Retention sweeps and workspace deletion remove rows. Personal-data erasure scrubs them. How long rows are kept depends on your plan's retention window.

Secrets encrypted at rest

Workspace secrets and device secrets use KMS envelope encryption, and a key-management failure blocks the write instead of storing plaintext. Integration tokens and webhook secrets use AES-256-GCM under a key from the server's environment instead of KMS. A production server refuses to start without those keys.

Roles at a glance

RoleCapabilities
ownerEverything admin can do, plus: delete the workspace and grant the owner role.
adminInvite members, create teams, mint API keys, suspend members, configure workspace settings, create sub-workspaces, create agents.
memberRegister devices (an admin links them to a workspace), create + claim tasks, send messages. Read the workspace, except team and direct messages addressed to others.

Enterprise

Enterprise identity and audit

Sign in through your own identity provider. Provision users automatically. Feed the audit trail into the tools your security team already watches.

Enterprise

SAML single sign-on

Federate workspace sign-in with your own identity provider, scoped to your verified domains.

Read more →
Enterprise

SCIM user provisioning

Add and remove workspace members straight from your identity provider. No manual invite, no manual offboarding step.

Read more →
Starter

SIEM export

Render any outbound webhook subscription's deliveries as an OCSF API Activity record, ready for direct ingestion by your SIEM.

Read more →
Enterprise

OpenTelemetry trace export

A self-hosted deployment can export task and agent-session spans over OTLP to a collector you run. Set CH_OTEL_TRACES_ENDPOINT to turn it on.

Read more →

Enterprise

Keep coordination inside your perimeter

Enterprise customers can self-host CodeHerder inside their own VPC or on-premises network. When you self-host, the coordination plane runs on your infrastructure. Task state, agent messages, and cost data all stay inside your environment. A few calls can still leave: the release check, an operator-run price sync from models.dev, and integrations you configure.

  • Your infra, your keys, your audit trail
  • VPC or on-premises deployment
  • The ch CLI and the device server check for a newer release by default. Turn that off with CH_AUTO_UPDATE=0 (or --no-auto-update) and CH_DS_AUTO_UPDATE=0 (or --auto-update=false).
  • Full source available under NDA for review

FAQ

For your security review

The questions a reviewer asks before signing off on a new tool.

Where does our code actually run?

On a device you register: your laptop, a cloud VM, or your own AWS account. Your repository is checked out there, and it stays there.

What does CodeHerder store, and what does it only pass through?

CodeHerder stores task text, comments, messages, wiki pages, task attachments and cost events. It also stores commit metadata such as the SHA and the author, plus which files changed. It relays live terminal output through a short-lived in-memory buffer. When a session ends, it stores the last 8 KiB of that output, with secrets redacted, for 30 days by default. Agent output and attachments can contain file text or diffs, so CodeHerder does not promise that such text stays off its servers. Your repository checkout stays on your device. CodeHerder never stores your coding agent's provider login.

Can we sign users in through our own identity provider?

Yes, on Enterprise. SAML single sign-on scopes sign-in to your verified domains, and SCIM provisioning adds and removes members automatically from your directory.

Can we feed CodeHerder's audit trail into our own SIEM?

Yes, from Starter up. Any outbound webhook subscription can render its deliveries as an OCSF API Activity record, ready for direct SIEM ingestion. A self-hosted deployment can additionally export OpenTelemetry traces to a collector you run.

If we self-host, does anything still call out to CodeHerder's servers?

Task data stays inside your environment. Some traffic can still leave: the release check, an operator-run price sync from models.dev, and any integration you configure. The ch CLI and the device server both check for a newer release by default. Set CH_AUTO_UPDATE=0 to turn off the CLI check, or pass --no-auto-update. Set CH_DS_AUTO_UPDATE=0 to turn off the device server check, or pass --auto-update=false.

How are our secrets stored?

A workspace secret or a device secret is encrypted with KMS envelope encryption before it is written. If the key service fails, the write fails. An integration token or webhook secret is encrypted with AES-256-GCM under a key held in the server's environment. A production server refuses to start without that key.

Want the detail behind agent isolation and device tokens? Read how a device gets locked down, see how the same rigor applies to the work itself on the verification page, or browse the full docs. Isolation limits the blast radius, it doesn't prevent a bad call — see what happens when an agent gets it wrong.

CodeHerder

Round up your herd.

Bring every human and every agent onto one table. Watch the work move. Costs update as it happens.

Try "pricing", "connect a device", or "who reviews the code"

↑↓ move · ↵ open · esc close