Share a coding agent's output through a unique URL, collect reviewer feedback, then paste the link back into the agent session. Pastes expire after one hour and are permanently deleted.
The production service runs on Cloudflare Workers. Each paste has its own SQLite-backed Durable Object, which provides strongly consistent feedback writes and schedules the paste's deletion with a Durable Object alarm.
Pastes are encrypted at rest and unreadable by the operator: the paste link contains a 32-character token whose first half names the storage object and whose SHA-256 digest is the AES-256-GCM key for the paste body. The server never stores the token and redacts it from every log line, so anyone without the link — including the operator — sees only ciphertext plus the timestamps needed for expiry.
https://agentbin.sh runs the code in this repository. Verify any claim on
this page against src/, or reproduce the deployed bundle locally with
npm run check.
Requirements: Node.js 20+ and npm.
npm install
npm test
npm run devnpm test runs unit tests and a full local Wrangler integration suite. The
integration suite covers form and JSON creation, rendering, raw output,
concurrent feedback, agent-readable feedback, owner deletion, hard expiry,
and validation failures.
Authenticate Wrangler and deploy the Worker plus its Durable Object namespace:
wrangler login
npm run deployIf Cloudflare OAuth is unavailable, create an API token from Cloudflare's
Edit Cloudflare Workers template and put it in the git-ignored .env file:
cp .env.example .env
# edit .env locally; never paste or commit the token
npx wrangler whoami
npm run deployThis configuration serves on the custom-domain route only (workers_dev and
preview_urls are disabled). To self-host, add your own domain to the
Cloudflare account, make its Cloudflare nameservers authoritative at the
registrar, and point the route in wrangler.jsonc at it — for example:
"routes": [
{
"pattern": "agentbin.sh",
"custom_domain": true
}
]Cloudflare creates the DNS record and TLS certificate for a Worker Custom Domain. Domain registration can remain at the existing registrar.
curl -fsSL https://agentbin.sh/install | shThe installer detects Claude Code, Codex, and Pi directories and installs
skill/agentbin/SKILL.md for each available agent. Set AGENTBIN_URL to use a
development or alternate deployment.
- After an agent response, say
/agentbinor "share this". - The agent redacts credential-shaped content and posts its response with useful session metadata.
- Send the returned URL to a reviewer.
- The reviewer submits feedback below the paste.
- Paste the URL back into the agent session to review each feedback item.
An agent creates a paste with form data:
curl -s https://agentbin.sh/api/pastes \
-d title="auth refactor" -d task="uuid pks" -d repo="acme/backend" \
-d sender="sam" -d agent="codex" \
--data-urlencode content@response.txtThe response contains the public-by-link URL and a one-time owner secret:
{"id":"…","url":"https://agentbin.sh/…","secret":"…"}The owner can delete a paste before expiry:
curl -X DELETE https://agentbin.sh/PASTE_ID \
-H "Authorization: Bearer OWNER_SECRET"| Route | Purpose |
|---|---|
GET / |
Manual paste form |
POST / |
Create from the manual form |
GET /skill |
Agent skill source |
GET /install |
Shell installer |
POST /api/pastes |
Create from form or JSON data |
GET /{token} |
View a paste and its feedback form |
POST /{token}/feedback |
Submit feedback |
GET /{token}/feedback.md |
Agent-readable feedback |
GET /{token}/raw |
Raw paste content |
DELETE /{token} |
Owner deletion |
Paste tokens are 32-character, uniformly generated base58 strings (~188
bits): 16 characters route to the paste, all 32 derive its encryption key.
Owner secrets are separate 32-character tokens and only their SHA-256 hashes
are stored. Owner deletion accepts the secret in the Authorization header
only, so secrets never appear in URLs or request logs. Feedback is capped at
10,000 UTF-8 bytes per item and 100 items per paste; request bodies at 1 MiB.
Paste creation and feedback are rate-limited per IP through Cloudflare's
rate-limiting bindings (see wrangler.jsonc).
- A paste stores only what the creator submits (title, task, repo, sender, agent, content) plus reviewer feedback. There are no accounts.
- All of it is stored AES-256-GCM encrypted. The key is derived from the link token, which the server never persists and never logs, so the operator cannot read paste contents — only creation and expiry times.
- Everything is deleted at most one hour after creation — a Durable Object alarm hard-deletes the storage, and expired pastes are also deleted on first access. Owners can delete earlier with the one-time secret.
- The application logs method, redacted path, status, and duration only — no IP addresses, user agents, query strings, or paste tokens. Cloudflare invocation logs (which would include full URLs) are disabled.
- Rate limiting uses the client IP as an in-memory bucketing key inside Cloudflare's rate-limiting primitive; it is never written to logs.
- Pastes are public to anyone who has the link. Links are unguessable but not access-controlled: do not paste secrets, credentials, or personal data.
- Every page ships a hash-based
Content-Security-Policywith nounsafe-inlinethat also blocks remote images, so reviewers cannot be tracked through markdown content. Markdown is rendered client-side and sanitized with DOMPurify; the two CDN scripts are pinned with subresource-integrity hashes. - The service runs on Cloudflare Workers, so requests transit Cloudflare's network subject to Cloudflare's own policies.
Report abuse or problems via GitHub issues.