veto-meow-gateway
v0.1.0
Published
Self-hostable delegated-authority gateway for Meow's MCP write-API. Optional connect to veto.so for observability + HITL.
Maintainers
Readme
veto-meow-gateway
Self-hostable delegated-authority gateway for Meow's MCP write-API. Runs on your laptop, your container platform, or connects to veto.so for the managed upgrade.
Block 2 status (this commit): runnable skeleton. Real capsule mint, MCP proxy, and OAuth land in Blocks 4–5. The commands below work today.
60-second start (from this repo)
Keep key and data directories outside the repo so they never end up in a
Docker/Cloud Build context or a git commit. The defaults below place them
under ~/.veto/meow-gateway/.
pnpm install
pnpm --filter veto-meow-gateway build
export KEYS_DIR="$HOME/.veto/meow-gateway/keys"
export STORAGE_DIR="$HOME/.veto/meow-gateway/data"
node apps/meow-gateway/dist/bin/cli.js keygen # writes to $KEYS_DIR
node apps/meow-gateway/dist/bin/cli.js start # boots at http://localhost:3005
curl http://localhost:3005/health
curl http://localhost:3005/.well-known/veto-keys.jsonOr, via the workspace scripts from the repo root:
pnpm --filter veto-meow-gateway keygen
pnpm --filter veto-meow-gateway startNever place KEYS_DIR inside the repository tree. The root
.dockerignore excludes veto-keys/, .veto-keys/, .veto-data/, *.sqlite,
and *.ndjson as belt-and-suspenders, but the first line of defense is
storing secrets outside source control in the first place.
veto-meow-gateway is private to the monorepo until veto-spend-capsule-protocol
publishes to npm (Block 4). Until then, the gateway is not npx-able — use
the repo-local commands above.
Subcommands (veto-meow-gateway <command>)
| Command | Ships in | Notes |
|-----------|-----------------|-------|
| keygen | Block 2 (today) | generate Ed25519 keypair to $KEYS_DIR |
| start | Block 2 (today) | boot HTTP server + /health + /ready + JWKS |
| demo | Block 4 | offline end-to-end: mint → consume → verify chain |
| connect | Block 7 | real OAuth handshake to veto.so (currently a placeholder — see bin/connect.ts) |
Self-host stack
- Policy packs: bundled YAML inside the container at
/etc/veto/policy-packs/ - Receipts: append-only NDJSON at
$STORAGE_DIR/receipts.ndjson+ SQLite at$STORAGE_DIR/store.sqlite. SQLite is the authoritative store; NDJSON is a deterministic rebuildable export. - Budgets + leases: SQLite (single-process semantics; see
storage/local.ts) - Signing keys:
$KEYS_DIR/(PKCS8 Ed25519 + JWKS JSON, chmod 600) - JWKS endpoint: served locally at
/.well-known/veto-keys.json - HITL approvals: logged to stdout by default; Slack webhook configurable via env
connect veto.so unlocks
- Multi-node policy pack distribution
- Central receipt aggregation + merkle root publication
- Slack/Discord HITL UI + dashboards
- Cross-entity analytics
- Long-term audit retention
Self-host stays free forever. Connect is the managed upgrade.
Deploy (managed)
Cloud Build config is in ops/cloudbuild/meow-gateway.yaml. Currently gated
behind a break-glass _ALLOW_DEPLOY=true substitution pending:
veto-spend-capsule-protocolpublish to npm (removes the sibling-repo file: dep)- Persistent signing-key + storage provisioning on Cloud Run (Secret Manager for the key, GCS/Memorystore for receipts)
Until both land, gateway.veto.so is not backed by an automatically deployed
revision — self-host is the canonical path.
