Skip to main content

Supported frameworks

Layero detects the framework automatically from the contents of package.json, the config files in the root and the lockfile. When auto-detection gets it wrong, override the choice through layero.json, the layero deploy --type flag, or the project settings in the dashboard.

Auto-detection (static)​

The order of checks matters — the first match wins:

FrameworkSignalOutput dir
Next.js (export)dep nextout
Nuxtdep nuxt.output/public
Remix / React Router v7dep @remix-run/* / @react-router/*build/client
SvelteKitdep @sveltejs/kit + svelte.config.*build
Gatsbydep gatsbypublic
Astrodep astrodist
Docusaurusdep @docusaurus/corebuild
Storybookdep @storybook/*storybook-static
VitePressdep vitepress.vitepress/dist
Vitedep vitedist (or outDir from vite.config, if set)
Angulardep @angular/core or angular.jsondist/{project}/browser
Create React Appdep react-scriptsbuild
Eleventy (11ty)dep @11ty/eleventy or eleventy.config.*_site
Hugohugo.toml or config.tomlpublic
Staticonly HTML in the root, no package.json. No build runs at all.
Genericyour own build script: no known framework, your buildCommand and outputDirectory are executeddist

The default build command is npm run build (or yarn build / pnpm build, depending on the lockfile). Hugo is built with hugo --gc --minify, Nuxt with nuxt generate.

Setting the preset explicitly​

Through the CLI:

layero deploy --type vite

Static presets of the flag: vite, vitepress, next (nextjs), astro, cra, sveltekit, nuxt, gatsby, docusaurus, storybook, eleventy (11ty), hugo, static, generic. The same flag accepts a runtime kind — node_web, python_web, ssr_next — for apps that Layero runs rather than serves as files; see layero deploy. The other frameworks from the table are set with the framework field in layero.json.

Through layero.json in the repository root:

{
"$schema": "https://layero.ru/schema/layero-v2.json",
"framework": "vite",
"buildCommand": "pnpm build:prod",
"outputDirectory": "bundle"
}

Two values are easy to mix up:

  • static — no build runs at all. No install and no build: buildCommand is ignored with it, and whatever sits in the root is published (minus the ignore rules). Handy for ready-made HTML.
  • generic — your own build script. There is no known framework, but the project has to be built: Layero executes buildCommand and takes the result from outputDirectory.
layero.json — your own build script
{ "framework": "generic", "buildCommand": "node build.mjs", "outputDirectory": "public" }

If the build log says static framework: skipping install/build and the site is empty, the project needs generic, not a different output path. Since 18.09.2026 the platform says so itself: with static and a buildCommand in layero.json the log shows [config] ВНИМАНИЕ: buildCommand из layero.json … НЕ выполняется ("is NOT run"), and if the output is missing the failure starts with «Сборка НЕ запускалась» ("the build did NOT run") and names the command that was not run.

Runtime applications​

Next.js in server mode (without output: 'export'), Streamlit, Gradio, Flask and the like run as containers — a separate mode, see Runtime.

Node version​

Sources, in priority order:

  1. Project settings (Project → Settings → Node.js version)
  2. .nvmrc
  3. .node-version
  4. package.json → engines.node
  5. Node 22 by default

For overrides and version retirement, see Runtime versions.

Package manager​

Determined by the lockfile:

LockfileManager
yarn.lockyarn
pnpm-lock.yamlpnpm
package-lock.json, or nonenpm
npm and optional dependencies

If your package-lock.json was generated on macOS while the build environment is Linux, npm ci can hang for a long time on platform-specific optional dependencies. If you hit this, commit a lockfile generated on Linux, or switch to pnpm or yarn.