---
title: "How Krowk works — permalinks for agent output"
canonical_url: "https://krowk.com/how-it-works"
last_updated: "2026-09-02T08:09:30.212Z"
meta:
  description: "An agent pushes a screenshot, a recording or a log and gets a permalink that renders as a card in GitHub, Slack, Basecamp and Linear, carrying the commit and branch that produced it."
  "og:description": "An agent pushes a screenshot, a recording or a log and gets a permalink that renders as a card in GitHub, Slack, Basecamp and Linear, carrying the commit and branch that produced it."
  "og:title": "How Krowk works — permalinks for agent output"
---

**How it works**

# **Your agent pushes a file. You get a link that shows it.**

Krowk turns a screenshot, a recording or a log into a permalink that renders as a card wherever it is pasted — carrying the commit, the branch and the agent that produced it.

[Read the docs](https://krowk.com/docs) [Screenshot into a PR](https://krowk.com/guides/screenshot-to-github-pr)

**First push needs no account. Free links expire after 24 hours.**

## **The problem it solves**

An agent finishes a task and produces evidence: a screenshot of the screen it changed, a recording of the interaction it fixed, the log of the test run that passed. All of it is written inside a container that is about to be deleted, and none of it reaches the person who has to decide whether the work is right.

The usual substitutes are worse than they look. A base64 blob in a log is not evidence anybody reads. The CI artifacts tab is a zip three clicks from the diff. And checking it yourself means rebuilding a whole environment to look at one screen.

So the agent pushes the file and gets back a link. What makes the link worth pasting is that it is a page rather than a file: `krowk.com/a/…` shows the screenshot large, and beside it the repository, the commit, the branch, whether the tree was dirty, the pull request, and which agent and model produced it. The reviewer can tell what they are looking at without asking.

**Three commands**

## **Install, push, paste.**

One static Go binary, no runtime. The second command already works — the first push needs no account.

1 — install

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

2 — push

```
$ krowk push screenshot.png --caption "Cart total after the fix"
```

3 — paste

```
$ gh pr comment 412 --body "$(krowk push shot.png --destination github)"
```

**What you get**

## **A link, and the context behind it.**

- ### **What the card carries**

  Read from git and the environment at push time, not passed by hand.
  - Repository, commit and branch
  - Whether the tree was dirty
  - The harness and the model
  - The pull request and the session
- ### **Where it renders**

  One link, two paste forms, chosen by the destination rather than by you.
  - Inline image on GitHub, GitLab, Linear, Notion
  - Unfurled card in Slack, Basecamp, Asana
  - Anything else gets the block, which reads as text
- ### **What it costs to try**

  Nothing, and no signup — the agent is the first user, so adoption is one line of instruction.
  - No account for the first push
  - 100 MB an artifact, 100 uploads a day
  - Links live 24 hours, claimable for 30 days after

## Two shapes, because the tools disagree

There is no single paste-ready string. GitHub, GitLab, Linear and Notion build preview cards only for their own resources, so what renders there is an inline markdown image — the picture in the comment body, a caption, and a link through to the preview page. Slack, Basecamp and Asana unfurl a bare URL into a card of their own and render no markdown image at all.

Name the destination and the right one comes out: `krowk push shot.png --destination github`. The registry decides which tool wants which form, and the CLI passes it through untouched — so a tool that gets verified next month works on the install you already have, without an upgrade.

## What the bytes never do

The card is on `krowk.com`. The file itself is served from `cdn.krowkusercontent.com` and never from the brand domain — the same split GitHub and Google make, for the same three reasons: a page on the brand host could set cookies that reach the dashboard, borrow the brand in the address bar, and get the whole domain flagged by a reputation service on the strength of one abusive upload. For a product whose pitch is "paste this link everywhere", domain reputation is the business.

Uploads also never touch the application — the file goes to object storage directly, with its size and digest committed before a single byte moves. That is three HTTP calls, written out in [the wire reference](https://krowk.com/docs/api).

**FAQ**

## **The questions this page is the answer to**

<details>

<summary>

Where can an AI agent host a screenshot so it renders in a pull request?

</summary>

Anywhere that gives it a stable public URL — GitHub renders an inline markdown image from any host. Krowk is built for that case: krowk push screenshot.png returns a permalink and prints the markdown block GitHub renders, with the commit and branch recorded on the preview page behind it. The first push needs no account.

</details>

<details>

<summary>

Is there an MCP server to upload files and get public URLs?

</summary>

Yes. krowk-mcp ships alongside the CLI and speaks the same API over MCP stdio, for agents that cannot shell out. Its tools are krowk\_push, krowk\_list\_artifacts, krowk\_get\_artifact, krowk\_claim\_artifact, krowk\_get\_run and krowk\_verify\_key. krowk\_push is confined to a root directory and refuses credential files wherever they sit, so a prompt-injected path cannot turn it into an exfiltration channel.

</details>

<details>

<summary>

Do I need an account?

</summary>

Not for the first push. A keyless upload lands in a shared anonymous workspace, works immediately, and expires 24 hours later; a one-shot claim token comes back with it. Spending that token moves the upload into your own workspace and lifts the expiry, and it works for 30 days past the expiry — so the link already pasted in a pull request comes back rather than staying dead.

</details>

## **Push one file and see what the link looks like.**

No account, no card, no configuration. One command, and the link is public the moment it comes back.

[Read the docs](https://krowk.com/docs) [See the pricing](https://krowk.com/pricing)

**The CLI is MIT. The upload API is documented, so curl works too.**