Your agent’s output, on the web.

An agent posts finished files over an API and gets back a stable URL. You keep the artifacts and hand them out with links that expire.

Run your own. Python 3.13, FastAPI, PostgreSQL, Redis.

An engraved rook placing a twig on its stick nest
7
Tools an agent can call, over one endpoint
1
Command from a finished build to a working URL
4
Cases in which a request is authorised. There is no fifth
0
Artifacts that are public when posted

A rookery is not rebuilt each spring. It is added to — one stick at a time, by whoever is carrying one.

Why the rook

Seven tools over one endpoint

Share speaks MCP at /mcp with a bearer token. An agent that can call tools can post a finished artifact without knowing anything about your storage, your host or your DNS. Posting is private. A share link is a separate step.

share_post
Post files as an artifact. Stays private. Returns the artifact URL.
share_create_link
Mint an expiring /s/… URL so someone without an account can open it.
share_list
List artifacts in the caller’s space.
share_get
Get one artifact by name.
share_delete
Move an artifact to trash.
share_restore
Restore an artifact from trash.
share_whoami
Return the authenticated identity.

Or one command

The share CLI does the same three-step upload the API does — declare the manifest, put the blobs, commit the version.

$ share post ./build --title "Q3 margin review"
Posting build  (14 files)

https://share.c52.com/q3-margin-review

It refuses to post files that look like secrets unless you pass --force-secrets.

An engraved rook's nest built into a horizontal branch
Sticks are reused, not re-cut. Files are addressed by SHA-256, so re-posting a directory uploads only what changed.

Private until you say otherwise

Nothing is public by default

A posted artifact is visible to its owner. There is no “anyone with the link” state you can fall into by accident.

Links expire

Create a link with a TTL, a label and an optional password. Revoke it and it stops resolving immediately.

Unknown and unauthorized are the same 404

A wrong URL and a URL you may not see return identical responses. The difference is not observable from outside.

Served with the headers on

Every artifact response carries a content security policy, nosniff, noindex and a strict referrer policy.

What it is instead of

Each of those was built for something else first. Share does one thing: take finished files from a machine and return a URL that a person can open.

Run it yourself

git clone https://github.com/iXanadu/ShareWeb.git
cd ShareWeb
pyenv virtualenv 3.13.12 share-3.13
pyenv local share-3.13
pip install -e ".[dev]"

cp examples/.env.example .env
cp examples/.keys.example .keys      # fill in the two secrets
uvicorn server.main:app --port 8000   # first terminal
sharectl bootstrap --email [email protected] --handle you # second terminal

Bootstrap prints a one-time setup URL. Open it immediately and register a passkey. Agents get separate, scoped bearer tokens you issue and revoke from the dashboard. Everything is stored on your own disk and in your own Postgres.

Where it stands

What is still open lives in the repository, not on this page.

Star on GitHub Point an agent at it