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..e3459639bd --- /dev/null +++ b/apps/blog/content/blog/launching-prisma-compute-public-beta/index.mdx @@ -0,0 +1,59 @@ +--- +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. 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. + +We're early and shipping fast, so we'd love to hear what breaks, what feels rough, and what's missing. Tag [@prisma on X](https://pris.ly/x), or drop your feedback in [the `prisma-compute` channel in our community Discord](https://pris.ly/discord-compute). We'll be reading closely, and we're excited to build this next chapter with you. + +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..c5287c3bc8 --- /dev/null +++ b/apps/blog/content/blog/launching-prisma-compute-public-beta/snippets.ts @@ -0,0 +1,17 @@ +// Captured from a real `@prisma/cli@latest app deploy --db` run. +// The agent reads the project, wires a branch database, applies the +// schema, builds, and ships an immutable preview, all in one command. +export const deployTerminalLines = [ + "✔ Linked ./guestbook to project compute-guestbook-demo", + "Deploying compute-guestbook-demo / add-guestbook / guestbook", + "◇ 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/docs/content/docs/(index)/getting-started.mdx b/apps/docs/content/docs/(index)/getting-started.mdx index 505a2437b7..6aa8eb5e06 100644 --- a/apps/docs/content/docs/(index)/getting-started.mdx +++ b/apps/docs/content/docs/(index)/getting-started.mdx @@ -6,7 +6,7 @@ metaTitle: Prisma getting started metaDescription: Choose a Prisma quickstart for new or existing projects and get from schema to first query quickly. --- -Prisma gives you a few good starting points depending on whether you need a database, already have one, or want the smallest possible local setup. +Prisma gives you a few good starting points depending on whether you need a database, already have one, want the smallest possible local setup, or are ready to deploy your app. ## Choose your path @@ -18,6 +18,11 @@ Prisma gives you a few good starting points depending on whether you need a data - [Quickstart with MySQL](/prisma-orm/quickstart/mysql) if your application uses MySQL - [Quickstart with MongoDB](/prisma-orm/quickstart/mongodb) if your application uses MongoDB +### Deploy your app + +- [Deploy your first app](/prisma-compute/deploy) on [Prisma Compute](/compute), currently in Public Beta, to run it next to your Prisma Postgres database +- [Set environment variables](/compute/environment-variables) to connect your deployed app to a database + ### Add Prisma to an existing project - [Add Prisma ORM to an existing PostgreSQL project](/prisma-orm/add-to-existing-project/postgresql) @@ -35,6 +40,13 @@ No matter which guide you choose, the flow is usually the same: 3. Run `prisma generate` to create a type-safe client for your schema. 4. Create or introspect your database, then start sending queries from your application. +If you're deploying to [Prisma Compute](/compute), the equivalent flow is: + +1. Sign in with `npx @prisma/cli@latest auth login`. +2. Run `npx @prisma/cli@latest app deploy` from your app directory to get a live URL. +3. Set your database connection string and other config as [environment variables](/compute/environment-variables). +4. Redeploy to apply them, then keep shipping from the CLI or [connect GitHub](/compute/github) to deploy on push. + ## Next steps After setup, these pages are usually the next ones people need: diff --git a/apps/docs/content/docs/(index)/index.mdx b/apps/docs/content/docs/(index)/index.mdx index ef519b3400..40b95e93b8 100644 --- a/apps/docs/content/docs/(index)/index.mdx +++ b/apps/docs/content/docs/(index)/index.mdx @@ -19,12 +19,19 @@ npx create-db ``` +[**Prisma Compute**](/compute) runs your app next to your Prisma Postgres database, currently in [Public Beta](/console/more/feature-maturity#public-beta). Deploy Next.js, Hono, TanStack Start, and Bun apps, with an isolated preview for every branch. + +```npm +npx @prisma/cli@latest app deploy +``` + + + }> + **Ready to deploy?** Run your app next to your database, with a live preview for every branch. + }> **Need a database?** Get started with your favorite framework and Prisma Postgres. - }> - **Already have a database?** Use Prisma ORM for a type-safe developer experience and automated migrations. - 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..e24601ce3a --- /dev/null +++ b/apps/docs/content/docs/(index)/prisma-compute/deploy.mdx @@ -0,0 +1,139 @@ +--- +title: Deploy your first app +description: Take an existing TypeScript app from your terminal to a live URL on Prisma Compute. +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 and verify it at a live URL. +--- + +[Prisma Compute](/compute) deploys and runs your app next to your Prisma Postgres database. + +In this guide, you will deploy an existing app to Compute, open it at a live URL, and connect it to GitHub so every push deploys on its own. Each step explains what the CLI does on your behalf, so nothing happens behind your back. + +If you are new to how Compute fits together, the [resource model](/compute#the-model) is worth a quick look first: a workspace holds projects, a project holds branches, and each branch owns its own app and database. + +## Prerequisites + +- A JavaScript runtime: Node.js 22.12 or newer for `npx`/`pnpm`, or Bun for `bunx`. +- A [Prisma Data Platform account](https://pris.ly/pdp). +- An app built with **Next.js**, **Hono**, **TanStack Start**, or a plain **Bun** HTTP server. + +:::info + +Next.js apps must set `output: "standalone"` in their Next.js config before deploying. + +::: + +## 1. Sign in + +A deploy needs an authenticated session, so sign in before anything else: + +```npm +npx @prisma/cli@latest auth login +``` + +This opens your browser, signs you in to your Prisma Data Platform account, and stores a session on your machine. Every later command reads that session automatically, so you sign in only once. Anything else running in the same environment inherits it too, including a coding agent working in your project directory. + +Confirm who you are signed in as: + +```npm +npx @prisma/cli@latest auth whoami +``` + +The browser step needs a human, so it does not work in CI or other headless environments. If you are in a headless environment, authenticate with a [service token](/compute/getting-started#automation-and-ci) instead. + +## 2. Deploy your app + +From your app directory, run: + +```npm +npx @prisma/cli@latest app deploy +``` + +There is no black box here. 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`. +2. **Sets up a project** the first time you deploy from this directory, then writes `.prisma/local.json` to pin the directory to that project. That file is a local, gitignored cache rather than 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 is what decides where the deploy lands. +4. **Builds and uploads your app**, provisions the app, and prints a live URL. + +Your first deploy is promoted to production automatically, so the URL you get back is your production URL. To see how projects, branches, and apps relate, see [The model](/compute#the-model). + +## 3. Verify the deployment + +Open the deployed app in your browser: + +```npm +npx @prisma/cli@latest app open +``` + +If the app does not respond the way you expect, stream its logs to see what happened: + +```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. + +## 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. The CLI resolves that branch name, creates a matching platform branch if one does not exist yet, and gives you an isolated [preview deployment](/compute/branching) with its own app, database, and URL. Preview deploys never ask for confirmation and never affect production, so you can 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 +``` + +You can also inspect everything you have deployed in the [Console](https://pris.ly/pdp): projects, branches, apps, deployments, integrations, and domains. + +## 5. Connect GitHub + +Connecting your repository to GitHub is the recommended way to deploy on Compute, and the workflow most teams settle on. Once it is connected, Prisma deploys on every push, so you rarely run `app deploy` by hand again. From your linked project directory, connect your Git origin: + +```npm +npx @prisma/cli@latest git connect +``` + +If the Prisma GitHub App is not installed yet, the CLI starts the install flow in your browser. Once the connection is live, Prisma watches the repository and keeps your platform branches in sync with your Git branches: + +- Pushing to a branch builds that commit and updates the matching platform branch's preview. +- Creating a Git branch creates the matching platform branch. +- Deleting a Git branch tears its preview down, while leaving production and your default branch alone. + +Connecting does not deploy anything on its own; it wires up automation for future pushes, so to ship right now you still run `app deploy`. For the full setup, including monorepos and CI, see the [GitHub integration docs](/compute/github). + +## Hand it to your agent + +You can also let your 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. +- 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..701b0acc9a --- /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? + +[`@prisma/cli`](/compute/getting-started). The executable is `prisma-cli`. The quickest way to run it without installing 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? + +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 repo and enables automation for future branch and push events. To deploy now, run `app deploy`. To set up the connection, see the [GitHub integration docs](/compute/github). + +## What does a GitHub push do? + +For a connected project, it creates or resolves the matching branch and builds the pushed commit. + +## Why can't I read my environment variable values back? + +They're encrypted and never returned, by any surface, in beta. `project env list` shows keys and metadata only. Keep your own copy 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. Redeploy 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`? + +The CLI couldn't resolve a project. Run `project create` or `project link`, or pass `--project` / `--create-project`. + +## Why `APP_AMBIGUOUS`? + +More than one app matched. Pass `--app `. + +## 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? + +Not in beta; custom domains are production-only. + +## Does Prisma clone my production database for previews? + +Don't assume so. These docs cover app deployment and runtime config only. 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..c74c0f6df8 --- /dev/null +++ b/apps/docs/content/docs/compute/index.mdx @@ -0,0 +1,67 @@ +--- +title: Prisma Compute +description: "Deploy and run your TypeScript app on the same platform as Prisma Postgres, with your schema, database, hosting, and previews managed together." +url: /compute +badge: beta +metaTitle: Overview | Prisma Compute +metaDescription: Learn what Prisma Compute is, how it runs your app alongside Prisma Postgres, and how to deploy your first app. +--- + +Prisma Compute deploys and runs your TypeScript app on the same platform as [Prisma Postgres](/postgres). You model your data with [Prisma ORM](/orm), store it in Prisma Postgres, and deploy your app to Prisma Compute, so your schema, database, and hosting are managed together in one sandbox. + +:::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 gets a TypeScript app to a live URL in a few minutes, then connects GitHub so every push deploys 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 an isolated copy of your app and database, so previews never touch 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 and deployments. +- An **app** is an HTTP service, such as a frontend or backend, and can have multiple **deployments**. + +The branch is the idea that ties Compute together, because each branch owns its own app, database, and URL. When you create a branch, Compute provisions a full copy of that infrastructure, so preview work runs in complete isolation and never touches 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 walks the whole flow, from your first deploy to shipping to production. 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/index.tsx b/apps/docs/src/components/concept-animation/index.tsx new file mode 100644 index 0000000000..823eaf453e --- /dev/null +++ b/apps/docs/src/components/concept-animation/index.tsx @@ -0,0 +1,19 @@ +import { ConceptPlayer } from "./player"; +import { CONCEPT_PRESETS, type ConceptName, parseStepTokens } from "./presets"; + +/** + * Animated concept diagram for the Compute docs, e.g. + * `` in MDX. Steps are defined in + * presets.ts; Code Hike token transitions morph between them without + * shifting the surrounding layout. + */ +export function ConceptAnimation({ name }: { name: ConceptName }) { + 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..5e50280732 --- /dev/null +++ b/apps/docs/src/components/concept-animation/player.tsx @@ -0,0 +1,241 @@ +"use client"; + +import { cn } from "@prisma-docs/ui/lib/cn"; +import { type AnnotationHandler, type HighlightedCode, InnerToken, Pre } from "codehike/code"; +import { useEffect, useMemo, useRef, useState } from "react"; +import type { ConceptToken } from "./presets"; +import { SmoothPre } from "./smooth-pre"; + +const AUTOPLAY_INTERVAL = 5000; + +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; +} + +function PlayIcon() { + return ( + + + + ); +} + +function PauseIcon() { + return ( + + + + ); +} + +function ChevronIcon({ direction }: { direction: "left" | "right" }) { + return ( + + + + ); +} + +export function ConceptPlayer({ label, steps }: { label: string; steps: PlayerStep[] }) { + const [active, setActive] = useState(0); + const [autoplay, setAutoplay] = useState(true); + const [inView, setInView] = useState(false); + const rootRef = useRef(null); + + const codes = useMemo( + () => + steps.map( + (step) => + ({ + tokens: step.tokens, + code: step.plain, + lang: "txt", + meta: "", + themeName: "concept", + style: {}, + annotations: [], + }) as unknown as HighlightedCode, + ), + [steps], + ); + + 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} + + + +
+ + {/* Grid-stacked sizers reserve the tallest/widest step up front, so + stepping through states never shifts the layout. */} +
+
+
+        
+ {steps.map((step) => ( +
+            {step.plain}
+          
+ ))} +
+ + {/* Footer: the caption for the current step, plus a labelled stepper so + readers can jump straight to any named state or walk prev/next. */} +
+ + {steps.map((step, index) => ( + + {step.caption} + + ))} + +
+ +
+ {steps.map((step, index) => ( + + ))} +
+ +
+
+
+ ); +} 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/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