About this project

AgentPod is a portable command center for AI agent runtimes — a single place to manage the environments where agents live, wherever they run. For each runtime it manages the filesystem, logs, terminal, config, health, lifecycle, cleanup, and provisioning, across machines, harnesses, and network boundaries. It is attach-first: you point it at runtimes you already run, or let it provision new ones. The architecture is three tiers. The operator-facing console is a SvelteKit static SPA that talks to the hub over HTTPS and WSS. The hub is built on Bun, Hono, and Postgres (via Drizzle) and acts as the node/station registry, connection broker, enrollment and auth service (Better Auth), audit and activity log, and provisioning driver host. The node-agent is a static Go binary installed per host that dials *out* to the hub over WSS, so it works behind NAT and CGNAT without opening inbound ports. Each node-agent runs harness descriptors and executes contract verbs locally. AgentPod ships descriptors for several agent harnesses — Hermes, OpenClaw, Claude Code, Codex, OpenCode, and Pi — registered in `apps/node-agent/cmd/agentpod-node/registry.go`. Each descriptor wraps the harness's native CLI or API to enumerate runtimes, locate config, logs, and workspace, and implement lifecycle operations without reinventing each harness's introspection. Deployment is straightforward: run the hub with Postgres and Bun (auto-migrating on first start), build the console with pnpm and deploy the static output to Cloudflare Pages or any static host on a subdomain of the hub's registrable domain (so the Better Auth session cookie stays same-site), then enroll node-agents on target hosts with a curl-piped install script that drops a systemd service. Prebuilt binaries for linux/darwin × amd64/arm64 are published on every `v*` tag via GitHub Actions. Status is single-operator: one admin account, signup closes after the first user, releases tagged `v0.1.x`. The tenant-isolation boundary has landed — a `tenants` table, `tenant_id` on every scoped table, and a `tenantScope()` helper that refuses to build a query without one, pinned by unit tests. Everything today runs under the single bootstrap tenant `fleet_00000000000000000000`; what remains is what uses the boundary: orgs, principals, and billing. The previous OpenCode-based product is frozen at tag `v0.0.4-opencode` with archived docs under `docs/archive/`. Licensed MIT.