Local app
Building locally with Prisma is ordinary app development: you run your framework's dev server, query a database, and iterate. What the platform adds is parity: the pieces you develop against locally behave like the ones you deploy to.
Prisma Compute runs deployed apps on Bun. There is no proprietary runtime layer to emulate locally: run your app with Bun on your machine and you are exercising the same runtime your deployment uses. Bun's built-in APIs, like its S3 client, work identically in both places.
Day to day, iteration stays your framework's usual loop. A scaffolded Prisma ORM app starts with:
bun run devpnpm run devyarn devnpm run devFor a Bun-native server, run the entry file directly:
bun run src/index.tsThe Bun runtime guide walks through a full local build on Bun.
Point your app at a local Prisma Postgres instance instead of a hosted one. Start it from your project directory:
bunx prisma devpnpm prisma devyarn prisma devnpx prisma devIt prints a DATABASE_URL you copy into .env; migrations and queries then run against your machine. Local Postgres covers instances, background mode, and management commands.
This .env wiring is hand-wired configuration, and it belongs to the direct dev-server loop: when you deploy an app configured this way, you swap DATABASE_URL for a hosted Prisma Postgres connection string, with no application code changes. A Composer app declares the wiring instead. The service depends on postgres() and reads its connection string as db.url from service.load(), so the same declaration resolves to a local database under dev and a hosted one on deploy, and there is no variable to swap.
It prints a DATABASE_URL you copy into .env; migrations and queries then run against your machine. Local Postgres covers instances, background mode, and management commands.
This .env wiring is hand-wired configuration, and it belongs to the direct dev-server loop: when you deploy an app configured this way, you swap DATABASE_URL for a hosted Prisma Postgres connection string, with no application code changes. A Composer app declares the wiring instead. The service depends on postgres() and reads its connection string as db.url from service.load(), so the same declaration resolves to a local database under dev and a hosted one on deploy, and there is no variable to swap.
Apps deploy to Compute as Prisma Composer apps: you declare your services in TypeScript and deploy stands them up. The same declarations run locally. One command brings the whole app up, whether it is one service or several, with its databases and buckets wired together:
bun run build
bunx prisma dev module.tspnpm run build
pnpm prisma dev module.tsyarn build
yarn prisma dev module.tsnpm run build
npx prisma dev module.tsdev runs the same pipeline a deploy runs, but against local emulators standing in for Prisma Compute and Prisma Postgres. No cloud credentials are involved, and the local databases and buckets persist between runs until you pass --fresh. When the app runs locally, deploying it is the same declarations against the hosted platform.
Local development in Composer documents the full workflow: warm restarts, log filtering, and what is local versus what is real.
dev runs the same pipeline a deploy runs, but against local emulators standing in for Prisma Compute and Prisma Postgres. No cloud credentials are involved, and the local databases and buckets persist between runs until you pass --fresh. When the app runs locally, deploying it is the same declarations against the hosted platform.
Local development in Composer documents the full workflow: warm restarts, log filtering, and what is local versus what is real.
- Local Postgres: the local database in detail.
- Local storage: S3-compatible clients against local and hosted buckets.
- Deploy your first app: take the locally built app to a live URL.