---
title: "Claude artifacts are easy to make and hard to share"
url: https://akdarrah.com/posts/claude-artifacts-are-easy-to-make-and-hard-to-share
author: Adam Darrah
published: 2026-10-18T01:18:48Z
updated: 2026-10-18T01:18:48Z
tags: ["ai","claude-code","cloudflare"]
---

# Claude artifacts are easy to make and hard to share

Making a page with Claude takes a minute. A report, an explainer, a one-off page for a meeting. It shows up as an artifact, and it looks good.

Then I send the link, and the reply is almost always the same: "I can't open it."

## Why the link never works

It was never one reason. Sometimes I hadn't set the link permission right. Sometimes the person wasn't on our team account, so the link asked them to sign in to an organization they don't belong to. Each time I'd go back, find the setting, change it and send the link again. The page took a minute. Sharing it took a conversation.

What I wanted was simple:

- A link **anyone can open**, with no Claude account and no team membership.
- A URL **nobody can guess**, so it's private in practice even though it's public.
- **Not hosted by me.** I thought about putting pages on this blog, but I don't want readers of this post to have to trust my server.
- **Free**, from a company people already trust.

## share-html

So I built [share-html](https://github.com/akdarrah/share-html), a Claude Code skill. When I say "share this", Claude publishes the page to my own Cloudflare account and hands me a link:

```terminal
$ share.sh report.html
https://16476356426ab8313e1d12a8.share-97daa5fc.pages.dev
```

That's a [real one](https://16476356426ab8313e1d12a8.share-97daa5fc.pages.dev), a page about bananas I used for testing. Open it in a private window: no login, no permission screen.

The whole tool is a ~100-line shell script and a skill file. Here is what it does:

1. **Each page gets its own random address.** The first part of the hostname is 24 random hex characters, 96 bits. Nobody finds it by guessing.
2. **Each share is a separate deployment.** Sharing a new page never touches an old one, and nothing is stored on my laptop except the project name. A new laptop doesn't break old links.
3. **Search engines are told to stay away** (`X-Robots-Tag: noindex`), and links on the page don't pass its address to other sites (`Referrer-Policy: no-referrer`).
4. **Edits keep the link.** `share.sh report.html --update <url>` republishes to the same address, so I can fix a typo without sending a new link.

The pages go to *your* Cloudflare account, not mine. Cloudflare's free plan has no bandwidth cap and doesn't ask for a credit card.

## Making it the default

The part I like most is that I don't have to think about it. One rule in my `~/.claude/CLAUDE.md` tells Claude Code to publish every plain HTML page this way, and to use regular artifacts for everything else: slide decks, docs, dashboards, and pages that need comments or shared data. The rule is in the README.

The pages look exactly like artifacts would. The skill tells Claude to follow the same design guidance it uses for artifacts and never to mention where the page is hosted. The person I send it to just sees the page.

## What I learned building it

A few things surprised me.

**Cloudflare is moving Pages into Workers.** New Pages projects now get routed through Workers by default, which needs a `workers.dev` subdomain registered first, and that subdomain then shows up in every URL. The script creates its project once with `--force` to use Pages directly, and every later command just works.

**Every deployment has a second, much shorter address.** Pages also serves each deployment at an 8-character address. That's only 32 bits, few enough that someone who learns your project name from one link could scan for the others. Each share now includes a five-line `_worker.js` that returns "not found" for anything except the long address.

**Wrangler drops your account details wherever you run it.** Cloudflare's CLI writes a `.wrangler/` folder into the current directory, including your account ID and account name. Run it inside a project and you can commit that without noticing. The script now runs it from a cache folder.

**The first link on a new project is slow.** For about 30 seconds Cloudflare is still issuing the certificate, and the link just hangs. After that, links work instantly.

## Trade-offs

An unguessable link is not access control. Anyone I forward it to can open it, and so can anyone they forward it to. I don't use this for anything I'd mind leaking.

It's also static pages only. Artifact features like comments, data shared between viewers, or asking Claude from the page don't exist outside claude.ai. For those I still use artifacts and set the permissions carefully.

And the guard that blocks the short addresses runs as a Worker, so each page view counts toward the free plan's 100,000 requests a day. That's plenty for sharing pages with people, not for a page that goes viral.

## Try it

You need Node 20+ and a free Cloudflare account:

```terminal
$ git clone https://github.com/akdarrah/share-html ~/.claude/skills/share-html
$ npx wrangler login
```

Then ask Claude Code to make a page and say "share this". The link it gives you works for anyone.

