# Send signals to Linear or GitHub

Send signals to Linear or GitHub issues, keep their statuses in sync, and match commits to open signals.

All three panels live under **Signal → Integrations**. Only admins and owners
see the page, see [Roles and permissions](/articles/roles-and-permissions). Triage itself is on
[Signal](/articles/triage-bugs-and-suggestions).

| Panel | Does |
| --- | --- |
| **Linear** | Accepting a signal opens a Linear issue |
| **GitHub issues** | Accepting a signal opens a GitHub issue |
| **Commits** | Reads pushes to your repositories and flags commits that look like fixes |

Connect Linear, GitHub issues, or both. **Accept** opens an issue in every
tracker that is connected.

## Linear

1. **Connect**

   Press **Connect Linear** and authorize Median on Linear's screen. Finish
   within 15 minutes.

2. **Pick a team**

   Back in Median, the panel lists the workspace's teams under "Choose a team
   for new issues." Click the team new issues should go into.

Once connected, the panel shows the team as `KEY · Team name` and the
workspace with who connected it.

| Control | Does |
| --- | --- |
| **File issues automatically** | On by default. Opens a Linear issue for every new signal, without waiting for **Accept**. That is every source except filing by hand: the agent, notes from the feedback panel, the CLI, the API and MCP, crash reports, Discord channels and the feedback board. Declined signals are skipped. Covers suggestions as well as bugs. |
| **Disconnect** | Revokes Median's access to the workspace. Existing issues stay in Linear. Status sync with them stops. |

The Median app creates the issues, not the person who connected it. Issues stay
in Linear if that person leaves. Reconnecting the same workspace keeps the team
you picked.

| Message | Fix |
| --- | --- |
| Linear connection was not authorized. Try connecting again. | You declined on Linear's screen. Press **Connect Linear** again. |
| The connection did not finish. Try again. | Press **Connect Linear** again. |
| This connection link has expired or was already used. Start again from Median. | More than 15 minutes passed. Start again from **Connect Linear**. |
| Median cannot see any teams in that workspace. | Connect a workspace with at least one team you can access. |
| Linear turned us away. Connect the workspace again. | Access was revoked in Linear. **Disconnect**, then connect again. |
| Linear is not answering right now. | Try again later. |
| Linear would not open that issue. | Try **Accept** again. |
| Linear integration is unavailable. Contact Median support. | Contact Median support. |

## GitHub issues

GitHub issues go through the Median GitHub App. The same app syncs repositories
into [Knowledge](/articles/connect-knowledge-sources) and reads commits for the
**Commits** panel. It needs write access to issues on the repository.

1. **Install the app**

   If no GitHub account is connected yet, press **Connect GitHub**. Install
   the app on GitHub and give it access to the repository.

2. **Pick a repository**

   The panel reads "Choose a repository for new issues." Search the list,
   then press **Connect** on the repository. The account menu beside the
   search switches GitHub accounts, and **Connect another account** in that
   menu adds one.

One repository per organization. To use another, press **Disconnect** and pick
again.

| Control | Does |
| --- | --- |
| **File issues automatically** | On by default. Same rule as Linear. |
| **Disconnect** | Stops new issues and stops Median updating existing ones. Existing issues stay on GitHub. Closing or reopening one of them on GitHub still moves its signal while the Median GitHub App can see the repository. |

Each issue gets the label `bug` or `suggestion`.

| Message | Fix |
| --- | --- |
| No repositories available. Grant Median access on GitHub. | Give the app access to the repository in your GitHub settings. |
| GitHub would not open an issue. The Median app needs write access to issues on that repository. | Accept the app's permission to write issues in your GitHub settings. |
| That repository has issues turned off. | Turn on Issues in the repository's settings. |
| GitHub could not find that repository. Check the app can still see it. | Give the app access to the repository again. |
| GitHub would not open that issue. | Try **Accept** again. |

## Where errors show

