Install
rowshape is a single static Go binary. There is no runtime to install and no services to run. Every channel delivers the same binary.
Homebrew
brew install rowshape/tap/rowshaperowshape --helpgo install
go install github.com/rowshape/rowshape@latestInstalls into $(go env GOPATH)/bin; make sure that is on your PATH.
npm / npx
npx rowshape --help# or add it to a project:npm install --save-dev rowshapeDirect download — darwin_arm64 for Apple silicon, darwin_amd64 for Intel:
VERSION=1.2.3 # the release you want, without the leading vcurl -sSLO "https://github.com/rowshape/rowshape/releases/download/v${VERSION}/rowshape_${VERSION}_darwin_arm64.tar.gz"tar -xzf "rowshape_${VERSION}_darwin_arm64.tar.gz"./rowshape --helpHomebrew
brew install rowshape/tap/rowshapego install
go install github.com/rowshape/rowshape@latestInstalls into $(go env GOPATH)/bin; make sure that is on your PATH.
npm / npx
npx rowshape --helpDirect download — linux_amd64 or linux_arm64:
VERSION=1.2.3 # the release you want, without the leading vcurl -sSLO "https://github.com/rowshape/rowshape/releases/download/v${VERSION}/rowshape_${VERSION}_linux_amd64.tar.gz"tar -xzf "rowshape_${VERSION}_linux_amd64.tar.gz"sudo install rowshape /usr/local/bin/go install
go install github.com/rowshape/rowshape@latestnpm / npx
npx rowshape --helpDirect download — Windows archives are .zip, windows_amd64 or
windows_arm64:
$Version = "1.2.3" # the release you want, without the leading vInvoke-WebRequest -OutFile rowshape.zip ` "https://github.com/rowshape/rowshape/releases/download/v$Version/rowshape_${Version}_windows_amd64.zip"Expand-Archive rowshape.zip -DestinationPath rowshape.\rowshape\rowshape.exe --helpGitHub Action — installs the release binary, verifies it, runs validate
and annotates the pull request:
- uses: rowshape/rowshape@v1 with: fixture: rowshape.yaml migrations: migrations/ ephemeral: postgres://postgres:postgres@localhost:5432/postgres?sslmode=disableSee the GitHub Action reference for the full workflow, inputs and exit-code gating.
Docker — a FROM scratch image for linux/amd64 and linux/arm64, tagged
with each version and latest:
docker run --rm ghcr.io/rowshape/rowshape:latest --helpRelease archives
Section titled “Release archives”Each release publishes six archives, named by .goreleaser.yaml as
rowshape_<version>_<os>_<arch> — the version without its leading v, raw
GOOS and GOARCH:
rowshape_<version>_darwin_amd64.tar.gzrowshape_<version>_darwin_arm64.tar.gzrowshape_<version>_linux_amd64.tar.gzrowshape_<version>_linux_arm64.tar.gzrowshape_<version>_windows_amd64.ziprowshape_<version>_windows_arm64.zipEach archive holds the rowshape binary, LICENSE and README.md. Alongside
them: checksums.txt, its cosign signature and certificate, and one SPDX SBOM
per archive.
Supply chain
Section titled “Supply chain”You do not have to verify by hand. The GitHub Action and the npm installer
both check the archive against checksums.txt and refuse to run a binary that
does not match; the Action can also require the cosign signature — see its
supply-chain verification
inputs, verify and verify-signature.
Verify a manual download yourself
Check the signature over checksums.txt first — it proves who produced the file
— then check your archive against it:
# 1. The signature is keyless, so the certificate identity must be pinned.cosign verify-blob \ --certificate checksums.txt.pem \ --signature checksums.txt.sig \ --certificate-oidc-issuer "https://token.actions.githubusercontent.com" \ --certificate-identity-regexp "^https://github.com/rowshape/rowshape/\.github/workflows/.+@refs/tags/" \ checksums.txt
# 2. Now that checksums.txt is trusted, check the archive against it.sha256sum --ignore-missing -c checksums.txtOrder matters: verifying the archive against an unverified checksums.txt
proves only that the two files agree, which an attacker who replaced both can
arrange. The identity flags are required — without them cosign will not verify a
keyless signature at all.
The binary is a single static executable with a deliberately small dependency set — half the reason rowshape is written in Go.
Quickstart: pull a fixture, validate a migration that fails on real data, fix it, and get a PASS.