---
title: "uploads.sh alternative — Krowk"
canonical_url: "https://krowk.com/alternatives/uploads-sh"
last_updated: "2026-09-02T08:09:37.159Z"
meta:
  description: "An honest comparison: what uploads.sh does better, what Krowk does differently, and the axes that decide it — keyless first push, no Node in the container, and how much of the production record each one records."
  "og:description": "An honest comparison: what uploads.sh does better, what Krowk does differently, and the axes that decide it — keyless first push, no Node in the container, and how much of the production record each one records."
  "og:title": "uploads.sh alternative — Krowk"
---

# **The uploads.sh alternative**

Both solve the same missing GitHub endpoint. Krowk trades annotation and auto-commenting for a keyless first push, a dependency-free binary, and a fuller production record on every file.

[Read the CLI reference](https://krowk.com/docs)

## **Why people leave uploads.sh**

- An account and a login before the first upload.
- Installs through npm, so the container needs Node.
- Branch is detected, but the commit, dirty flag, harness and model are not.
- No preview page — the record sits beside the picture only in the comment.

## **What Krowk does better**

- First push works with no account, no key and no login.
- One static Go binary — no runtime in the agent container.
- Repo, commit, branch, dirty flag, harness and model read from the environment.
- The link is a preview page carrying that record beside the image.

Both tools exist because of the same missing endpoint: GitHub has no image upload API, so an agent working headless cannot put a screenshot where a reviewer will see it. Past that the two are shaped differently, and the difference is worth knowing before you switch.

## What uploads.sh is good at

It does more to the picture, and more to the pull request. Annotation — hand-drawn boxes, arrows, labels and redactions baked into the capture. Device frames. Galleries that group shots across several pull requests under one link. And it posts the comment itself, updating it on each revision rather than adding another. If what you want is a polished visual review artefact, that is its ground, and Krowk does none of it.

## Where Krowk is different

**The first push needs nothing.** No account, no login step, no key. That is not a trial gesture; it is the adoption path. An agent reads one line of instruction and pushes — there is no signup for it to get stuck on and no credential for you to get into its container. The link expires 24 hours later unless you claim it, and claiming works for 30 days after the expiry, so nothing is lost by trying it first and deciding later.

**One static binary.** Go, standard library only, no runtime. uploads.sh installs through npm, which means the container needs Node. Plenty of them do. The ones running a Go or Rust or Python toolchain do not, and the upload step is the last thing in a task — the worst possible place for a dependency that might not be there.

**The production record is fuller.** Both tools detect the branch — uploads.sh labels an upload with it, and Krowk records it too. Past the branch they diverge: every Krowk push also stamps the commit, whether the working tree was dirty, which harness was driving and which model, all read from git and the environment rather than passed by hand. The dirty flag is the one worth having: a commit hash on a screenshot taken from a modified tree names code that is not in the picture.

The link is also a page, not just a file. It carries the picture and that production record side by side, so a reviewer looking at a screenshot in a week-old thread can tell which commit produced it. Slack and Basecamp unfurl the bare URL into their own card; GitHub, GitLab, Linear and Notion get the inline image block. Which form a tool wants is the registry's table, not the client's, so a newly verified tool works on an install that predates it.

## Where Krowk is worse

It does not comment for you. It prints the block and you post it — one extra step, and on GitHub Actions the action's output goes straight into github-script, but it is still a step you write. There is no annotation, no device frame, no gallery. And there is no self-hosting: bring-your-own-bucket is not an option here, because the preview page depends on the hosted resolver. The answer given is "not yet" rather than "no", and nothing is scheduled.

## Switching

There is nothing to migrate — old links keep working wherever they are hosted, and new ones come from a different command. Change the push line in your agent instructions or your workflow, and the next screenshot goes somewhere else.

agent shell

```
krowk push screenshot.png --destination github
```

## **Krowk vs uploads.sh, feature by feature **

| **Feature** | **Krowk** | uploads.sh |
| --- | --- | --- |
| Upload before signing up | Yes | Account required |
| Runtime in the container | None — one static binary | Node, via npm |
| Git context detected automatically | Repo, commit, branch, dirty flag, harness, model | Branch |
| Custom metadata | Yes | Yes |
| Comments on the pull request for you | No — prints the block, you post it | Yes |
| Annotation and device frames | No | Yes |
| Standalone preview page for one file | Yes — carries the record beside the image | No |

**FAQ**

## **Before you switch**

<details>

<summary>

Is there an uploads.sh alternative that works without an account?

</summary>

Krowk's first push is keyless: no account, no key, no login. The link is live at once and dies after 24 hours unless claimed — and a claim still works for 30 days after it died, which revives the same URL rather than minting a new one. So a link already sitting in a pull request starts working again.

</details>

<details>

<summary>

Do I need Node to use Krowk?

</summary>

No. It is one static Go binary with no runtime, installed with a single script. If Node happens to be there, npx @krowk/cli runs the same binary, and Go users can go install it. The binary is the supported path in containers precisely because Node often is not there.

</details>

<details>

<summary>

Can Krowk post the pull request comment automatically?

</summary>

Not on its own. It prints the markdown block GitHub renders and you post it — one line with the gh CLI, or the GitHub Action's markdown output piped into actions/github-script. uploads.sh does this for you; if that step is what you are paying for, it is a real difference.

</details>

<details>

<summary>

Does Krowk have a free tier I can point an agent at?

</summary>

Yes, and it needs no card and no account: 100 uploads a day, 100 MB an artifact, links that live 24 hours. That is enough to run the tool inside a real task before deciding anything. The pricing page carries the paid tier and the meters.

</details>

Ready to switch from uploads.sh?

[Read the CLI reference](https://krowk.com/docs)