-
Notifications
You must be signed in to change notification settings - Fork 0
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.
- 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.
- There is no previous manifest — a first release has nothing to compare against.
- Nothing changed.
-
disable diff-notesinletsgo.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.
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.
Start here
Releasing
Checking
Extending
Running it
About