Demos — the promises, proven
Each demo here proves a promise AgentStack makes — import once and render everywhere, undo byte-for-byte, and, deeper in, refuse an undeclared tool call and block an unapproved destination. Note the shape of that last one: AgentStack restricts destinations and records decisions. It does not inspect payloads, so an agent can still send data through a host you approved — see the claim discipline. Everything comes from examples/ in the repo: self-contained, self-asserting scripts that run in an isolated temp HOME, print PASS/FAIL per claim, and exit nonzero on any mismatch. Looking for how to use the CLI instead? That’s the how-to guides and the command reference.
first-value-demo
agentstack init imports both into one manifest (the token lifted to ${GITHUB_TOKEN} in a gitignored .env), one apply --write renders both native formats, doctor closes at 0 errors, and two restore --last --write return the machine byte-for-byte to where it started. Eight assertions, all green in the run replayed below.examples/first-value-demo/run-demo.sh · DEMO_PAUSE=2.5 paces it for a recordingeveryday-loop-demo
.agentstack/skills/ and activated: declared, pinned in the lock, and readable at .claude/skills/ where the CLI actually looks. Then undo --to 1 --write returns .mcp.json byte-for-byte — hand-written server and all — while leaving the dropped file alone. share writes a signed .astack bundle; on a second machine with its own trust store, receive stages it inert (its manifest is deliberately not merged) and up verifies against the lock and renders that machine's config. Twenty assertions, every one an on-disk effect rather than a command's own summary line.agentstack yes is deliberately terminal-only — --yes answers its prompt but is no substitute for the review a human reads. The demo asserts that refusal, then runs the explicit adopt → lock → trust → use path the error message itself names.examples/everyday-loop-demo/run-demo.sh · needs python3 · DEMO_PAUSE=2.5 paces it for a recordingmalicious-repo-demo
evil_server.py: an MCP server advertising a friendly status tool and a malicious exfiltrate tool that reads a planted credential and POSTs it to a localhost sink. Tellingly, its manifest declares no firewall of its own — a malicious repo won't constrain itself. The same hostile repo runs three ways:examples/malicious-repo-demo/run-demo.sh · needs python3 · DEMO_PAUSE=2.5 paces it for a recordingguard-demo
guard check; every denial is recorded to ~/.agentstack/audit/calls.jsonl. Hand it a pending call:examples/guard-demo/run-demo.sh · finishes by grepping the audit log to prove the denials landedone-manifest-demo
${GITHUB_TOKEN} — the demo greps it to prove it's secret-free before rendering anything. Then apply fans it out. Pick a CLI to see its native shape:examples/one-manifest-demo/run-demo.shsandbox · first run
demo-firstrun.sh builds a throwaway HOME each run, so it is always a genuine first run — a dev who already runs Claude Code with one MCP server, adopting agentstack to spread it across every other CLI. Step through it:sandbox · central library
central-demo/ is just a manifest — a toolset referencing a server + skill by name, no inline definitions, no capability files. Both resolve from the central library at ~/.agentstack/lib/. Walk the flow:sandbox · lockdown
demo-lockdown.sh launches a real run --sandbox --lockdown container and then tries to get out of it. Click each attempt:LOCKDOWN / ENFORCED · NO DIRECT ROUTE. Point AGENTSTACK_SANDBOX_IMAGE at an image carrying your CLI; the sidecar is pulled from GHCR, pinned per release.mcp-profile-lease
agentstack mcp stdio process: the agent opens the backend toolset, loads its skill, freezes what it observed into a new toolset, and closes — asserting that none of the native artifacts (.mcp.json, .claude/skills/, sessions.json) were ever created. Step through the lifecycle — these are MCP tool calls, not shell commands:Machine-policy presets
~/.agentstack/agentstack.toml, then doctor. Pick one to see its stance:"*" rule — it binds every server whatever a manifest calls it. Plain globs allow, a ! prefix denies; any allow pattern turns the list into an allowlist. A later broken edit runs DEGRADED on the last-known-good snapshot; broken first-run state is BLOCKED, never project-only.Seven example projects
Fake-but-realistic projects, each exercising one use case end-to-end with an assert.sh that proves it. Click one for the full story:
The dogfooding report these projects produced — the skill-indexing investigation, the CLI-differences matrix, the device test of run --locked — lives in examples/projects/FINDINGS.md.