# Publish an app

Volly serves static apps: drag in a built app, a static site `.zip`, a
single HTML file, or a single React component (`.jsx`/`.tsx`), and it goes
live at its own URL in your company directory — something like
`https://acme-reports.volly.so`.

Upload from the dashboard (drag and drop anywhere, or use the publish
wizard), or let an AI agent do it for you via the
[MCP integration](https://volly.so/docs/mcp).

## What the zip needs

- **`index.html` at the top level** — this is where viewers land.
- **Relative asset paths** (e.g. `css/style.css`), bundled in the zip.
- **Static files only** — for frameworks, upload the built output like
  `dist/` or `out/`.
- **Optional `README.md`** at the top level becomes the project README, shown
  alongside your app.

## Limits

| Limit                    | Value  |
| ------------------------ | ------ |
| Files per app            | 500    |
| Zip upload size          | 100 MB |
| Uncompressed bundle size | 150 MB |
| Single-file upload       | 30 MB  |

:::tip
A single file (`.html`, `.jsx`, or `.tsx`) can be up to 30 MB — zip it
together with its assets to go larger.
:::

## Single React component (`.jsx`/`.tsx`)

A single React component file — like the ones Claude produces as artifacts —
deploys as-is: Volly wraps it in a generated page that transpiles and renders
it in the browser, no build step needed.

- The file must **`export default`** a React component.
- **npm imports work** (`react`, `lucide-react`, `recharts`, …) — they load
  from [esm.sh](https://esm.sh) when the page is viewed.
- **Tailwind classes work** (the wrapper includes the Tailwind Play CDN).
- **Local imports don't** — `./other-file` and `@/components/...` can't be
  resolved from a single file. Inline that code, or build the app and upload
  a `.zip`.

The original source stays available next to the page at `app.jsx`/`app.tsx`.

Publishing something Claude built? See
[Publish a Claude artifact](https://volly.so/docs/claude-artifacts) for the few Claude-only
features that don't carry over — and how Volly helps you fix them.

## Updating an app

Publishing again replaces the live build at the same URL — viewers get the
new version on their next visit. Every deploy is kept in the project's
history.

Not ready for everyone to see it? Save the update as a
[draft](https://volly.so/docs/drafts) and test it on a private preview URL first.

## Who can see it

New apps start **Restricted** — visible only to you and people you invite.
Open them up to the whole workspace (or share by link) from the Share
dialog — see [Share an app and control access](https://volly.so/docs/sharing).

## An app you can't upload?

If the tool needs a database or a server — or already lives on Vercel,
Heroku, or your own infrastructure — you can still put it in your directory
behind Volly sign-in. See
[Add an app hosted elsewhere](https://volly.so/docs/gated-apps).