Create and configure a Linear agent app so the assistant can manage issues, projects, and workflows under its own identity
assistant skills install linear-app-setupSet up a Linear agent app so the assistant operates under its own identity in a Linear workspace — creating issues, commenting, updating status, etc. as itself.
Linear agent apps act as their own entity in the workspace. They're free (don't count as billable users), can be @mentioned, and can be delegated issues.
Total manual effort: ~3 interactions — create the app, grab the API key, (optionally) upload an avatar.
Direct the user to create a new application:
Open https://linear.app/settings/api/applications/new to create a new application.
Guide them through the form:
| Field | Value |
|---|---|
| Application name | The assistant's name. This is how the agent appears in mentions and filters. |
| Developer name | The user's name or org name |
| Developer URL | Any valid URL |
Click Create when done.
After creating the app, the user should generate a personal API key scoped to this app identity. This is how the assistant authenticates — simpler and more reliable than the full OAuth token refresh flow.
Direct the user:
On the app's settings page, look for the option to create an API key for this application. Copy the key.
Prompt for the API key via secure UI:
credential_store:
action: "prompt"
service: linear
field: api_key
label: "Linear App API Key"
placeholder: "lin_api_xxxxxxxxxx"
description: "API key for your Linear app (used to authenticate API requests)"
allowed_domains: ["api.linear.app"]
allowed_tools: ["bash"]
injection_templates:
- hostPattern: "api.linear.app"
injectionType: header
headerName: Authorization
valuePrefix: "Bearer "
After storing the key, verify the connection:
curl -s -X POST https://api.linear.app/graphql \
-H "Content-Type: application/json" \
-d '{"query":"{ viewer { id name email } }"}'
Run with network_mode: "proxied" and the linear credential. A successful response returns the app's identity:
{
"data": {
"viewer": {
"id": "...",
"name": "MyAssistant",
"email": "...@oauthapp.linear.app"
}
}
}
The @oauthapp.linear.app email confirms it's an app actor, not a user.
Linear doesn't support setting the avatar via API — it must be uploaded through the web UI.
If the assistant has an avatar, send it to the user:
<vellum-attachment source="sandbox" path="data/avatar/avatar-image.png" />
Then direct them to the app settings page:
Go to https://linear.app/settings/api, find your app, and upload the avatar image under the app icon.
The app appears as a distinct entity in Linear:
app:mentionable scope is enabledapp:assignable scope is enabled — delegation sets the app as delegate, not assignee, so humans keep ownershipWhen the agent performs an action that originated from a specific user in a third-party system, use createAsUser and displayIconUrl to attribute it:
mutation {
issueCreate(
input: {
title: "Bug report"
teamId: "TEAM_UUID"
createAsUser: "Jane"
displayIconUrl: "https://example.com/jane-avatar.png"
}
) {
success
issue {
identifier
url
}
}
}
This renders as "Jane (via AppName)" in Linear.
After installation, workspace admins can modify the app's team access at any time through the app's details page in Linear settings.