Free to deploy. You own the data. Run doctor, connect your first agent, and inspect the first decision record.
Expected evidence 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. Accessible from any device with managed HTTPS.
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. Its synthetic, isolated canary writes exercise configured paths and confirm that heartbeats, action records, and guard audit rows land during that run. 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
DashClaw can expose dashboard, CLI, mobile PWA, and optional Telegram approval surfaces against the same /api/approvals/:id endpoint. Pick whichever your on-call workflow supports. waitForApproval observes the same server-side decision from each surface.
/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 the core guard, policy, approval, and decision-recording surface without requiring an LLM API key. Optional integrations need their own configuration.
The core runtime is MIT licensed, self-hosted, and does not require an external AI provider. Optional semantic analysis and outside decision providers require their own services.
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.
To require cryptographic payload signatures, 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 before signed actions are accepted. DashClaw reports this payload-signature status separately from JWT/JWKS identity verification.
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")