| When | Where |
| --- | --- |
| **Accept** on a card | Under **Approvals** on the Signal page. The signal still moves to Planned. |
| **Accept** on a signal's page | In the sidebar of that page |
| Bulk **Accept** | "N could not reach a tracker." in the bulk bar |
| Automatic filing, issue updates, status sync | No message on the signal. A failed **Issue sync** entry in [Logs](/articles/search-your-logs). |

## Commits

The **Commits** panel reads pushes to your repositories and flags commits that
look like they fix an open signal. It needs the Median GitHub App on those
repositories.

1. **Pick a repository**

   Under **Add a repository**, press **Choose** on a repository. The form is
   open while no repository is watched. After that, press **Add repository**.

2. **Pick a branch**

   **Branch** starts on the repository's default branch. Leave it to follow
   whatever the default branch is, or pick another one.

3. **Confirm**

   Press **Watch repository**. The repository appears with "Watching the
   default branch" or "Watching" and the branch name.

The trash button on a row stops watching that repository.

| Limit | Value |
| --- | --- |
| Repositories | 10 per organization. The 11th fails with "Median watches 10 repositories at most." |
| Same repository twice | Refused with "That repository is already watched." |
| Branch | Only pushes to the watched branch are read |
| Commits per push | The last 20. Only the first line of each message is read. |
| Signals compared | Up to 60 signals that are not Done or Declined, bugs and suggestions. Suggestions are read before bugs. |

Matching runs on AI and uses credits, see [Plans](/articles/manage-your-plan-and-credits#plans). A
commit is claimed once per signal, even if GitHub delivers the push twice.

### Confirm or dismiss a match

A match shows in three places.

- A commit glyph with a count on the signal's row.
- The **Commits** section on the signal's page, with the message, short SHA,
  author, the reason it looks like a fix, and a link to the commit.
- A **Fix to confirm** item on [Home](/articles/find-your-way-around-the-dashboard#home).

| Button | Does |
| --- | --- |
| **Confirm fix** | Moves the signal to Done. Reporters get their message. |
| **Dismiss match** | Removes the claim. The status does not change. |

### Close signals automatically

Each watched repository has a **Close signals automatically** switch. It is off
by default. When on, a matching commit moves the signal to Done at once and its
reporters get their message, with nobody confirming. It applies to bugs and
suggestions alike. The commit stays on the signal's page as the record of why it closed.

## What an issue contains

| Part | Content |
| --- | --- |
| Title | The signal's title |
| Body | The signal's write-up |
| **Reports (N)** | The 5 newest reports. Each has the name, the time in UTC, the quote, screenshots, page, viewport, app state, attached values, the last 5 browser log entries, and server check results. More reports are counted as "And N more reports, in Median." |
| Footer | The line `Priority: medium · Reported through Median.` and an **Open it in Median** link |
| Linear priority | Urgent, High, Medium or Low, matching the signal |
| GitHub label | `bug` or `suggestion` |

Median rewrites the title and body whenever the signal's content changes. That
covers an edit, a new report, a merge and a priority change. Edits made to the issue
body in the tracker are replaced on the next update. Linear also gets the new
priority.

## Status sync

Median updates linked issues while their tracker is connected. Linear changes
reach Median while Linear is connected. GitHub changes reach Median while the
Median GitHub App can see the repository.

| Signal moves to | Linear issue | GitHub issue |
| --- | --- | --- |
| Open, Planned | An unstarted state, such as Todo | Reopened |
| In progress, In review | A started state | Open |
| Done | A completed state | Closed as completed |
| Declined | A canceled state | Closed as not planned |

| Linear issue moves to | Signal |
| --- | --- |
| A completed state | Done |
| A canceled state | Declined |
| A started state | In progress. A signal already In review stays there. |
| Backlog, triage or unstarted | No change |

| GitHub issue is | Signal |
| --- | --- |
| Closed as not planned | Declined |
| Closed for any other reason | Done |
| Reopened | Open, back in Approvals |

A signal that reaches Done from a tracker messages its reporters like any other
move to Done, see [Telling reporters](/articles/triage-bugs-and-suggestions).
