Free to deploy. You own the data. Run doctor, connect your first agent, and verify the first decision record in under 10 minutes.
Expected proof after deploy
npm run doctor or dashclaw doctor exits 0 or names the blocker. Your first governed action appears in /decisions, held work appears in /approvals, and /api/setup/live-proof can capture setup evidence without exposing secrets.
Vercel + Neon free tiers. Zero cost, accessible from any device, auto-HTTPS. Takes ~10 minutes.
Docker + localhost. Good for development or if you want everything on your machine.
Verify
Doctor diagnoses database, configuration, auth, deployment, SDK reachability, governance staleness, data hygiene, shape drift, and write-path health (live canary writes that prove heartbeats, action records, and guard audit rows actually land: synthetic, isolated, self-cleaning). It reports by default; pass --fix to apply safe repairs. Run it as the first thing after your instance comes up.
The live host canary covers the outside-in half: an hourly GitHub Actions cron probes your deployed hosts as a real unauthenticated client (pages render, trial mint stays fail-closed, OAuth discovery and the MCP handshake answer their contracts) and files its verdict to your instance; failures render on /setup#live-canary and raise a posture finding.
Filesystem-level fixes. Can write missing env vars to .env (always backed up first), run pending DB migrations, generate NEXTAUTH_SECRET/ENCRYPTION_KEY, fix CORS, and seed a default policy.
npm run doctor
Same engine, invoked via GET /api/doctor + POST /api/doctor/fix. No filesystem access. Add --json for CI, --no-fix to diagnose only.
npm install -g @dashclaw/cli dashclaw doctor
Exit codes: 0 healthy, 1 warnings, failures, or unreachable.
Approve from anywhere
Every instance exposes four approval surfaces against the same /api/approvals/:id endpoint. Pick whichever your on-call workflow prefers. waitForApproval unblocks the agent within about a second regardless of which surface resolved the action.
/approvePhone-first approval surface. Add to your home screen and incoming approvals appear with the triggering policy, risk score, and one-tap Allow / Deny.
https://<your-instance>/approve
Pending actions push to an admin chat with inline buttons. If Telegram is unreachable, DashClaw warn-logs and approvals stay available via the other surfaces; it is purely additive.
dashclaw install telegram
Dashboard (/approvals) and CLI (dashclaw approve) are always on. Mobile PWA ships by default; Telegram is opt-in via TELEGRAM_BOT_TOKEN.
Your DashClaw instance ships with the full governance API surface. Every feature works out of the box -- no LLM API key required.
All features are free, self-hosted, and work without any external AI provider. The governance core (guard, policies, approvals, and action recording) is pure runtime logic with no LLM dependency.
The installer generates secrets, writes .env.local, installs dependencies, and prints the API key your agents should use.
./install-windows.bat
bash ./install-mac.sh
When it finishes, open http://localhost:3000.
For cryptographic identity binding, set ENFORCE_AGENT_SIGNATURES=true on the dashboard host. The Python SDK's create_pairing_from_private_jwk() helper generates a keypair and registers the public key via POST /api/pairings; an admin then approves the pairing in the dashboard before the agent's signed actions are accepted.
Step-by-step guides for popular agent frameworks. Each takes under 20 minutes.
Hook-based governance
dashclaw install codex
8 lifecycle hooks + live ingest
OAuth connector, no install
Node.js SDK integration
Python governance node
@tool decorator pattern
Framework-native plugin
Governed tool calls
Governed agent tools
Governed execute wrapper
No OAuth required to get started. Use Quick Start to deploy solo in under 10 minutes (full walkthrough: deploy without OAuth). Switch to Team Setup when you're ready to invite teammates. Coming from the hosted trial? Click Export workspace on your trial's /connect card, then run dashclaw import <file> once your instance is up: policies, decisions, and action history carry over (API keys never do).
Neon gives you a serverless Postgres database on their free tier, no credit card required.
postgresql://user:pass@ep-xyz.neon.tech/neondbYou'll paste this as DATABASE_URL in the next step.
Fork the repo and import it into Vercel. Add the environment variables and deploy.
DASHCLAW_API_KEY is your bootstrap admin key: it authenticates agents and seeds your first organization. After you sign in, you can create and manage additional API keys from the dashboard at /api-keys.Tables are created automatically on first request.
No OAuth app required. Add one environment variable in Vercel and you can sign in immediately.
In your Vercel project → Settings → Environment Variables, add:
Then redeploy. Visit your app and sign in with your password on the login page.
Use a strong password. This grants full admin access. You can add OAuth later when you want to invite teammates.
Use Upstash Redis to bridge Vercel's serverless functions for real-time dashboard events.
The 30MB free tier at Upstash is more than enough for DashClaw's live event buffer.
Agents only need a base URL plus API key. Every action they take flows through the same guard, record, and outcome loop. The deeper surfaces (scoring profiles, prompt templates, learning analytics) are available from the same SDK once you are connected.
DASHCLAW_BASE_URL=https://your-app.vercel.app DASHCLAW_API_KEY=<your-secret-api-key> DASHCLAW_AGENT_ID=my-agent
Your Vercel app uses Vercel env vars. Your agent uses its own environment variables.
import { DashClaw, GuardBlockedError } from 'dashclaw';
const dc = new DashClaw({
baseUrl: process.env.DASHCLAW_BASE_URL,
apiKey: process.env.DASHCLAW_API_KEY,
agentId: process.env.DASHCLAW_AGENT_ID || 'my-agent',
});
// 1. Ask the policy engine before acting.
const decision = await dc.guard({
action_type: 'deploy',
declared_goal: 'Ship auth-service v2.1',
risk_score: 40,
});
if (decision.decision === 'block') {
throw new GuardBlockedError(decision);
}
// 2. Record the attempt. The server is the source of truth.
const { action_id } = await dc.createAction({
action_type: 'deploy',
declared_goal: 'Ship auth-service v2.1',
risk_score: 40,
});
// 3. Run your real work, then close the loop.
await dc.reportActionSuccess(action_id, 'Deployed auth-service v2.1');import os
from dashclaw import DashClaw, GuardBlockedError
dc = DashClaw(
base_url=os.environ["DASHCLAW_BASE_URL"],
api_key=os.environ["DASHCLAW_API_KEY"],
agent_id=os.environ.get("DASHCLAW_AGENT_ID", "my-agent"),
)
# 1. Ask the policy engine before acting.
decision = dc.guard({
"action_type": "deploy",
"declared_goal": "Ship auth-service v2.1",
"risk_score": 40,
})
if decision["decision"] == "block":
raise GuardBlockedError(decision)
# 2. Record the attempt. The server is the source of truth.
result = dc.create_action(
action_type="deploy",
declared_goal="Ship auth-service v2.1",
risk_score=40,
)
action_id = result["action_id"]
# 3. Run your real work, then close the loop.
dc.report_action_success(action_id, "Deployed auth-service v2.1")