Project structure
A Curb project is a folder of React components. The folder names are the routes.
my-agent/
package.json "dev": "curb dev", depends on "curb"
tsconfig.json jsx: react-jsx (required)
context/ optional markdown, referenced via <Text src="…" />
src/agent/
agent.tsx exports `agent` (defineAgent): the agent level, where every conversation
starts: prompts, config, skills index, tools every skill has
<name>/skill.tsx one folder per skill, opened when needed; nested folders are sub-skills
The voice session (speech, turn-taking, interruptions, the production worker) is the framework’s, the same on every route; a project holds no copy of it.
Routes come from folder names: src/agent/claim-procedure/skill.tsx is
/claim-procedure. Discovery is automatic: never register skills manually.
Every skill has a folder of its own: a skill.tsx next to agent.tsx is
not a skill, and curb check says where its content goes
(AGENT_HOME_SKILL_REMOVED).
Agent authoring is imported from the "curb" package:
import { Agent, Skills, Skill, Tool, Instruction, defineAgent, z } from "curb";
Voice settings are <Agent> props and defineAgent options; see
Voice sessions.
Files Curb writes
These stay out of git. The project’s .gitignore already lists them.
| Path | What it holds |
|---|---|
.env | Your keys and settings. See Configuration |
.data/ | Recorded conversations, by default .data/conversations.jsonl |
.curb/ | Generated files, and link.json, the hosted agent this project deploys to |
.mcp-auth/ | Tokens of MCP servers you signed in to |
mcp.servers.json holds the MCP servers you added in the preview. It never holds tokens.
Next steps
- Agents and skills: write the agent itself.