---
title: "Krowk — share screenshots from AI coding agents"
canonical_url: "https://krowk.com/"
last_updated: "2026-09-02T06:50:13.379Z"
meta:
  description: "AI agents push screenshots and video as they work. You get one canonical link that renders as a rich preview in GitHub, Slack, Basecamp and Linear."
  "og:description": "AI agents push screenshots and video as they work. You get one canonical link that renders as a rich preview in GitHub, Slack, Basecamp and Linear."
  "og:title": "Krowk — the permalink layer for AI agent output"
---

**Permalinks for agent output **

# **Let your agent show its work. **

Your agent pushes a screenshot or a clip mid-run and gets back one canonical URL that renders as a card in GitHub, Slack, Basecamp and Linear. With a key, the card carries repo, commit, branch and agent.

Installation guide

**macOS, Linux and Windows, MIT licensed. Skip the install with **[~~npx or go install~~](https://krowk.com/docs#install)**. First push needs no account. **

**Claude Code**** Codex**** Cursor**** Copilot**** Gemini CLI**** GitHub Actions**** Any CLI**

**Quick start**

## **Install once, then one line in your agent's instructions. **

The install line puts the CLI on the path. This line tells your agent to use it. From then on the evidence arrives as links, and nobody uploads anything by hand.

1 — Install the CLI

```
$ curl -fsSL https://krowk.com/install | bash
```

2 — CLAUDE.md, AGENTS.md, or a CI step

```
After any visual change, capture it (screenshot if static, a short screen recording if it is an interaction) and publish it with the krowk skill. If the skill is missing or fails, run `krowk help --json`, then `krowk push FILE --title "what changed" --json`, and paste `paste.url` where you report the work.
```

[krowkcom/cli](https://github.com/krowkcom/cli)

**The problem**

## **The work is done. Looking at it is the expensive part. **

1. **01**### **Your agent finished.**

   The screenshot, the recording, the summary: everything that proves it worked. All of it sits in a sandbox that's already gone.
2. **02**### **You spin it up to look.**

   Fetch the branch, install, migrate, run, click through to the screen that changed. Twelve minutes to confirm that one button moved.
3. **03**### **Your team never sees it.**

   You pasted it into the pull request. Half the team lives in Basecamp. An attachment stays where it landed, not with the work.

**One link, any artifact**

## **A screenshot, a clip, a write-up. Same card every time. **

Krowk reads the file and builds the preview. Slack and Basecamp unfurl the card; GitHub and Linear show the image inline. No re-upload, no second copy, no tool that renders it as a bare blue link.

**Screenshot · **checkout-after.png

krowk.com/a/9f3c2e1

**Checkout, mobile 390×844**

The frame after the fix. Discount now applies before tax.

<dl>

<dt>agent</dt>
<dd>claude-code</dd>

<dt>repo</dt>
<dd>acme/storefront</dd>

<dt>task</dt>
<dd>#412 discount codes</dd></dl>

**Screen recording · **add-to-paid.mp4

krowk.com/a/4d7b8a2

**Add to cart → paid, 12s**

The whole flow in one take, no manual steps in between.

<dl>

<dt>agent</dt>
<dd>claude-code</dd>

<dt>repo</dt>
<dd>acme/storefront</dd>

<dt>task</dt>
<dd>#412 discount codes</dd></dl>

**Markdown · **run-report.md

krowk.com/a/b1e60c4

**Run report, #412 discount codes**

What changed, what it ran, and the two tests that came back red.

<dl>

<dt>agent</dt>
<dd>claude-code</dd>

<dt>repo</dt>
<dd>acme/storefront</dd>

<dt>task</dt>
<dd>#412 discount codes</dd></dl>

**Built for agents**

## **The client is a program, so the API reads like one. **

### **Retry-safe protocol**

The digest is signed into the upload URL, so corrupted bytes are refused at the edge. Finalizing is idempotent, and a retried step gets the same success instead of a broken state.

### **Errors an LLM can act on**

Every failure names the code, the limit, the actual value and the fix. No stack traces, no HTML error page.

### **A key per agent**

One key per agent, each counted against its own per-minute ceiling, so one looping agent cannot throttle the rest. Revoke a runaway at 3am without rotating anything else.

### **A 429 that says when**

Push past the per-minute ceiling and the API answers 429 with Retry-After. Agents wait the seconds they are given instead of hammering.

**Pricing**

## **It bills like an API, not like a seat. **

### **Free**

For trying it inside a real run.

**$0**

- Links live for 24 hours
- 100 uploads a day
- 100 MB an artifact
- Expired links recoverable for 30 days
- No signup, no card

### **Pro**

For teams whose agents run daily.

**$15**/mo

- Links that never expire
- 10,000 uploads a month
- 2 GB an artifact
- 100 GB of storage included
- Unlimited teammates, a key per agent

[Claim a workspace](https://app.krowk.com/registration/new)

**Already pushed something? Every free upload prints a one-shot claim token. Spend it in your new workspace and that link stops expiring. **

### **Business**

For when the output can no longer be public.

**$49**/mo

- Links that never expire
- 30,000 uploads a month
- 2 GB an artifact
- 100 GB of storage included
- Unlimited teammates, a key per agent
- Private and shared artifacts
- Per-fetch access logs

[Start Business](https://app.krowk.com/checkout?products=4503afb3-c67f-4ea1-a9ba-ef42c4b2709c)

**Private and shared links, login-gated cards, and a per-fetch log of who opened them. Sign in, then Polar checkout. **

**Paid plans, past the included amounts **

Included uploads: 10,000 a month on Pro, 30,000 on Business. Storage included is 100 GB on both.

<dl>

<dt>Uploads past the included monthly amount</dt>
<dd>**$1 per 1,000**</dd>

<dt>Storage past 100 GB</dt>
<dd>**$0.05 per GB-month**</dd></dl>

Every key has a per-minute upload ceiling, on by default and not switchable off, so a runaway loop is throttled inside a minute. One key per agent is one kill switch per agent. A hard spend cap is coming, but not yet.

**FAQ**

## **The fine print, out loud. **

<details>

<summary>

Why not just use S3?

</summary>

S3 gives you a bucket and a signed URL that expires and unfurls as nothing. Krowk gives you a stable link that renders as a preview card in GitHub, Slack, Basecamp, Linear and Notion, plus an API shaped for a client that retries. Object storage is the substrate underneath. It is not the product.

</details>

<details>

<summary>

Do links expire?

</summary>

Free links expire 24 hours after upload. Links in a claimed workspace do not expire.

</details>

<details>

<summary>

What happens to a free link when it expires?

</summary>

The URL returns 410 Gone with the original filename and upload time, so anyone reading an old thread can tell what used to be there instead of hitting a dead 404. The artifact itself sits in cold storage for another 30 days. Claim a workspace in that window and the link comes back. After that it is deleted for good.

</details>

<details>

<summary>

What does usage cost past the included amounts?

</summary>

Two meters, published in full: $1 per 1,000 uploads past the included monthly amount (10,000 on Pro, 30,000 on Business), and $0.05 per GB-month of storage past 100 GB. Going past the included amounts bills at exactly those rates — retries with an Idempotency-Key are never double-counted. There is no bandwidth or egress charge, however many times a link unfurls.

</details>

<details>

<summary>

What does Business add?

</summary>

Privacy and audit. Private artifacts are workspace-only until you share them; shared artifacts hand the card itself to whoever holds the link. Per-fetch access logs record who fetched the bytes. Teammates stay unlimited. Same meters as Pro, with 30,000 uploads a month included instead of 10,000.

</details>

<details>

<summary>

What if an agent goes runaway?

</summary>

Every key, and every address pushing without one, has a per-minute ceiling on new uploads. It is on by default and cannot be switched off. A loop that runs away is throttled inside a minute: the API returns 429 with Retry-After and the writes stop landing. Keys are one per agent, so the fix is revoking that one key and nothing else. A hard spend cap is coming, but not yet. The ceiling limits the rate, not the bill.

</details>

<details>

<summary>

What happens to my links if I cancel?

</summary>

Links stay live for 60 days after the subscription ends, and you can export every artifact with its metadata as one archive at any time, including that window. After 60 days the links return 410 with the filename tombstone, the same way expired free links do.

</details>

<details>

<summary>

Is the CLI open source?

</summary>

Yes. The CLI is MIT, at github.com/krowkcom/cli. The upload API is documented at krowk.com/docs, so you can talk to it with curl if you would rather install nothing.

</details>

<details>

<summary>

Can I self-host?

</summary>

Not yet. The unfurl side depends on our link resolver, and we would rather ship one that works than a self-host guide that half works.

</details>

<details>

<summary>

Which agents are supported?

</summary>

Anything that can run a CLI. Claude Code, Cursor, Devin, OpenHands, Codex, or a bash step in CI. There is no agent-specific integration to wait for.

</details>

<details>

<summary>

How do I get a screenshot out of Claude Code into a pull request?

</summary>

Install the CLI and add the agent rule from the quick start to CLAUDE.md or AGENTS.md. After a visual change the agent captures a screenshot (or a short recording of an interaction), publishes it with the krowk skill, and pastes the link in the PR comment. If the skill is missing it runs krowk help --json, then krowk push. The first push needs no account; with an API key the card also carries repo, commit, branch and agent.

</details>

## **Your agent's next screenshot is a link that works everywhere. **

One command. No account, no dashboard tour.

Wire up your agent

agent shell

```
$ npx @krowk/cli push screenshot.png

✓ uploaded  screenshot.png  318 KB
  https://krowk.com/a/art_0000000000000000000demo2
  expires in 24h
  keep it:  krowk claim art_0000000000000000000demo2 krowk_claim_...
```