Attach artifacts to pull requests

Attach artifacts to pull requests

Stage as you work with put. Attach when a PR is already open. Share a URL for any file.

Attach files to a PR #

With a pull request open, run attach from its branch:

uploads attach ./screenshot.png

The files land on the PR as one managed comment:

Run attach again and the same comment updates in place.

attach finds the repo and PR through the gh CLI. To target something else, add --pr <n> or --issue <n>, plus --repo owner/name for another repo.

Stage before a PR exists #

No PR yet? Upload with put. On any branch other than the default, it stages the file for that branch’s future PR:

uploads put ./after.png

uploads screenshot stages the same way. When the PR opens, staged files move onto it: right away with the GitHub App, or on your next uploads attach.

Staging several files at once? Use uploads attach --branch.

To see what’s queued, run uploads staged:

uploads staged
$ uploads staged
after.webp 94.2 KB staged 2026-07-22T14:00:00Z https://storage.uploads.sh/gh/you/app/branch/feat-nav/after.webp
binding: self — these auto-attach when this branch's PR opens
once the PR exists: uploads attach --promote

If binding shows anything other than self, the files won’t attach on their own. See GitHub App: staging before a PR exists to fix it.

Get a URL for a file #

put uploads a file and prints a public URL and Markdown you can paste anywhere:

uploads put
$ uploads put ./shot.png
>> optimized 411.5 KB → 94.2 KB (shot.webp)
URL: https://storage.uploads.sh/screenshots/app/2026-07-12/shot-9f2c1a.webp
MARKDOWN: ![shot.png](https://storage.uploads.sh/screenshots/app/2026-07-12/shot-9f2c1a.webp)

Common flags:

  • --pr <n> also posts the file to that PR.
  • --url <url> uploads a file from the web instead of a local path.
  • --no-optimize keeps the original bytes.

put converts images to WebP and strips their EXIF data. It keeps a few capture details, like viewport and device, and shows them on the file’s public page. See Good to know for what’s kept and how to turn it off.

Pair a before and after #

Tag two images with --state and they render side by side in the comment:

uploads put ./hero-before.webp --state before
uploads put ./hero-after.webp --state after

If one comment has several pairs, give each pair the same --meta path=<page> value so they match up. Without a path, files pair by name, so hero-before.webp matches hero-after.webp.