Skip to content

What Shipped

Dan Riddell edited this page Sep 30, 2026 · 1 revision

What shipped

Every release body ends with a collapsed section comparing this release's manifest against the previous one:

<details><summary>What shipped (vs v1.2.8)</summary>
from to
toolchain go1.27.1 go1.27.2
+ dependency github.com/some/dep v1.4.0
~ dependency golang.org/x/net v0.21.0 v0.23.0
linux/amd64 12.4 MB 16.8 MB (+35%)

A changelog is a human account of a change. This is what the artifacts say, and the two disagree more often than anyone would like: a dependency bump nobody wrote a commit message about still moves every binary.

The toolchain row is the one that earns its place. A compiler change moves every target at once, which no dependency accounts for, and it is the first thing worth ruling out when a binary grew for no apparent reason.

What is in it

  • Toolchain — the Go version that built each release.
  • Dependencies — added, removed and changed, direct and indirect.
  • Sizes — per target.

Size rows appear only for changes over 1%, at most five of them, largest first. Under that threshold it is noise, and a section people scroll past is a section that stopped working.

API changes are not in it. The notes already carry the API-derived changelog section, and saying it twice in one release body helps nobody. letsgo diff --format md does include them, because there is no changelog beside it there.

When it is omitted

  • There is no previous manifest — a first release has nothing to compare against.
  • Nothing changed.
  • disable diff-notes in letsgo.mod. See Features.

It is compared against the same previous release the changelog uses, which depends on the kind of release: a stable release compares against the previous stable, so a v1.2.9 backported after v1.3.0 says "vs v1.2.8". See Prereleases.

release --snapshot shows the section too, so you can see what a release would say before making one.

letsgo diff

The same comparison, for any two releases:

$ letsgo diff v1.2.3 v1.3.0
v1.2.3 -> v1.3.0

binary size
  linux/amd64     12.4 MB -> 16.8 MB    +35%
  darwin/arm64    12.1 MB -> 16.5 MB    +36%

dependencies
  + github.com/some/large-dep v1.4.0
  ~ golang.org/x/net v0.21.0 -> v0.23.0

api
  ! example.com/foo: Client.Do: changed from func([]byte) error to func(context.Context, []byte) error

toolchain
  go1.23.4 -> go1.24.7
Flag Description
--format text|md|json Output format; text is the default
--repo Repository to compare in, as owner/name
--token Forge token (default: $GITHUB_TOKEN or $GH_TOKEN)

--format md produces the same table as the notes section, plus API changes — which is what makes it useful in a job summary or a pull request comment. --format json carries schema: 1:

{"schema": 1, "from": "v1.2.3", "to": "v1.3.0",
 "toolchain": {"from": "go1.23.4", "to": "go1.24.7"},
 "dependencies": [], "sizes": [], "size_kind": "binary", "api": []}

Every line comes from two JSON manifests. No rebuild, no downloads, no checkout — so it works on releases of repositories you have never cloned, and either side can be a local dist/letsgo.json instead of a tag. "What did the build I just ran do to the binary" is the same command.

Clone this wiki locally