Install
$ agentstack add skill-butterbase-ai-butterbase-skills-substrate ✓ scanned · ✓ verified, works with Claude Code, Cursor, and more.
Security review
✓ PassedNo issues found. Passed automated security review. · v0.1.0 How review works →
- ✓ Prompt-injection patterns
- ✓ Secret / credential exfiltration
- ✓ Dangerous shell & filesystem operations
- ✓ Untrusted network calls
- ✓ Known-malicious package signatures
What it can access
- ✓ Network access No
- ✓ Filesystem access No
- ✓ Shell / process execution No
- ✓ Environment & secrets No
- ✓ Dynamic code execution No
From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.
Verified badge
Passed review? Show it. Paste this badge into your README, it links to the public security report.
Reliability & compatibility
Declared compatibility
Compatibility is declared by the source manifest. End-to-end runtime verification is coming, see below.
We're building live execution health for every listing: tool-call success rate, median latency, uptime, and last-checked timestamps, measured, not self-reported. It isn't live yet, so we don't show numbers we can't stand behind.
How agent discovery & health will work →About
Butterbase Substrate
Substrate is an optional, per-user add-on backend. One substrate per Butterbase account, lazily provisioned on first use, queryable from local Claude Code (via MCP), from any opted-in Butterbase app (via ctx.substrate inside functions), and from external systems (via HTTP).
Four stores
| Store | What lives there | Tools | |---|---|---| | Entities | People, companies, projects you transact with | get_entity, find_entities | | Business state | Numeric facts that change over time (MRR, headcount) | find_entities with type filter | | Institutional memory | Decisions, commitments, learnings | search_memory | | Action ledger | Append-only log of every proposed/executed action | list_outbox, propose_action history |
The propose → policy → execute → log loop
Every write goes through this loop. Agents NEVER touch the substrate database directly.
- Propose —
propose_actionwithcapability+args. Returns an action ID. - Policy — substrate-core evaluates per-capability rules. Verdicts:
auto_execute,require_approval,deny. - Approval (if needed) — human calls
approve_action(action_id)orreject_action(action_id). Ifyolo_mode=truefor this user, approvals are auto-granted for capabilities marked yolo-safe. - Execute + log — substrate-core runs the action in a transaction and appends to the ledger.
For external side effects (sending email, calling an API), substrate writes to the outbox instead of executing inline. The cron-scheduler drains it. Use list_outbox, retry_outbox, cancel_outbox to manage it.
Reads
get_entity(id)— fetch by ID.find_entities(type, query, limit)— typed search;queryis full-text + structured.search_memory(query, kind?)— semantic + keyword search across decisions/commitments/learnings.
When to use
- ✅ Founder copilot ("what did I decide about pricing last quarter?")
- ✅ AI agent that should remember a customer across conversations
- ✅ Any app where you want a single source of truth for entities the agent operates on
- ❌ Plain CRUD app (use regular Butterbase tables)
- ❌ Pure analytics / read-only dashboard (substrate is action-oriented)
Linking an app
When apps.substrate_user_id is set to the app owner's platform_user.id, functions in that app get ctx.substrate injected at cold start, with reader and proposer methods. Use /butterbase-skills:journey-substrate to enable this for an app.
API keys
For agent access from local Claude Code, generate a scope='both' API key via manage_auth_config action: "generate_service_key" with substrate_access: true. The same bb_sk_ key works on both app and substrate endpoints.
Anti-patterns
- ❌ Calling substrate MCP tools without first checking whether the user has substrate provisioned.
find_entitiesreturns 401 if there's no substrate — handle gracefully and suggest provisioning. - ❌ Treating the action ledger as mutable. It's append-only; "undo" is a new compensating action, not a delete.
- ❌ Storing transient state in entities. Entities are durable nouns; use the app's runtime tables for ephemeral state.
- ❌ Calling
upsert_entitywithoutcanonical_keysorprimary_emailand expecting dedup. Provide one or the other so substrate can match an existing row. Without them, every call mints a new entity. - ❌ Calling
update_entityfor a partial update. It replacesattrswholesale and will drop every key you didn't include. Usepatch_entity(RFC 7396 merge-patch) instead. - ❌ Storing entity IDs in app data and skipping alias resolution after
merge_entities. The merged-away ID stops resolving to an entity; look upsubstrate.entity_aliasesto find the survivor.
Source & license
This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.
- Author: butterbase-ai
- Source: butterbase-ai/butterbase-skills
- License: MIT
Install and usage instructions live in the source repository linked above.
Reviews
No reviews yet, be the first.
Write a review
Versions
- v0.1.0 Imported from the upstream source.