--- title: Linear tracker description: Linear issues. Direct API key or Composio-mediated — AO picks the right transport automatically. ---
Slot: tracker · Name: linear
The Linear tracker supports two transports and auto-picks between them: - **Composio-mediated** — when `COMPOSIO_API_KEY` is set. Takes priority. - **Direct API** — when `LINEAR_API_KEY` is set. ## Setup ### Direct Linear API 1. [Create a personal API key](https://linear.app/settings/api) in Linear. 2. Export it: ```bash export LINEAR_API_KEY=lin_api_... ``` 3. Configure AO: ```yaml tracker: linear projects: api: tracker: linear trackerConfig: teamId: TEAM-123 # required for issue creation workspaceSlug: myteam # optional, used to build issue URLs ``` ### Composio-mediated If you already use the [Composio toolkit](https://composio.dev): ```bash export COMPOSIO_API_KEY=... export COMPOSIO_ENTITY_ID=... # optional; defaults to "default" ``` AO detects this and routes Linear calls through Composio — no separate Linear token needed. `COMPOSIO_ENTITY_ID` is optional; if omitted it defaults to `"default"`. ## Per-project config | Key | Required | What it does | |---|---|---| | `teamId` | ✓ (for `createIssue`) | Linear team the issue lives in | | `workspaceSlug` | optional | Used to render `https://linear.app/{slug}/issue/{id}` URLs | ## Branch names Linear issues expose a `branchName` field — the string shown in the **Copy git branch name** button in the Linear UI (formatted according to your workspace settings in **Settings → Integrations → GitHub → Branch format**). When AO spawns an agent for a Linear issue it: 1. Reads the issue's `branchName` field from the Linear API (if present and git-safe). 2. Falls back to `feat/` if `branchName` is absent or contains characters that aren't valid in a branch name. You can customise the format globally via Linear's branch format settings — AO will pick up whatever Linear generates automatically. ## Issue identifiers Linear uses `TEAM-42`-style identifiers, not numbers. `ao spawn TEAM-42` works as you'd expect.