artifact-hub

Private by default. One flag to share.

Publish a file. Get a link that opens.

One command puts a file online at a link that renders in the browser instead of landing in a downloads folder. Everything you publish, from a terminal, a script or an agent, lands in a file manager you already know how to use.

Publish report.html
ah upload report.html --public
It prints one line: the link, and nothing else
https://vivid-harbor-g7uvqik4emi3munp7z4a42vxha.artifacthub.link/

That is not an illustration. It is a live artifact, and it is the page in the frame further down. Uploads are private until you pass --public.

The link, opened

Nothing was deployed to put this online.

One HTML file, pushed with the command above. It answers on a hostname of its own, which is why it can carry its own styling without being able to reach anything else.

report.html https://vivid-harbor-g7uvqik4emi3munp7z4a42vxha.artifacthub.link/ Open
A rendered report page, served at its own hostname, explaining what the reader is looking at.
A live artifact, not a picture of one: the frame links to it. It is a browser origin apart from every other artifact and from the app.

What that gets you

Three things a file host usually gets wrong.

The app

A Drive for everything you publish.

Whatever an agent publishes and whatever you upload yourself lands in the same place: folders, search, previews, sharing and history, working the way a Drive works.

Getting it

Two lines to install, one to sign in.

ah is a single file of plain JavaScript with no dependencies at all. You can read the whole thing before you run it, which is the only honest argument for downloading a program from a website.

A terminal

Install, sign in, publish. The key is written to a 0600 file; it is never printed, never passed as a flag and never reaches your shell history.

Install
mkdir -p ~/.local/bin
curl -fsSL https://artifacthub.link/ah.mjs -o ~/.local/bin/ah
chmod +x ~/.local/bin/ah
Sign in
ah login

On a machine with no browser, like a VPS, a container or an SSH session, ah login --device prints a URL and an eight-letter code you open on anything, a phone included. Needs Node 18 or newer, and nothing else.

An agent

For Claude Code there is a skill: with it installed, “publish this and give me the link” is the whole instruction. It runs ah login when there is no key, and never puts one where a transcript can reach it. Anything else speaks plain HTTP:

The same publish, without ah
curl -sS --fail-with-body -T report.html \
  -H "Authorization: Bearer $ARTIFACT_HUB_TOKEN" \
  https://api.artifacthub.link/v1/report.html?visibility=public

The rest of it

The whole Drive, from the command line too.

ah also files, finds, shares, tags, moves, retires and restores what is already there, and every command takes --json when something else is reading.

A working session
ah upload chart.png --path reports/2026 --expires 7d
ah ls reports/2026
ah list --q invoice --sort updated --starred
ah share 3k9m2xq7wp4v add ana@example.com --role commenter
ah delete 3k9m2xq7wp4v
ah restore 3k9m2xq7wp4v