Attach artifacts to pull requests
Get started
GitHub
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.pngThe 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.pnguploads 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 stagedafter.webp 94.2 KB staged 2026-07-22T14:00:00Z https://storage.uploads.sh/gh/you/app/branch/feat-nav/after.webpbinding: self — these auto-attach when this branch's PR opensonce the PR exists: uploads attach --promoteIf 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 ./shot.png>> optimized 411.5 KB → 94.2 KB (shot.webp)URL: https://storage.uploads.sh/screenshots/app/2026-07-12/shot-9f2c1a.webpMARKDOWN: 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-optimizekeeps 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 beforeuploads put ./hero-after.webp --state afterIf 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.