Publish a website or HTML file from Claude Code or Codex

Claude Code and Codex build sites but don't host them. Paste the prompt below and either agent publishes the folder to https://<name>.chorus.host and replies with the link. No account needed. The link lasts 24 hours unless you claim it. In our tests it took about 40 seconds.

By the chorus.host team · Tested 1 October 2026 with Claude Code 2.1.285 and Codex CLI 0.158 · For agents: /guides/publish-html-from-claude-code.md

Publish the dashboard folder to chorus.host and give me the link. Instructions: https://chorus.host/skill.md?ref=guide-agents

The agent reads chorus.host/skill.md, runs one command, and answers with the live URL on its own line and a claim link to keep the site. It asks before running commands unless you've allowed them.

What happens when you paste it (tested)

We pasted that prompt into each agent on 1 October 2026, in a folder holding a two-file dashboard (index.html and app.js), with no chorus.host account:

AgentVersionTime to a live URLWhat it ranResult
Claude Code2.1.285, Opus 5.537.6 sRead skill.md, then publish.py (8 shell commands in all)Both files served; claim link and the 24-hour notice given
Codex CLI0.158, network access on39.2 sRead skill.md, then publish.py (6 shell commands in all)Both files served; claim link and the 24-hour notice given
Codex CLI0.158, default sandboxFailedCouldn't resolve chorus.hostThe default sandbox has no network; see below

One run each, so treat the times as a guide. Most of each run is the model reading the instructions; the publish itself takes about 3 seconds.

Which option fits what you built

Checked 1 October 2026 against each vendor's docs (linked under the table). "Not stated" means the docs don't say.

Account or plan neededFolder with several filesAn unclaimed link lastsPublic without a passwordCustom domainBackend code
Claude Code artifactsA paid Claude plan (Pro, Max, Team or Enterprise), signed in with /loginNo: one self-contained page; relative links don't resolve and external images are blocked; 16 MiBPrivate until you share itPublic link possible (off by default on Team and Enterprise)NoNo
ChatGPT and Codex SitesPlus or higher; public betaYesPrivate by defaultWhen you choose to share itYes, a domain you own, where available (not on Enterprise at launch)Yes (full-stack, D1 and R2)
chorus.hostNoneYes24 hours, then claim or lose itYesNoWorkers, with a free account
NetlifyNone for netlify deploy --allow-anonymousYes1 hour to claimNo: password-protected until claimedYes, after claimingNetlify Functions, with an account
CloudflareNone for wrangler deploy --temporaryYesDeleted after 60 minutes unless claimedYesYes, after claimingWorkers
VercelLogin, or the claimable-deploy skill's fallbackYesNot statedNot statedYes, with an accountVercel Functions
GitHub Pages or Cloudflare Pages via gitYesYesLong-livedYesYesCloudflare Pages Functions

Use something else when:

More on hosts that work without an account: host a static site with no signup.

Set it up once in Claude Code

Install the skill, so every new session already knows how to publish:

npx skills add chorus-host/skill -g -a claude-code

No Node? mkdir -p ~/.claude/skills/publish-website && curl -fsSL https://chorus.host/skill.md -o ~/.claude/skills/publish-website/SKILL.md. More install options: the agent skill page.

Or add the MCP server, which gives Claude Code a publish_site tool:

claude mcp add --transport http chorus https://chorus.host/mcp

Or install the CLI and let Claude Code run it:

curl -fsSL https://chorus.host/install.sh -o install-beacon.sh && sh install-beacon.sh
beacon deploy ./dashboard --pretty

To make it the default for one project, add this to the project's CLAUDE.md:

## Publishing
To publish a site or HTML file, follow https://chorus.host/skill.md and give me the link and the claim link.

Codex: turn on network access first

Codex's default workspace-write sandbox blocks the network, so the publish fails with "can't resolve chorus.host". Any one of these fixes it:

