diff --git a/apps/blog/content/blog/launching-prisma-compute-public-beta/index.mdx b/apps/blog/content/blog/launching-prisma-compute-public-beta/index.mdx
new file mode 100644
index 0000000000..3e22513a85
--- /dev/null
+++ b/apps/blog/content/blog/launching-prisma-compute-public-beta/index.mdx
@@ -0,0 +1,61 @@
+---
+title: "Launching Prisma Compute in Public Beta"
+slug: "launching-prisma-compute-public-beta"
+date: "2026-06-08"
+authors:
+ - "Shane Neubauer"
+metaTitle: "Launching Prisma Compute in Public Beta"
+metaDescription: "Prisma Compute is now in public beta: TypeScript app hosting that runs on the same infrastructure as your database. Point your agent at your project and tell it to deploy."
+heroImagePath: "/launching-prisma-compute-public-beta/imgs/hero.png"
+heroImageAlt: "Prisma Compute, now in public beta"
+metaImagePath: "/launching-prisma-compute-public-beta/imgs/meta.png"
+tags:
+ - "announcement"
+ - "platform"
+ - "ai"
+---
+
+import { deployTerminalLines } from "./snippets";
+
+The hard part of building apps has moved up the stack. You describe what you want, and your agent codes it at 50x the speed.
+
+What didn't change is everything after: finding somewhere to host it, configuring your database, copying connection strings between dashboards, setting environment variables, inspecting build output, chasing logs, and feeding all of that context back into the agent when something breaks.
+
+The friction didn't disappear, it moved.
+
+## Introducing Prisma Compute
+
+Today we're launching Prisma Compute in [public beta](https://pris.ly/public-beta-docs): TypeScript app hosting that runs on the same infrastructure as your database, without sending traffic through a separate hosting vendor.
+
+It runs on Bun, scales to zero when nothing is happening, and treats every deploy as an immutable version with its own preview URL. You can look at a change running in production-like conditions before you promote it, and roll back just as easily by promoting the previous one.
+
+Every branch comes with a full database and an app deployment. Your agent can spin up a branch, test a new idea against a real database, and merge it into production when it's ready. App and database, together in one box.
+
+The most important part is that your agent can drive the whole loop: build, deploy, read logs, fix, and redeploy. It can make a change, inspect what happened, fix what failed, and try again without jumping between tools.
+
+That is the direction Prisma is moving in: one place where product builders, and their agents, can define the stack, deploy it, inspect it, and keep iterating.
+
+## Where Prisma is headed
+
+Prisma started as a type-safe ORM for the TypeScript community, where you could express your database schema as code. Then we launched Prisma Postgres, so you could host your database with Prisma too. Now Prisma Compute brings the app and database together into one platform, where you, or your agent, can define the entire stack as code and deploy it.
+
+With Prisma Compute, Prisma becomes a platform for product builders who want to build software with their agent, in the way software is built in 2026.
+
+## Try it
+
+Compute is in public beta starting today. Sign in once with `bunx @prisma/cli@latest auth login`, the one step that needs a human, then point your coding agent at your project and tell it:
+
+
+
+One prompt, and the agent reads the project, provisions a branch database, applies your schema, builds the app, and ships an immutable preview URL. When something breaks, it reads the same logs you just watched scroll by, fixes the cause, and redeploys. The loop stays inside the agent.
+
+Want the full walkthrough, from signing in to connecting GitHub for deploy-on-push? Read the [Compute quickstart](https://docs.prisma.io/docs/prisma-compute/deploy).
+
+We're early and shipping fast, so tell us what breaks or feels rough in [the `prisma-compute` channel on our Discord](https://pris.ly/discord-compute).
+
+Go build something.
diff --git a/apps/blog/content/blog/launching-prisma-compute-public-beta/snippets.ts b/apps/blog/content/blog/launching-prisma-compute-public-beta/snippets.ts
new file mode 100644
index 0000000000..90f484806b
--- /dev/null
+++ b/apps/blog/content/blog/launching-prisma-compute-public-beta/snippets.ts
@@ -0,0 +1,20 @@
+// Captured from a real `@prisma/cli@latest app deploy --db` run.
+// The agent reads the project and detects the build, wires a branch
+// database, applies the schema, builds, uploads, and ships an
+// immutable preview, all from one command.
+export const deployTerminalLines = [
+ "✔ Linked ./guestbook to project compute-guestbook-demo",
+ "Deploying compute-guestbook-demo / add-guestbook / guestbook",
+ " Build command bun run build",
+ " Output .",
+ "◇ Creating branch database…",
+ "✔ Created branch database",
+ "◇ Applying schema with prisma db push…",
+ "✔ Database in sync with prisma/schema.prisma",
+ "✔ Added branch env: DATABASE_URL, DIRECT_URL",
+ "Building locally… Built",
+ "Uploading… Uploaded",
+ "Deploying… Deployed",
+ "✔ Live in 4.5s",
+ " https://add-guestbook.guestbook.prisma.build",
+];
diff --git a/apps/blog/public/authors/shane-neubauer.png b/apps/blog/public/authors/shane-neubauer.png
index 9f6f55fb76..103983152e 100644
Binary files a/apps/blog/public/authors/shane-neubauer.png and b/apps/blog/public/authors/shane-neubauer.png differ
diff --git a/apps/blog/public/launching-prisma-compute-public-beta/imgs/hero.png b/apps/blog/public/launching-prisma-compute-public-beta/imgs/hero.png
new file mode 100644
index 0000000000..33d382d51c
Binary files /dev/null and b/apps/blog/public/launching-prisma-compute-public-beta/imgs/hero.png differ
diff --git a/apps/blog/public/launching-prisma-compute-public-beta/imgs/meta.png b/apps/blog/public/launching-prisma-compute-public-beta/imgs/meta.png
new file mode 100644
index 0000000000..d0fb5595df
Binary files /dev/null and b/apps/blog/public/launching-prisma-compute-public-beta/imgs/meta.png differ
diff --git a/apps/blog/src/components/AgentPrompt/Client.tsx b/apps/blog/src/components/AgentPrompt/Client.tsx
index fd5a0a32dd..a3f0db8c3a 100644
--- a/apps/blog/src/components/AgentPrompt/Client.tsx
+++ b/apps/blog/src/components/AgentPrompt/Client.tsx
@@ -231,7 +231,7 @@ export function AgentPromptClient({
{showSkillBadge ? (
- Agent
+ Skill
{skill}
) : null}
@@ -276,7 +276,7 @@ export function AgentPromptClient({
- {skill ? `Running ${skill}` : "Terminal"}
+ {skill ? `Agent running ${skill}` : "Terminal"}
{!hasCode ? (
-
-}>
- **Need a database?** Get started with your favorite framework and Prisma Postgres.
+ }
+ >
+ Deploy and run your TypeScript app next to your database, with a live
+ preview for every branch.
- }>
- **Already have a database?** Use Prisma ORM for a type-safe developer experience and automated migrations.
+
+
+
+
+
+ }
+ >
+ Get started with your favorite framework and Prisma Postgres as the
+ database.
diff --git a/apps/docs/content/docs/(index)/meta.json b/apps/docs/content/docs/(index)/meta.json
index 878f912fea..14b5034999 100644
--- a/apps/docs/content/docs/(index)/meta.json
+++ b/apps/docs/content/docs/(index)/meta.json
@@ -8,6 +8,8 @@
"---Prisma ORM---",
"...prisma-orm",
"---Prisma Postgres---",
- "...prisma-postgres"
+ "...prisma-postgres",
+ "---Prisma Compute---",
+ "...prisma-compute"
]
}
diff --git a/apps/docs/content/docs/(index)/prisma-compute/deploy.mdx b/apps/docs/content/docs/(index)/prisma-compute/deploy.mdx
new file mode 100644
index 0000000000..c9e194b203
--- /dev/null
+++ b/apps/docs/content/docs/(index)/prisma-compute/deploy.mdx
@@ -0,0 +1,187 @@
+---
+title: Deploy your first app
+description: Take a TypeScript app from your terminal to a live URL on Prisma Compute, either by scaffolding a new one or deploying a project you already have.
+url: /prisma-compute/deploy
+metaTitle: "Quickstart: Deploy your first app on Prisma Compute"
+metaDescription: Deploy a TypeScript app to Prisma Compute with the @prisma/cli beta package. Scaffold a new app with create-prisma or deploy an existing project, then verify it at a live URL.
+---
+
+[Prisma Compute](/compute) is serverless hosting for TypeScript apps. It runs your app right next to your Prisma Postgres database, so the trip from app to data stays short.
+
+This is a quickstart: sign in, then deploy. There are two ways in:
+
+- **To start fresh**, scaffold a new app and deploy it in one step with `create-prisma`. Follow [Option A](#option-a-scaffold-a-new-app-with-create-prisma).
+- **To deploy an app you already have**, run a deploy from its directory. Follow [Option B](#option-b-deploy-a-project-you-already-have).
+
+To learn more about how Compute works, see the [resource model](/compute#the-model) for a mental model.
+
+## Prerequisites
+
+Before you start, make sure you have:
+
+- **A JavaScript runtime.** Node.js 22.12 or newer for `npx`/`pnpm dlx`, or Bun for `bunx`.
+- **A [Prisma Data Platform account](https://pris.ly/pdp).** Free to create, and it holds your workspace.
+- **An app, if you are bringing your own.** Compute deploys **Next.js**, **Hono**, **TanStack Start**, and plain **Bun** servers today, including **Elysia** (which runs on Bun). Skip this if you are scaffolding a new app below.
+
+:::info
+
+Next.js apps must set `output: "standalone"` in their Next.js config before deploying. The `create-prisma` template already does this for you.
+
+```ts title="next.config.ts"
+export default { output: "standalone" };
+```
+
+:::
+
+## 1. Sign in
+
+Sign in once. This is the only step that needs a human, because it opens your browser:
+
+```npm
+npx @prisma/cli@latest auth login
+```
+
+It stores a session on your machine that every later command reads automatically, including a coding agent working in your directory. Confirm it any time with `auth whoami`.
+
+Two shortcuts from here:
+
+- In CI or a headless environment where no browser can open, use a [service token](/compute/getting-started#automation-and-ci) instead.
+- To let an agent do the deploying for you, jump to [Hand it to your agent](#hand-it-to-your-agent).
+
+## 2. Deploy your app
+
+Both options finish in the same place: a live URL and a project you can deploy to again.
+
+### Option A: Scaffold a new app with create-prisma
+
+`create-prisma` builds a TypeScript app from a template, wires up Prisma, and can deploy it to Compute in the same run. Run it and answer the prompts:
+
+```npm
+npx create-prisma@latest
+```
+
+It asks for a template, a database provider, and a few options, then asks **"Deploy to Prisma Compute now?"**. Say yes, and the deploy step:
+
+- signs you in, if you have not already
+- creates a Prisma project for the app
+- builds and deploys it, then prints the live URL
+- provisions a Prisma Postgres database and wires it in, when you pick PostgreSQL and don't bring your own connection string
+
+So your deployed app has a database from its first request.
+
+To skip the prompts, pass your choices as flags. Compute deploys are available for the `hono`, `elysia`, `next`, and `tanstack-start` templates:
+
+```npm
+npx create-prisma@latest --name my-api --template hono --provider postgresql --deploy
+```
+
+When it finishes, it prints your live URL and adds a `compute:deploy` script so you can redeploy later. Then [verify the deployment](#3-verify-the-deployment).
+
+### Option B: Deploy a project you already have
+
+From your app's directory, run:
+
+```npm
+npx @prisma/cli@latest app deploy
+```
+
+In one pass, the CLI:
+
+1. **Detects your framework** from your project files, whether that is Next.js, Hono, TanStack Start, or a plain Bun server. To choose it yourself, pass `--framework` (use `--framework bun` for a Bun or Elysia server).
+2. **Sets up a project** the first time you deploy from this directory, then writes [`.prisma/local.json`](/compute/getting-started#link-an-existing-project) to pin the directory to that project. That file is a gitignored local cache, not committed config. If your team already has a project, [link it first](/compute/getting-started#link-an-existing-project).
+3. **Resolves the target branch.** Inside a Git repository, the CLI uses your current Git branch name; otherwise it falls back to `main`. Pass `--branch ` to choose explicitly. Because each branch is its own isolated environment, this decides where the deploy lands.
+4. **Builds and uploads your app**, provisions it, and prints a live URL.
+
+Your first deploy is promoted to production automatically, so the URL you get back is your production URL.
+
+Need a database too? Add `--db`, and the deploy provisions a Prisma Postgres database and wires its connection string into this deploy target:
+
+```npm
+npx @prisma/cli@latest app deploy --db
+```
+
+## 3. Verify the deployment
+
+You have a URL. Confirm the app responds by opening it:
+
+```npm
+npx @prisma/cli@latest app open
+```
+
+If it does not behave the way you expect, stream its logs:
+
+```npm
+npx @prisma/cli@latest app logs
+```
+
+Logs cover both the build and the running app, so a failed build and a runtime error both surface in the same place.
+
+You can also inspect everything you have deployed in the [Console](https://pris.ly/pdp) instead of the terminal:
+
+- projects, branches, and apps
+- deployments, integrations, and domains
+
+## 4. Deploy again
+
+Run `app deploy` whenever you want to ship a change. After your first deploy, production is protected: deploying to your production branch again needs an explicit `--prod` flag, so you never ship to production by accident.
+
+```npm
+npx @prisma/cli@latest app deploy --prod
+```
+
+Deploying from a Git feature branch behaves differently. Instead of touching production, the CLI:
+
+- resolves the branch name and creates a matching platform branch if one does not exist yet
+- gives you an isolated [preview deployment](/compute/branching) with its own app, database, and URL
+
+Preview deploys never ask for confirmation, so run them as often as you like. In scripts and CI, add `--yes` to accept the production confirmation up front:
+
+```npm
+npx @prisma/cli@latest app deploy --prod --yes
+```
+
+## 5. Set up deploy on push (optional)
+
+Connect your project to a GitHub repository once, and Prisma deploys every push for you:
+
+- every commit you push is built and deployed on its own
+- each branch gets its own preview, with its own URL
+- you stop running `app deploy` by hand
+
+Make sure your project directory is a Git repository with a GitHub remote, then connect it:
+
+```npm
+npx @prisma/cli@latest git connect
+```
+
+`git connect` wires up the project this directory is linked to, which exists once you have deployed at least once. For monorepos and CI, see the [GitHub integration docs](/compute/github).
+
+## Hand it to your agent
+
+You can let a coding agent do the deploying. Sign in once yourself ([step 1](#1-sign-in)), because the browser step needs a human. After that, anything running in your environment inherits the session, including your agent. Paste this into your agent and fill in the blanks:
+
+```text
+Build [what you want] in [framework] and deploy it to Prisma Compute using `npx @prisma/cli@latest`.
+```
+
+For example:
+
+```text
+Build a Hono API with a /todos endpoint backed by an in-memory list. Deploy it to Prisma Compute using `npx @prisma/cli@latest`.
+```
+
+Notes for your agent:
+
+- Run every CLI command as `npx @prisma/cli@latest `, and add `--json` for structured output.
+- Check login state with `npx @prisma/cli@latest auth whoami`.
+- On the first deploy, the CLI creates the project and prints a live URL. Open it and confirm the app responds. The first deploy is promoted to production automatically.
+- To give the app a database, add `--db` to the deploy so Compute provisions and wires a Prisma Postgres database.
+- If the app needs config or secrets, scope them to the environment you're deploying. Use `--role production` for production deploys and `--role preview` for preview branches, then redeploy: `npx @prisma/cli@latest project env add KEY=value --role production` (or `--role preview`). Don't write production config to the preview scope. For the full scoping rules, see [Environment variables](/compute/environment-variables).
+
+## What's next
+
+- [Branching](/compute/branching): how preview branches isolate work and map to your Git branches.
+- [Add environment variables](/compute/environment-variables) for configuration, secrets, and your database connection string.
+- [Deployments](/compute/deployments): promote, roll back, and inspect what you ship.
+- [GitHub integration](/compute/github): the full picture on deploy-on-push, monorepos, and cleanup.
+- [Read the full CLI getting-started guide](/compute/getting-started) for frameworks, project linking, and CI.
diff --git a/apps/docs/content/docs/(index)/prisma-compute/meta.json b/apps/docs/content/docs/(index)/prisma-compute/meta.json
new file mode 100644
index 0000000000..90897af209
--- /dev/null
+++ b/apps/docs/content/docs/(index)/prisma-compute/meta.json
@@ -0,0 +1,5 @@
+{
+ "title": "Prisma Compute",
+ "defaultOpen": true,
+ "pages": ["deploy"]
+}
diff --git a/apps/docs/content/docs/(index)/prisma-orm/quickstart/prisma-postgres.mdx b/apps/docs/content/docs/(index)/prisma-orm/quickstart/prisma-postgres.mdx
index 39cca47e81..38998322a2 100644
--- a/apps/docs/content/docs/(index)/prisma-orm/quickstart/prisma-postgres.mdx
+++ b/apps/docs/content/docs/(index)/prisma-orm/quickstart/prisma-postgres.mdx
@@ -269,7 +269,11 @@ You've successfully set up Prisma ORM. Here's what you can explore next:
- **Build a full application**: Check out our [framework guides](/guides) to integrate Prisma ORM with Next.js, Express, and more
- **Join the community**: Connect with other developers on [Discord](https://pris.ly/discord)
+:::info[Deploy to Compute]
+Want to run this app in the cloud? Deploy it to [Prisma Compute](/compute), which runs your app next to your Prisma Postgres database. Follow [Deploy your first app](/prisma-compute/deploy).
+
+:::
## More info
diff --git a/apps/docs/content/docs/(index)/prisma-postgres/quickstart/drizzle-orm.mdx b/apps/docs/content/docs/(index)/prisma-postgres/quickstart/drizzle-orm.mdx
index 7063e198fa..6f80e50925 100644
--- a/apps/docs/content/docs/(index)/prisma-postgres/quickstart/drizzle-orm.mdx
+++ b/apps/docs/content/docs/(index)/prisma-postgres/quickstart/drizzle-orm.mdx
@@ -192,3 +192,9 @@ Connection closed
## Next steps
You've successfully connected Drizzle ORM to Prisma Postgres! For more advanced features like schemas, migrations, and queries, see the [Drizzle ORM documentation](https://orm.drizzle.team/docs/get-started).
+
+:::info[Deploy to Compute]
+
+Want to run this app in the cloud? Deploy it to [Prisma Compute](/compute), which runs your app next to your Prisma Postgres database. Follow [Deploy your first app](/prisma-compute/deploy).
+
+:::
diff --git a/apps/docs/content/docs/(index)/prisma-postgres/quickstart/kysely.mdx b/apps/docs/content/docs/(index)/prisma-postgres/quickstart/kysely.mdx
index 8ece2682cf..be37ddfd3b 100644
--- a/apps/docs/content/docs/(index)/prisma-postgres/quickstart/kysely.mdx
+++ b/apps/docs/content/docs/(index)/prisma-postgres/quickstart/kysely.mdx
@@ -268,3 +268,9 @@ All users: [ { id: 1, email: 'alice@prisma.io', name: 'Alice' } ]
## Next steps
You've successfully connected Kysely to Prisma Postgres! For more advanced features like schemas, migrations, and complex queries, see the [Kysely documentation](https://kysely.dev/docs/intro).
+
+:::info[Deploy to Compute]
+
+Want to run this app in the cloud? Deploy it to [Prisma Compute](/compute), which runs your app next to your Prisma Postgres database. Follow [Deploy your first app](/prisma-compute/deploy).
+
+:::
diff --git a/apps/docs/content/docs/(index)/prisma-postgres/quickstart/prisma-orm.mdx b/apps/docs/content/docs/(index)/prisma-postgres/quickstart/prisma-orm.mdx
index 9bc81ab10a..2144e33406 100644
--- a/apps/docs/content/docs/(index)/prisma-postgres/quickstart/prisma-orm.mdx
+++ b/apps/docs/content/docs/(index)/prisma-postgres/quickstart/prisma-orm.mdx
@@ -251,6 +251,12 @@ You've successfully set up Prisma ORM. Here's what you can explore next:
- **Build a full application**: Check out our [framework guides](/guides) to integrate Prisma ORM with Next.js, Express, and more
- **Join the community**: Connect with other developers on [Discord](https://pris.ly/discord)
+:::info[Deploy to Compute]
+
+Want to run this app in the cloud? Deploy it to [Prisma Compute](/compute), which runs your app next to your Prisma Postgres database. Follow [Deploy your first app](/prisma-compute/deploy).
+
+:::
+
## More info
- [Prisma Postgres documentation](/postgres)
diff --git a/apps/docs/content/docs/(index)/prisma-postgres/quickstart/typeorm.mdx b/apps/docs/content/docs/(index)/prisma-postgres/quickstart/typeorm.mdx
index 66514c0f36..b301bc2b10 100644
--- a/apps/docs/content/docs/(index)/prisma-postgres/quickstart/typeorm.mdx
+++ b/apps/docs/content/docs/(index)/prisma-postgres/quickstart/typeorm.mdx
@@ -174,3 +174,9 @@ Loaded users: [ User { id: 1, firstName: 'Timber', lastName: 'Saw', age: 25 } ]
## Next steps
You've successfully connected TypeORM to Prisma Postgres! For more advanced features like entities, migrations, and queries, see the [TypeORM documentation](https://typeorm.io/docs/getting-started).
+
+:::info[Deploy to Compute]
+
+Want to run this app in the cloud? Deploy it to [Prisma Compute](/compute), which runs your app next to your Prisma Postgres database. Follow [Deploy your first app](/prisma-compute/deploy).
+
+:::
diff --git a/apps/docs/content/docs/cli/index.mdx b/apps/docs/content/docs/cli/index.mdx
index d52870ebef..97d72c3857 100644
--- a/apps/docs/content/docs/cli/index.mdx
+++ b/apps/docs/content/docs/cli/index.mdx
@@ -22,6 +22,12 @@ The Prisma CLI is available as an npm package. Install it as a development depen
npm install prisma --save-dev
```
+:::info
+
+Looking for [Prisma Compute](/compute) commands? Deployments to Compute use the separate [`@prisma/cli`](/compute/getting-started) beta package, which exposes the `prisma-cli` binary so it can coexist with `prisma`. See [Get started with `@prisma/cli`](/compute/getting-started) and the [Prisma Compute CLI reference](/compute/cli-reference).
+
+:::
+
## Usage
```bash
diff --git a/apps/docs/content/docs/compute/branching.mdx b/apps/docs/content/docs/compute/branching.mdx
new file mode 100644
index 0000000000..bad849f708
--- /dev/null
+++ b/apps/docs/content/docs/compute/branching.mdx
@@ -0,0 +1,69 @@
+---
+title: Branching
+description: Branches are isolated environments that map to your Git branches, so preview work never touches production.
+url: /compute/branching
+metaTitle: Branching | Prisma Compute
+metaDescription: How production and preview branches work in Prisma Compute, how the CLI picks a branch, and how branches are created and cleaned up.
+---
+
+A branch is an isolated environment for one line of work. Every branch in a project gets its own apps, databases, and deployments, so work on a preview never touches production.
+
+A platform branch usually matches a Git branch name, but in Prisma it is a real resource that owns its own apps and databases:
+
+
+
+## Production and preview
+
+Every branch has a role:
+
+- The **first branch** in a project is your production branch, usually `main`. It's protected and durable: after the first deploy, deploys to it need an explicit `--prod` flag, and automated cleanup never touches it.
+- **Every other branch** is a preview by default: disposable resources for testing changes before they merge. Preview deploys never ask for confirmation.
+
+To learn more, see the [Deployments docs](/compute/deployments).
+
+## How the CLI picks a branch
+
+When you deploy, the CLI resolves the branch in this order:
+
+1. `--branch `, if you pass it.
+2. Your active Git branch.
+3. `main`.
+
+Inside a Git repo, deploying from `feature/search` targets the `feature/search` branch automatically. To target a branch explicitly:
+
+```npm
+npx @prisma/cli@latest app deploy --branch feature/search
+```
+
+Inspect platform branches:
+
+```npm
+npx @prisma/cli@latest branch list
+npx @prisma/cli@latest branch show
+```
+
+`branch use` changes which branch your later commands target, without creating anything remote:
+
+```npm
+npx @prisma/cli@latest branch use feature/search
+```
+
+Listing a branch doesn't expand the apps and databases inside it. Use the `app` commands to inspect those.
+
+## Creating branches
+
+You rarely create branches manually. They appear when work needs them:
+
+- **On deploy**: `app deploy --branch feature/search` creates the branch if it doesn't exist.
+- **From GitHub**: when a repo is connected, branch and push events create or update the matching platform branch automatically. To set this up, see the [GitHub integration docs](/compute/github).
+
+Connecting GitHub doesn't create branches retroactively; it wires up automation for future events.
+
+## Cleaning up
+
+When GitHub is connected, deleting a Git branch tears down the matching platform branch, as long as it isn't your production or default branch. Those are always left alone.
+
+## Next steps
+
+- [Environment variables](/compute/environment-variables): preview values and per-branch overrides.
+- [GitHub integration](/compute/github): keep platform branches in sync with your repo.
diff --git a/apps/docs/content/docs/compute/cli-reference.mdx b/apps/docs/content/docs/compute/cli-reference.mdx
new file mode 100644
index 0000000000..fa0d6c1b60
--- /dev/null
+++ b/apps/docs/content/docs/compute/cli-reference.mdx
@@ -0,0 +1,254 @@
+---
+title: CLI reference
+description: Every @prisma/cli command, flag, environment variable, and error code for Prisma Compute.
+url: /compute/cli-reference
+metaTitle: '@prisma/cli reference | Prisma Compute'
+metaDescription: Complete reference for the @prisma/cli beta package, including app, project, branch, git, and auth commands, global flags, and error codes.
+---
+
+This page is the complete reference for the [`@prisma/cli`](https://github.com/prisma/prisma-cli) beta package. For a guided start, see [Get started with `@prisma/cli`](/compute/getting-started).
+
+The package installs an executable called `prisma-cli`. Run it without installing:
+
+```npm
+npx @prisma/cli@latest
+```
+
+Requires Node.js 22.12 or newer for `npx` and `pnpm`; `bunx` also works. The command groups are `auth`, `project`, `project env`, `git`, `branch`, `app`, and `version`. There is no `init`, `schema`, `database`, or `migrate` command in the beta.
+
+## `auth`
+
+Manage authentication.
+
+| Command | Description |
+| ------------- | ---------------------------------------------------- |
+| `auth login` | Log in to your Prisma platform account (browser flow) |
+| `auth logout` | Clear stored authentication credentials |
+| `auth whoami` | Show the authenticated user and accessible workspace |
+
+The browser step in `auth login` needs a human. Afterwards, anything running in that environment inherits the session, including coding agents. For CI, set [`PRISMA_SERVICE_TOKEN`](#environment-variables) instead.
+
+## `app`
+
+Manage apps and deployments for a project.
+
+| Command | Description |
+| ----------------------------- | ------------------------------------------------------------------------ |
+| `app build` | Build the app locally into a deployable artifact |
+| `app run` | Run your app locally |
+| `app deploy` | Create a new deployment for the app |
+| `app show` | Show the app and its current deployment |
+| `app open` | Open the app's live URL |
+| `app logs` | Stream logs for the app's current deployment |
+| `app list-deploys` | List deployments for the app |
+| `app show-deploy `| Show a deployment in detail |
+| `app promote ` | Promote a deployment to production, rebuilding with production env vars |
+| `app rollback` | Roll back production to the previous deployment, without rebuilding |
+| `app remove` | Remove the app from the current branch |
+
+### `app deploy` options
+
+| Flag | Description |
+| ------------------------- | --------------------------------------------------------------------------- |
+| `--app ` | Target a specific app; otherwise inferred from `package.json` name or directory |
+| `--project ` | Target a specific project |
+| `--create-project ` | Create and link a new project before deploying |
+| `--branch ` | Deploy to a specific branch; otherwise your active Git branch, then `main` |
+| `--framework ` | One of `nextjs`, `hono`, `tanstack-start`, `bun` |
+| `--entry ` | Entry point, required for `bun` and useful when detection needs a hand |
+| `--http-port ` | HTTP port your app listens on |
+| `--env ` | Set a one-off variable for this deployment (repeatable) |
+| `--prod` | Confirm intent to deploy to the production branch |
+
+After the first production deploy, every later production deploy needs `--prod`; without it the deploy fails with `PROD_DEPLOY_REQUIRES_FLAG`. With `--prod`, the CLI asks for confirmation; pass `-y` / `--yes` to accept it up front. In non-interactive mode, a `--prod` deploy without `--yes` fails with `CONFIRMATION_REQUIRED`. The first production deploy is auto-promoted and needs neither flag.
+
+### `app build` and `app run` options
+
+| Flag | Description |
+| --------------------- | ----------------------------------------------------------------------------- |
+| `--entry ` | Entry point for Bun apps |
+| `--build-type ` | `app build`: `auto`, `bun`, `nextjs`, `nuxt`, `astro`, `tanstack-start`. `app run`: `auto`, `bun`, `nextjs` |
+| `--port ` | Port for `app run` |
+
+### Other `app` options
+
+| Flag | Applies to | Description |
+| --------------------- | -------------------------------- | ------------------------------------ |
+| `--app`, `--project` | all inspection and deploy commands | Select the app or project explicitly |
+| `--deployment ` | `app logs` | Stream logs for a specific deployment |
+| `--to ` | `app rollback` | Roll back to a specific deployment |
+| `--yes` | `app remove`, `--prod` deploys | Accept the confirmation prompt |
+
+## `app domain`
+
+Manage custom domains for an app. All commands take a `` argument plus `--app` / `--project`. Domains target the production branch; to learn more, see the [Domains docs](/compute/domains).
+
+| Command | Description |
+| ----------------------------- | --------------------------------------------------------------- |
+| `app domain add ` | Register a custom domain on the app's production branch |
+| `app domain show ` | Show custom domain status and certificate details |
+| `app domain wait ` | Wait until a custom domain is active or failed |
+| `app domain retry ` | Retry custom domain DNS verification and TLS provisioning |
+| `app domain remove `| Detach a custom domain from the app |
+
+`app domain wait` polls for up to 15 minutes by default; pass `--timeout ` to change that, or `--timeout 0` for a single status check. In `--json` mode it streams newline-delimited status events.
+
+## `project`
+
+Manage projects and directory bindings.
+
+| Command | Description |
+| ---------------------------- | ------------------------------------------------------------- |
+| `project list` | List all projects in your workspace |
+| `project show` | Show this directory's project binding |
+| `project create ` | Create a project and link the directory to it |
+| `project link [id-or-name]` | Link the directory to an existing project |
+
+Linking writes `.prisma/local.json`, a gitignored local pin of the workspace and project. It is a cache, not committed config; the CLI never reads or writes committed config files.
+
+## `project env`
+
+Manage environment variables for the active project. Writes require an explicit scope: exactly one of `--role ` or `--branch `. To learn more, see the [Environment variables docs](/compute/environment-variables).
+
+| Command | Description |
+| -------------------------------- | ----------------------------------------------------------- |
+| `project env add ` | Create a variable; pass just `KEY` to read the value from your environment |
+| `project env update ` | Replace an existing variable's value |
+| `project env list` | List variable names and metadata for a scope, never values |
+| `project env remove ` | Remove a variable from a scope (`rm` also works) |
+
+Values are write-only: encrypted at rest and never returned by any surface. They resolve at deploy time; redeploy to apply changes.
+
+## `branch`
+
+Inspect platform branches for the resolved project. These commands don't create remote state. To learn more, see the [Branching docs](/compute/branching).
+
+| Command | Description |
+| ------------------ | --------------------------------------------------------- |
+| `branch list` | List platform branches for the resolved project |
+| `branch show` | Show the platform branch matching your current Git branch |
+| `branch use [name]`| Switch your local branch context without creating anything |
+
+## `git`
+
+Manage the GitHub repository connection. To learn more, see the [GitHub integration docs](/compute/github).
+
+| Command | Description |
+| ------------------------ | ----------------------------------------------------------------- |
+| `git connect [git-url]` | Link the project to a GitHub repository; starts the GitHub App install flow if needed |
+| `git disconnect` | Stop push-triggered automation; keeps the project and existing branches |
+
+In `--json` / `--no-interactive` mode, `git connect` returns an install URL instead of blocking.
+
+## `version`
+
+| Command | Description |
+| --------- | ------------------------------ |
+| `version` | Show CLI build and environment |
+
+## Global flags
+
+| Flag | Description |
+| ----------------------------------- | --------------------------------------------------- |
+| `--json` | Emit structured JSON output |
+| `-y`, `--yes` | Accept supported confirmation prompts |
+| `-q`, `--quiet` / `-v`, `--verbose` | Adjust output verbosity |
+| `--trace` | Show deeper diagnostics for failures |
+| `--interactive` / `--no-interactive`| Force or disable prompts; non-interactive fails instead of asking |
+| `--color` / `--no-color` | Control colored output |
+| `--version` | Print the CLI version |
+
+## JSON output
+
+In `--json` mode, every command returns an envelope you can branch on:
+
+- `ok`: `true` or `false`.
+- `result`: the command's data, when `ok` is `true`.
+- `error.code`, `error.summary`, `error.why`, `error.fix`: what failed and what to do about it.
+- `nextSteps` and `nextActions`: exact follow-up commands, useful for agents.
+
+Branch on `error.code`, not the message text: codes are a stable contract, while message wording can change between releases.
+
+## Agent skills
+
+The CLI ships agent skills for guided deploys. Install them into a repo with:
+
+```bash
+pnpm dlx skills@latest add prisma/prisma-cli/skills --all
+```
+
+This adds the `prisma-cli`, `prisma-cli-deploy-nextjs`, and `prisma-cli-feedback` skills to `.agents/skills/`. To learn more, see [Agent skills](/compute/getting-started#agent-skills) in the getting started guide.
+
+## Environment variables
+
+| Variable | Description |
+| ---------------------- | ------------------------------------------------------------------- |
+| `PRISMA_SERVICE_TOKEN` | Authenticate without a browser (CI); takes priority over any stored session |
+| `PRISMA_PROJECT_ID` | Override the project resolved from `.prisma/local.json` |
+| `PRISMA_APP_ID` | Override the app resolution |
+
+## Error codes
+
+The common codes, grouped by area:
+
+**General**
+
+| Code | Meaning |
+| ----------------------- | --------------------------------------------------------------------- |
+| `AUTH_REQUIRED` | No session or service token. Run `auth login` or set `PRISMA_SERVICE_TOKEN`. |
+| `CONFIRMATION_REQUIRED` | A confirmation prompt can't run here (e.g. a `--prod` deploy in non-interactive mode, or `app remove`). Pass `--yes`. |
+| `USAGE_ERROR` | Invalid arguments or flags. Check the command's `--help`. |
+| `FEATURE_UNAVAILABLE` | The platform can't serve this yet (e.g. logs for some deployments). |
+
+**Projects and apps**
+
+| Code | Meaning |
+| ------------------------ | -------------------------------------------------------------------- |
+| `PROJECT_SETUP_REQUIRED` | No project resolved. Pass `--project` or `--create-project`. |
+| `PROJECT_NOT_FOUND` | The named project doesn't exist or isn't visible to you. |
+| `APP_AMBIGUOUS` | More than one app matched. Pass `--app `. |
+| `FRAMEWORK_NOT_DETECTED` | The CLI couldn't detect your framework. Pass `--framework`. |
+
+**Deployments**
+
+| Code | Meaning |
+| ------------------------ | ------------------------------------------------- |
+| `PROD_DEPLOY_REQUIRES_FLAG` | A production deploy is missing explicit intent. Re-run with `--prod`. |
+| `BUILD_FAILED` | The app failed to build. Check the build output. |
+| `DEPLOY_FAILED` | The deployment failed after the build. |
+| `DEPLOYMENT_NOT_FOUND` | The deployment id doesn't exist for this app. |
+| `NO_PREVIOUS_DEPLOYMENT` | Nothing to roll back to. |
+
+**Environment variables**
+
+| Code | Meaning |
+| ----------------------------- | --------------------------------------------------- |
+| `ENV_VARIABLE_ALREADY_EXISTS` | The key exists in this scope. Use `update` instead. |
+| `ENV_VARIABLE_NOT_FOUND` | No variable with that key in this scope. |
+| `ENV_BRANCH_SCOPE_IS_PRODUCTION` | Branch overrides can't target the production branch. |
+
+**Domains**
+
+| Code | Meaning |
+| ----------------------------- | ----------------------------------------------------- |
+| `BRANCH_NOT_DEPLOYABLE` | Domain commands targeted a non-production branch. |
+| `DOMAIN_ALREADY_REGISTERED` | The hostname is already registered. |
+| `DOMAIN_DNS_NOT_CONFIGURED` | The CNAME record isn't visible yet. |
+| `DOMAIN_VERIFICATION_FAILED` | DNS verification or TLS provisioning failed. |
+| `DOMAIN_QUOTA_EXCEEDED` | The app already has 3 custom domains. |
+| `DOMAIN_RETRY_NOT_ELIGIBLE` | The domain isn't in a retryable state. |
+
+**GitHub**
+
+| Code | Meaning |
+| --------------------------- | ----------------------------------------------------- |
+| `REPO_NOT_CONNECTED` | No repository connected. Run `git connect` first. |
+| `REPO_ALREADY_CONNECTED` | The project is already connected to a repository. |
+| `REPO_INSTALLATION_REQUIRED`| The Prisma GitHub App isn't installed in the workspace. |
+| `REPO_PROVIDER_UNSUPPORTED` | `git connect` with a non-GitHub provider. |
+
+## Related
+
+- [Get started with `@prisma/cli`](/compute/getting-started)
+- [Known limitations](/compute/limitations)
+- [Prisma ORM CLI reference](/cli) for the `prisma` binary
diff --git a/apps/docs/content/docs/compute/deployments.mdx b/apps/docs/content/docs/compute/deployments.mdx
new file mode 100644
index 0000000000..63b21366ad
--- /dev/null
+++ b/apps/docs/content/docs/compute/deployments.mdx
@@ -0,0 +1,116 @@
+---
+title: Deployments
+description: Build, deploy, inspect, promote, and roll back app deployments on Prisma Compute.
+url: /compute/deployments
+metaTitle: Deployments | Prisma Compute
+metaDescription: How deployments work in Prisma Compute, including local builds, production deploys, logs, promotion, and rollback.
+---
+
+A deployment is one built version of your app. Deployments live inside a [branch](/compute/branching), and the live deployment is the one currently serving traffic.
+
+## Deploy
+
+From your app directory:
+
+```npm
+npx @prisma/cli@latest app deploy
+```
+
+The CLI resolves your project, branch, and app, builds the code, and returns a live URL. What it resolves:
+
+- **Project**: from your linked directory, or `--project` / `--create-project`.
+- **Branch**: `--branch`, then your active Git branch, then `main`.
+- **App**: `--app`, or inferred from your `package.json` name or directory. If more than one app matches in non-interactive mode, the deploy fails with `APP_AMBIGUOUS`; pass `--app`.
+
+You can pass values straight into a deploy:
+
+```npm
+npx @prisma/cli@latest app deploy --framework hono --entry src/index.ts --http-port 3000
+npx @prisma/cli@latest app deploy --env DATABASE_URL=postgresql://example
+```
+
+`--env` is for one-off values at deploy time. For variables that should persist across deploys, set them on the project. To learn more, see the [Environment variables docs](/compute/environment-variables).
+
+## Build and run locally
+
+Check your app builds before you ship it:
+
+```npm
+npx @prisma/cli@latest app build
+npx @prisma/cli@latest app run --port 3000
+```
+
+`app build` supports the build types `auto`, `bun`, `nextjs`, `nuxt`, `astro`, and `tanstack-start`. `app run` currently supports `auto`, `bun`, and `nextjs`.
+
+## Deploy to production
+
+Your first deployment is promoted to production automatically. After that, every production deploy needs an explicit `--prod` flag, so you don't ship to production by accident:
+
+```npm
+npx @prisma/cli@latest app deploy --prod
+```
+
+Without `--prod`, a deploy that resolves to the production branch and already has a live production deployment fails with `PROD_DEPLOY_REQUIRES_FLAG`. With `--prod`, the CLI shows the current live deployment and asks you to confirm before replacing it.
+
+For scripts and CI, pass both flags so nothing waits on a prompt:
+
+```npm
+npx @prisma/cli@latest app deploy --prod --yes
+```
+
+In non-interactive mode, a `--prod` deploy without `--yes` fails with `CONFIRMATION_REQUIRED`. Preview deploys never need `--prod` and never ask.
+
+## Inspect deployments
+
+```npm
+npx @prisma/cli@latest app show --app web
+npx @prisma/cli@latest app open --app web
+npx @prisma/cli@latest app list-deploys --app web
+npx @prisma/cli@latest app show-deploy dep_123
+```
+
+`app show` describes the live app, `app open` opens its URL, `app list-deploys` lists the deployment history, and `app show-deploy` shows one deployment in detail.
+
+## Logs
+
+Stream logs for the live deployment, or for a specific one:
+
+```npm
+npx @prisma/cli@latest app logs --app web
+npx @prisma/cli@latest app logs --app web --deployment dep_123
+```
+
+Your app's log lines go to stdout; the CLI's own status and errors go to stderr, so you can pipe them apart. If the platform can't serve logs for the resolved deployment, the command fails with `FEATURE_UNAVAILABLE`.
+
+## Promote and roll back
+
+Promote an earlier deployment to production:
+
+```npm
+npx @prisma/cli@latest app promote dep_123 --app web
+```
+
+Promotion rebuilds the deployment with your production environment variables. The rebuild is necessary because values are baked in at deploy time: a preview build still carries preview config, so it can't serve production as-is.
+
+Roll back to the previous deployment, or a specific one. Unlike `promote`, rollback reuses an existing build, so there is no rebuild step between you and a known-good state:
+
+```npm
+npx @prisma/cli@latest app rollback --app web
+npx @prisma/cli@latest app rollback --app web --to dep_123
+```
+
+If there's nothing to roll back to, you get `NO_PREVIOUS_DEPLOYMENT`.
+
+## Remove an app
+
+```npm
+npx @prisma/cli@latest app remove --app web
+```
+
+This removes the app from the current branch. Pass `--yes` to skip the confirmation prompt.
+
+## Next steps
+
+- [Environment variables](/compute/environment-variables): persist config across deploys.
+- [GitHub integration](/compute/github): deploy on push instead of manually.
+- [Domains](/compute/domains): point a custom domain at production.
diff --git a/apps/docs/content/docs/compute/domains.mdx b/apps/docs/content/docs/compute/domains.mdx
new file mode 100644
index 0000000000..64dbfdc144
--- /dev/null
+++ b/apps/docs/content/docs/compute/domains.mdx
@@ -0,0 +1,78 @@
+---
+title: Domains
+description: Point a custom domain at a production app and the platform verifies DNS and provisions TLS for you.
+url: /compute/domains
+metaTitle: Custom domains | Prisma Compute
+metaDescription: Add a custom domain to a Prisma Compute app, configure the CNAME record, watch provisioning, and troubleshoot failures.
+---
+
+Point a custom domain at a production app and the platform verifies DNS and provisions TLS for you. In beta, custom domains are production-only.
+
+## Before you start
+
+You'll need:
+
+- A linked project.
+- A production app with a promoted, live deployment.
+- Access to your domain's DNS settings.
+
+Domain commands target the production branch. Pointing them at any other branch fails with `BRANCH_NOT_DEPLOYABLE`.
+
+## Add a domain
+
+```npm
+npx @prisma/cli@latest app domain add shop.acme.com --app web
+```
+
+The command prints a **CNAME** record. Add it at your DNS provider; it points your hostname at Prisma's routing. Then wait for the domain to go live:
+
+```npm
+npx @prisma/cli@latest app domain wait shop.acme.com --app web
+```
+
+`wait` polls until the domain is active, up to 15 minutes. For a single status check, use `--timeout 0`:
+
+```npm
+npx @prisma/cli@latest app domain wait shop.acme.com --app web --timeout 0 --json
+```
+
+In `--json` mode, `wait` streams newline-delimited status events, so an agent can track provisioning as it progresses.
+
+## Check and fix
+
+```npm
+npx @prisma/cli@latest app domain show shop.acme.com --app web
+npx @prisma/cli@latest app domain retry shop.acme.com --app web
+```
+
+`show` gives you the exact state, certificate details, and any DNS hints. `retry` restarts stuck provisioning; if a domain isn't in a retryable state, it returns `DOMAIN_RETRY_NOT_ELIGIBLE`.
+
+A domain moves through these states:
+
+| Status | Meaning |
+| ------------------ | ------------------------------------------------------------- |
+| `pending_dns` | Waiting for your CNAME record to be visible |
+| `verifying` | DNS found; ownership and routing are being verified |
+| `provisioning_tls` | The TLS certificate is being issued |
+| `active` | The domain is fully provisioned and routing traffic to your app |
+| `failed` | Registration or provisioning failed; see the failure reason |
+
+## Remove a domain
+
+```npm
+npx @prisma/cli@latest app domain remove shop.acme.com --app web
+```
+
+Removing detaches the domain from the app; pass `--yes` to skip the confirmation prompt. Prisma can't touch your DNS, so the CNAME record stays behind: delete it at your provider once you no longer need it.
+
+## Limits
+
+- Custom domains are production-only.
+- DNS uses CNAME records.
+- Up to 3 custom domains per app; more returns `DOMAIN_QUOTA_EXCEEDED`.
+- There's no workspace-wide domain list in the CLI.
+
+## Next steps
+
+- [Deployments](/compute/deployments): promote a deployment to production first.
+- [Known limitations](/compute/limitations): what the beta can and can't do.
diff --git a/apps/docs/content/docs/compute/environment-variables.mdx b/apps/docs/content/docs/compute/environment-variables.mdx
new file mode 100644
index 0000000000..dd696b6aa1
--- /dev/null
+++ b/apps/docs/content/docs/compute/environment-variables.mdx
@@ -0,0 +1,92 @@
+---
+title: Environment variables
+description: Project configuration that gets injected into your deployments, scoped to production, preview, or a single branch.
+url: /compute/environment-variables
+metaTitle: Environment variables | Prisma Compute
+metaDescription: Set, update, and remove environment variables for Prisma Compute apps, with production, preview, and per-branch scopes.
+---
+
+Environment variables are project configuration that gets injected into your deployments. You scope each one to production, to preview, or to a single preview branch. This is also how you connect your app to a database: set its connection string as a variable like `DATABASE_URL`.
+
+## How it works
+
+There are three layers:
+
+1. **Production variables**: used by production deploys.
+2. **Preview variables**: used by every preview deploy.
+3. **Branch overrides**: replace a preview value for one specific branch.
+
+
+
+A preview deploy gets the preview variables, with any branch overrides layered on top. Overrides help when one branch needs a different API key, database URL, or feature flag than the rest.
+
+Values are resolved at deploy time and baked into the deployment. Changing a variable doesn't touch deployments that already exist and doesn't trigger a redeploy; the new value applies the next time you deploy.
+
+## Set a variable
+
+Pass `KEY=value` and a role or branch:
+
+```npm
+npx @prisma/cli@latest project env add DATABASE_URL=postgresql://example --role production
+npx @prisma/cli@latest project env add DATABASE_URL=postgresql://preview --role preview
+npx @prisma/cli@latest project env add FEATURE_FLAG=enabled --branch feature/search
+```
+
+To keep a secret out of your shell history, pass just the key and let the CLI read it from your environment:
+
+```bash
+DATABASE_URL=postgresql://example npx @prisma/cli@latest project env add DATABASE_URL --role production
+```
+
+## Connect a database
+
+To give your app a database, set its connection string per scope, then redeploy. Use a different database per scope if you want preview deployments isolated from production data.
+
+:::note
+
+Don't assume production data is copied into preview branches, and don't assume migrations run automatically on deploy. Run migrations yourself against the right database.
+
+:::
+
+## List, update, remove
+
+```npm
+npx @prisma/cli@latest project env list --role production
+npx @prisma/cli@latest project env list --branch feature/search
+npx @prisma/cli@latest project env update DATABASE_URL=postgresql://new --role production
+npx @prisma/cli@latest project env remove DATABASE_URL --role preview
+```
+
+`list --role` shows names and metadata, never values. `list --branch` shows the resolved view for one branch. `rm` works as an alias for `remove`.
+
+## Values are write-only
+
+Once you save a variable, the platform never gives it back. Values are encrypted at rest and never returned: not by the CLI, the API, or the Console. In practice:
+
+- `project env list` shows keys and metadata, not values.
+- There's no command to pull values into a local `.env`.
+- To rotate a secret, `project env update` it and redeploy.
+- To confirm an app sees a value, redeploy and check its behavior or logs.
+
+Keep your own copy of every value in a secret manager. Treat Prisma as the place values are *injected*, not a store you read back from.
+
+## Rules
+
+- Keys must match `[A-Z_][A-Z0-9_]*`.
+- Values must be non-empty, up to 8 KB.
+- Production variables can't be branch-scoped: use `--role production` for production, and `--branch ` only for preview overrides.
+
+## In CI and agents
+
+Add `--json` so the output is machine-readable, and `--no-interactive` so the CLI fails with an error code instead of waiting on a prompt nothing will answer:
+
+```npm
+npx @prisma/cli@latest project env list --role preview --json --no-interactive
+```
+
+Don't build anything that depends on reading a value back. Pass the source value in from your own secret store, and let Prisma handle injection at deploy time.
+
+## Next steps
+
+- [Deployments](/compute/deployments): redeploy to apply new values.
+- [Branching](/compute/branching): how preview branches work.
diff --git a/apps/docs/content/docs/compute/faq.mdx b/apps/docs/content/docs/compute/faq.mdx
new file mode 100644
index 0000000000..7d8535b308
--- /dev/null
+++ b/apps/docs/content/docs/compute/faq.mdx
@@ -0,0 +1,122 @@
+---
+title: FAQ
+description: Quick answers to common questions about Prisma Compute.
+url: /compute/faq
+metaTitle: FAQ | Prisma Compute
+metaDescription: Answers to common questions about Prisma Compute, the @prisma/cli beta package, branches, environment variables, and domains.
+---
+
+## Which package do I install?
+
+You install [`@prisma/cli`](/compute/getting-started), which provides an executable called `prisma-cli`. The quickest way to run it without installing anything is:
+
+```npm
+npx @prisma/cli@latest app deploy
+```
+
+## Why `prisma-cli` and not `prisma`?
+
+It avoids shadowing the `prisma` binary from [Prisma ORM](/orm), which many projects already have installed. To set up a shorter command, add your own package script; see [A shorter command](/compute/getting-started#a-shorter-command) in the getting started guide.
+
+## What's the difference between a project and an app?
+
+A project groups the resources for one product or codebase. An app is a single HTTP service inside a project's branch. The full hierarchy:
+
+
+
+## What's a branch?
+
+A branch is an isolated environment for one line of work. It usually matches a Git branch name, but in Prisma it is a real resource that owns its own apps and databases. To learn more, see the [Branching docs](/compute/branching).
+
+## Does `git connect` deploy my app?
+
+No, it links a project to a GitHub repository and turns on automation for future branch and push events. It does not deploy anything by itself, so if you want to ship right now, run `app deploy`. To set the connection up, see the [GitHub integration docs](/compute/github).
+
+## What does a GitHub push do?
+
+When a project is connected to GitHub, each push creates or resolves the matching branch and builds the pushed commit.
+
+## Why can't I read my environment variable values back?
+
+In beta, variable values are encrypted and never returned by any surface. `project env list` shows only the keys and their metadata, so keep your own copy of each value in a secret manager. To learn more, see [Values are write-only](/compute/environment-variables#values-are-write-only).
+
+## How do I rotate a secret?
+
+Update it, then redeploy to production:
+
+```npm
+npx @prisma/cli@latest project env update DATABASE_URL=postgresql://new --role production
+npx @prisma/cli@latest app deploy --prod --yes
+```
+
+`--prod` signals intent to deploy to production, and `--yes` accepts the confirmation up front.
+
+## Does changing a variable redeploy my app?
+
+No. Variables resolve at deploy time, so you need to redeploy for the app to pick up a new value.
+
+## How do I deploy from CI?
+
+Use a service token and explicit targets:
+
+```bash
+PRISMA_SERVICE_TOKEN=... npx @prisma/cli@latest app deploy \
+ --project my-app \
+ --app web \
+ --branch "$GITHUB_HEAD_REF" \
+ --json \
+ --no-interactive
+```
+
+Passing every target explicitly keeps the run self-contained; `--json` makes the result parseable, and `--no-interactive` turns any would-be prompt into a structured error.
+
+## Why did my production deploy fail with `PROD_DEPLOY_REQUIRES_FLAG`?
+
+Your first deploy is promoted to production automatically. After that, deploying to the production branch needs an explicit `--prod` flag. Re-run with `npx @prisma/cli@latest app deploy --prod`, or deploy from a preview branch instead.
+
+## Why did my production deploy fail with `CONFIRMATION_REQUIRED`?
+
+A `--prod` deploy asks you to confirm before replacing the live deployment, and that prompt can't run in non-interactive mode. Pass both flags, `--prod --yes`, to accept the confirmation up front. (`app remove` uses the same `--yes` confirmation.)
+
+## Why `PROJECT_SETUP_REQUIRED`?
+
+This means the CLI couldn't work out which project to deploy to, because the current directory isn't linked to one yet. Create or link a project first with `project create` or `project link`, or name one directly on the command with `--project` or `--create-project`.
+
+## Why `APP_AMBIGUOUS`?
+
+This means your project holds more than one app, so the CLI can't tell which one you meant. Tell it explicitly by passing `--app ` with the name of the app you want to deploy.
+
+## How do I add a custom domain?
+
+Promote a production app, then:
+
+```npm
+npx @prisma/cli@latest app domain add shop.acme.com --app web
+npx @prisma/cli@latest app domain wait shop.acme.com --app web
+```
+
+Add the CNAME record the command returns at your DNS provider. To learn more, see the [Domains docs](/compute/domains).
+
+## Can preview branches have custom domains?
+
+No. In beta, custom domains are production-only, so they cannot be attached to preview branches.
+
+## Does Prisma clone my production database for previews?
+
+You should not assume it does. These docs cover app deployment and runtime configuration only, so pass database URLs through [environment variables](/compute/environment-variables) and manage data and migrations yourself.
+
+## Do I need Prisma Postgres to use Compute?
+
+No. Your app connects to a database through a connection string you set as an environment variable, such as `DATABASE_URL`. Compute and [Prisma Postgres](/postgres) are designed to work well together, and running both keeps your app next to your database.
+
+## Can I use the Console instead?
+
+Yes. Use it to inspect projects, branches, apps, deployments, integrations, env var names, and domain status.
+
+## What does Public Beta mean for Compute?
+
+The core model and documented happy paths are stable enough for evaluation, staging, internal tools, and low-risk apps; details like limits, pricing, and some CLI, API, and Console behavior can still change before general availability. See [Public Beta](/console/more/feature-maturity#public-beta) on the feature maturity page.
+
+## What are the current limits?
+
+See [Known limitations](/compute/limitations) for what the beta can and can't do.
diff --git a/apps/docs/content/docs/compute/getting-started.mdx b/apps/docs/content/docs/compute/getting-started.mdx
new file mode 100644
index 0000000000..fd7913f0c2
--- /dev/null
+++ b/apps/docs/content/docs/compute/getting-started.mdx
@@ -0,0 +1,212 @@
+---
+title: '@prisma/cli'
+description: Deploy your first app to Prisma Compute with the @prisma/cli beta package, then learn the variations you'll need next.
+url: /compute/getting-started
+metaTitle: 'Get started with Prisma Compute via @prisma/cli'
+metaDescription: Install the @prisma/cli beta package, deploy an app to Prisma Compute, and learn the variations for frameworks, production, and CI.
+---
+
+Deploy an app to [Prisma Compute](/compute) in two commands: sign in, then `app deploy`. This guide takes you from your code to a live URL, then covers the variations you'll need next. For every command, flag, and error code, see the [CLI reference](/compute/cli-reference).
+
+Install nothing up front: run the [`@prisma/cli`](https://github.com/prisma/prisma-cli) beta package directly with `npx`. The package installs an executable called `prisma-cli`.
+
+## Prerequisites
+
+- A JavaScript runtime. The commands below run with `npx` or `pnpm` on Node.js 22.12 or newer, or with `bunx` (Bun).
+- A [Prisma Data Platform account](https://pris.ly/pdp).
+- An app directory to deploy.
+
+## Sign in
+
+Deploys fail without a session, so authenticate first:
+
+```npm
+npx @prisma/cli@latest auth login
+```
+
+This opens a browser to sign you in, then stores a session that every later command inherits, including any coding agent working in your directory. The browser step needs a human; in CI or other headless environments, use a [service token](#automation-and-ci) instead. To check who you're signed in as, run `auth whoami`.
+
+## Deploy your app
+
+From your app directory, run:
+
+```npm
+npx @prisma/cli@latest app deploy
+```
+
+Then the CLI sets up the project, builds your app, and deploys it. After it finishes, you get a live URL.
+
+To stream the app's logs:
+
+```npm
+npx @prisma/cli@latest app logs
+```
+
+To open the live URL in your browser:
+
+```npm
+npx @prisma/cli@latest app open
+```
+
+That is the core deploy loop. The sections below cover variations on it.
+
+## A shorter command
+
+The binary is `prisma-cli`, not `prisma`. That's deliberate: many projects already have the `prisma` binary from [Prisma ORM](/orm), and the beta package doesn't shadow it.
+
+To avoid typing `npx @prisma/cli@latest` each time, install the package and add your own script:
+
+```npm
+npm install --save-dev @prisma/cli
+```
+
+```json title="package.json"
+{
+ "scripts": {
+ "deploy": "prisma-cli app deploy"
+ }
+}
+```
+
+Now `npm run deploy` does the same thing.
+
+## Link an existing project
+
+On your first deploy, the CLI creates a project for you. If your team already has one, link to it before you deploy instead:
+
+```npm
+npx @prisma/cli@latest project link my-app
+```
+
+Either path writes `.prisma/local.json`, a gitignored file that pins this directory to a project. It's a local cache, not committed config. Two commands to check your wiring:
+
+```npm
+npx @prisma/cli@latest project show
+npx @prisma/cli@latest project list
+```
+
+`project show` tells you what this directory is linked to; `project list` shows the projects you can see.
+
+## Pick a framework
+
+The CLI detects your framework automatically. Today there is first-class support for **Next.js**, **Hono**, and **TanStack Start**:
+
+```npm
+npx @prisma/cli@latest app deploy --framework nextjs
+npx @prisma/cli@latest app deploy --framework hono --entry src/index.ts
+npx @prisma/cli@latest app deploy --framework tanstack-start
+```
+
+Deploy a plain Bun server by pointing `--entry` at your server file:
+
+```npm
+npx @prisma/cli@latest app deploy --framework bun --entry src/server.ts
+```
+
+:::note
+
+Next.js apps must set `output: "standalone"` in their Next.js config before deploying. The CLI builds the standalone output and fails the build if it's missing.
+
+```ts title="next.config.ts"
+export default { output: "standalone" };
+```
+
+:::
+
+## Check it builds locally
+
+Before you deploy, you can build and run the app on your machine:
+
+```npm
+npx @prisma/cli@latest app build
+npx @prisma/cli@latest app run --port 3000
+```
+
+## Deploy to production
+
+Your first deployment is promoted to production automatically. After that, every production deploy needs an explicit `--prod` flag, so you don't ship to production by accident:
+
+```npm
+npx @prisma/cli@latest app deploy --prod
+```
+
+Without `--prod`, a deploy that resolves to the production branch and already has a live production deployment fails with the error code `PROD_DEPLOY_REQUIRES_FLAG`. With `--prod`, the CLI shows the current live deployment and asks you to confirm before replacing it.
+
+For scripts and CI, pass both `--prod` and `-y` / `--yes` to accept the confirmation up front:
+
+```npm
+npx @prisma/cli@latest app deploy --prod --yes
+```
+
+In non-interactive mode, a `--prod` deploy without `--yes` can't prompt, so it fails with `CONFIRMATION_REQUIRED`; re-run with `--prod --yes`.
+
+Preview deploys never need `--prod` and never ask for confirmation. To learn about promotion and rollback, see the [Deployments docs](/compute/deployments).
+
+## Automation and CI
+
+The CLI is built for agents and CI, not just terminals.
+
+If you've already signed in with `auth login`, anything running in that environment inherits your session, including an agent working in your directory. Check the session:
+
+```npm
+npx @prisma/cli@latest auth whoami
+```
+
+For CI, or any environment where the browser sign-in isn't an option, authenticate with a **service token** instead. Set `PRISMA_SERVICE_TOKEN` and the CLI uses it before any stored session:
+
+```bash
+PRISMA_SERVICE_TOKEN=... npx @prisma/cli@latest app deploy \
+ --project my-app \
+ --app web \
+ --branch feature/search \
+ --json \
+ --no-interactive
+```
+
+Pass targets explicitly so nothing depends on a prompt. `--json` gives you structured output to parse; `--no-interactive` makes the CLI fail instead of asking. In non-interactive mode the CLI won't set up a project for you, so create it inline when you need a self-contained run:
+
+```npm
+npx @prisma/cli@latest app deploy --create-project my-app --app web
+```
+
+### Agent skills
+
+If a coding agent does your deploying, install the Prisma CLI agent skills into your repo:
+
+```bash
+pnpm dlx skills@latest add prisma/prisma-cli/skills --all
+```
+
+This installs three skills into `.agents/skills/`, where supported agents pick them up automatically:
+
+- `prisma-cli`: routes broad deploy prompts to the right workflow.
+- `prisma-cli-deploy-nextjs`: a guided Next.js deploy, from auth check to live URL.
+- `prisma-cli-feedback`: files bugs and feedback with the Prisma team.
+
+To match the skills to a specific CLI version, add `#cli-v` to the source, for example `prisma/prisma-cli/skills#cli-v3.0.0-beta.3`, so the instructions your agent follows match the CLI version your project runs.
+
+### Structured output
+
+In `--json` mode, every result is an envelope with an `ok` flag. On failure, `error.code` identifies the problem, `error.fix` says what to do about it, and `nextSteps` lists the exact commands to run next. Branch on the error code rather than the message: codes are a stable contract, while message wording can change between releases. The common ones:
+
+| Code | Meaning |
+| ------------------------ | --------------------------------------------------------------------- |
+| `PROJECT_SETUP_REQUIRED` | No project resolved. Pass `--project` or `--create-project`. |
+| `APP_AMBIGUOUS` | More than one app matched. Pass `--app `. |
+| `PROD_DEPLOY_REQUIRES_FLAG` | A production deploy is missing explicit intent. Re-run with `--prod`. |
+| `CONFIRMATION_REQUIRED` | A `--prod` deploy can't prompt for confirmation here. Pass `--prod --yes`. |
+| `FEATURE_UNAVAILABLE` | The platform can't serve this yet (e.g. logs for some deployments). |
+
+For the full list, see the [error codes reference](/compute/cli-reference#error-codes).
+
+## Console
+
+To view your resources instead of running commands, use the [Console](https://pris.ly/pdp) for projects, branches, apps, deployments, integrations, and domains. It shows them in a visual way and lets you manage them with buttons instead of commands.
+
+## Next steps
+
+- [CLI reference](/compute/cli-reference): every command, flag, and error code.
+- [Deployments](/compute/deployments): inspect, promote, roll back, remove.
+- [Environment variables](/compute/environment-variables): give your app a database connection string and other config.
+- [Branching](/compute/branching): how branches isolate work and map to Git.
+- [GitHub integration](/compute/github): deploy on push.
diff --git a/apps/docs/content/docs/compute/github.mdx b/apps/docs/content/docs/compute/github.mdx
new file mode 100644
index 0000000000..c001139272
--- /dev/null
+++ b/apps/docs/content/docs/compute/github.mdx
@@ -0,0 +1,82 @@
+---
+title: GitHub
+description: Connect a GitHub repository to a project and Prisma deploys on every push, with previews tracking your Git branches.
+url: /compute/github
+metaTitle: GitHub integration | Prisma Compute
+metaDescription: Connect a GitHub repository to Prisma Compute, deploy on push, and map repository branches to platform branches automatically.
+---
+
+Connect a GitHub repository to a project and Prisma deploys on every push. Branch and push events map to platform branches automatically, so your previews track your Git branches.
+
+## How it works
+
+The connection has two levels:
+
+
+
+The workspace owns the GitHub App installation; each project points at a single repository. Once connected, Prisma listens for that repo's branch events and keeps the matching platform branches in sync.
+
+In beta, a project connects to one repository.
+
+## Connect a repo
+
+From a linked project directory, connect your Git origin:
+
+```npm
+npx @prisma/cli@latest git connect
+```
+
+To name the repository explicitly:
+
+```npm
+npx @prisma/cli@latest git connect https://github.com/acme/shop
+```
+
+If the GitHub App isn't installed yet, the CLI starts the install flow. In `--json` / `--no-interactive` mode it returns an install URL instead of blocking, so automation can hand it off:
+
+```npm
+npx @prisma/cli@latest git connect https://github.com/acme/shop --json --no-interactive
+```
+
+Disconnect when you're done:
+
+```npm
+npx @prisma/cli@latest git disconnect
+```
+
+Disconnecting stops future automation. It doesn't delete the project or tear down existing branches.
+
+## What events do
+
+Once a project is connected:
+
+- **Branch created** → creates the matching platform branch.
+- **Push** → creates or resolves the matching branch and builds the pushed commit.
+- **Branch deleted** → tears down the matching branch, unless it's the production or default branch.
+
+Connecting doesn't deploy anything on its own; it wires up automation for *future* events. To deploy right now, run `app deploy` yourself.
+
+## CI and monorepos
+
+GitHub auto-deploy is single-app in beta. For monorepos, custom pipelines, or anywhere you want full control, run the CLI directly with a service token and explicit targets:
+
+```bash
+PRISMA_SERVICE_TOKEN=... npx @prisma/cli@latest app deploy \
+ --project my-app \
+ --app web \
+ --branch "$GITHUB_HEAD_REF" \
+ --json \
+ --no-interactive
+```
+
+This keeps deploys deterministic and gives agents a structured result to read.
+
+## What's not in beta
+
+GitHub is the only supported provider; others return `REPO_PROVIDER_UNSUPPORTED`. The webhook path is branch- and push-driven only: don't rely on pull-request comments, PR status checks, or preview comments. They aren't part of the beta surface.
+
+## Next steps
+
+- [Branching](/compute/branching): how platform branches map to Git.
+- [Deployments](/compute/deployments): what happens after a push builds.
+- [Environment variables](/compute/environment-variables): per-branch config for previews.
diff --git a/apps/docs/content/docs/compute/index.mdx b/apps/docs/content/docs/compute/index.mdx
new file mode 100644
index 0000000000..c95179fd77
--- /dev/null
+++ b/apps/docs/content/docs/compute/index.mdx
@@ -0,0 +1,67 @@
+---
+title: Prisma Compute
+description: "Deploy TypeScript apps alongside Prisma Postgres, with hosting, database branches, and previews managed together."
+url: /compute
+badge: beta
+metaTitle: Prisma Compute | TypeScript app hosting for Prisma Postgres
+metaDescription: Learn how Prisma Compute deploys TypeScript apps alongside Prisma Postgres, with isolated branch previews, database branches, and CLI-first workflows.
+---
+
+Prisma Compute is TypeScript app hosting built to run alongside [Prisma Postgres](/postgres). You model your data with [Prisma ORM](/orm), store it in Prisma Postgres, and deploy your app with Prisma Compute, so your schema, database, hosting, and branch previews work together in one Prisma project.
+
+:::info[Public Beta]
+
+Prisma Compute is in [Public Beta](/console/more/feature-maturity#public-beta) and is CLI-first: you deploy and manage apps with the [`@prisma/cli`](/compute/getting-started) beta package. Use the [Console](https://pris.ly/pdp) if you prefer to view your resources instead of running a command.
+
+:::
+
+## Get started
+
+The best way to understand Compute is to deploy an app. The quickstart takes a TypeScript app to a live URL in a few minutes, then connects GitHub so every push can deploy automatically.
+
+
+
+ The quickstart: sign in, deploy, verify, and connect GitHub.
+
+
+
+To learn how Compute works, [the model](#the-model) below shows how each branch gets isolated app and database resources, so preview work never touches production.
+
+## The model
+
+Compute organizes everything into a few resources:
+
+- A **project** groups one product or codebase.
+- A **branch** maps to a Git branch in the linked repository, and gets its own isolated app, environment variables, and deployments.
+- An **app** is an HTTP service, such as a frontend or backend, and can have multiple **deployments**.
+
+The branch is the concept that ties Compute together. Each branch owns its own app, database, URL, and environment variables. When you create a branch, Compute provisions isolated resources for that branch, so you can test changes in preview without affecting production.
+
+- **Production**: the default Git branch (e.g., `main`) is your production branch, with its own resources and environment variables.
+- **Preview**: every other branch is a preview branch, with its own isolated resources and environment variables scoped to **preview**.
+
+After you [connect a GitHub repository](/compute/github), pushing to a Git branch builds and deploys its preview automatically.
+
+The animation below shows how a project, its branches, and their infrastructure fit together, and how each branch's variables resolve by scope. Step through it, or let it play:
+
+
+
+For the full picture, see [Branching](/compute/branching).
+
+## CLI and Console
+
+Use the **CLI** for anything you want to repeat: local development, CI, and agent workflows. Every command supports a `--json` flag that switches its output to machine-readable JSON, so scripts and agents can parse results instead of scraping terminal text.
+
+Use the **[Console](https://pris.ly/pdp)** if you prefer to view your resources instead of running a command. The Console shows your projects, branches, apps, and deployments in a visual way, and lets you manage them with buttons instead of commands.
+
+## What to read next
+
+- [Get started with `@prisma/cli`](/compute/getting-started): the full CLI guide for frameworks, project linking, production, and CI.
+- [Branching](/compute/branching): how branches isolate work and map to Git.
+- [Deployments](/compute/deployments): build, deploy, logs, promote, roll back.
+- [Environment variables](/compute/environment-variables): production, preview, and per-branch overrides.
+- [GitHub integration](/compute/github): connect a repo and deploy on push.
+- [CLI reference](/compute/cli-reference): every command, flag, and error code.
+- [Domains](/compute/domains): point a custom domain at production.
+- [Known limitations](/compute/limitations): what the beta can and can't do.
+- [FAQ](/compute/faq): quick answers to common questions.
diff --git a/apps/docs/content/docs/compute/limitations.mdx b/apps/docs/content/docs/compute/limitations.mdx
new file mode 100644
index 0000000000..56fc5b563c
--- /dev/null
+++ b/apps/docs/content/docs/compute/limitations.mdx
@@ -0,0 +1,74 @@
+---
+title: Known limitations
+description: What the Prisma Compute beta can and can't do.
+url: /compute/limitations
+metaTitle: Known limitations | Prisma Compute
+metaDescription: Known limits of the Prisma Compute beta across the CLI, branches, frameworks, environment variables, GitHub, domains, and logs.
+---
+
+Prisma Compute is in [Public Beta](/console/more/feature-maturity#public-beta). This page lists what the beta can and can't do.
+
+## CLI
+
+- The package is `@prisma/cli`; the executable is `prisma-cli`. The quickest way to run it is `npx @prisma/cli@latest ` (or `bunx`/`pnpm dlx`), with Node.js 22.12 or newer for `npx` and `pnpm`.
+- The command groups are `auth`, `project`, `project env`, `git`, `branch`, `app`, and `version`. There is no `init`, `schema`, `database`, or `migrate` command, and no product-branded `compute` namespace.
+- Project and app resolution never reads or writes committed config files. `.prisma/local.json` is a gitignored local pin, and `PRISMA_PROJECT_ID` / `PRISMA_APP_ID` override it for CI.
+
+## Projects and branches
+
+- Project setup is explicit: `--yes` won't create or choose a project for you.
+- The first branch in a project is production; the rest are preview by default.
+- `branch list` and `branch show` inspect branches; they don't create remote state.
+- Deleting a branch on GitHub can tear down the matching platform branch, but production and default branches are always left alone.
+
+## Frameworks and runtimes
+
+- `app deploy --framework` accepts `nextjs`, `hono`, `tanstack-start`, and `bun`.
+- `app build --build-type` accepts `auto`, `bun`, `nextjs`, `nuxt`, `astro`, and `tanstack-start`.
+- `app run --build-type` accepts `auto`, `bun`, and `nextjs`.
+- Use `--entry` for Bun, or whenever detection needs a hand.
+
+## Environment variables
+
+- Values are write-only: once saved, they are never returned by any surface, and there is no command to pull them into a local `.env`.
+- `project env list` returns keys and metadata only.
+- Values resolve at deploy time; changing one doesn't mutate existing deployments or trigger a redeploy.
+- Production variables can't be branch-scoped.
+- Keys must match `[A-Z_][A-Z0-9_]*`; values are non-empty, up to 8 KB.
+
+## GitHub
+
+- GitHub is the only supported provider, and a project connects to one repository.
+- Auto-deploy is single-app; use CI with a service token for monorepos.
+- The webhook path is branch- and push-driven. There are no PR comments or PR status automation.
+
+## Domains
+
+- Custom domains are production-only and CNAME-based.
+- Up to 3 custom domains per app.
+- There is no workspace-wide domain list in the CLI.
+
+## Logs
+
+- `app logs` streams the live deployment or a specific one.
+- It returns `FEATURE_UNAVAILABLE` when the platform can't serve logs for the resolved deployment.
+- Logs stream in time-bounded segments, so direct API clients should expect to reconnect.
+
+## Runtime
+
+- This release focuses on HTTP apps. WebSockets, cron or background jobs, a persistent filesystem, and edge runtimes are not part of it.
+- No multi-region deployments.
+- Not yet recommended for mission-critical or heavy production workloads.
+- Exact limits, pricing, retention policies, and runtime guardrails can still change before general availability.
+
+## Databases and migrations
+
+- These docs cover app deploy and runtime config only: not database creation, schema migrations, or data cloning.
+- Don't assume production data is copied into preview branches.
+- Don't assume production migrations run automatically on deploy.
+- Pass database URLs and other runtime config through [environment variables](/compute/environment-variables).
+
+## Next steps
+
+- [FAQ](/compute/faq): quick answers to common questions.
+- [Get started with `@prisma/cli`](/compute/getting-started): your first deploy.
diff --git a/apps/docs/content/docs/compute/meta.json b/apps/docs/content/docs/compute/meta.json
new file mode 100644
index 0000000000..40fe78d376
--- /dev/null
+++ b/apps/docs/content/docs/compute/meta.json
@@ -0,0 +1,22 @@
+{
+ "title": "Compute",
+ "root": true,
+ "icon": "Cpu",
+ "pages": [
+ "---Introduction---",
+ "index",
+ "getting-started",
+ "---Features---",
+ "branching",
+ "deployments",
+ "environment-variables",
+ "domains",
+ "---Integrations---",
+ "github",
+ "---Reference---",
+ "cli-reference",
+ "---More---",
+ "faq",
+ "limitations"
+ ]
+}
diff --git a/apps/docs/content/docs/console/concepts.mdx b/apps/docs/content/docs/console/concepts.mdx
index c9b4546ba2..26345317dd 100644
--- a/apps/docs/content/docs/console/concepts.mdx
+++ b/apps/docs/content/docs/console/concepts.mdx
@@ -6,12 +6,13 @@ metaDescription: 'Learn Prisma Console hierarchy: user accounts, workspaces (bil
url: /console/concepts
---
-The Console workflows are based on four main concepts:
+The Console workflows are based on five main concepts:
- [**User account**](#user-account): In order to use Prisma products, you need to have a Console user account. A _user_ will typically create one user account to manage all their workspaces, projects and resources. The _user_ can also be invited to join other workspaces to collaborate on the projects in that workspace.
- [**Workspaces**](#workspace): A user account can belong to multiple workspaces. A workspace typically represents a _team_ of individuals working together on one or more projects. **Billing is on a workspace level**, i.e. the invoice for a workspace at the end of the month captures all costs associated with the projects in that workspace.
- [**Projects**](#project): A project belongs to a workspace. It typically represents the _application_ or _service_ a team is working on.
-- [**Resources**](#resources): Resources represent the actual services or databases within a project. For example, in Prisma Postgres, each project can contain multiple databases. For Accelerate, resources might correspond to different environments (like `Development`, `Staging`, or `Production`). **Connection strings are provisioned at the resource level**, and products are configured per resource as well (e.g., the database connection string used for Accelerate).
+- [**Branches**](#branch): For projects that use [Prisma Compute](/compute), resources are grouped into branches. A branch is an isolated infrastructure boundary for one line of work, usually mapping to a Git branch.
+- [**Resources**](#resources): Resources represent the actual services or databases within a project. For example, in Prisma Postgres, each project can contain multiple databases. For Prisma Compute, each branch contains apps and their deployments. For Accelerate, resources might correspond to different environments (like `Development`, `Staging`, or `Production`). **Connection strings are provisioned at the resource level**, and products are configured per resource as well (e.g., the database connection string used for Accelerate).
Here is a visual illustration of how these concepts relate to each other:
@@ -45,11 +46,28 @@ In each project, you can:
The number of projects you can create in a workspace depends on the [subscription plan](https://www.prisma.io/pricing?utm_source=docs&utm_medium=platform-docs) configured in that workspace.
+## Branch
+
+For projects that use [Prisma Compute](/compute), a branch groups the resources for one line of work:
+
+```text
+workspace → project → branch → { apps, databases }
+```
+
+A branch usually maps to a Git branch, but it's a real resource that owns the apps and databases for that work:
+
+- The **first branch** in a project is the production branch, usually `main`. It's protected and durable.
+- **Every other branch** is a preview branch by default: disposable infrastructure for testing changes before they merge.
+- [Environment variables](/compute/environment-variables) are scoped to production, to preview, or to a single preview branch.
+
+Learn more in [Branching](/compute/branching).
+
## Resources
Resources represent the actual services or databases within a project. The type of resources available depends on the Prisma products you're using:
- **For Prisma Postgres**: Each project can contain multiple databases. These databases are the primary resources you'll manage.
+- **For Prisma Compute**: Each branch contains apps. An app is an HTTP service, and each built version of an app is a deployment. See [Prisma Compute](/compute).
- **For Accelerate**: Resources typically correspond to different deployment stages (like `Development`, `Staging`, or `Production`).
In each project, you can:
diff --git a/apps/docs/content/docs/console/index.mdx b/apps/docs/content/docs/console/index.mdx
index 7af9fa1dc9..9211e41287 100644
--- a/apps/docs/content/docs/console/index.mdx
+++ b/apps/docs/content/docs/console/index.mdx
@@ -13,6 +13,7 @@ The [Console](https://console.prisma.io/login) enables you to manage and configu
- [Query Insights](/query-insights): Inspect slow queries, connect Prisma calls to SQL, and apply focused fixes.
- [Prisma Postgres](/postgres): A managed PostgreSQL database that is optimized for Prisma ORM.
+- [Prisma Compute](/compute): Runs your app next to your Prisma Postgres database, currently in [Public Beta](/console/more/feature-maturity#public-beta). Inspect projects, branches, apps, and deployments in the Console; deploy with the [`@prisma/cli`](/compute/getting-started) beta package.
## Getting started
diff --git a/apps/docs/content/docs/console/more/feature-maturity.mdx b/apps/docs/content/docs/console/more/feature-maturity.mdx
index 24dfcbb0c4..0b68762b59 100644
--- a/apps/docs/content/docs/console/more/feature-maturity.mdx
+++ b/apps/docs/content/docs/console/more/feature-maturity.mdx
@@ -1,6 +1,6 @@
---
title: Feature Maturity
-description: Understand Early Access and Preview feature stages in the Console
+description: Understand Early Access, Preview, and Public Beta feature stages in the Console
url: /console/more/feature-maturity
metaTitle: 'Console: Maturity levels'
metaDescription: Understand the maturity levels for features in Prisma Data Platform
@@ -33,3 +33,15 @@ If a feature on the Console is labeled as **Preview**:
- We use the Preview phase as a final stress test to ensure the product is ready for heavy production workloads.
We recommend testing the product in a staging environment and welcome any feedback in our [Discord](https://pris.ly/discord?utm_source=docs&utm_medium=inline_text). This will assist us in improving the product for its final release.
+
+## Public Beta
+
+If a product or feature is labeled as **Public Beta**:
+
+- It is open for anyone to try. No invite or waitlist is required.
+- The core model is stable, and the documented happy paths work end to end. It is a good fit for evaluation, dogfooding, staging environments, internal tools, and low-risk apps.
+- Behavior should stay stable unless the documentation or release notes call out an exception.
+- Details can still change before general availability: exact limits, pricing, retention policies, runtime guardrails, supported frameworks and build behavior, some CLI and API details, Console UX, naming, and advanced workflows.
+- We don't recommend it yet for mission-critical or heavy production workloads.
+
+Public Beta is the final stress-test phase before general availability. Expect some rough edges, and tell us about them in [Discord](https://pris.ly/discord?utm_source=docs&utm_medium=inline_text); your feedback directly shapes the release.
diff --git a/apps/docs/content/docs/meta.json b/apps/docs/content/docs/meta.json
index 6b7db11405..746bdf60b1 100644
--- a/apps/docs/content/docs/meta.json
+++ b/apps/docs/content/docs/meta.json
@@ -5,6 +5,7 @@
"(index)",
"orm",
"postgres",
+ "compute",
"cli",
"guides",
"studio",
diff --git a/apps/docs/cspell.json b/apps/docs/cspell.json
index 00958b4716..3dd1715113 100644
--- a/apps/docs/cspell.json
+++ b/apps/docs/cspell.json
@@ -76,6 +76,7 @@
"DBML",
"dbname",
"distancesphere",
+ "dogfooding",
"Distroless",
"distros",
"Dmmf",
@@ -379,6 +380,7 @@
"VARBIT",
"Vdbi",
"veroh",
+ "waitlist",
"walinspect",
"windsurfrules",
"workerd",
diff --git a/apps/docs/package.json b/apps/docs/package.json
index 096a3eb273..d729cbe6a4 100644
--- a/apps/docs/package.json
+++ b/apps/docs/package.json
@@ -34,6 +34,7 @@
"@sentry/nextjs": "catalog:",
"@streamdown/code": "catalog:",
"class-variance-authority": "catalog:",
+ "codehike": "^1.1.0",
"dexie": "catalog:",
"dexie-react-hooks": "catalog:",
"fumadocs-core": "catalog:",
@@ -70,13 +71,13 @@
"fast-glob": "catalog:",
"gray-matter": "catalog:",
"next-validate-link": "catalog:",
+ "openapi-to-postmanv2": "^6.0.1",
"postcss": "catalog:",
"rimraf": "catalog:",
"tailwindcss": "catalog:",
"tsx": "catalog:",
"tw-animate-css": "catalog:",
"typescript": "catalog:",
- "openapi-to-postmanv2": "^6.0.1",
"unified": "^11.0.5"
}
}
diff --git a/apps/docs/source.config.ts b/apps/docs/source.config.ts
index 9c5c40f93c..ad8ecf3089 100644
--- a/apps/docs/source.config.ts
+++ b/apps/docs/source.config.ts
@@ -6,6 +6,7 @@ import lastModified from "fumadocs-mdx/plugins/last-modified";
import { z } from "zod";
import convert from "npm-to-yarn";
import remarkConsoleUtm from "@/lib/remark-console-utm";
+import { BADGE_TYPES } from "@/lib/badge-types";
// npm-to-yarn only converts the last line of multi-line strings,
// so we split, convert each line, and rejoin.
@@ -42,7 +43,7 @@ export const docs = defineDocs({
docs: {
schema: frontmatterSchema.extend({
image: z.string().optional(),
- badge: z.enum(["early-access", "deprecated", "preview"]).optional(),
+ badge: z.enum(BADGE_TYPES).optional(),
url: z.string(),
metaTitle: z.string(),
metaDescription: z.string(),
@@ -95,7 +96,7 @@ export default defineConfig({
command: (cmd: string) => {
const converted = convertLine(cmd, "bun");
if (!converted) return undefined;
- return converted.replace(/^bun x /, "bunx --bun ");
+ return converted.replace(/^bun x /gm, "bunx --bun ");
},
name: "bun",
},
diff --git a/apps/docs/src/components/concept-animation/flow-presets.ts b/apps/docs/src/components/concept-animation/flow-presets.ts
new file mode 100644
index 0000000000..75aa65b67c
--- /dev/null
+++ b/apps/docs/src/components/concept-animation/flow-presets.ts
@@ -0,0 +1,531 @@
+import type { ConceptName } from "./presets";
+
+/**
+ * A flow scene is a fixed box-and-arrow diagram drawn in a viewBox. Every node
+ * and edge is laid out once; each step only chooses which of them are visible
+ * and which are emphasized. Because the SVG keeps the same viewBox across
+ * steps, the diagram scales with its container and never shifts the layout as
+ * a reader steps through it.
+ *
+ * Coordinates are in viewBox units (roughly pixels at full width).
+ */
+
+/** Color role for a box. Mapped to theme-aware classes in flow.tsx. */
+export type FlowVariant =
+ | "project"
+ | "branch"
+ | "vars"
+ | "infra"
+ | "source"
+ | "scope"
+ | "neutral"
+ | "production"
+ | "resolved";
+
+/** Where a resolved variable came from. Drives the colored bar on each row. */
+export type RowOrigin = "production" | "preview" | "override";
+
+/** One key=value line inside a node, color-coded by where the value came from. */
+export interface FlowRow {
+ key: string;
+ value: string;
+ origin: RowOrigin;
+}
+
+/** A small labelled pill rendered inside an `infra` node. */
+export interface FlowChip {
+ label: string;
+ variant: FlowVariant;
+}
+
+export interface FlowNode {
+ id: string;
+ label: string;
+ /** Smaller secondary line under the label. */
+ sub?: string;
+ /** Render the sub on its own line under the title instead of to the right. */
+ subBelow?: boolean;
+ /** Tint the sub line to a scope color (used by the resolved branch boxes). */
+ subOrigin?: RowOrigin;
+ variant: FlowVariant;
+ x: number;
+ y: number;
+ w: number;
+ h: number;
+ /** Chips laid out in a row inside the box (used for the infrastructure box). */
+ chips?: FlowChip[];
+ /** Variable rows rendered inside the box. */
+ rows?: FlowRow[];
+ /** Row slots to reserve, so per-step row changes never resize the box. */
+ maxRows?: number;
+}
+
+export type Side = "l" | "r" | "t" | "b";
+
+export interface FlowEdge {
+ id: string;
+ from: string;
+ fromSide: Side;
+ to: string;
+ toSide: Side;
+ /** Nudge the start/end anchor along the box edge, to fan out parallel edges. */
+ fromDy?: number;
+ toDy?: number;
+ /** Override the x of the vertical bend, so parallel edges don't share a lane. */
+ bendX?: number;
+ /** Dashed lines read as "applies to" / "wires into" rather than "contains". */
+ dashed?: boolean;
+ /** Optional label drawn on the edge. */
+ label?: string;
+}
+
+export interface FlowStep {
+ title: string;
+ caption: string;
+ /** Node ids visible in this step. */
+ nodes: string[];
+ /** Edge ids visible in this step. */
+ edges: string[];
+ /** Node ids drawn brighter, to pull the eye to what changed. */
+ emphasize?: string[];
+ /** Replace a node's rows for this step (used to compose the resolved set). */
+ rowOverrides?: Record;
+}
+
+export interface FlowScene {
+ label: string;
+ /** viewBox width / height. */
+ width: number;
+ height: number;
+ /** Column captions, e.g. "Branch", "Infrastructure". */
+ groupLabels?: { text: string; x: number; y: number }[];
+ /** Color key for row origins, drawn along the bottom. */
+ legend?: { origin: RowOrigin; label: string }[];
+ nodes: FlowNode[];
+ edges: FlowEdge[];
+ steps: FlowStep[];
+}
+
+// Shared three-row band used by the model scene.
+const ROW = [30, 116, 202];
+const BOX_H = 64;
+
+const computeModel: FlowScene = {
+ label: "How Compute organizes resources and isolates branches",
+ width: 712,
+ height: 286,
+ groupLabels: [
+ { text: "Branch", x: 200, y: 18 },
+ { text: "Infrastructure", x: 404, y: 18 },
+ ],
+ nodes: [
+ {
+ id: "project",
+ label: "Project",
+ sub: "my-app",
+ variant: "project",
+ x: 16,
+ y: 116,
+ w: 92,
+ h: 64,
+ },
+
+ {
+ id: "b-main",
+ label: "main",
+ sub: "default · production",
+ variant: "branch",
+ x: 200,
+ y: ROW[0],
+ w: 160,
+ h: BOX_H,
+ },
+ {
+ id: "b-feature",
+ label: "feature/new-feature",
+ sub: "preview",
+ variant: "branch",
+ x: 200,
+ y: ROW[1],
+ w: 160,
+ h: BOX_H,
+ },
+ {
+ id: "b-bug",
+ label: "bug/fix-issue",
+ sub: "preview",
+ variant: "branch",
+ x: 200,
+ y: ROW[2],
+ w: 160,
+ h: BOX_H,
+ },
+
+ {
+ id: "i-main",
+ label: "",
+ variant: "infra",
+ x: 404,
+ y: ROW[0],
+ w: 292,
+ h: BOX_H,
+ // Variables follow a scope (production here); App and DB are isolated per branch.
+ chips: [
+ { label: "Variables · production", variant: "production" },
+ { label: "App", variant: "scope" },
+ { label: "DB", variant: "scope" },
+ ],
+ },
+ {
+ id: "i-feature",
+ label: "",
+ variant: "infra",
+ x: 404,
+ y: ROW[1],
+ w: 292,
+ h: BOX_H,
+ chips: [
+ { label: "Variables · preview", variant: "vars" },
+ { label: "App", variant: "scope" },
+ { label: "DB", variant: "scope" },
+ ],
+ },
+ {
+ id: "i-bug",
+ label: "",
+ variant: "infra",
+ x: 404,
+ y: ROW[2],
+ w: 292,
+ h: BOX_H,
+ chips: [
+ { label: "Variables · preview", variant: "vars" },
+ { label: "App", variant: "scope" },
+ { label: "DB", variant: "scope" },
+ ],
+ },
+ ],
+ edges: [
+ { id: "e-main", from: "project", fromSide: "r", to: "b-main", toSide: "l" },
+ { id: "e-feature", from: "project", fromSide: "r", to: "b-feature", toSide: "l" },
+ { id: "e-bug", from: "project", fromSide: "r", to: "b-bug", toSide: "l" },
+ { id: "c-main", from: "b-main", fromSide: "r", to: "i-main", toSide: "l" },
+ { id: "c-feature", from: "b-feature", fromSide: "r", to: "i-feature", toSide: "l" },
+ { id: "c-bug", from: "b-bug", fromSide: "r", to: "i-bug", toSide: "l" },
+ ],
+ steps: [
+ {
+ title: "1. First deploy",
+ caption:
+ "Your first deploy creates the project, its default production branch, and the infrastructure that runs it: an app, a database, and its production-scoped variables.",
+ nodes: ["project", "b-main", "i-main"],
+ edges: ["e-main", "c-main"],
+ emphasize: ["b-main", "i-main"],
+ },
+ {
+ title: "2. Branch off",
+ caption:
+ "Deploy a new branch name and Compute provisions a full, isolated copy: its own app and database. Its variables resolve from the shared preview scope, so a new preview branch picks up the preview set automatically.",
+ nodes: ["project", "b-main", "i-main", "b-feature", "i-feature"],
+ edges: ["e-main", "c-main", "e-feature", "c-feature"],
+ emphasize: ["b-feature", "i-feature"],
+ },
+ {
+ title: "3. Many branches",
+ caption:
+ "Every branch is its own environment under one project. App and database are isolated per branch; variables follow their scope (production for the default branch, preview for the rest), so a new branch is configured the moment it deploys. Run features and fixes in parallel without collisions.",
+ nodes: ["project", "b-main", "i-main", "b-feature", "i-feature", "b-bug", "i-bug"],
+ edges: ["e-main", "c-main", "e-feature", "c-feature", "e-bug", "c-bug"],
+ emphasize: ["b-bug", "i-bug"],
+ },
+ ],
+};
+
+// Resolved-set rows reused across env steps, so the composition is explicit:
+// each row carries the scope it resolved from.
+const PROD_DB: FlowRow = { key: "DATABASE_URL", value: "…/prod", origin: "production" };
+const PREVIEW_DB: FlowRow = { key: "DATABASE_URL", value: "…/preview", origin: "preview" };
+const PREVIEW_STRIPE: FlowRow = { key: "STRIPE_KEY", value: "sk_test_…", origin: "preview" };
+const OVERRIDE_DB: FlowRow = { key: "DATABASE_URL", value: "…/branch-db", origin: "override" };
+const OVERRIDE_FLAG: FlowRow = { key: "FEATURE_FLAG", value: "on", origin: "override" };
+
+const envLayers: FlowScene = {
+ label: "How a deploy composes its environment variables",
+ width: 730,
+ height: 404,
+ groupLabels: [
+ { text: "What you set, by scope", x: 16, y: 26 },
+ { text: "What each branch resolves to", x: 448, y: 26 },
+ ],
+ legend: [
+ { origin: "production", label: "from production" },
+ { origin: "preview", label: "from preview" },
+ { origin: "override", label: "from branch override" },
+ ],
+ nodes: [
+ // Left: the scopes you write to. Sub on its own line so long flags fit.
+ {
+ id: "s-prod",
+ label: "Production",
+ sub: "--role production",
+ subBelow: true,
+ variant: "production",
+ x: 16,
+ y: 50,
+ w: 224,
+ h: 78,
+ rows: [PROD_DB],
+ },
+ {
+ id: "s-preview",
+ label: "Preview",
+ sub: "--role preview",
+ subBelow: true,
+ variant: "source",
+ x: 16,
+ y: 150,
+ w: 224,
+ h: 102,
+ rows: [PREVIEW_DB, PREVIEW_STRIPE],
+ },
+ {
+ id: "s-override",
+ label: "Branch override",
+ sub: "--branch feature/search",
+ subBelow: true,
+ variant: "branch",
+ x: 16,
+ y: 274,
+ w: 224,
+ h: 102,
+ rows: [OVERRIDE_DB, OVERRIDE_FLAG],
+ },
+
+ // Right: the set each branch actually deploys with.
+ {
+ id: "r-main",
+ label: "main",
+ sub: "production deploy",
+ subOrigin: "production",
+ variant: "resolved",
+ x: 448,
+ y: 50,
+ w: 266,
+ h: 64,
+ rows: [PROD_DB],
+ maxRows: 1,
+ },
+ {
+ id: "r-feature",
+ label: "feature/search",
+ sub: "preview deploy",
+ subOrigin: "preview",
+ variant: "resolved",
+ x: 448,
+ y: 140,
+ w: 266,
+ h: 112,
+ rows: [OVERRIDE_DB, PREVIEW_STRIPE, OVERRIDE_FLAG],
+ maxRows: 3,
+ },
+ {
+ id: "r-bug",
+ label: "bug/fix-issue",
+ sub: "preview deploy",
+ subOrigin: "preview",
+ variant: "resolved",
+ x: 448,
+ y: 274,
+ w: 266,
+ h: 90,
+ rows: [PREVIEW_DB, PREVIEW_STRIPE],
+ maxRows: 2,
+ },
+ ],
+ edges: [
+ { id: "d-prod", from: "s-prod", fromSide: "r", to: "r-main", toSide: "l", dashed: true },
+ {
+ id: "d-preview-f",
+ from: "s-preview",
+ fromSide: "r",
+ to: "r-feature",
+ toSide: "l",
+ dashed: true,
+ fromDy: -16,
+ toDy: -22,
+ bendX: 384,
+ },
+ {
+ id: "d-preview-b",
+ from: "s-preview",
+ fromSide: "r",
+ to: "r-bug",
+ toSide: "l",
+ dashed: true,
+ fromDy: 16,
+ bendX: 304,
+ },
+ {
+ id: "d-override",
+ from: "s-override",
+ fromSide: "r",
+ to: "r-feature",
+ toSide: "l",
+ dashed: true,
+ toDy: 22,
+ },
+ ],
+ steps: [
+ {
+ title: "1. Production",
+ caption:
+ "Your default branch deploys as production, and resolves to the production variables only. Nothing else is mixed in.",
+ nodes: ["s-prod", "r-main"],
+ edges: ["d-prod"],
+ emphasize: ["s-prod", "r-main"],
+ },
+ {
+ title: "2. Preview is the default",
+ caption:
+ "Here's the default that surprises people: every preview branch automatically inherits the shared preview set. You don't configure feature/search or bug/fix-issue, they both just resolve to preview. Production variables are never included.",
+ nodes: ["s-prod", "r-main", "s-preview", "r-feature", "r-bug"],
+ edges: ["d-prod", "d-preview-f", "d-preview-b"],
+ emphasize: ["s-preview", "r-feature", "r-bug"],
+ rowOverrides: { "r-feature": [PREVIEW_DB, PREVIEW_STRIPE] },
+ },
+ {
+ title: "3. Override layers on top",
+ caption:
+ "A branch override composes key by key on top of that default, for one branch only: feature/search replaces DATABASE_URL and adds FEATURE_FLAG, while STRIPE_KEY still flows through from preview. bug/fix-issue has no override, so it stays on the plain preview defaults.",
+ nodes: ["s-prod", "r-main", "s-preview", "r-feature", "r-bug", "s-override"],
+ edges: ["d-prod", "d-preview-f", "d-preview-b", "d-override"],
+ emphasize: ["s-override", "r-feature"],
+ },
+ ],
+};
+
+const githubConnection: FlowScene = {
+ label: "How a GitHub connection deploys on push",
+ width: 668,
+ height: 256,
+ groupLabels: [
+ { text: "Workspace level", x: 24, y: 22 },
+ { text: "Project level", x: 24, y: 132 },
+ ],
+ nodes: [
+ {
+ id: "workspace",
+ label: "Workspace",
+ sub: "your org",
+ variant: "neutral",
+ x: 24,
+ y: 40,
+ w: 160,
+ h: 62,
+ },
+ {
+ id: "ghapp",
+ label: "Prisma GitHub App",
+ sub: "installed",
+ variant: "source",
+ x: 250,
+ y: 40,
+ w: 178,
+ h: 62,
+ },
+
+ {
+ id: "project",
+ label: "Project",
+ sub: "my-app",
+ variant: "project",
+ x: 24,
+ y: 150,
+ w: 160,
+ h: 62,
+ },
+ {
+ id: "repo",
+ label: "Repository",
+ sub: "acme/shop",
+ variant: "neutral",
+ x: 250,
+ y: 150,
+ w: 178,
+ h: 62,
+ },
+ {
+ id: "deploy",
+ label: "Preview deploy",
+ sub: "feature/login",
+ variant: "scope",
+ x: 494,
+ y: 150,
+ w: 150,
+ h: 62,
+ },
+ ],
+ edges: [
+ {
+ id: "e-install",
+ from: "workspace",
+ fromSide: "r",
+ to: "ghapp",
+ toSide: "l",
+ label: "installs",
+ },
+ {
+ id: "e-connect",
+ from: "project",
+ fromSide: "r",
+ to: "repo",
+ toSide: "l",
+ label: "git connect",
+ },
+ {
+ id: "e-push",
+ from: "repo",
+ fromSide: "r",
+ to: "deploy",
+ toSide: "l",
+ dashed: true,
+ label: "push",
+ },
+ ],
+ steps: [
+ {
+ title: "1. Install the app",
+ caption:
+ "The connection has two levels. First, your workspace installs the Prisma GitHub App once. That installation is what lets Prisma see your repositories.",
+ nodes: ["workspace", "ghapp"],
+ edges: ["e-install"],
+ emphasize: ["workspace", "ghapp"],
+ },
+ {
+ title: "2. Connect a repo",
+ caption:
+ "Then each project connects to a single repository with git connect. Connecting wires up automation for future events; it doesn't deploy anything on its own.",
+ nodes: ["workspace", "ghapp", "project", "repo"],
+ edges: ["e-install", "e-connect"],
+ emphasize: ["project", "repo"],
+ },
+ {
+ title: "3. Push to deploy",
+ caption:
+ "After that, a push builds the pushed commit and deploys the matching branch, so a push to feature/login deploys that preview. Production stays deliberate: you promote a deployment when you're ready.",
+ nodes: ["workspace", "ghapp", "project", "repo", "deploy"],
+ edges: ["e-install", "e-connect", "e-push"],
+ emphasize: ["deploy"],
+ },
+ ],
+};
+
+/**
+ * Names that render as visual flow diagrams. Any name not listed here falls
+ * back to the Code Hike token animation in presets.ts.
+ */
+export const FLOW_SCENES = {
+ "compute-model": computeModel,
+ "env-layers": envLayers,
+ "github-connection": githubConnection,
+} satisfies Partial>;
diff --git a/apps/docs/src/components/concept-animation/flow.tsx b/apps/docs/src/components/concept-animation/flow.tsx
new file mode 100644
index 0000000000..012b99a347
--- /dev/null
+++ b/apps/docs/src/components/concept-animation/flow.tsx
@@ -0,0 +1,548 @@
+"use client";
+
+import type { CSSProperties } from "react";
+import type {
+ FlowEdge,
+ FlowNode,
+ FlowRow,
+ FlowScene,
+ FlowVariant,
+ RowOrigin,
+ Side,
+} from "./flow-presets";
+import { PlayerShell } from "./shell";
+
+const EDGE_COLOR = "var(--color-fd-muted-foreground)";
+const MONO = "ui-monospace, SFMono-Regular, Menlo, monospace";
+
+/** Box styling per role. Tailwind `fill-*`/`stroke-*` utilities, theme-aware. */
+const BOX: Record = {
+ project: {
+ rect: "fill-amber-100 stroke-amber-300 dark:fill-amber-400/15 dark:stroke-amber-400/40",
+ label: "fill-amber-950 dark:fill-amber-50",
+ sub: "fill-amber-700 dark:fill-amber-200/70",
+ ring: "stroke-amber-400 dark:stroke-amber-300",
+ },
+ branch: {
+ rect: "fill-amber-100 stroke-amber-300 dark:fill-amber-400/15 dark:stroke-amber-400/40",
+ label: "fill-amber-950 dark:fill-amber-50",
+ sub: "fill-amber-700 dark:fill-amber-200/70",
+ ring: "stroke-amber-400 dark:stroke-amber-300",
+ },
+ vars: {
+ rect: "fill-emerald-100 stroke-emerald-300 dark:fill-emerald-400/15 dark:stroke-emerald-400/40",
+ label: "fill-emerald-950 dark:fill-emerald-50",
+ sub: "fill-emerald-700 dark:fill-emerald-200/70",
+ ring: "stroke-emerald-400 dark:stroke-emerald-300",
+ },
+ source: {
+ rect: "fill-emerald-100 stroke-emerald-300 dark:fill-emerald-400/15 dark:stroke-emerald-400/40",
+ label: "fill-emerald-950 dark:fill-emerald-50",
+ sub: "fill-emerald-700 dark:fill-emerald-200/70",
+ ring: "stroke-emerald-400 dark:stroke-emerald-300",
+ },
+ production: {
+ rect: "fill-teal-100 stroke-teal-300 dark:fill-teal-400/15 dark:stroke-teal-400/40",
+ label: "fill-teal-950 dark:fill-teal-50",
+ sub: "fill-teal-700 dark:fill-teal-200/70",
+ ring: "stroke-teal-400 dark:stroke-teal-300",
+ },
+ scope: {
+ rect: "fill-violet-100 stroke-violet-300 dark:fill-violet-400/15 dark:stroke-violet-400/40",
+ label: "fill-violet-950 dark:fill-violet-50",
+ sub: "fill-violet-700 dark:fill-violet-200/70",
+ ring: "stroke-violet-400 dark:stroke-violet-300",
+ },
+ resolved: {
+ rect: "fill-fd-card stroke-stroke-neutral-strong",
+ label: "fill-fd-foreground",
+ sub: "fill-fd-muted-foreground",
+ ring: "stroke-teal-400 dark:stroke-teal-300",
+ },
+ infra: {
+ rect: "fill-transparent stroke-stroke-neutral-strong",
+ label: "fill-fd-foreground",
+ sub: "fill-fd-muted-foreground",
+ ring: "stroke-amber-400 dark:stroke-amber-300",
+ },
+ neutral: {
+ rect: "fill-fd-muted stroke-stroke-neutral-strong",
+ label: "fill-fd-foreground",
+ sub: "fill-fd-muted-foreground",
+ ring: "stroke-fd-foreground/40",
+ },
+};
+
+type ChipKind = "vars" | "scope" | "production";
+const CHIP: Record = {
+ vars: "fill-emerald-100 stroke-emerald-300 dark:fill-emerald-400/20 dark:stroke-emerald-400/40",
+ scope: "fill-violet-100 stroke-violet-300 dark:fill-violet-400/20 dark:stroke-violet-400/40",
+ production: "fill-teal-100 stroke-teal-300 dark:fill-teal-400/20 dark:stroke-teal-400/40",
+};
+const CHIP_TEXT: Record = {
+ vars: "fill-emerald-950 dark:fill-emerald-50",
+ scope: "fill-violet-950 dark:fill-violet-50",
+ production: "fill-teal-950 dark:fill-teal-50",
+};
+function chipKind(variant: string): ChipKind {
+ if (variant === "vars") return "vars";
+ if (variant === "production") return "production";
+ return "scope";
+}
+
+/** Colored bar drawn beside a variable row, by where its value came from. */
+const ORIGIN_BAR: Record = {
+ production: "fill-teal-500 dark:fill-teal-400",
+ preview: "fill-emerald-500 dark:fill-emerald-400",
+ override: "fill-amber-500 dark:fill-amber-400",
+};
+const ORIGIN_TEXT: Record = {
+ production: "fill-teal-700 dark:fill-teal-300",
+ preview: "fill-emerald-700 dark:fill-emerald-300",
+ override: "fill-amber-700 dark:fill-amber-300",
+};
+
+const ROW_H = 23;
+const ROW_TOP = 34;
+
+interface Point {
+ x: number;
+ y: number;
+}
+
+function anchor(n: FlowNode, side: Side, dy = 0): Point {
+ switch (side) {
+ case "l":
+ return { x: n.x, y: n.y + n.h / 2 + dy };
+ case "r":
+ return { x: n.x + n.w, y: n.y + n.h / 2 + dy };
+ case "t":
+ return { x: n.x + n.w / 2, y: n.y };
+ case "b":
+ return { x: n.x + n.w / 2, y: n.y + n.h };
+ }
+}
+
+/** Orthogonal waypoints between two anchors, based on which side each exits. */
+function routePoints(a: Point, fromSide: Side, b: Point, toSide: Side, bendX?: number): Point[] {
+ const horizFrom = fromSide === "l" || fromSide === "r";
+ const horizTo = toSide === "l" || toSide === "r";
+ if (horizFrom && horizTo) {
+ const midX = bendX ?? (a.x + b.x) / 2;
+ return [a, { x: midX, y: a.y }, { x: midX, y: b.y }, b];
+ }
+ if (horizFrom && !horizTo) return [a, { x: b.x, y: a.y }, b];
+ if (!horizFrom && horizTo) return [a, { x: a.x, y: b.y }, b];
+ const midY = (a.y + b.y) / 2;
+ return [a, { x: a.x, y: midY }, { x: b.x, y: midY }, b];
+}
+
+/** Polyline with rounded corners. */
+function roundedPath(pts: Point[], r = 9): string {
+ if (pts.length < 2) return "";
+ let d = `M ${pts[0].x} ${pts[0].y}`;
+ for (let i = 1; i < pts.length - 1; i += 1) {
+ const p0 = pts[i - 1];
+ const p1 = pts[i];
+ const p2 = pts[i + 1];
+ const len1 = Math.hypot(p1.x - p0.x, p1.y - p0.y) || 1;
+ const len2 = Math.hypot(p2.x - p1.x, p2.y - p1.y) || 1;
+ const rr = Math.min(r, len1 / 2, len2 / 2);
+ const s = { x: p1.x - ((p1.x - p0.x) / len1) * rr, y: p1.y - ((p1.y - p0.y) / len1) * rr };
+ const e = { x: p1.x + ((p2.x - p1.x) / len2) * rr, y: p1.y + ((p2.y - p1.y) / len2) * rr };
+ d += ` L ${s.x} ${s.y} Q ${p1.x} ${p1.y} ${e.x} ${e.y}`;
+ }
+ const last = pts[pts.length - 1];
+ d += ` L ${last.x} ${last.y}`;
+ return d;
+}
+
+function Edge({
+ edge,
+ byId,
+ visible,
+}: {
+ edge: FlowEdge;
+ byId: Map;
+ visible: boolean;
+}) {
+ const from = byId.get(edge.from);
+ const to = byId.get(edge.to);
+ if (!from || !to) return null;
+ const pts = routePoints(
+ anchor(from, edge.fromSide, edge.fromDy ?? 0),
+ edge.fromSide,
+ anchor(to, edge.toSide, edge.toDy ?? 0),
+ edge.toSide,
+ edge.bendX,
+ );
+ const d = roundedPath(pts);
+
+ const mid = Math.floor((pts.length - 1) / 2);
+ const lx = (pts[mid].x + pts[mid + 1].x) / 2;
+ const ly = (pts[mid].y + pts[mid + 1].y) / 2;
+ const labelW = edge.label ? edge.label.length * 6 + 12 : 0;
+
+ return (
+
+
+ {edge.label ? (
+
+
+
+ {edge.label}
+
+
+ ) : null}
+
+ );
+}
+
+function Rows({ node, rows }: { node: FlowNode; rows: FlowRow[] }) {
+ const rowTop = node.subBelow ? ROW_TOP + 12 : ROW_TOP;
+ return (
+ <>
+ {rows.map((row, i) => {
+ const y0 = node.y + rowTop + i * ROW_H;
+ const cy = y0 + ROW_H / 2;
+ return (
+
+
+
+ {row.key}
+
+
+ {row.value}
+
+
+ );
+ })}
+ >
+ );
+}
+
+function Chips({ node }: { node: FlowNode }) {
+ const chips = node.chips ?? [];
+ const gap = 8;
+ const padX = 12;
+ const chipH = 34;
+ const widths = chips.map((c) => Math.max(38, c.label.length * 6.6 + 18));
+ const total = widths.reduce((a, b) => a + b, 0) + gap * (chips.length - 1);
+ let x = node.x + Math.max(padX, (node.w - total) / 2);
+ const y = node.y + (node.h - chipH) / 2;
+ return (
+ <>
+ {chips.map((chip, i) => {
+ const w = widths[i];
+ const kind = chipKind(chip.variant);
+ const cell = (
+
+
+
+ {chip.label}
+
+
+ );
+ x += w + gap;
+ return cell;
+ })}
+ >
+ );
+}
+
+function Node({
+ node,
+ rows,
+ visible,
+ emphasized,
+}: {
+ node: FlowNode;
+ rows?: FlowRow[];
+ visible: boolean;
+ emphasized: boolean;
+}) {
+ const style = BOX[node.variant];
+ const cx = node.x + node.w / 2;
+ const cy = node.y + node.h / 2;
+ const hasRows = rows != null && rows.length > 0;
+ // Row boxes get a left-aligned header; chip and plain boxes don't.
+ const titled = hasRows;
+ const groupStyle: CSSProperties = {
+ opacity: visible ? 1 : 0,
+ transform: visible ? "scale(1)" : "scale(0.96)",
+ transformBox: "fill-box",
+ transformOrigin: "center",
+ };
+
+ return (
+
+ {/* Emphasis ring: brightens the box that changed this step. */}
+
+
+
+ {node.chips ? : null}
+
+ {titled ? (
+ <>
+ {/* Header: title left; sub either on its own line below (scope
+ boxes, avoids overflow) or to the right (resolved boxes). */}
+
+ {node.label}
+
+ {node.sub ? (
+
+ {node.sub}
+
+ ) : null}
+ {hasRows ? : null}
+ >
+ ) : node.chips ? null : (
+ <>
+
+ {node.label}
+
+ {node.sub ? (
+
+ {node.sub}
+
+ ) : null}
+ >
+ )}
+
+ );
+}
+
+function Legend({ scene }: { scene: FlowScene }) {
+ const items = scene.legend ?? [];
+ if (items.length === 0) return null;
+ const widths = items.map((it) => 16 + it.label.length * 5.6 + 22);
+ const total = widths.reduce((a, b) => a + b, 0);
+ let x = (scene.width - total) / 2;
+ const y = scene.height - 16;
+ return (
+ <>
+ {items.map((it, i) => {
+ const startX = x;
+ x += widths[i];
+ return (
+
+
+
+ {it.label}
+
+
+ );
+ })}
+ >
+ );
+}
+
+function FlowDiagram({ scene, active }: { scene: FlowScene; active: number }) {
+ const step = scene.steps[active];
+ const byId = new Map(scene.nodes.map((n) => [n.id, n]));
+ const visibleNodes = new Set(step.nodes);
+ const visibleEdges = new Set(step.edges);
+ const emphasized = new Set(step.emphasize ?? []);
+
+ return (
+
+
+
+
+
+
+
+
+ {scene.groupLabels?.map((g) => (
+
+ {g.text}
+
+ ))}
+
+ {scene.edges.map((edge) => (
+
+ ))}
+ {scene.nodes.map((node) => (
+
+ ))}
+
+
+
+
+ );
+}
+
+/** Player for the visual box-and-arrow flow scenes. */
+export function FlowPlayer({ scene }: { scene: FlowScene }) {
+ const steps = scene.steps.map((s) => ({ title: s.title, caption: s.caption }));
+ return (
+
+ {(active) => }
+
+ );
+}
diff --git a/apps/docs/src/components/concept-animation/index.tsx b/apps/docs/src/components/concept-animation/index.tsx
new file mode 100644
index 0000000000..f0d3d2c03d
--- /dev/null
+++ b/apps/docs/src/components/concept-animation/index.tsx
@@ -0,0 +1,27 @@
+import { FLOW_SCENES } from "./flow-presets";
+import { FlowPlayer } from "./flow";
+import { ConceptPlayer } from "./player";
+import { CONCEPT_PRESETS, type ConceptName, parseStepTokens } from "./presets";
+
+/**
+ * Animated concept diagram for the Compute docs, e.g.
+ * ` ` in MDX.
+ *
+ * Names with an entry in flow-presets.ts render as a visual box-and-arrow flow
+ * (Project → Branch → Infrastructure, variable scopes, push-to-deploy). Any
+ * other name falls back to the Code Hike token animation in presets.ts. Either
+ * way the surrounding layout never shifts as you step through.
+ */
+export function ConceptAnimation({ name }: { name: ConceptName }) {
+ const scene = FLOW_SCENES[name];
+ if (scene) return ;
+
+ const preset = CONCEPT_PRESETS[name];
+ if (!preset) throw new Error(`Unknown concept animation: ${String(name)}`);
+ const steps = preset.steps.map((step) => ({
+ ...parseStepTokens(step.code),
+ title: step.title,
+ caption: step.caption,
+ }));
+ return ;
+}
diff --git a/apps/docs/src/components/concept-animation/player.tsx b/apps/docs/src/components/concept-animation/player.tsx
new file mode 100644
index 0000000000..c2bf24662e
--- /dev/null
+++ b/apps/docs/src/components/concept-animation/player.tsx
@@ -0,0 +1,73 @@
+"use client";
+
+import { type AnnotationHandler, type HighlightedCode, InnerToken, Pre } from "codehike/code";
+import { useMemo } from "react";
+import type { ConceptToken } from "./presets";
+import { PlayerShell } from "./shell";
+import { SmoothPre } from "./smooth-pre";
+
+const handlers: AnnotationHandler[] = [
+ {
+ name: "token-transitions",
+ PreWithRef: SmoothPre,
+ // inline-block so the WAAPI translate animation can move each token
+ Token: (props) => ,
+ },
+];
+
+export interface PlayerStep {
+ tokens: ConceptToken[];
+ plain: string;
+ title: string;
+ caption: string;
+}
+
+/**
+ * Code Hike token-transition player: each step is a plain-text diagram whose
+ * surviving tokens slide to their new position between states.
+ */
+export function ConceptPlayer({ label, steps }: { label: string; steps: PlayerStep[] }) {
+ const codes = useMemo(
+ () =>
+ steps.map(
+ (step) =>
+ ({
+ tokens: step.tokens,
+ code: step.plain,
+ lang: "txt",
+ meta: "",
+ themeName: "concept",
+ style: {},
+ annotations: [],
+ }) as unknown as HighlightedCode,
+ ),
+ [steps],
+ );
+
+ return (
+
+ {(active) => (
+ // Grid-stacked sizers reserve the tallest/widest step up front, so
+ // stepping through states never shifts the layout.
+
+
+ {steps.map((step) => (
+
+ {step.plain}
+
+ ))}
+
+ )}
+
+ );
+}
diff --git a/apps/docs/src/components/concept-animation/presets.ts b/apps/docs/src/components/concept-animation/presets.ts
new file mode 100644
index 0000000000..2588ab620c
--- /dev/null
+++ b/apps/docs/src/components/concept-animation/presets.ts
@@ -0,0 +1,193 @@
+import type { CSSProperties } from "react";
+
+/**
+ * A concept animation is a sequence of plain-text "diagram" states.
+ * Code Hike's token transitions morph one state into the next, so tokens
+ * that survive between steps slide to their new position instead of
+ * re-rendering.
+ *
+ * Wrap tokens in `[[...]]` to emphasize them in the current step.
+ */
+export interface ConceptStep {
+ /** Short label for this state, shown in the stepper so readers can jump to it. */
+ title: string;
+ code: string;
+ caption: string;
+}
+
+export interface ConceptPreset {
+ label: string;
+ steps: ConceptStep[];
+}
+
+export const CONCEPT_PRESETS = {
+ "compute-model": {
+ label: "How Compute organizes resources and isolates branches",
+ steps: [
+ {
+ title: "1. First deploy",
+ code:
+ "$ [[npx @prisma/cli@latest app deploy]]\n" +
+ " │\n" +
+ " ▼\n" +
+ "project: my-app\n" +
+ "└─ branch: main (production) → app + database",
+ caption:
+ "Run from your project directory, your first app deploy creates everything: the project (my-app), its production branch, and the app and database that run it. Nothing exists before this command.",
+ },
+ {
+ title: "2. Preview branch",
+ code:
+ "$ [[npx @prisma/cli@latest app deploy --branch feature/login]]\n" +
+ " │\n" +
+ " ▼\n" +
+ "project: my-app\n" +
+ "├─ branch: main (production) → app + database\n" +
+ "└─ branch: feature/login (preview) → app + database [[← new copy]]",
+ caption:
+ "Deploy with a new branch name and Compute provisions a full copy of the infrastructure: feature/login gets its own app, database, and URL. Production stays untouched.",
+ },
+ {
+ title: "3. Connect GitHub",
+ code:
+ "$ [[npx @prisma/cli@latest git connect]]\n" +
+ "$ [[git push]] # push feature/login\n" +
+ " │\n" +
+ " ▼\n" +
+ "project: my-app (connected → acme/shop)\n" +
+ "├─ branch: main ← git: main\n" +
+ "└─ branch: feature/login ← git: feature/login [[deploys]]",
+ caption:
+ "Connect the repo once and you stop deploying by hand. Each Git branch maps to a branch by name, so pushing feature/login builds and deploys just that preview automatically.",
+ },
+ {
+ title: "4. Ship to production",
+ code:
+ "$ [[git push]] # merge to main\n" +
+ " │\n" +
+ " ▼\n" +
+ "project: my-app\n" +
+ "└─ branch: main (production) [[deployed]]",
+ caption:
+ "Merging to your default branch pushes to main and deploys to production. The merged preview branch is cleaned up, so only production keeps running.",
+ },
+ ],
+ },
+ "github-connection": {
+ label: "How a GitHub connection deploys on push",
+ steps: [
+ {
+ title: "1. Install the app",
+ code:
+ "$ [[npx @prisma/cli@latest git connect]]\n" +
+ " │\n" +
+ " ▼\n" +
+ "workspace\n" +
+ "└─ Prisma GitHub App installed",
+ caption:
+ "The first time you run git connect, the workspace installs the Prisma GitHub App. That installation is what lets Prisma see your repositories.",
+ },
+ {
+ title: "2. Connect a repo",
+ code:
+ "$ [[npx @prisma/cli@latest git connect]]\n" +
+ " │\n" +
+ " ▼\n" +
+ "workspace\n" +
+ "└─ Prisma GitHub App installed\n" +
+ "project: my-app → github.com/acme/shop",
+ caption:
+ "The same command connects this project to a single repository, so Prisma knows that github.com/acme/shop belongs to my-app.",
+ },
+ {
+ title: "3. Push to deploy",
+ code:
+ "$ [[git push]] # push feature/x\n" +
+ " │\n" +
+ " ▼\n" +
+ "project: my-app → deploys branch [[feature/x]]",
+ caption:
+ "After that, every push builds the commit and deploys the matching branch, so your previews always track your Git branches.",
+ },
+ ],
+ },
+ "env-layers": {
+ label: "How environment variables resolve",
+ steps: [
+ {
+ title: "1. Production",
+ code:
+ "$ npx @prisma/cli@latest project env add \\\n" +
+ " DATABASE_URL=postgres://prod [[--role production]]\n" +
+ " │\n" +
+ " ▼\n" +
+ "branch main resolves:\n" +
+ " DATABASE_URL = postgres://prod",
+ caption:
+ "Variables added with --role production apply to every production deploy, so the main branch resolves to exactly these values.",
+ },
+ {
+ title: "2. Preview",
+ code:
+ "$ npx @prisma/cli@latest project env add \\\n" +
+ " DATABASE_URL=postgres://preview [[--role preview]]\n" +
+ " │\n" +
+ " ▼\n" +
+ "branch feature/search resolves:\n" +
+ " DATABASE_URL = postgres://preview",
+ caption:
+ "Preview-scoped variables apply to every preview branch, so test traffic stays off production data. Any branch other than main resolves to this set.",
+ },
+ {
+ title: "3. Branch override",
+ code:
+ "$ npx @prisma/cli@latest project env add \\\n" +
+ " FEATURE_FLAG=on [[--branch feature/search]]\n" +
+ " │\n" +
+ " ▼\n" +
+ "branch feature/search resolves:\n" +
+ " DATABASE_URL = postgres://preview\n" +
+ " FEATURE_FLAG = on [[← override]]",
+ caption:
+ "A branch override adds or replaces a value for one branch. feature/search keeps the shared preview DATABASE_URL but also gets FEATURE_FLAG=on, which no other branch sees.",
+ },
+ ],
+ },
+} satisfies Record;
+
+export type ConceptName = keyof typeof CONCEPT_PRESETS;
+
+/** Code Hike token: plain text, or [text, color, style?]. */
+export type ConceptToken = string | [string, string, CSSProperties?];
+
+const EMPHASIS_COLOR = "var(--color-fd-primary)";
+
+function pushWords(tokens: ConceptToken[], text: string, emphasized: boolean) {
+ for (const part of text.split(/(\s+)/)) {
+ if (!part) continue;
+ if (/^\s+$/.test(part)) {
+ tokens.push(part);
+ } else {
+ tokens.push([part, emphasized ? EMPHASIS_COLOR : "currentColor"]);
+ }
+ }
+}
+
+/**
+ * Turn a `[[...]]`-annotated step into word-level Code Hike tokens.
+ * Word-level granularity is what lets token transitions move each word
+ * independently; Code Hike's own highlighter would merge same-colored
+ * neighbors into one token and the animation would lose its shape.
+ */
+export function parseStepTokens(code: string): { tokens: ConceptToken[]; plain: string } {
+ const tokens: ConceptToken[] = [];
+ const emphasis = /\[\[(.+?)\]\]/g;
+ let lastIndex = 0;
+ for (const match of code.matchAll(emphasis)) {
+ pushWords(tokens, code.slice(lastIndex, match.index), false);
+ pushWords(tokens, match[1], true);
+ lastIndex = match.index + match[0].length;
+ }
+ pushWords(tokens, code.slice(lastIndex), false);
+ return { tokens, plain: code.replace(emphasis, "$1") };
+}
diff --git a/apps/docs/src/components/concept-animation/shell.tsx b/apps/docs/src/components/concept-animation/shell.tsx
new file mode 100644
index 0000000000..4b5df417e3
--- /dev/null
+++ b/apps/docs/src/components/concept-animation/shell.tsx
@@ -0,0 +1,211 @@
+"use client";
+
+import { cn } from "@prisma-docs/ui/lib/cn";
+import { type ReactNode, useEffect, useRef, useState } from "react";
+
+const AUTOPLAY_INTERVAL = 5000;
+
+/** Title + caption for one step; the body itself is rendered by the caller. */
+export interface ShellStep {
+ title: string;
+ caption: string;
+}
+
+function PlayIcon() {
+ return (
+
+
+
+ );
+}
+
+function PauseIcon() {
+ return (
+
+
+
+ );
+}
+
+function ChevronIcon({ direction }: { direction: "left" | "right" }) {
+ return (
+
+
+
+ );
+}
+
+/**
+ * Shared chrome for the concept animations: an autoplay progress bar, a header
+ * with the diagram label and step count, the body (rendered by `children` for
+ * the active step), and a footer with the step caption and a labelled stepper.
+ *
+ * The body is a render prop so the same controls drive both the Code Hike
+ * token animation and the SVG flow diagrams. Autoplay pauses off-screen and
+ * when the reader prefers reduced motion.
+ */
+export function PlayerShell({
+ label,
+ steps,
+ children,
+}: {
+ label: string;
+ steps: ShellStep[];
+ children: (active: number) => ReactNode;
+}) {
+ const [active, setActive] = useState(0);
+ const [autoplay, setAutoplay] = useState(true);
+ const [inView, setInView] = useState(false);
+ const rootRef = useRef(null);
+
+ useEffect(() => {
+ if (window.matchMedia("(prefers-reduced-motion: reduce)").matches) {
+ setAutoplay(false);
+ }
+ }, []);
+
+ useEffect(() => {
+ const el = rootRef.current;
+ if (!el) return;
+ // A low threshold keeps tall diagrams autoplaying even when only partly
+ // on screen, so the animation is moving by the time a reader looks at it.
+ const observer = new IntersectionObserver(([entry]) => setInView(entry.isIntersecting), {
+ threshold: 0.2,
+ });
+ observer.observe(el);
+ return () => observer.disconnect();
+ }, []);
+
+ const playing = autoplay && inView;
+
+ useEffect(() => {
+ if (!playing) return;
+ const id = window.setInterval(
+ () => setActive((current) => (current + 1) % steps.length),
+ AUTOPLAY_INTERVAL,
+ );
+ return () => window.clearInterval(id);
+ }, [playing, steps.length]);
+
+ // Manual navigation stops autoplay so a reader can study a state; the play
+ // button brings it back.
+ const goTo = (index: number) => {
+ setAutoplay(false);
+ setActive((index + steps.length) % steps.length);
+ };
+
+ return (
+
+
+
+ {/* Autoplay progress bar: refills every step, so it is obvious the
+ diagram is advancing on its own and that more steps are coming. */}
+
+
+ {/* Header: what this diagram explains, plus where you are in the steps. */}
+
+
{label}
+
+
+ Step {active + 1} of {steps.length}
+
+ setAutoplay((on) => !on)}
+ className="flex size-6 items-center justify-center rounded-full border border-stroke-neutral text-fd-muted-foreground transition-colors hover:border-fd-primary hover:text-fd-primary"
+ >
+ {autoplay ? : }
+
+
+
+
+ {children(active)}
+
+ {/* Footer: the caption for the current step, plus a labelled stepper so
+ readers can jump straight to any named state or walk prev/next. The
+ captions are grid-stacked so the footer reserves the tallest one and
+ never shifts as you step through. */}
+
+
+ {steps.map((step, index) => (
+
+ {step.caption}
+
+ ))}
+
+
+
goTo(active - 1)}
+ className="flex size-6 shrink-0 items-center justify-center rounded-full border border-stroke-neutral text-fd-muted-foreground transition-colors hover:border-fd-primary hover:text-fd-primary"
+ >
+
+
+
+ {steps.map((step, index) => (
+ goTo(index)}
+ className={cn(
+ "whitespace-nowrap rounded-full border px-2.5 py-1 text-[0.75rem] transition-colors",
+ index === active
+ ? "border-fd-primary bg-fd-primary text-fd-primary-foreground"
+ : "border-stroke-neutral text-fd-muted-foreground hover:text-fd-foreground",
+ )}
+ >
+ {step.title}
+
+ ))}
+
+
goTo(active + 1)}
+ className="flex size-6 shrink-0 items-center justify-center rounded-full border border-stroke-neutral text-fd-muted-foreground transition-colors hover:border-fd-primary hover:text-fd-primary"
+ >
+
+
+
+
+
+ );
+}
diff --git a/apps/docs/src/components/concept-animation/smooth-pre.tsx b/apps/docs/src/components/concept-animation/smooth-pre.tsx
new file mode 100644
index 0000000000..6dc8962dbf
--- /dev/null
+++ b/apps/docs/src/components/concept-animation/smooth-pre.tsx
@@ -0,0 +1,63 @@
+"use client";
+
+import { type CustomPreProps, InnerPre, getPreRef } from "codehike/code";
+import {
+ type TokenTransitionsSnapshot,
+ calculateTransitions,
+ getStartingSnapshot,
+} from "codehike/utils/token-transitions";
+import React from "react";
+
+const TRANSITION_DURATION = 900;
+
+/**
+ * The Code Hike token-transitions pre: snapshots token positions before an
+ * update, then animates each token from its old position/color to the new
+ * one with the Web Animations API. Class component because the recipe needs
+ * getSnapshotBeforeUpdate.
+ */
+export class SmoothPre extends React.Component {
+ ref: React.RefObject;
+
+ constructor(props: CustomPreProps) {
+ super(props);
+ this.ref = getPreRef(this.props);
+ }
+
+ render() {
+ return ;
+ }
+
+ getSnapshotBeforeUpdate(): TokenTransitionsSnapshot | null {
+ return this.ref.current ? getStartingSnapshot(this.ref.current) : null;
+ }
+
+ componentDidUpdate(
+ _prevProps: unknown,
+ _prevState: unknown,
+ snapshot: TokenTransitionsSnapshot | null,
+ ) {
+ if (!this.ref.current || !snapshot) return;
+ if (window.matchMedia("(prefers-reduced-motion: reduce)").matches) return;
+ const transitions = calculateTransitions(this.ref.current, snapshot);
+ for (const { element, keyframes, options } of transitions) {
+ const { translateX, translateY, ...rest } = keyframes as Record<
+ string,
+ [number | string, number | string]
+ >;
+ const frames: Record = rest;
+ if (translateX && translateY) {
+ frames.translate = [
+ `${translateX[0]}px ${translateY[0]}px`,
+ `${translateX[1]}px ${translateY[1]}px`,
+ ];
+ }
+ element.animate(frames as PropertyIndexedKeyframes, {
+ duration: options.duration * TRANSITION_DURATION,
+ delay: options.delay * TRANSITION_DURATION,
+ easing: options.easing,
+ fill: "both",
+ });
+ }
+ }
+}
diff --git a/apps/docs/src/components/sidebar-badge-provider.tsx b/apps/docs/src/components/sidebar-badge-provider.tsx
index 832dd2c50c..c0c041922b 100644
--- a/apps/docs/src/components/sidebar-badge-provider.tsx
+++ b/apps/docs/src/components/sidebar-badge-provider.tsx
@@ -3,8 +3,9 @@ import { createContext, use, type FC, type ReactNode } from "react";
import type * as PageTree from "fumadocs-core/page-tree";
import { SidebarItem } from "@/components/layout/notebook/sidebar";
import { Badge } from "@prisma/eclipse";
+import type { BadgeType } from "@/lib/badge-types";
-export type BadgeType = "early-access" | "deprecated" | "preview";
+export type { BadgeType };
const BadgeContext = createContext>({});
@@ -20,12 +21,14 @@ export function BadgeProvider({
const BADGE_LABEL: Record = {
"early-access": "Early Access",
+ beta: "Beta",
preview: "Preview",
deprecated: "Deprecated",
};
const BADGE_COLOR: Record = {
"early-access": "ppg",
+ beta: "neutral",
preview: "neutral",
deprecated: "warning",
};
diff --git a/apps/docs/src/lib/badge-types.ts b/apps/docs/src/lib/badge-types.ts
new file mode 100644
index 0000000000..0ef76cad4e
--- /dev/null
+++ b/apps/docs/src/lib/badge-types.ts
@@ -0,0 +1,7 @@
+// Single source of truth for documentation page badge values.
+// Keep this list in sync in one place: the frontmatter zod enum
+// (source.config.ts), the badge map (page-badges.ts), and the sidebar
+// renderer (sidebar-badge-provider.tsx) all derive from it.
+export const BADGE_TYPES = ["early-access", "beta", "deprecated", "preview"] as const;
+
+export type BadgeType = (typeof BADGE_TYPES)[number];
diff --git a/apps/docs/src/lib/layout.shared.tsx b/apps/docs/src/lib/layout.shared.tsx
index 0ed483d0ed..d6a6199f95 100644
--- a/apps/docs/src/lib/layout.shared.tsx
+++ b/apps/docs/src/lib/layout.shared.tsx
@@ -22,7 +22,7 @@ export const links: LinkItemTypeWithActivePaths[] = [
text: "Getting Started",
url: "/",
active: "nested-url",
- activePaths: ["/", "/prisma-orm", "/prisma-postgres"],
+ activePaths: ["/", "/prisma-orm", "/prisma-postgres", "/prisma-compute"],
},
{
text: "ORM",
@@ -35,6 +35,11 @@ export const links: LinkItemTypeWithActivePaths[] = [
url: "/postgres",
active: "nested-url",
},
+ {
+ text: "Compute",
+ url: "/compute",
+ active: "nested-url",
+ },
{
text: "CLI",
url: "/cli",
diff --git a/apps/docs/src/lib/page-badges.ts b/apps/docs/src/lib/page-badges.ts
index c552ed1f20..0c6990add0 100644
--- a/apps/docs/src/lib/page-badges.ts
+++ b/apps/docs/src/lib/page-badges.ts
@@ -1,6 +1,7 @@
import { source } from "./source";
+import type { BadgeType } from "./badge-types";
-export type BadgeType = "early-access" | "deprecated" | "preview";
+export type { BadgeType };
// Create a map of page URLs to their badge values
export function getPageBadges(): Map {
diff --git a/apps/docs/src/mdx-components.tsx b/apps/docs/src/mdx-components.tsx
index 3a7d81dfea..20c553c968 100644
--- a/apps/docs/src/mdx-components.tsx
+++ b/apps/docs/src/mdx-components.tsx
@@ -1,6 +1,7 @@
import defaultMdxComponents from "fumadocs-ui/mdx";
import { Youtube } from "@prisma-docs/ui/components/youtube";
import { APIPage } from "@/components/api-page";
+import { ConceptAnimation } from "@/components/concept-animation";
import { withDocsBasePath } from "@/lib/urls";
import type { MDXComponents } from "mdx/types";
@@ -30,7 +31,7 @@ import {
TableCaption,
Input,
Alert,
- Button
+ Button,
} from "@prisma/eclipse";
function withDocsBasePathForImageSrc(src: unknown): unknown {
@@ -62,6 +63,7 @@ export function getMDXComponents(components?: MDXComponents): MDXComponents {
Accordion,
Accordions,
APIPage,
+ ConceptAnimation,
Youtube,
img: (props: any) => (
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 7ec3923dca..9de6c729cd 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -245,7 +245,7 @@ importers:
version: 1.3.0(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
'@fumadocs/base-ui':
specifier: 'catalog:'
- version: 16.6.3(@types/react@19.2.14)(fumadocs-core@16.6.3(@mdx-js/mdx@3.1.1)(@mixedbread/sdk@0.46.0)(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.14)(lucide-react@0.575.0(react@19.2.4))(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.1)(@playwright/test@1.59.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6))(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.1)(@playwright/test@1.59.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(tailwindcss@4.2.2)
+ version: 16.6.3(@types/react@19.2.14)(fumadocs-core@16.6.3(@mdx-js/mdx@3.1.1)(@mixedbread/sdk@0.46.0)(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.14)(lucide-react@0.575.0(react@19.2.4))(next@16.1.6(@opentelemetry/api@1.9.1)(@playwright/test@1.59.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6))(next@16.1.6(@opentelemetry/api@1.9.1)(@playwright/test@1.59.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(tailwindcss@4.2.2)
'@fumadocs/cli':
specifier: 'catalog:'
version: 1.3.4(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)
@@ -269,16 +269,16 @@ importers:
version: 2.8.6
fumadocs-core:
specifier: 'catalog:'
- version: 16.6.3(@mdx-js/mdx@3.1.1)(@mixedbread/sdk@0.46.0)(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.14)(lucide-react@0.575.0(react@19.2.4))(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.1)(@playwright/test@1.59.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6)
+ version: 16.6.3(@mdx-js/mdx@3.1.1)(@mixedbread/sdk@0.46.0)(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.14)(lucide-react@0.575.0(react@19.2.4))(next@16.1.6(@opentelemetry/api@1.9.1)(@playwright/test@1.59.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6)
fumadocs-mdx:
specifier: 'catalog:'
- version: 14.2.9(@types/mdast@4.0.4)(@types/mdx@2.0.13)(@types/react@19.2.14)(fumadocs-core@16.6.3(@mdx-js/mdx@3.1.1)(@mixedbread/sdk@0.46.0)(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.14)(lucide-react@0.575.0(react@19.2.4))(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.1)(@playwright/test@1.59.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6))(mdast-util-directive@3.1.0)(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.1)(@playwright/test@1.59.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react@19.2.4)
+ version: 14.2.9(@types/mdast@4.0.4)(@types/mdx@2.0.13)(@types/react@19.2.14)(fumadocs-core@16.6.3(@mdx-js/mdx@3.1.1)(@mixedbread/sdk@0.46.0)(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.14)(lucide-react@0.575.0(react@19.2.4))(next@16.1.6(@opentelemetry/api@1.9.1)(@playwright/test@1.59.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6))(mdast-util-directive@3.1.0)(next@16.1.6(@opentelemetry/api@1.9.1)(@playwright/test@1.59.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react@19.2.4)
fumadocs-openapi:
specifier: 'catalog:'
- version: 10.3.17(35ac6ed76a0a0af52e89afd8526c5f89)
+ version: 10.3.17(9de11f01189fd90426a917361984bfb1)
fumadocs-ui:
specifier: 'catalog:'
- version: '@fumadocs/base-ui@16.6.3(@types/react@19.2.14)(fumadocs-core@16.6.3(@mdx-js/mdx@3.1.1)(@mixedbread/sdk@0.46.0)(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.14)(lucide-react@0.575.0(react@19.2.4))(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.1)(@playwright/test@1.59.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6))(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.1)(@playwright/test@1.59.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(tailwindcss@4.2.2)'
+ version: '@fumadocs/base-ui@16.6.3(@types/react@19.2.14)(fumadocs-core@16.6.3(@mdx-js/mdx@3.1.1)(@mixedbread/sdk@0.46.0)(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.14)(lucide-react@0.575.0(react@19.2.4))(next@16.1.6(@opentelemetry/api@1.9.1)(@playwright/test@1.59.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6))(next@16.1.6(@opentelemetry/api@1.9.1)(@playwright/test@1.59.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(tailwindcss@4.2.2)'
lucide-react:
specifier: 'catalog:'
version: 0.575.0(react@19.2.4)
@@ -348,7 +348,7 @@ importers:
version: 1.3.0(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
'@fumadocs/base-ui':
specifier: 'catalog:'
- version: 16.6.3(@types/react@19.2.14)(fumadocs-core@16.6.3(@mdx-js/mdx@3.1.1)(@mixedbread/sdk@0.46.0)(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.14)(lucide-react@0.575.0(react@19.2.4))(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.1)(@playwright/test@1.59.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6))(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.1)(@playwright/test@1.59.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(tailwindcss@4.2.2)
+ version: 16.6.3(@types/react@19.2.14)(fumadocs-core@16.6.3(@mdx-js/mdx@3.1.1)(@mixedbread/sdk@0.46.0)(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.14)(lucide-react@0.575.0(react@19.2.4))(next@16.1.6(@opentelemetry/api@1.9.1)(@playwright/test@1.59.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6))(next@16.1.6(@opentelemetry/api@1.9.1)(@playwright/test@1.59.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(tailwindcss@4.2.2)
'@fumadocs/cli':
specifier: 'catalog:'
version: 1.3.4(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)
@@ -376,6 +376,9 @@ importers:
class-variance-authority:
specifier: 'catalog:'
version: 0.7.1
+ codehike:
+ specifier: ^1.1.0
+ version: 1.1.0
dexie:
specifier: 'catalog:'
version: 4.4.2
@@ -384,16 +387,16 @@ importers:
version: 4.4.0(dexie@4.4.2)(react@19.2.4)
fumadocs-core:
specifier: 'catalog:'
- version: 16.6.3(@mdx-js/mdx@3.1.1)(@mixedbread/sdk@0.46.0)(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.14)(lucide-react@0.575.0(react@19.2.4))(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.1)(@playwright/test@1.59.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6)
+ version: 16.6.3(@mdx-js/mdx@3.1.1)(@mixedbread/sdk@0.46.0)(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.14)(lucide-react@0.575.0(react@19.2.4))(next@16.1.6(@opentelemetry/api@1.9.1)(@playwright/test@1.59.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6)
fumadocs-mdx:
specifier: 'catalog:'
- version: 14.2.9(@types/mdast@4.0.4)(@types/mdx@2.0.13)(@types/react@19.2.14)(fumadocs-core@16.6.3(@mdx-js/mdx@3.1.1)(@mixedbread/sdk@0.46.0)(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.14)(lucide-react@0.575.0(react@19.2.4))(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.1)(@playwright/test@1.59.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6))(mdast-util-directive@3.1.0)(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.1)(@playwright/test@1.59.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react@19.2.4)
+ version: 14.2.9(@types/mdast@4.0.4)(@types/mdx@2.0.13)(@types/react@19.2.14)(fumadocs-core@16.6.3(@mdx-js/mdx@3.1.1)(@mixedbread/sdk@0.46.0)(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.14)(lucide-react@0.575.0(react@19.2.4))(next@16.1.6(@opentelemetry/api@1.9.1)(@playwright/test@1.59.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6))(mdast-util-directive@3.1.0)(next@16.1.6(@opentelemetry/api@1.9.1)(@playwright/test@1.59.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react@19.2.4)
fumadocs-openapi:
specifier: 'catalog:'
- version: 10.3.17(35ac6ed76a0a0af52e89afd8526c5f89)
+ version: 10.3.17(9de11f01189fd90426a917361984bfb1)
fumadocs-ui:
specifier: 'catalog:'
- version: '@fumadocs/base-ui@16.6.3(@types/react@19.2.14)(fumadocs-core@16.6.3(@mdx-js/mdx@3.1.1)(@mixedbread/sdk@0.46.0)(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.14)(lucide-react@0.575.0(react@19.2.4))(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.1)(@playwright/test@1.59.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6))(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.1)(@playwright/test@1.59.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(tailwindcss@4.2.2)'
+ version: '@fumadocs/base-ui@16.6.3(@types/react@19.2.14)(fumadocs-core@16.6.3(@mdx-js/mdx@3.1.1)(@mixedbread/sdk@0.46.0)(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.14)(lucide-react@0.575.0(react@19.2.4))(next@16.1.6(@opentelemetry/api@1.9.1)(@playwright/test@1.59.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6))(next@16.1.6(@opentelemetry/api@1.9.1)(@playwright/test@1.59.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(tailwindcss@4.2.2)'
jotai:
specifier: 'catalog:'
version: 2.19.0(@babel/core@7.29.0)(@babel/template@7.28.6)(@types/react@19.2.14)(react@19.2.4)
@@ -511,7 +514,7 @@ importers:
version: 1.3.0(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
'@fumadocs/base-ui':
specifier: 'catalog:'
- version: 16.6.3(@types/react@19.2.14)(fumadocs-core@16.6.3(@mdx-js/mdx@3.1.1)(@mixedbread/sdk@0.46.0)(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.14)(lucide-react@0.575.0(react@19.2.4))(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.1)(@playwright/test@1.59.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6))(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.1)(@playwright/test@1.59.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(tailwindcss@4.2.2)
+ version: 16.6.3(@types/react@19.2.14)(fumadocs-core@16.6.3(@mdx-js/mdx@3.1.1)(@mixedbread/sdk@0.46.0)(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.14)(lucide-react@0.575.0(react@19.2.4))(next@16.1.6(@opentelemetry/api@1.9.1)(@playwright/test@1.59.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6))(next@16.1.6(@opentelemetry/api@1.9.1)(@playwright/test@1.59.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(tailwindcss@4.2.2)
'@fumadocs/cli':
specifier: 'catalog:'
version: 1.3.4(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)
@@ -526,13 +529,13 @@ importers:
version: 0.7.1
fumadocs-core:
specifier: 'catalog:'
- version: 16.6.3(@mdx-js/mdx@3.1.1)(@mixedbread/sdk@0.46.0)(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.14)(lucide-react@0.575.0(react@19.2.4))(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.1)(@playwright/test@1.59.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6)
+ version: 16.6.3(@mdx-js/mdx@3.1.1)(@mixedbread/sdk@0.46.0)(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.14)(lucide-react@0.575.0(react@19.2.4))(next@16.1.6(@opentelemetry/api@1.9.1)(@playwright/test@1.59.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6)
fumadocs-mdx:
specifier: 'catalog:'
- version: 14.2.9(@types/mdast@4.0.4)(@types/mdx@2.0.13)(@types/react@19.2.14)(fumadocs-core@16.6.3(@mdx-js/mdx@3.1.1)(@mixedbread/sdk@0.46.0)(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.14)(lucide-react@0.575.0(react@19.2.4))(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.1)(@playwright/test@1.59.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6))(mdast-util-directive@3.1.0)(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.1)(@playwright/test@1.59.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react@19.2.4)
+ version: 14.2.9(@types/mdast@4.0.4)(@types/mdx@2.0.13)(@types/react@19.2.14)(fumadocs-core@16.6.3(@mdx-js/mdx@3.1.1)(@mixedbread/sdk@0.46.0)(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.14)(lucide-react@0.575.0(react@19.2.4))(next@16.1.6(@opentelemetry/api@1.9.1)(@playwright/test@1.59.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6))(mdast-util-directive@3.1.0)(next@16.1.6(@opentelemetry/api@1.9.1)(@playwright/test@1.59.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react@19.2.4)
fumadocs-ui:
specifier: 'catalog:'
- version: '@fumadocs/base-ui@16.6.3(@types/react@19.2.14)(fumadocs-core@16.6.3(@mdx-js/mdx@3.1.1)(@mixedbread/sdk@0.46.0)(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.14)(lucide-react@0.575.0(react@19.2.4))(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.1)(@playwright/test@1.59.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6))(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.1)(@playwright/test@1.59.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(tailwindcss@4.2.2)'
+ version: '@fumadocs/base-ui@16.6.3(@types/react@19.2.14)(fumadocs-core@16.6.3(@mdx-js/mdx@3.1.1)(@mixedbread/sdk@0.46.0)(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.14)(lucide-react@0.575.0(react@19.2.4))(next@16.1.6(@opentelemetry/api@1.9.1)(@playwright/test@1.59.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6))(next@16.1.6(@opentelemetry/api@1.9.1)(@playwright/test@1.59.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(tailwindcss@4.2.2)'
lucide-react:
specifier: 'catalog:'
version: 0.575.0(react@19.2.4)
@@ -608,7 +611,7 @@ importers:
version: 1.3.0(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
'@fumadocs/base-ui':
specifier: 'catalog:'
- version: 16.6.3(@types/react@19.2.14)(fumadocs-core@16.6.3(@mdx-js/mdx@3.1.1)(@mixedbread/sdk@0.46.0)(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.14)(lucide-react@0.575.0(react@19.2.4))(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.1)(@playwright/test@1.59.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6))(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.1)(@playwright/test@1.59.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(tailwindcss@4.2.2)
+ version: 16.6.3(@types/react@19.2.14)(fumadocs-core@16.6.3(@mdx-js/mdx@3.1.1)(@mixedbread/sdk@0.46.0)(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.14)(lucide-react@0.575.0(react@19.2.4))(next@16.1.6(@opentelemetry/api@1.9.1)(@playwright/test@1.59.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6))(next@16.1.6(@opentelemetry/api@1.9.1)(@playwright/test@1.59.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(tailwindcss@4.2.2)
'@mixedbread/sdk':
specifier: 'catalog:'
version: 0.46.0
@@ -626,13 +629,13 @@ importers:
version: 2.8.6
fumadocs-core:
specifier: 'catalog:'
- version: 16.6.3(@mdx-js/mdx@3.1.1)(@mixedbread/sdk@0.46.0)(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.14)(lucide-react@0.575.0(react@19.2.4))(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.1)(@playwright/test@1.59.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6)
+ version: 16.6.3(@mdx-js/mdx@3.1.1)(@mixedbread/sdk@0.46.0)(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.14)(lucide-react@0.575.0(react@19.2.4))(next@16.1.6(@opentelemetry/api@1.9.1)(@playwright/test@1.59.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6)
fumadocs-mdx:
specifier: 'catalog:'
- version: 14.2.9(@types/mdast@4.0.4)(@types/mdx@2.0.13)(@types/react@19.2.14)(fumadocs-core@16.6.3(@mdx-js/mdx@3.1.1)(@mixedbread/sdk@0.46.0)(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.14)(lucide-react@0.575.0(react@19.2.4))(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.1)(@playwright/test@1.59.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6))(mdast-util-directive@3.1.0)(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.1)(@playwright/test@1.59.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react@19.2.4)
+ version: 14.2.9(@types/mdast@4.0.4)(@types/mdx@2.0.13)(@types/react@19.2.14)(fumadocs-core@16.6.3(@mdx-js/mdx@3.1.1)(@mixedbread/sdk@0.46.0)(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.14)(lucide-react@0.575.0(react@19.2.4))(next@16.1.6(@opentelemetry/api@1.9.1)(@playwright/test@1.59.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6))(mdast-util-directive@3.1.0)(next@16.1.6(@opentelemetry/api@1.9.1)(@playwright/test@1.59.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react@19.2.4)
fumadocs-ui:
specifier: 'catalog:'
- version: '@fumadocs/base-ui@16.6.3(@types/react@19.2.14)(fumadocs-core@16.6.3(@mdx-js/mdx@3.1.1)(@mixedbread/sdk@0.46.0)(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.14)(lucide-react@0.575.0(react@19.2.4))(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.1)(@playwright/test@1.59.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6))(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.1)(@playwright/test@1.59.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(tailwindcss@4.2.2)'
+ version: '@fumadocs/base-ui@16.6.3(@types/react@19.2.14)(fumadocs-core@16.6.3(@mdx-js/mdx@3.1.1)(@mixedbread/sdk@0.46.0)(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.14)(lucide-react@0.575.0(react@19.2.4))(next@16.1.6(@opentelemetry/api@1.9.1)(@playwright/test@1.59.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6))(next@16.1.6(@opentelemetry/api@1.9.1)(@playwright/test@1.59.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(tailwindcss@4.2.2)'
html-react-parser:
specifier: ^5.2.17
version: 5.2.17(@types/react@19.2.14)(react@19.2.4)
@@ -7406,12 +7409,12 @@ snapshots:
dependencies:
'@formatjs/fast-memoize': 3.1.1
- '@fumadocs/base-ui@16.6.3(@types/react@19.2.14)(fumadocs-core@16.6.3(@mdx-js/mdx@3.1.1)(@mixedbread/sdk@0.46.0)(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.14)(lucide-react@0.575.0(react@19.2.4))(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.1)(@playwright/test@1.59.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6))(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.1)(@playwright/test@1.59.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(tailwindcss@4.2.2)':
+ '@fumadocs/base-ui@16.6.3(@types/react@19.2.14)(fumadocs-core@16.6.3(@mdx-js/mdx@3.1.1)(@mixedbread/sdk@0.46.0)(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.14)(lucide-react@0.575.0(react@19.2.4))(next@16.1.6(@opentelemetry/api@1.9.1)(@playwright/test@1.59.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6))(next@16.1.6(@opentelemetry/api@1.9.1)(@playwright/test@1.59.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(tailwindcss@4.2.2)':
dependencies:
'@base-ui/react': 1.3.0(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
'@fumadocs/tailwind': 0.0.2(tailwindcss@4.2.2)
class-variance-authority: 0.7.1
- fumadocs-core: 16.6.3(@mdx-js/mdx@3.1.1)(@mixedbread/sdk@0.46.0)(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.14)(lucide-react@0.575.0(react@19.2.4))(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.1)(@playwright/test@1.59.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6)
+ fumadocs-core: 16.6.3(@mdx-js/mdx@3.1.1)(@mixedbread/sdk@0.46.0)(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.14)(lucide-react@0.575.0(react@19.2.4))(next@16.1.6(@opentelemetry/api@1.9.1)(@playwright/test@1.59.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6)
lucide-react: 0.570.0(react@19.2.4)
motion: 12.38.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
next-themes: 0.4.6(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
@@ -10546,7 +10549,7 @@ snapshots:
fsevents@2.3.3:
optional: true
- fumadocs-core@16.6.3(@mdx-js/mdx@3.1.1)(@mixedbread/sdk@0.46.0)(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.14)(lucide-react@0.575.0(react@19.2.4))(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.1)(@playwright/test@1.59.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6):
+ fumadocs-core@16.6.3(@mdx-js/mdx@3.1.1)(@mixedbread/sdk@0.46.0)(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.14)(lucide-react@0.575.0(react@19.2.4))(next@16.1.6(@opentelemetry/api@1.9.1)(@playwright/test@1.59.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6):
dependencies:
'@formatjs/intl-localematcher': 0.8.2
'@orama/orama': 3.1.18
@@ -10586,14 +10589,14 @@ snapshots:
transitivePeerDependencies:
- supports-color
- fumadocs-mdx@14.2.9(@types/mdast@4.0.4)(@types/mdx@2.0.13)(@types/react@19.2.14)(fumadocs-core@16.6.3(@mdx-js/mdx@3.1.1)(@mixedbread/sdk@0.46.0)(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.14)(lucide-react@0.575.0(react@19.2.4))(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.1)(@playwright/test@1.59.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6))(mdast-util-directive@3.1.0)(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.1)(@playwright/test@1.59.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react@19.2.4):
+ fumadocs-mdx@14.2.9(@types/mdast@4.0.4)(@types/mdx@2.0.13)(@types/react@19.2.14)(fumadocs-core@16.6.3(@mdx-js/mdx@3.1.1)(@mixedbread/sdk@0.46.0)(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.14)(lucide-react@0.575.0(react@19.2.4))(next@16.1.6(@opentelemetry/api@1.9.1)(@playwright/test@1.59.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6))(mdast-util-directive@3.1.0)(next@16.1.6(@opentelemetry/api@1.9.1)(@playwright/test@1.59.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react@19.2.4):
dependencies:
'@mdx-js/mdx': 3.1.1
'@standard-schema/spec': 1.1.0
chokidar: 5.0.0
esbuild: 0.27.4
estree-util-value-to-estree: 3.5.0
- fumadocs-core: 16.6.3(@mdx-js/mdx@3.1.1)(@mixedbread/sdk@0.46.0)(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.14)(lucide-react@0.575.0(react@19.2.4))(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.1)(@playwright/test@1.59.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6)
+ fumadocs-core: 16.6.3(@mdx-js/mdx@3.1.1)(@mixedbread/sdk@0.46.0)(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.14)(lucide-react@0.575.0(react@19.2.4))(next@16.1.6(@opentelemetry/api@1.9.1)(@playwright/test@1.59.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6)
js-yaml: 4.1.1
mdast-util-mdx: 3.0.0
mdast-util-to-markdown: 2.1.2
@@ -10616,7 +10619,7 @@ snapshots:
transitivePeerDependencies:
- supports-color
- fumadocs-openapi@10.3.17(35ac6ed76a0a0af52e89afd8526c5f89):
+ fumadocs-openapi@10.3.17(9de11f01189fd90426a917361984bfb1):
dependencies:
'@fumari/json-schema-ts': 0.0.2
'@fumari/stf': 1.0.3(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
@@ -10629,8 +10632,8 @@ snapshots:
ajv: 8.18.0
class-variance-authority: 0.7.1
dereference-json-schema: 0.2.2
- fumadocs-core: 16.6.3(@mdx-js/mdx@3.1.1)(@mixedbread/sdk@0.46.0)(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.14)(lucide-react@0.575.0(react@19.2.4))(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.1)(@playwright/test@1.59.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6)
- fumadocs-ui: '@fumadocs/base-ui@16.6.3(@types/react@19.2.14)(fumadocs-core@16.6.3(@mdx-js/mdx@3.1.1)(@mixedbread/sdk@0.46.0)(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.14)(lucide-react@0.575.0(react@19.2.4))(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.1)(@playwright/test@1.59.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6))(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.1)(@playwright/test@1.59.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(tailwindcss@4.2.2)'
+ fumadocs-core: 16.6.3(@mdx-js/mdx@3.1.1)(@mixedbread/sdk@0.46.0)(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.14)(lucide-react@0.575.0(react@19.2.4))(next@16.1.6(@opentelemetry/api@1.9.1)(@playwright/test@1.59.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6)
+ fumadocs-ui: '@fumadocs/base-ui@16.6.3(@types/react@19.2.14)(fumadocs-core@16.6.3(@mdx-js/mdx@3.1.1)(@mixedbread/sdk@0.46.0)(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.14)(lucide-react@0.575.0(react@19.2.4))(next@16.1.6(@opentelemetry/api@1.9.1)(@playwright/test@1.59.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6))(next@16.1.6(@opentelemetry/api@1.9.1)(@playwright/test@1.59.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(tailwindcss@4.2.2)'
github-slugger: 2.0.0
hast-util-to-jsx-runtime: 2.3.6
js-yaml: 4.1.1