# artifact.land
> A publishing platform for self-contained interactive artifacts.
> Upload an HTML or JSX file, get a URL. No build tools, no deployment.
artifact.land hosts self-contained interactive artifacts — tools, visualizations, explanations, creative pieces, prototypes, and anything else that runs in a browser from a single file. Artifacts are created externally (in Claude, Cursor, VS Code, or by hand) and published here.
---
# Overview
artifact.land is a publishing platform for self-contained interactive artifacts. Makers upload an entry HTML or JSX file (plus optional images in `assets/`), and it gets a permanent URL that anyone can visit and interact with. No build tools, no deployment process, no server needed.
## What is an artifact?
An artifact is a self-contained interactive thing that runs in a browser. It could be:
- **A useful tool** — a color picker, regex tester, unit converter, ffmpeg command generator, mortgage calculator
- **A data visualization** — an interactive chart, model explorer, financial dashboard, scenario simulator
- **An interactive explanation** — a concept made tangible with sliders, animations, and explorable examples
- **A creative piece** — generative art, interactive fiction, a music toy, a visual experiment
- **A prototype** — a UI concept, a game mechanic, an interaction pattern
- **Anything else** that's interactive and self-contained in a small bundle of files
There is no prescribed style or genre. If it does something interesting when you open it in a browser, it belongs on artifact.land.
## Single file or small bundle
An artifact is one entry file (`index.html` or `index.jsx`) plus any images it references, packaged together. The two shapes:
- **Single file** — just an entry file, no separate assets. All content inline (base64 data URIs, embedded SVG, CDN scripts). This is what Claude artifact exports look like.
- **Bundle** — an entry file at the root plus images under an `assets/` directory. Reference them with normal relative URLs (`
`); they're served from the same origin as the entry, so no CORS, no signed URLs in the markup.
Bundles travel over the wire as a single zip file (the CLI and web upload form both build the zip for you). The server unpacks, validates, and serves each file at its bundle-relative path.
See [HTML Artifacts](https://artifact.land/docs/llms/html-artifacts) for the canonical bundle structure and reference patterns.
## Two publishing paths
### JSX path (easiest for React components)
Write a React component with standard imports. artifact.land transpiles JSX, resolves imports to a pre-configured runtime (React 18, Tailwind CSS, and a curated library set), and wraps everything in an HTML shell that renders your component.
This is designed so that **Claude artifact exports work with zero modification** — copy the JSX, upload it, publish.
**Use the JSX path when:**
- You're writing a React component
- The libraries you need are in the supported set (React, Recharts, D3, Three.js, Lucide, etc.)
- You want the simplest possible publishing flow
See [JSX Runtime](https://artifact.land/docs/llms/jsx-runtime) for the full library list and details.
### HTML path (full control)
Upload a complete `.html` file. It's served exactly as-is — no compilation, no modification, no wrapping. Use any framework, any CDN libraries, any approach.
**Use the HTML path when:**
- You need libraries outside the JSX runtime's supported set
- You're not using React (vanilla JS, Vue, Svelte, Preact, Alpine, etc.)
- You want full control over the document structure
- You're bundling a more complex project into a single file
See [HTML Artifacts](https://artifact.land/docs/llms/html-artifacts) for details and allowed CDN domains.
## Key constraints
All artifacts run in a **sandboxed iframe** on a per-artifact subdomain. Each artifact gets its own unique origin, isolated from the main app and from every other artifact. Key limits:
- **No network requests** — `fetch()`, `XMLHttpRequest`, and WebSocket are all blocked
- **No external images** — `img-src 'self' data: blob:` blocks remote image URLs; bundle the image instead
- **No parent navigation** — cannot redirect the parent page (but `target="_blank"` links and popups open in a new tab normally)
- **Bundle caps** — Free tier: 5 MB / 50 files. Pro tier: 25 MB / 200 files.
- **Entry file types** — `.html` or `.jsx`
- **Bundled asset types** — raster images only for v1 (`.png`, `.jpg`, `.jpeg`, `.gif`, `.webp`, `.avif`). Fonts, audio, and data files are inline-only for now (base64 / inline JSON still works in the entry file).
Each artifact has its own subdomain origin, so `localStorage`, `sessionStorage`, `IndexedDB`, and cookies all work and are scoped to that one artifact. There's no cloud sync — storage is per-device, per-browser.
See [Constraints](https://artifact.land/docs/llms/constraints) for the full list of what's blocked and what works.
---
# JSX Runtime Reference
When you upload a `.jsx` file to artifact.land, it's compiled into a self-contained HTML page using a pre-configured runtime. This is designed so that Claude artifact exports and similar React components work with zero modification.
## How compilation works
1. You write a `.jsx` file with standard React imports
2. artifact.land transpiles JSX to JavaScript using SWC
3. `import` statements for known libraries are replaced with CDN-loaded globals
4. Named imports (e.g., `{ useState }` from `"react"`) are destructured from the library global
5. The code is wrapped in an HTML shell with `
A self-contained HTML artifact.