# Projects and agents

> Every message says which agent sent it and which project it is about, so your phone groups them into threads. How both are named and created.

Every message comes from an **agent** and is about a **project**, and Kabu shows them that way: one thread per agent
in each project, so "claude-code in payments-api" never mixes with "nightly-build in web".

- A **project** is a repository, a service or an environment: `payments-api`, `web`, `staging`.
- An **agent** is who is asking: `claude-code`, `copilot-cli`, `release-bot`, `nightly-build`.

## Naming them

Pass `project` and `agent` on a message or a session, by name. A name Kabu has not seen creates the project or agent,
and names that differ only in case, spaces, `-` and `_` are one: `My App`, `my-app` and `my_app` are the same project.
Without a `project`, a message goes to the project called `default`. Each also has an id (`prj_…`, `agt_…`) that
works wherever a name does.

You rarely type them. `kabu` names the project after the repository your coding agent started in, wherever its
commands run, and the agent after the coding agent that runs it (Claude Code, Copilot CLI, Codex, Cursor and others);
see [Which project](/docs/cli#which-project). Over MCP, `kabu mcp` fills in the same project, and the client's own
name is the agent's.

## Keys bound to a project or an agent

A key can be bound to a project, an agent or both. A bound key always sends as its agent, whatever a request says,
and as its project: a request that leaves the project out gets it, and one that names another project is refused with
`403`. That is how a shared CI system's key can only ever speak for its own job. See
[Keys and scopes](/docs/concepts/keys).

## Limits

Creating by name stops at 1,000 projects and 1,000 agent names per org, with `429`
[`quota_exceeded`](/docs/errors/quota_exceeded): reuse a name, or tidy up in the console. An agent that sends 20
near-identical messages within a minute is paused for 10 minutes, and you are told once, so a loop cannot flood your
phone. While it is paused, its messages are refused with `429` [`rate_limited`](/docs/errors/rate_limited) and a
`Retry-After` saying when the pause lifts.
