Skip to content

Supported frameworks

deploybase detects your framework from the files in your repository and applies its defaults. Anything on this page can be overridden per project, and a framework we have never heard of works too: set the build command and output directory yourself.

The one requirement is shared by all of them. deploybase serves files, so your build has to produce a directory of files. Frameworks that expect a server process at request time need to be configured for static output first, and the notes below say how.

Framework Build command Output Install Image
Next.js npm run build out npm install node:24-alpine
SvelteKit npm run build build npm install node:24-alpine
Astro npm run build dist npm install node:24-alpine
Vite npm run build dist npm install node:24-alpine
Gatsby npm run build public npm install node:24-alpine
Hugo hugo --minify public none ghcr.io/gohugoio/hugo:v0.168.0
Jekyll bundle exec jekyll build _site bundle install ruby:3.3
Static HTML none . none, or yours once you set a build command alpine:3.24, or node:24-alpine with a build command
Other npm run build dist npm install node:24-alpine

The framework field accepts exactly these values: nextjs, sveltekit, astro, hugo, vite, gatsby, jekyll, static-html, other.

Static HTML is for a repository that is already a website. By default nothing is built and the repository is published as it is. Set a build command and the build runs with Node, npm, pnpm, yarn and bun available, and installs dependencies first when the repository has a package.json. Set the output directory to wherever that command writes. Because the whole working directory is the output, some paths are withheld from every deploy, your .git directory among them.

Other is the generic Node preset. Point the build command at whatever your toolchain runs and the output directory at whatever it writes.

The npm install in the table is shorthand. The install that actually runs depends on your lockfile and package manager: see package managers.

Framework What to configure
Next.js output: 'export' in next.config.js. No SSR, API routes, middleware or ISR. Full guide
SvelteKit @sveltejs/adapter-static, either fully prerendered or in SPA mode. Full guide
Astro Nothing for a static site. Replace another host’s SSR adapter with @deploybase/adapter-astro (beta) for on-demand pages. Set site for canonical URLs. Full guide
Hugo Set baseURL, and vendor your theme rather than using a Git submodule. Full guide
Gatsby Nothing. gatsby build is static by default
Vite Nothing, for a client-rendered app. A dev-server proxy has no equivalent in production
Jekyll A committed Gemfile.lock. bundle install resolves against it

Change the build command and output directory under Configure → Build and Git, or:

Terminal window
curl -X PATCH "https://api.deploybase.eu/api/v1/projects/$PROJECT_ID" \
-H "Authorization: Bearer $DEPLOYBASE_API_KEY" \
-H "Content-Type: application/json" \
-d '{"build_command": "npm run generate", "output_dir": ".output/public"}'

The output directory is relative to the repository root, and it is the directory whose contents are published: dist publishes dist/index.html as /index.html.

The build command is a shell command. It runs with sh in the repository root, or in the root directory when you set one, after dependencies are installed. Chaining, pipes, quotes and inline variables all work:

npm run lint && npm run build
NODE_ENV=production npm run build
tsc --noEmit && esbuild src/app.ts --bundle --outfile=public/app.js
hugo --minify --baseURL "https://example.com/"

Dependencies are already installed when your command starts, so there is no need to begin it with npm ci or npm install.

The command must fit on one line. To run several steps, chain them with && so the build stops at the first one that fails. A longer sequence reads better as a script in package.json or a shell script in the repository, such as sh scripts/build.sh.

The command is checked when you save it. The dashboard, the API and the MCP server refuse a command the build would refuse: one with a line break, a tab or another control character in it.

Secrets belong in environment variables, not in the command. They are encrypted, scoped per environment, and available to the command as ordinary shell variables.

Limits: build command 1024 characters, output directory 255 characters. An output directory cannot be absolute or contain ...

Node projects install with npm, pnpm, yarn or bun, detected from your repository. To pin it:

Terminal window
curl -X PATCH "https://api.deploybase.eu/api/v1/projects/$PROJECT_ID" \
-H "Authorization: Bearer $DEPLOYBASE_API_KEY" \
-H "Content-Type: application/json" \
-d '{"package_manager": "pnpm"}'

Your build command does not change. npm run build runs the build script from package.json whichever manager installed the dependencies. Detection order and lockfile handling has the details.

If we cannot identify the framework we say so rather than guessing, and fall back to npm run build into dist/. Set the two fields yourself and the build runs the same as any other.

If your toolchain does not fit any of this, build the site wherever you like and upload the finished directory. The publish step works the same, and so do previews, promotion and rollback.

Live a8b7eb1d built