[sandbox_workspace_write]
network_access = true

Then paste the same prompt. To give Codex the MCP tool instead: codex mcp add chorus --url https://chorus.host/mcp. And put the same publishing note in the project's AGENTS.md that you'd put in CLAUDE.md.

ChatGPT's own Sites feature is managed in the ChatGPT app, not in the Codex CLI; use it if you want the site inside your ChatGPT workspace.

Cursor and other agents

The same prompt works in Cursor's Agent mode and in any agent that can fetch a URL and run commands. For the MCP route, add this to .cursor/mcp.json (we haven't run Cursor ourselves yet):

{ "mcpServers": { "chorus": { "url": "https://chorus.host/mcp" } } }

Agents that only chat, like claude.ai and ChatGPT, can connect the MCP server: setup for every client.

Made it in the Claude app instead?

Download the HTML file from the chat and drop it on chorus.host/html-to-url, or use Claude's own share option for artifacts. Sharing a single report, with a password or updates: share an HTML file as a link.

Keep it, update it, lock it

If it doesn't work

The exact API calls

For a dashboard made of index.html and app.js, with nothing but curl:

cd dashboard
curl -sS https://chorus.host/v1/publish -F file=@index.html -F file=@app.js

For big sites, the three-call API registers each file with its size and SHA-256 hash, uploads only what chorus.host doesn't already have, then makes the version live:

cd dashboard
entry() {
  printf '{"path":"%s","size":%s,"contentType":"%s","hash":"sha256:%s"}' "$1" \
    "$(wc -c < "$1" | tr -d ' ')" "$2" \
    "$( (shasum -a 256 "$1" 2>/dev/null || sha256sum "$1") | cut -d' ' -f1)"
}
curl -sS https://chorus.host/v1/sites -H "Content-Type: application/json" \
  -d '{"files":['"$(entry index.html 'text/html; charset=utf-8')"','"$(entry app.js 'text/javascript; charset=utf-8')"']}' \
  > site.json
jq -r '(.uploads.pending // [])[] | select(.uploadUrl) | "\(.path) \(.uploadUrl)"' site.json |
while read -r file url; do
  case "$file" in
    *.html) mime='text/html; charset=utf-8' ;;
    *.js) mime='text/javascript; charset=utf-8' ;;
  esac
  curl -sS -X PUT "$url" -H "Content-Type: $mime" --data-binary @"$file"
done
curl -sS -X POST "https://chorus.host$(jq -r .version.finalizeUrl site.json)" \
  -H "X-Claim-Token: $(jq -r .claimToken site.json)"
jq -r '"\nLive: \(.site.url)\nClaim it to keep it: \(.claimUrl)"' site.json

Questions

Can Claude Code host a website?

Not by itself: Claude Code writes the files, and something else has to serve them. Ask it to publish to chorus.host (point it at https://chorus.host/skill.md) and it puts the site on a public URL in about 40 seconds, no account needed.

Does Claude provide web hosting?

Claude Code artifacts can share a single self-contained page on paid Claude plans. For a site with several files, or a link anyone can open without a Claude account, publish it to a host like chorus.host.

How do I share a Claude HTML file?

Download it and drop it on chorus.host/html-to-url, or ask Claude Code to publish it to chorus.host. Either way you get a public link that opens the page.

Is it free?

Yes. Publishing without an account is free and the link lasts 24 hours. Keeping the site, with a free account made from just an emailed code, is free too.

Can Codex make me a website and publish it?

Yes. Turn on network access for Codex's sandbox, then ask it to publish to chorus.host with the prompt on this page. It writes the files, publishes them and gives you the link.

How do I update the site after Claude Code changes it?

Ask it to publish again from the same folder. The saved state in .beacon/publish.json makes the second run update the same URL instead of creating a new site.

Sources

Related: chorus.host Workers, chorus.host vs here.now, and the home page of chorus.host, web hosting for AI agents.