Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Use when the user wants to read/write their Butterbase substrate — the per-user agent-memory backend that holds entities, business state, institutional memory, and an append-only action ledger. Use for: founder copilots, AI agents that need memory across sessions, anything that proposes actions on the user's behalf.
.claude/skills/butterbase-ai-substrate/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-02 | ✗→✓ | ▲ Improved | 88% | 0% |
| case-04 | ✗→✓ | ▲ Improved | 1% | 0% |
| case-10 | ✗→✓ | ▲ Improved | -5% | 0% |
| case-12 | ✗→✓ | ▲ Improved | -9% | 0% |
| case-13 | ✗→✓ | ▲ Improved | -11% | 0% |
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).
| 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 |
Every write goes through this loop. Agents NEVER touch the substrate database directly.
propose_action with capability + args. Returns an action ID.auto_execute, require_approval, deny.approve_action(action_id) or reject_action(action_id). If yolo_mode=true for this user, approvals are auto-granted for capabilities marked yolo-safe.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.
get_entity(id) — fetch by ID.find_entities(type, query, limit) — typed search; query is full-text + structured.search_memory(query, kind?) — semantic + keyword search across decisions/commitments/learnings.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.
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.
find_entities returns 401 if there's no substrate — handle gracefully and suggest provisioning.upsert_entity without canonical_keys or primary_email and expecting dedup. Provide one or the other so substrate can match an existing row. Without them, every call mints a new entity.update_entity for a partial update. It replaces attrs wholesale and will drop every key you didn't include. Use patch_entity (RFC 7396 merge-patch) instead.merge_entities. The merged-away ID stops resolving to an entity; look up substrate.entity_aliases to find the survivor.Other measured skills in the registry, with their headline benchmark lift.