Use this reference when deciding whether and how an app can deploy to Prisma Compute.
Treat @prisma/cli app deploy as the deployment surface. Treat create-prisma as a new-project scaffold that can generate useful defaults and, for some templates, a compute:deploy script.
Compute deploy supports these framework keys:
nextjs
nuxt
astro
hono
nestjs
tanstack-start
custom
bun
Auto-detection:
- Next.js:
next.config.*ornextdependency - Nuxt:
nuxt.config.*ornuxtdependency - Astro:
astro.config.*orastrodependency - Hono:
honodependency - NestJS:
nest-cli.jsonor@nestjs/coredependency - TanStack Start:
@tanstack/react-startor@tanstack/solid-start - Custom artifact: explicit
framework: "custom"plusbuild.outputDirectoryandbuild.entrypointinprisma.compute.ts - Bun: explicit
--entry <path>or--framework bun
If detection is ambiguous, set framework in prisma.compute.ts or pass a supported --framework value. If the app is a source-level plain server, use framework: "bun" plus entry, or pass --framework bun --entry <path>, after verifying the server entrypoint. If the app already produces a runnable Node artifact, use framework: "custom" with build.outputDirectory and build.entrypoint.
| App shape | Deploy command shape | Auto-detected | Required output/entry | Notes |
|---|---|---|---|---|
| Next.js | --framework nextjs |
Yes | standalone server.js output |
Requires output: "standalone" |
| Nuxt | --framework nuxt |
Yes | .output/server/index.mjs |
Framework strategy supplies build defaults; a config build block is optional |
| Astro | --framework astro |
Yes | standalone Node server artifact | Framework strategy supplies build defaults; a config build block is optional |
| Hono | --framework hono |
Yes | Bun entry from main, module, --entry, or src/index.ts |
Usually fixed port 8080 in generated config/scripts |
| NestJS | --framework nestjs |
Yes | NestJS server artifact | Omit host or bind to 0.0.0.0; a config build block is optional |
| TanStack Start | --framework tanstack-start |
Yes | .output/server/index.mjs |
Requires Nitro node output |
| Custom artifact | config-backed framework: "custom" |
No | configured build.outputDirectory and build.entrypoint |
Use for prebuilt/custom-built Node artifacts |
| Bun / plain server | --framework bun --entry <path> |
With explicit entry | server entrypoint | Use for Elysia and custom HTTP servers |
| Elysia | --framework bun --entry src/index.ts |
No dedicated deploy key | Bun entrypoint | Preserve port/host handling |
| SvelteKit | No deploy framework key | No | Node adapter/prebuilt artifact | Do not deploy vite preview |
| Turborepo | Deploy concrete app targets | No | app-specific entry/output | Prefer prisma.compute.ts with apps |
app build --build-type uses the framework build type. Build types include auto, nextjs, nuxt, astro, nestjs, tanstack-start, custom, and bun.
app run --build-type is local-dev oriented and supports auto, bun, and nextjs. It streams the local dev server and is not proof that the deployed app is reachable through public ingress.
prisma.compute.ts can set framework, entrypoint, HTTP port, env inputs, app root, region, and build settings. A config build block is accepted for every supported framework; all build types are config-backed (nextjs, nuxt, astro, nestjs, tanstack-start, custom, bun; hono builds through the bun strategy). For Nuxt, Astro, and NestJS the framework strategy supplies the default build command and output, so a build block is optional and normally unnecessary, but it overrides those defaults when present. Only custom requires one.
Config snippets below assume:
import { defineComputeConfig } from "@prisma/compute-sdk/config";Compute needs a server process:
- It must listen on the deployed HTTP port.
@prisma/cli app deploydefaults to the framework's default HTTP port (3000 for most frameworks, 4321 for Astro) unless--http-portis passed. - It must bind on all interfaces. Do not hard-code
localhostor127.0.0.1for a deployed server; use0.0.0.0,server.host: true, or the framework equivalent. - It must have a deployable entrypoint or recognized framework output.
- It must not rely on a preview-only command such as
vite preview. - It must receive env vars through
--env, project env, branch env, or external automation.
Check host and port together. A listener on the right port but bound to loopback can appear ready while public ingress cannot reach it.
Deploy shape:
bunx @prisma/cli@latest app deploy --framework nextjs --env .envnext.config.ts must include standalone output:
import type { NextConfig } from "next"
const nextConfig: NextConfig = {
output: "standalone",
}
export default nextConfigDo not pass --entry with nextjs; the CLI derives the runtime entrypoint from framework build output.
Do not set HOSTNAME=localhost or HOSTNAME=127.0.0.1 in deploy env. If the standalone server host is overridden, use 0.0.0.0.
Deploy shape:
bunx @prisma/cli@latest app deploy \
--framework hono \
--http-port 8080 \
--env .envConfig shape:
export default defineComputeConfig({
app: {
framework: "hono",
entry: "src/index.ts",
httpPort: 8080,
env: ".env",
},
});Project expectations:
package.jsonhasmainormodulepointing at the entrypoint, or deploy passes--entry src/index.ts- server uses
@hono/node-server - code reads
process.env.PORTand defaults to the same port used by--http-port - code does not set
hostnametolocalhostor127.0.0.1; if hostname is set explicitly, use0.0.0.0
Example runtime shape:
const rawPort = (process.env.PORT ?? "").trim()
const parsedPort = rawPort.length > 0 ? Number(rawPort) : Number.NaN
const port = Number.isInteger(parsedPort) ? parsedPort : 8080
serve({ fetch: app.fetch, port })Deploy shape:
bunx @prisma/cli@latest app deploy --framework nestjs --env .envConfig shape:
export default defineComputeConfig({
app: {
framework: "nestjs",
env: ".env",
},
});Project expectations:
- detection uses
nest-cli.jsonor the@nestjs/coredependency; pass--framework nestjswhen neither signal is present src/main.tsor the compiled runtime must start an HTTP server- read
process.env.PORTand default to the same port used by--http-port - omit the host argument in
app.listen(port)or pass"0.0.0.0"; do not pass"localhost"or"127.0.0.1" - a
buildblock is optional for NestJS; the framework strategy supplies the build/output defaults, and a committedbuildblock overrides them - use
app build --build-type nestjsfor a Compute artifact check;app run --build-type nestjsis not supported, so use the Nest dev server locally
Example runtime shape:
const port = Number(process.env.PORT ?? "3000")
await app.listen(port)Deploy shape:
bunx @prisma/cli@latest app deploy --framework tanstack-start --env .envExpected vite.config.ts shape:
import { defineConfig } from "vite"
import viteReact from "@vitejs/plugin-react"
import { tanstackStart } from "@tanstack/react-start/plugin/vite"
import { nitro } from "nitro/vite"
export default defineConfig({
plugins: [tanstackStart(), nitro(), viteReact()],
})Preserve these details:
- keep
nitroindependencies - keep
import { nitro } from "nitro/vite" - keep
nitro()in the Vite plugin list - keep the React Vite plugin after
tanstackStart() - keep Nitro on its default node server preset; do not switch to edge, static, Cloudflare, or another non-Node preset for Compute
The build command is vite build. The build must produce .output/server/index.mjs, and the production start shape is:
{
"scripts": {
"build": "vite build",
"start": "node .output/server/index.mjs"
}
}Do not deploy TanStack Start as a Bun entrypoint such as src/router.tsx. If .output/server/index.mjs is missing, fix the TanStack/Nitro build path.
Make sure Nitro does not bind only to localhost in deployment. If host env/config is customized, use the framework's all-interface host setting rather than localhost.
Deploy shape:
bunx @prisma/cli@latest app deploy --framework nuxt --env .envConfig shape:
export default defineComputeConfig({
app: {
framework: "nuxt",
env: ".env",
},
});Nuxt uses Nitro output at .output/server/index.mjs. Keep the Nitro preset compatible with a Node server runtime. A build block is optional for Nuxt: the framework strategy supplies the build command and output, and a committed build block overrides them.
Deploy shape:
bunx @prisma/cli@latest app deploy --framework astro --env .envConfig shape:
export default defineComputeConfig({
app: {
framework: "astro",
httpPort: 4321,
env: ".env",
},
});Astro Compute-style server output usually needs:
import { defineConfig } from "astro/config"
import node from "@astrojs/node"
export default defineConfig({
output: "server",
adapter: node({ mode: "standalone" }),
server: { host: true },
})A build block is optional for Astro: the framework strategy supplies the build command and output, and a committed build block overrides them.
Use the Bun deploy key for app shapes without a dedicated --framework value:
bunx @prisma/cli@latest app deploy \
--framework bun \
--entry src/index.ts \
--http-port 8080 \
--env .envapp deploy also treats --entry <path> without --framework as a Bun app deploy.
Requirements:
- pass
--entryunlesspackage.jsonmainormodulepoints at the runtime entrypoint - ensure the entrypoint starts an HTTP server, not only exports handlers
- read
process.env.PORTor align--http-portwith the fixed listener port - bind on all interfaces
Elysia example:
const port = Number(process.env.PORT ?? "8080")
app.listen({ port, hostname: "0.0.0.0" })Use framework: "custom" when the app is already built, or when a custom command produces a runnable Node artifact that Compute should stage as-is:
export default defineComputeConfig({
app: {
framework: "custom",
build: {
command: "npm run build",
outputDirectory: "build",
entrypoint: "handler.js",
},
httpPort: 3000,
env: ".env",
},
});Requirements:
- set both
build.outputDirectoryandbuild.entrypoint - make
build.entrypointrelative tobuild.outputDirectory - ensure the artifact starts an HTTP server and binds on all interfaces
- use
command: nullonly when the output directory already contains the deployable artifact
@prisma/cli app deploy --framework has no svelte framework key. Do not claim SvelteKit is directly deployable with that name.
For frameworks without a dedicated deploy key, use one of these paths:
- produce a Node server artifact and deploy with config-backed
framework: "custom", or through a supported prebuilt/SDK flow - if the app has a plain Node/Bun server entrypoint, deploy that entrypoint through
--framework bun --entry <path>
SvelteKit should use a Node adapter or another production server artifact. Do not use vite preview as the deployed runtime.
Deploy concrete app packages, not the monorepo root by default. Prefer prisma.compute.ts at the repo root with one apps entry per deploy target.
Checklist:
- choose the app directory, such as
apps/api - run the workspace build from the correct root/package
- pass the app package's runtime entrypoint or framework
- pass the correct env file, which may live outside the app package
- keep branch env/database scope aligned with the deployed app
Example config:
export default defineComputeConfig({
apps: {
web: { root: "apps/web", framework: "nextjs" },
api: {
root: "apps/api",
framework: "bun",
entry: "src/index.ts",
httpPort: 3000,
env: "packages/db/.env",
},
},
});Deploy one target:
bunx @prisma/cli@latest app deploy api --branch feature/foo --jsonFlag-only shape after confirming output paths:
bun run build
bunx @prisma/cli@latest app deploy \
--framework bun \
--entry apps/api/dist/src/index.js \
--http-port 3000 \
--env packages/db/.envVerify the actual output path before using this command.