Profiles
A profile is a template for an agent. When you submit a task, you pick a profile; the platform spins up a workspace using that template.
Profiles are user-owned. You can have many. Common patterns: one for coding, one for personal finance, one for research, one shared across the household.
Fields
Section titled “Fields”| Field | What it does |
|---|---|
id | prof_<nanoid>. Stable identifier. |
slug | URL-friendly handle (coding, vzfinance). How you @mention the profile in Slack/Telegram. Unique per user. |
name | Display name. |
model | Anthropic model id (claude-opus-4-7, claude-sonnet-4-6, claude-haiku-4-5) or Ollama model id. |
api_key_id | Which API key in your api_keys vault to bill against. |
default_tools | Default tool list (Bash, Read, Write, WebSearch, WebFetch, custom tool ids). |
mcp_servers | Which MCP servers to inject (memory, notify, gmail, teller, vonzio, or custom HTTP MCPs). |
skill_ids, tool_ids, agent_ids | Curated skills / custom tools / subagent definitions. |
claude_md | The system prompt. Plain text. This is where you encode the agent’s personality, scope, and rules. |
memory_enabled | Whether the memory MCP server is injected. Defaults true. |
persistent_sessions | Whether new workspaces use named volumes (see Workspaces). |
setup_commands | Bash commands to run inside fresh containers (e.g. apt-get install, env setup). |
concurrency_limit | Max simultaneous workspaces per this profile. |
max_turns, max_budget_usd | Per-task safety limits. |
The claude_md field
Section titled “The claude_md field”This is the system prompt that defines who the agent is and what it should do. A good claude_md:
- States the agent’s name and one-line purpose
- Lists the data sources it has access to and what to do with them
- States any hard rules (
never modify .env,always check reminders_sent before nudging) - Provides format/style guidance for its outputs
- Provides example interactions
For a real example see VZFinance’s claude_md field in the production DB (select claude_md from profiles where slug = 'vzfinance').
API surface
Section titled “API surface”| Endpoint | Purpose |
|---|---|
GET /v1/profiles | List your profiles. |
POST /v1/profiles | Create a profile. |
GET /v1/profiles/:id | One profile (incl. claude_md and tool/skill/agent ids). |
PATCH /v1/profiles/:id | Update fields. |
DELETE /v1/profiles/:id | Delete the profile. Workspaces using it still exist but you can’t start new ones. |
GET /v1/profiles/:id/models | List models available to this profile (filtered by the linked API key’s capabilities). |
Default profile resolution
Section titled “Default profile resolution”When the caller doesn’t specify a profile (e.g. inbound Slack message with no @slug prefix), the platform picks one in this order:
- Explicit
@slugtoken in the prompt. - The bot’s
bound_profile_id(Telegram only — see Telegram integration). - The user’s first profile (legacy fallback).
Reusing a profile vs forking
Section titled “Reusing a profile vs forking”Profiles are cheap. Don’t over-think it. If two agents share 90% of a claude_md but differ in tools or model, just make two profiles. Sharing claude_md text by reference isn’t supported.