---
name: linear-weekly-changelog
description: "Every Friday: the issues completed in Linear this week, filtered to what customers will notice and rewritten as a short changelog ready to edit. Use when the user asks for this, or when it runs on a schedule."
---

# Linear weekly changelog

Every Friday: the issues completed in Linear this week, filtered to what customers will notice and rewritten as a short changelog ready to edit.

The list of issues completed this week is not a changelog. Half of it is internal work, and the rest is titled for the people who built it, not the people who will use it.

Every Friday the agent takes the week's completed issues, drops internal ones by label, merges issues from the same project into one line, and rewrites the rest in plain second person: what you can do now that you could not before. Product managers get a draft to edit instead of a list to translate.

## Two ways to get the data

Use the API or MCP route when you have an MCP server, a CLI or an API token for the app. Otherwise, if you can drive a browser the user is signed in to (Claude in Chrome, a Playwright or Chrome DevTools MCP server), use the browser route. Say which one you used.

## Route A: API or MCP server

### What you need

- Read access to the teams whose work belongs in the changelog.
- The Linear MCP server or connector, or a read-only Linear API key in `LINEAR_API_KEY`.

If something is missing, say what and stop; do not invent numbers.

### Steps

1. **Collect completed issues** (Linear): Query `issues(filter: { completedAt: { gt: "-P7D" }, team: { key: { in: ["ENG", "WEB"] } } }, first: 200)` with `identifier title description labels { nodes { name } } project { name } parent { identifier } url`. Linear accepts ISO 8601 durations like `-P7D` as dates relative to now.
2. **Drop what customers never see**: Leave out issues labelled `internal`, `chore`, `tech-debt` or `infra`, and sub-issues whose parent is also on the list. Small fixes stay in: they are often what a customer wrote in about.
3. **Group and merge**: New for capabilities that did not exist, Improved for changes to something that did, Fixed for bugs. Issues from the same project become one line.
4. **Rewrite for customers**: Each line says what changed for the user, without issue IDs, code names or team names: "Duplicate a dashboard from its menu, filters included." Keep the identifiers behind each line in a separate list for your reference.
5. **Hand over the draft**: Markdown with a dated heading and at most 10 lines across the three sections. Name the plan or flag for anything that not every customer gets.

## Route B: the browser

### What you need

- Signed in to Linear with read access to the ENG and WEB teams; guests see only the teams they were invited to.

If something is missing, say what and stop; do not invent numbers.

### Steps

Start at https://linear.app/. The user is signed in already; never type passwords or codes, and ask if a sign-in page appears.

1. **Open the team's issues**: In the sidebar, open the first team (ENG) and click **Issues**, then the **All** tab so completed issues are included. Do the same for WEB afterwards, or use the **Issues** entry at the top of the sidebar for all teams at once.
2. **Filter to this week's completed work**: Click **Filter**, add `Status` is `Completed`, then add `Completed date` and pick the option for the past week. Add `Labels` is not `internal`, `chore`, `tech-debt`, `infra`. In **View options**, group by `Project` and show `Labels` and `Parent`.
3. **Read the list**: Open any issue whose title does not explain the change and read the description. Skip sub-issues whose parent is also in the list. Note each issue's identifier and project.
4. **Write the changelog**: Sort into New, Improved and Fixed, merge issues from the same project into one line, and rewrite each in plain second person without identifiers, code names or team names. Keep the identifiers in a separate list.
5. **Record what was left out**: Remove the label filter for a moment and read the count in the view header, so the draft can say how many internal issues were skipped.

Note: The issue list loads more rows as you scroll; a team that completes more than a couple of hundred issues a week is better served by the API route or a CSV export from Settings > Administration > Import / Export.

## The report

- A Markdown changelog for the week, with **New**, **Improved** and **Fixed** sections.
- One line per change, in customer language.
- **Left out**: how many internal issues were skipped, so you can check nothing public was dropped.
- **Sources**: the Linear identifiers behind each line.

## Post it to Briefkin

When `BRIEFKIN_TOKEN` is set, or `~/.config/briefkin/env` exists (the installer from https://briefkin.dev/docs writes it), also send the result to the user's Briefkin board as one card. Keep the `item_key` the same on every run so the card updates in place, use a new `event_id` per run, and put today's real numbers in place of the example ones. If the request fails, say so once and carry on.

```bash
[ -n "${BRIEFKIN_TOKEN:-}" ] || . ~/.config/briefkin/env
curl -sS -X POST "${BRIEFKIN_URL:-https://briefkin.dev}/v1/events" \
  -H "authorization: Bearer $BRIEFKIN_TOKEN" \
  -H "content-type: application/json" \
  -d @- <<'JSON'
{
  "v": 1,
  "event_id": "linear-weekly-changelog/<date of this run, e.g. 2026-10-16>",
  "item_key": "linear-weekly-changelog",
  "project": "Acme",
  "source": "Linear weekly changelog skill",
  "kind": "update",
  "title": "Changelog draft for the week of Oct 12",
  "summary": "23 issues completed this week; **9 lines** made the changelog after 14 internal issues were left out.",
  "widget": [
    {
      "type": "Table",
      "props": {
        "columns": [
          "Section",
          "Change"
        ],
        "rows": [
          [
            "New",
            "Duplicate a dashboard from its menu, filters included"
          ],
          [
            "New",
            "Schedule a report to arrive by email (Business plan)"
          ],
          [
            "Improved",
            "Search finds customers by phone number"
          ],
          [
            "Improved",
            "The invoice list loads 50 rows at a time instead of 20"
          ],
          [
            "Improved",
            "Team invites stay valid for 14 days instead of 3"
          ],
          [
            "Fixed",
            "Charts no longer show a gap at midnight in your time zone"
          ],
          [
            "Fixed",
            "CSV imports accept files saved by Excel on a Mac"
          ],
          [
            "Fixed",
            "The Save button stays visible while you scroll long forms"
          ],
          [
            "Fixed",
            "Email digests no longer arrive twice after an address change"
          ]
        ]
      }
    },
    {
      "type": "Callout",
      "props": {
        "text": "Scheduled reports are Business-only, so that line names the plan.",
        "tone": "info"
      }
    }
  ]
}
JSON
```

Widgets come from the Briefkin catalog (https://briefkin.dev/v1/catalog). Without a token, just give the user the report.

## Run it on a schedule

Suggested: Fridays at 14:00 (`0 14 * * 5`). From cron, with the agent signed in on that machine:

```bash
0 14 * * 5 claude -p "Run the linear-weekly-changelog skill"
# Codex: codex exec, Gemini CLI: gemini -p, Copilot CLI: copilot -p, OpenCode: opencode run
```

Or use the agent's own scheduler (Claude Code routines, Codex automations, Claude or ChatGPT scheduled tasks): https://briefkin.dev/skills/linear-weekly-changelog#schedule

Source: https://briefkin.dev/skills/linear-weekly-changelog
