AgentPulse

Self-host an AI coding agent dashboard with Docker, Kubernetes and SSO

Your agents' prompts, file paths and tool output say a lot about your code. AgentPulse keeps all of it on infrastructure you run. This guide covers the deployment options, from a single container to a multi-user Kubernetes install behind single sign-on.

Pick a deployment

SetupGood forDatabase
Local service (Bun)One machine, no DockerSQLite
Docker containerOne machine, or a small home serverSQLite
Remote server + relaysSeveral machines reporting to one dashboardSQLite or PostgreSQL
KubernetesA homelab or team install behind SSOSQLite, or PostgreSQL with the overlay

Docker, on your own machine

This starts the container bound to localhost, waits for it to be healthy and configures the agent hooks:

docker run -d -p 127.0.0.1:3000:3000 -v agentpulse-data:/app/data -e DISABLE_AUTH=true \
  --restart unless-stopped --name agentpulse ghcr.io/jstuart0/agentpulse \
  && until curl -fsSL http://localhost:3000/api/v1/health >/dev/null 2>&1; do sleep 1; done \
  && curl -sSL http://localhost:3000/setup.sh | bash

The 127.0.0.1: prefix matters. DISABLE_AUTH=true turns off login, so the port must not be reachable from your network.

A server for several machines

Run AgentPulse with authentication on (the default), then install the relay on each machine that runs agents. The relay listens on localhost, queues events on disk and forwards them to the server with an API key:

curl -sSL https://your-agentpulse-server.example.com/setup-relay.sh | bash

The relay's key needs the ingest and observe scopes. Mint one per machine in Settings, so you can revoke a single machine without touching the rest.

Kubernetes with single sign-on

The repository ships Kustomize manifests in deploy/k8s/: namespace, deployment, service, PVC, network policy, resource limits and a Traefik IngressRoute. Hook ingestion is authenticated with API keys, while the dashboard goes through your identity provider:

kubectl apply -k deploy/k8s/

AgentPulse trusts identity headers from any forwardauth provider: Authentik (the default header names), Authelia, oauth2-proxy, Pomerium and Cloudflare Access. A shared secret injected by the proxy proves the headers came from it. Provider-specific setup is in FORWARDAUTH.md.

PostgreSQL

SQLite is the default and works well for one instance. For PostgreSQL, set DATABASE_URL=postgres://..., or apply the overlay in deploy/overlays/postgres/, which also switches the deployment to rolling updates. Migrations run at boot under an advisory lock, so a rolling deploy can't run them twice. Keep to one replica for now: some rate limits and queues are held in process memory.

Teams

AgentPulse runs in solo mode by default. Team mode adds people, admins and per-session owners: each session belongs to whoever's key reported it, and deleting, archiving or renaming needs the owner or an admin. Team mode attributes work to people. It doesn't make sessions private, since every member can read every session.

Data and privacy