Turn this week's completed Linear issues into a customer 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.

Runs
Fridays at 14:00
Uses
Linear
Posts
Report card

What lands on your board

AcmeLinear weekly changelog · Claude Code

Changelog draft for the week of Oct 12

23 issues completed this week; 9 lines made the changelog after 14 internal issues were left out.

SectionChange
NewDuplicate a dashboard from its menu, filters included
NewSchedule a report to arrive by email (Business plan)
ImprovedSearch finds customers by phone number
ImprovedThe invoice list loads 50 rows at a time instead of 20
ImprovedTeam invites stay valid for 14 days instead of 3
FixedCharts no longer show a gap at midnight in your time zone
FixedCSV imports accept files saved by Excel on a Mac
FixedThe Save button stays visible while you scroll long forms
FixedEmail digests no longer arrive twice after an address change

Scheduled reports are Business-only, so that line names the plan.

Done
An example with made-up numbers. Your agent posts your real ones.

What it does

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.

How it works

  1. 1Collect completed issues

    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. 2

    2Drop 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. 3

    3Group 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. 4

    4Rewrite 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. 5

    5Hand 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.

  6. Post it to the board

    With BRIEFKIN_TOKEN set, the agent sends the result as one card that updates in place every run. Without it, you get the report in the chat.

What you get

  • 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.

Install and run it

Pick your agent, where the data comes from and how to schedule it; the commands below follow.

Agent
Data
Schedule
  1. Install the skill

    One command. It puts the SKILL.md in ~/.claude/skills and in ~/.agents/skills, which Codex, Cursor, Gemini CLI, Copilot CLI and OpenCode read too.

    shellcurl -fsSL https://briefkin.dev/skills/linear-weekly-changelog/install | sh
  2. Run it

    Ask Claude Code:

    promptRun the linear-weekly-changelog skill

    Or paste the prompt instead of installing:

    promptUsing the Linear GraphQL API (or the Linear MCP server), list issues completed in the last 7 days (completedAt greater than -P7D) for teams ENG and WEB, with title, description, labels, project and parent. Drop internal work (labels internal, chore, tech-debt, infra) and sub-issues whose parent is in the list. Write a customer-facing changelog in Markdown with New, Improved and Fixed sections, at most 10 lines, each saying what the user can now do in plain second-person language, with no issue IDs or internal names. Note anything behind a plan or feature flag. After the changelog, list the Linear identifiers behind each line and how many issues you left out.
  3. Put it on a schedule

    Fridays at 14:00, from cron on any machine where Claude Code is signed in:

    crontab0 14 * * 5 claude -p "Run the linear-weekly-changelog skill"

    Add it with crontab -e. A laptop asleep at that time runs it when it wakes if you use launchd or Task Scheduler instead; GitHub Actions works for the API route.

  4. Send it to your board

    Connect Briefkin once with curl -fsSL https://briefkin.dev/install | sh and every run lands on your board as a report card. How setup works

View the SKILL.mdRaw file
SKILL.md---
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

What your agent needs

  • 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.

Connecting Linear

  1. Linear MCP server, Linear's official remote server at https://mcp.linear.app/mcp. Add Linear from Claude's connector directory, or run claude mcp add --transport http linear https://mcp.linear.app/mcp in Claude Code, and sign in with OAuth.
  2. GraphQL API with a personal API key. Create a key in Linear's settings under Security & access, store it in LINEAR_API_KEY, and send it as the Authorization header with no Bearer prefix. For a workspace bot, an OAuth app with the read scope does the same job.

When you create the key, give it Read access and only the teams in the report; it then can't create or edit issues.

Questions

Does it publish the changelog anywhere?

No, it drafts. Paste it into your changelog page, help center or release email after a read-through. If your changelog lives in a docs repo, you can ask the agent to open a pull request with the draft as a separate step.

What if an issue is completed but not released yet?

Linear does not know what is deployed. If you ship behind flags or on a release train, add a label such as released when it goes out and filter on that label instead of completedAt.

Do I need Briefkin to use the Linear weekly changelog skill?

No. The skill runs with your own agent and gives you the report in the chat. With a Briefkin token set, each run also posts it to your board as a report card, so you can glance at it instead of asking again.

Which agents can run it?

Claude Code, Codex, Cursor, Gemini CLI, GitHub Copilot CLI, OpenCode, Windsurf and Amp all read SKILL.md files. The install command puts it in ~/.claude/skills and ~/.agents/skills, where they look. ChatGPT, the Claude app and Grok take the prompt instead. Pick your agent under "Install and run it" and the commands change to match.

Can it work without an API or MCP server, from my browser?

Yes. Switch the data source to "Your browser" and the steps change to the Linear pages themselves: the agent opens linear.app in a browser you are signed in to and reads the numbers off the page. Claude Code, Codex, Cursor, Claude app and ChatGPT can drive a browser out of the box; Gemini CLI, Copilot CLI and OpenCode need a Playwright or Chrome DevTools MCP server first. It is slower than the API and needs you signed in, so it suits a report you run by hand or from a scheduler on your own computer.

Read this report on your board, not in a chat log

Skills are free to use with any agent. Briefkin is where their results land: one board for every report, number and question your agents send, with a ping when something needs you.

Free during the open beta. No card.