The AI never files issues on its own. It only writes a draft when a teammate presses Create issue, and nothing reaches GitHub or Linear until that teammate presses Create in GitHub or Create in Linear.
Connect a tracker
Owners and admins connect trackers in Settings → Issue trackers. You can connect GitHub, Linear or both. Each card shows Connected or Not set up, where its credential comes from, and where issues go. Credentials can come from two places:- A Worker secret,
GITHUB_TOKENorLINEAR_API_KEY. It always wins over one pasted in Settings. The card then shows ✓ from the Worker secretGITHUB_TOKENand has no field to edit. See Secrets. - Pasted in Settings. The token is kept in the workspace’s Durable Object storage, not the database, and is never shown again: the card shows only its last four characters (✓ saved (•••• a1b2)). Paste a new one to replace it, or press Remove.
- GitHub
- Linear
Issues go to one repository.
1
Create a token
On GitHub, create a fine-grained personal access token. Under Repository access, choose Only select repositories and pick the repository. Under Permissions, set Issues to Read and write.
2
Add the token
Paste it in Token and press Save, or set it as the Worker secret
GITHUB_TOKEN instead:3
Set the repository
Enter it as
owner/name (for example acme/web-app; a github.com URL works too) and press Save.4
Test connection
Press Test connection. On success it reads
Connected to acme/web-app (private). If issues are turned off for the repository, it says so; turn them on in the repository’s settings.Create an issue
Any teammate can file an issue once a tracker is connected.1
Press Create issue
Open the conversation and press Create issue in the header (or choose Create issue in the command palette). Until a tracker is connected, the button is disabled and a Set up link next to it opens Settings → Issue trackers.
2
Wait for the draft
The dialog shows Drafting from the conversation and the visitor’s browser… for a few seconds. With both trackers connected, a GitHub / Linear switch at the top picks where it goes (the desk remembers your last choice in this browser). The line under it shows the repository or team.
3
Check and edit
Edit the Title and the Description (Markdown). For GitHub, Labels is a comma-separated list,
bug by default; GitHub applies only labels that already exist in the repository. Tick the screenshots to include, if the conversation has any.4
File it
Press Create in GitHub or Create in Linear. The issue is filed exactly as written.
- A toast shows Created acme/web-app#123 (or the Linear key, like
ENG-42) as a link. - The conversation gets an internal note,
Issue created: acme/web-app#123 — <title>, which teammates with the conversation open see live. - An Issues bar under the header links every issue filed from the conversation.
What goes in the draft
The draft has the same sections for GitHub and Linear. The AI writes only the story; everything factual comes straight from what the widget recorded, so the model can’t invent a request or an error.
The AI is told to use only these facts, to write
Unknown for anything it doesn’t know, and not to name the customer. It reads the conversation (customer, AI and team messages, plus internal notes and the AI’s handoff brief, marked as team notes) and the browser’s recorded events. The customer’s name and email are never sent to the model or put in the issue.
If the AI can’t write a draft, you get a template built from the same facts, with a note saying why:
- AI is off, so this is a template from the conversation and browser details.
- The monthly AI cap is reached, so this is a template.
- The AI couldn’t write a draft just now (it failed or took too long), so this is a template. The draft waits at most 15 seconds.
- The AI’s draft wasn’t usable, so this is a template.
draft AI job, so you can give it its own model. Its tokens count toward your usage, but a draft isn’t a reply, so it doesn’t use up the monthly reply cap. See Models.
Masking
Issue text goes through the same masking as the debug context:- The browser details were masked in the visitor’s browser and again on the server when they were stored (emails, tokens, query values; request bodies are never captured).
- The conversation is masked before the model sees it.
- The model’s answer is masked again, in case it echoed something.
- When you press Create, the title and description you edited are masked once more on the server before they’re sent, so an email or token pasted into the description doesn’t reach the tracker.
Screenshots
If images were attached to the conversation (by the customer, a teammate, or in a note), the dialog lists them under Screenshots with checkboxes. You can include up to 10. Where they end up depends on the tracker:
GitHub has no API for uploading images to an issue, which is why images there are links to your desk. The links are long random addresses, but they aren’t behind a sign-in. If an image fails to upload to Linear, the issue is still filed and the toast says how many images couldn’t be attached.
Next steps
Debug context
What the widget records in the customer’s browser.
Secrets
Set
GITHUB_TOKEN and LINEAR_API_KEY as Worker secrets.