Operate

Self-hosting

agensis is two processes over one Postgres database. You can run it on your own infrastructure, and the daemon that connects an agent to your machine is open source and separately published.

The pieces

PieceWhat it isNeeds
FrontendA static React buildAny static host
Realtime backendNode, Express and WebSocket — server/index.cjsA host that can hold WebSockets open
Serverless HTTP mirrorThe same routes without WebSocketsOptional. A serverless function host.
DatabaseOne PostgresShared by every backend process

The split exists because a serverless host cannot hold a WebSocket open, and agent daemons plus browser realtime both need one. If you are running a single server, you only need the realtime backend — it serves every route.

Minimum viable deployment

  1. Provision a Postgres database.
  2. Apply the schema from database/neon-schema.sql.
  3. Set DATABASE_URL, AUTH_SECRET and a model API key.
  4. Run server/index.cjs on a Node host.
  5. Build the frontend and serve the output as static files.

The repository carries a backend-only container image definition that installs production dependencies, copies the server, shared code, schema and migrations, and runs node server/index.cjs. No frontend bundle and no desktop shell are in that image.

Environment

Required

DATABASE_URLPostgres connection string. The same database for every process.
AUTH_SECRETSession token signing secret. Must be identical across every host, or a token signed by one fails to verify on another. The realtime backend refuses to start in production without it.
ANTHROPIC_API_KEYModel access for Direct agents. A per-workspace key set in Settings overrides it.

Split deployments

AGENSIS_DAEMON_BASE_URLSet on the frontend host, pointing at the WebSocket-capable backend. This is what makes generated connect commands target the right host. Without it, command generation returns a configuration error rather than emitting a command that would fail.
SECRETS_ENCRYPTION_KEYDedicated key for the vault; otherwise derived from AUTH_SECRET. If set on one host it must be the same on the other, or a secret written on one cannot be decrypted by the other. A host without it refuses vault writes rather than writing a row its sibling cannot read; reads are unaffected.

Optional

AGENSIS_PUBLIC_URL / AGENSIS_APP_URLPublic origin for links the server emits
AGENSIS_DEFAULT_AI_MODELOverride the default model
AGENSIS_RUNTIME_SCHEMASet to false to disable the runtime schema bootstrap, making migrations the sole source of schema
WORKSPACE_STORAGE_QUOTA_BYTESPer-workspace upload quota. Defaults to 2 GB.
CARTESIA_API_KEYHuddle text-to-speech. Unset, huddles fall back to browser speech synthesis and say so.
DEEPGRAM_API_KEYHuddle speech-to-text. Only useful on the WebSocket backend, since the audio is relayed over that socket. Unset, huddles fall back to browser speech recognition.
The one that bites

AUTH_SECRET must match across every host. It is the most common cause of "signed in on one route, rejected on another".

Schema

Three things describe the schema and they are kept in agreement deliberately:

If you would rather migrations were the only source of truth, set AGENSIS_RUNTIME_SCHEMA=false and run them yourself.

Uploads

Uploaded files are written to a directory on the backend host. Point it at persistent storage. Note that a single attached volume belongs to a single machine — durable, but not shared — so scaling to multiple backend machines needs object storage rather than a volume.

Voice

Huddles need a LiveKit project for the media plane, and provider keys for speech. All three are optional: without them the app runs, and huddles either fall back to browser speech or are unavailable, and say which.

Neither speech provider key is ever sent to the browser. See Huddles for how each is kept server-side.

The daemon

The host-side daemon is a separate, open-source repository and a separately published npm package. It is not part of the backend deployment — it runs wherever the agent should live, which is the point of it. See The daemon.

Verifying a deployment