← Back to blog
Product July 17, 2026 by Javier Arancibia

Claude Artifacts, Unbundled: A Live URL for Every Agent's HTML

Claude Artifacts, Unbundled: A Live URL for Every Agent's HTML

I shipped a new open-source tool this week: hart — the agent-first artifact host. In one CLI call it turns a self-contained HTML (or JSX) file into a live, versioned, sandboxed URL, from any terminal agent, on your own infrastructure. The code is on GitHub and there's a live instance at hart.intrane.fr.

This post is about the gap it fills and the one design decision that makes it more than "scp to nginx".

Every agent can build a deliverable. None of them can share it.

Terminal agents — Claude Code, Cursor, aider, Codex CLI, Gemini CLI, your own SDK agents and cron jobs — have quietly gotten very good at producing rich HTML: dashboards, run reports, call sheets, mockups, one-pagers, data explorers. But outside of claude.ai, the single most shareable thing an agent makes has the worst distribution story. The agent writes a beautiful report.html to disk, and then the human has to:

  • open it locally — which dies the moment they want to share it,
  • paste it into a gist — which loses the styling and doesn't render,
  • or stand up a static host by hand — which isn't something an agent can drive.

Claude solved this inside claude.ai with Artifacts. Everyone else is stuck. hart is the missing primitive, for every agent, on your own box:

hart publish report.html --owner you --artifact q3
# -> {"url":"https://hart.intrane.fr/a/you/q3","version":1}

The agent calls that, parses the JSON, and hands the URL to the human. No UI, no build step, no lock-in.

The one decision: safely hosting untrusted HTML

Here's the thing that makes hart a product and not a shell alias: anyone can copy a file to a web server. The value is doing it safely and repeatably — because the HTML you're hosting was generated by an agent from a prompt, and you are about to serve it to other people from your own domain.

So every artifact is wrapped in the same kind of strict, sandboxed Content-Security-Policy that neuters Claude's own artifacts: inline styles and scripts render, but there are no external scripts, no external fonts, and no network at allfetch, XHR and WebSockets are blocked. A publish-time linter rejects anything that reaches off-page before it's ever stored. That security envelope is the product; the CLI is just how you drive it.

Agent-first, not human-first

Every incumbent — Netlify, Vercel, GitHub Pages, S3+CloudFront — is built for a human clicking a dashboard or wiring a CI pipeline. None expose a clean, non-interactive, JSON-in/JSON-out contract an agent can call blind and parse. hart is the opposite: the primary user is a program. JSON on stdout, structured errors on stderr, semantic exit codes, deterministic idempotent publishes, and a hart guide command that prints the version-exact manual. There's a drop-in agent skill and an MCP server too, so an agent on any runtime reflexively publishes what it makes — and can discover everything it published before.

What it does today

  • Publish & version — every re-publish appends an immutable version; latest tracks newest; hart rollback reverts instantly.
  • Living dashboards — publish a template once, then push just the data (hart data); the same URL re-renders. Great for a status board an agent keeps fresh on a cron.
  • Visibility — unlisted, public (with a discovery feed), or private (password-gated read).
  • Analytics without trackers — view counts and referrers are counted server-side (the CSP blocks client beacons anyway), plus staleness alerts when a living dashboard goes quiet.
  • An operator dashboard — one admin-gated page showing every artifact your fleet of agents produced, with freshness flags.
  • One-line installcurl -fsSL https://hart.intrane.fr/install.sh | sh drops the CLI, pre-pointed at the instance.

Open-source, one binary, your infra

hart is a single static native binary — no Node, no bundler, no interpreter, no per-artifact cost. It's built in machin, the same language I've been writing about here, and it's both the CLI (hart publish) and the hosting daemon (hart serve) in one file. Self-host it on your own box with a SQLite store; bring your own domain. The open-source core is the whole product.

If your agents are generating HTML and dropping it on the floor, give them somewhere to ship it. Grab the binary or the source on GitHub, try the live instance at hart.intrane.fr, or just point an agent at it and watch a URL come back.