Skip to content

Frontend frameworks

Alchemy deploys frontends to Cloudflare with two resources: Cloudflare.Website.Vite for anything built by Vite, and Cloudflare.Website.StaticSite for anything built by any other command.

const site = yield* Cloudflare.Website.Vite("Website");

Cloudflare.Website.Vite deploys any pure-Vite app — it runs a programmatic vite build of your project with the Cloudflare plugin appended to the plugins your own vite.config.ts declares, then uploads the client assets (and server bundle, if the build produces one) as a Worker. No main entrypoint, no build command, no output directory, no Wrangler config. Whatever framework plugin drives your Vite build — TanStack Start, React Router, Vue, SolidStart — rides along unchanged.

const site = yield* Cloudflare.Website.StaticSite("Website", {
command: "zola build",
outdir: "public",
});

Cloudflare.Website.StaticSite deploys any directory produced by any build command — it runs the command as a shell process, content-hashes the output directory, and serves it as Worker static assets. The framework (or lack of one) doesn’t matter: if a command produces a directory of files, StaticSite deploys it.

Both resources are thin wrappers over a Worker, so everything a Worker supports applies to both: domain, env bindings, compatibility flags, and a custom main entrypoint in front of the assets.

FrameworkResourceStatusGuide
React / Vite SPAViteSupportedVite SPA
TanStack Start (React & Solid)ViteSupportedTanStack Start
React Router (incl. RSC)ViteSupportedReact Router
VueViteSupportedVue
SolidStart / SolidJS SSRViteSupportedSolidStart
AstroStaticSite (static output)Vite support is a TODOAstro
NuxtNot yet supportedNuxt
Zola, Hugo, or any static generatorStaticSiteSupportedStatic sites

Every “Supported” row is backed by a checked-in example or a live deploy test in the Alchemy repository — plain Vite SPA deploys are live-tested with a vanilla fixture, and React itself is exercised via the TanStack Start example. The last row is deliberately open-ended: StaticSite runs any build command that produces a directory, so any static generator works the same way — Zola is the one exercised as an example.

The criterion is literal: Cloudflare.Website.Vite calls vite.createBuilder({ root: rootDir, plugins: [cloudflare(...), ...] }) on your project root and runs buildApp() — nothing else.

If your entire app is built by vite build — the framework is a plugin declared in vite.config.ts (tanstackStart(), viteReact(), @vitejs/plugin-vue, solidStart()) — use Vite. If the framework drives its own CLI build (astro build, nuxi build) or isn’t JavaScript at all (Zola, Hugo), that build never enters Vite’s builder, so use StaticSite on the build output instead. See what “pure Vite” means for the full picture.