Free · GitHub Marketplace · runs on your runner

A GitHub Action that writes the changelog, the email, and the Release

You tagged the release. You still owe five write-ups. Add uses: shipnotepack/action@v1. The next tag prints changelog, customer email, social posts, a GitHub Release body, and a Discord/Slack note into the Actions job summary — and opens a draft Release if that tag has none. ShipNote never sees the repo.

GitHub Marketplace One-off pack on the website

What the job writes

Changelog

Keep-a-Changelog headings when CHANGELOG.md has Features / Fixes. Otherwise a polished list from the git log.

Customer email

Subject plus a body you can paste into your ESP. Same facts as the tag. No invented features.

Social posts

Short posts plus a longer note. Pain hooks only when a bullet mapped to a known pain.

GitHub Release + chat

A Release body for the draft, and a Discord/Slack paste for #releases. Same scope as the tag.

Install in one commit

Lead with the Marketplace Action. Save as .github/workflows/shipnote-pack.yml:

name: ShipNote pack

on:
  push:
    tags:
      - "v*"
      - "[0-9]*"

jobs:
  pack:
    runs-on: ubuntu-latest
    permissions:
      contents: write
    steps:
      - uses: shipnotepack/action@v1
  1. Copy that workflow (button above) or add ShipNote pack from GitHub Marketplace.
  2. Commit it on the default branch. Public repo: github.com/shipnotepack/action.
  3. Push a tag that matches v* or starts with a number (v1.8.0, 1.8.0).
  4. Open the Actions run. The job summary is the pack. The job also opens a draft GitHub Release if that tag has none — edit it, then publish.
Will not take a third-party Action? Copy github-action.yml into the same path instead. Same packer, downloaded onto the runner at job time so the file in your repo cannot drift. The live file is the source of truth — do not rewrite it to uses:.
Private repos: the website cannot Load & generate a private GitHub URL. This Action can, because it runs on your runner with your checkout. That is the path for private code.

What it reads

Same packer as the website (pack-core.js). uses: shipnotepack/action@v1 runs the copies vendored in the Action repo — the job does not download them. The copy-paste workflow curls those files from shipnotepack.com at job time.

  1. CHANGELOG.md first — also changelog.md, CHANGELOG.txt, History.md, HISTORY.md, NEWS.md, CHANGES.md, RELEASES.md. Latest version section only. Features / Fixes headings stay in the changelog and GitHub channels.
  2. Else git log since the previous tag (git describe). Chore and merge noise is dropped.
  3. If this is the first tag, the last 40 commits.

After the run you also get a shipnotepack.com/?gh= link. Open it to change tone or copy panels in the browser. The compare or CHANGELOG blob URL is public-only on the website; the job summary already has the pack either way.

What the job summary looks like

From a CHANGELOG section with one feature and two fixes, the summary is the five channels in one place. Shortened:

# ShipNote pack for AcmeBoard v1.8.0

Built on your runner from CHANGELOG since v1.7.0. ShipNote did not see this log.

## Changelog
## v1.8.0 - Faster exports, Clearer billing
### Features
- CSV export streams so big workspaces do not time out
### Fixes
- Invoice email subjects now show the correct plan name
- Fixed a crash when renaming a project mid-sync

## Customer email
Subject: AcmeBoard v1.8.0 — 1 feature, 2 fixes
…

## GitHub Release body
## What's new
AcmeBoard v1.8.0 — 1 feature, 2 fixes.
### Features
- CSV export streams so big workspaces do not time out
…

Copy from the summary into the changelog file, the ESP, social, and chat. Or publish the draft Release the job already opened.

Website pack vs Action pack

Website Action
When You paste once, now Every matching tag, unattended
Input Bullets, git log, public GitHub URL CHANGELOG.md in the repo, else git log
Private repos Paste a git log Works; the runner already has the checkout
GitHub Release Copy, then Open releases/new Opens a draft Release for the tag
Who sees the log Your browser, plus public GitHub fetch if you Load a public URL Your GitHub runner only

Privacy and permissions

  • uses: shipnotepack/action@v1 does not download JS at runtime. The packer is vendored in the Action. No POST of your log.
  • The copy-paste workflow curls pack-core.js, commit-dump.js, and pack-cli.js from shipnotepack.com. It does not POST your log anywhere.
  • contents: write is only so gh release create --draft can run with GITHUB_TOKEN.
  • On the Marketplace Action, set input create_draft_release: "false" to write the job summary and skip the draft Release. On the copy-paste file, set SHIPNOTE_CREATE_DRAFT_RELEASE: "false".
  • If that tag already has a Release, the job leaves those notes alone.

Troubleshooting

The workflow did not run

Tags must match v* or [0-9]*. release-candidate will not fire it. The file has to be on the default branch before you push the tag, or the tag commit must include it.

The pack is chore soup

Put a CHANGELOG.md at the repo root with a latest version section. The Action prefers that file over the git log. On the website, paste the CHANGELOG URL instead.

It did not open a draft Release

A Release for that tag already exists, or draft-release is off. The job summary still has the GitHub-channel body to paste.

I want a different product name

Pass product on uses: shipnotepack/action@v1. The copy-paste workflow uses the repo name. Either way you can open the ?gh= link from the summary and change Product name, then Generate & copy.

The copy-paste workflow (no third-party Action)

Open raw file

Save as .github/workflows/shipnote-pack.yml. The live file at /github-action.yml is the source of truth for this path — copy from there so comments and the packer stay in sync.

Copy-paste yml instead