> This page is for Webflow Cloud.

> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://developers.webflow.com/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://developers.webflow.com/_mcp/server.

# Static apps

> Deploy no-framework static apps on Webflow Cloud using plain HTML, CSS, and JavaScript.

Use this path when your app is plain HTML, CSS, and JavaScript with no framework build.

This page covers no-framework static apps.
For framework apps, including Vite static SPAs, see [Optimizing your app for Webflow Cloud](/webflow-cloud/environment/framework-customization).

## What qualifies as a static app

Webflow Cloud treats your app as static in either of these cases:

* You set `"framework": "static"` inside the `cloud` object in `webflow.json`.
* You don't set a framework, and your repo meets static inference rules.

For inference, all of these conditions must hold:

* No root `package.json`.
* No nested `package.json` below the repo root.
* No other framework in `webflow.json`.
* A root `index.html` that is a regular file.
* No build or runtime indicators in the published tree.

> **Mixed static and runtime repos fail inference**
>
> If a repo has a root `index.html` and build or runtime indicators, static inference fails.
> The deploy exits with an error that lists the conflicting files.
>
> Set `"framework": "static"` in `cloud` only if you intentionally want those files published as public static assets.
> This override can publish framework source files if your repo also contains a framework app.

## Deploy a static app

The recommended start is to fork [hello-world-static-app](https://github.com/Webflow-Examples/hello-world-static-app).
It deploys by inference, with no `package.json` and no `webflow.json`.

Deploy with the CLI:

```bash
webflow cloud deploy
```

For later deployments, use the workflow configured for your app.

> **Note**
>
> Dashboard setup can still warn when a static repo has no root `package.json`.
> If you hit that warning, deploy with the CLI first, then continue with your normal deployment workflow.

## Opt in explicitly with webflow\.json

Set this when you need to force static mode:

**`webflow.json`**

```json title="webflow.json"
{
  "cloud": {
    "framework": "static"
  }
}
```

For the full framework value list, see [Bring your own app](/webflow-cloud/bring-your-own-app).

## Mount paths and asset references

Webflow Cloud serves static app files exactly as committed.
It doesn't rewrite HTML, CSS, or JavaScript paths.

> **Absolute asset paths can break under mount paths**
>
> If your mount path is `/app`, an absolute path like `/styles.css` resolves at the domain root and can 404.
>
> Use relative paths like `./styles.css`, or prefix paths with your mount path.

Framework apps handle base paths differently.
For that behavior, see [Optimizing your app for Webflow Cloud](/webflow-cloud/environment/framework-customization).

## `_headers` and `_redirects` files

If present, `_headers` and `_redirects` are moved to the asset root.
Cloudflare honors these files only at the asset root.

> **Note**
>
> Rule-path semantics for `_redirects` under non-root mount paths are still being verified.
> Test new rules in a non-production environment before rollout.

## What static apps can't do

Static apps are assets-only deployments:

* No worker deploys.
* No server runtime exists.
* No framework build step runs.

Webflow Cloud accepts and ignores worker-oriented configuration for static apps.
This includes D1, KV, and R2 bindings plus worker configuration in `wrangler.json`.

Environment variables don't affect static apps.
There is no build step or worker runtime to consume them.

## What's never published

Webflow Cloud copies from your whole checkout for static apps.
Any file not excluded is published as a public asset.
The exclusions include:

* Dot files and dot-directories, except `.well-known`.
* `node_modules`, `package.json`, lock files, `clouduser`, and `clouduser.wrangler.json`.
* `webflow.json`, `webflow.jsonc`, and `wrangler.*` control files.
* `terraform.tfstate`, `terraform.tfstate.*`, `*.tfvars`, and `auth.json`.
* Private key material like `*.pem`, `*.key`, `*.pfx`, `*.p12`, `id_rsa`, `id_rsa.*`, `id_dsa`, `id_ecdsa`, and `id_ed25519`.

Symlinks are never followed.