Skip to content

Commit 6830b67

Browse files
authored
Merge branch 'main' into feat/getting-started-revamp
2 parents e302bdb + 324e21f commit 6830b67

18 files changed

Lines changed: 2029 additions & 888 deletions

apps/docs/public/prisma-management-api.postman_collection.json

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.
Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
---
2+
title: "Store files with Object Store buckets and see your workspace at a glance"
3+
date: "2026-07-24"
4+
version: "2026-07-24"
5+
slug: "2026-07-24"
6+
headline: "Store files with Object Store buckets and see your workspace at a glance"
7+
tags:
8+
- "Prisma"
9+
- "Prisma Compute"
10+
- "Prisma Next"
11+
canonical: "/changelog#log2026-07-24"
12+
metaDescription: "Object Store buckets bring S3-compatible file storage to Prisma projects, the Console workspace page becomes an overview dashboard, and Prisma Next 0.16.0 lands on npm."
13+
share:
14+
active: true
15+
content: "Look at this page: "
16+
---
17+
Prisma projects can now store files. Object Store buckets are S3-compatible storage that lives next to your Prisma Postgres databases and Prisma Compute apps, managed from the Prisma Console, the Management API, or MCP tools.
18+
19+
The Prisma Console workspace page is now an overview dashboard: usage against your plan, the current invoice, deploy health, and your most active projects on one screen.
20+
21+
Prisma Next 0.16.0 is on npm, and bringing an existing database to Prisma Next is now much smoother. The prisma.io docs are also rebuilt for coding agents, with per-section `llms.txt` indexes and a markdown version of every page.
22+
23+
## Highlights
24+
25+
### New · Store files in your project with Object Store buckets
26+
27+
Apps that store user uploads or generated files needed a separate storage vendor, with its own account, credentials, and billing. Every Prisma project can now create Object Store buckets: S3-compatible storage that lives alongside your databases and apps. Create a bucket in the Prisma Console, generate an access key (the secret is shown exactly once, so store it safely), and read and write objects with any S3 client or SDK.
28+
29+
Buckets can also be managed through the new `/v1/buckets` [Management API endpoints](https://www.prisma.io/docs/management-api/endpoints/buckets/get-buckets) and matching MCP tools, so agents can provision storage the same way they provision databases. Deleting a bucket removes its contents in one step, even when it is not empty.
30+
31+
### New · See your whole workspace at a glance
32+
33+
The Console landing page used to show a usage dashboard, so answering "is everything healthy?" meant clicking through projects. The workspace page is now an overview: billing-cycle usage with your included-limit line, the current invoice with per-line meters, and your top projects with their deploy health, repository, latest commit, and share of usage. The detailed usage dashboard, including usage-threshold and database-quota alerts, moved to its own Usage page, and the projects list is now paginated.
34+
35+
### New · Prisma Next 0.16.0
36+
37+
Pointing Prisma Next at an existing database could produce a schema its own toolchain rejected: `contract infer` printed output that `contract emit` refused, index types like `gin` failed to emit, and a column's exact type and its auto-update behavior could not be declared together. In 0.16.0, inferred schemas work as generated: infer output round-trips cleanly through emit, the built-in Postgres index types (`gin`, `gist`, `brin`, and friends) emit, and new temporal presets let one field declaration carry both the column type and its auto-update behavior:
38+
39+
```prisma
40+
model Page {
41+
updatedAt temporal.timestamp(3, onCreate: now, onUpdate: now)
42+
lastSeen temporal.timestamp(3)
43+
touched temporal.timestamptz(onUpdate: now)
44+
}
45+
```
46+
47+
> **Note:** Prisma Next is in Early Access. Scope and behavior may still change. This release includes breaking changes, listed below.
48+
49+
Read the [v0.16.0 release notes](https://github.com/prisma/prisma-next/releases/tag/v0.16.0) for the full list. Shipped in [prisma/prisma-next#1003](https://github.com/prisma/prisma-next/pull/1003), [prisma/prisma-next#1011](https://github.com/prisma/prisma-next/pull/1011), and [prisma/prisma-next#1019](https://github.com/prisma/prisma-next/pull/1019).
50+
51+
## Prisma Next
52+
53+
Beyond the 0.16.0 headline changes, your editor now gives live schema feedback, and polymorphic queries get more capable.
54+
55+
- **New** · Schema problems show up in your editor as you type. The language server now reports unresolvable relations, type and codec mismatches, and extension-block errors live, instead of waiting for `contract emit`. If your config file fails to load, the error appears on the config file itself, and existing diagnostics stay put instead of disappearing. ([prisma/prisma-next#972](https://github.com/prisma/prisma-next/pull/972), [prisma/prisma-next#974](https://github.com/prisma/prisma-next/pull/974))
56+
- **Improved** · Polymorphic queries can follow relations declared on a variant: narrow a query with `.variant(...)` and `.include()` the relations that variant declares. ([prisma/prisma-next#976](https://github.com/prisma/prisma-next/pull/976))
57+
58+
<details>
59+
<summary>Fixes and improvements (4)</summary>
60+
61+
- **Fixed** · A `Bytes` column selected inside `.include()` now returns bytes instead of raw `\x...` hex text. ([prisma/prisma-next#942](https://github.com/prisma/prisma-next/pull/942))
62+
- **Fixed** · Migrations run their operations in dependency order, fixing cases such as a column being dropped before its own constraint. ([prisma/prisma-next#992](https://github.com/prisma/prisma-next/pull/992))
63+
- **Fixed** · Count-returning updates and deletes on a narrowed variant no longer generate SQL that references a missing table. ([prisma/prisma-next#940](https://github.com/prisma/prisma-next/pull/940))
64+
- **Fixed** · More `contract infer` fixes: `Decimal` fields connect without a codec error, `dbgenerated(...)` defaults no longer report permanent drift in `db verify`, and foreign keys that point outside the introspected tables are explained in the output instead of silently dropped. ([prisma/prisma-next#1011](https://github.com/prisma/prisma-next/pull/1011))
65+
</details>
66+
67+
## Prisma Compute
68+
69+
App detection moved into the public SDK, and app URLs are now correct before your first deploy.
70+
71+
- **New** · The Prisma Compute SDK can inspect a repository without cloning it: `detectComputeApp` reads a repository snapshot and reports the app's framework, build type, HTTP port, and entrypoint. Elysia, Express, and Fastify apps are recognized and run on Bun. Available since `@prisma/compute-sdk` 0.37.0.
72+
- **Improved** · The GitHub repository picker in the Prisma Console loads repositories page by page, so installations with more than 100 repositories can reach all of them, and switching accounts mid-load no longer briefly shows the wrong account's list.
73+
- **Fixed** · The app URL returned before your first deployment now names the domain your app will actually serve on. Previously it could point at the wrong region and never resolve.
74+
75+
## Prisma docs
76+
77+
The prisma.io docs are now built for coding agents.
78+
79+
- **New** · The root `llms.txt` is a compact index linking ten per-section indexes instead of one file too large for agents to read, every page carries a crawler-visible pointer to its markdown version, and MCP server discovery is published. Point your agent at [prisma.io/docs](https://www.prisma.io/docs) and every page is reachable from the root index. ([prisma/web#8087](https://github.com/prisma/web/pull/8087))
80+
- **New** · A [Plasmic integration guide](https://www.prisma.io/docs/guides/integrations/plasmic) walks through connecting a Plasmic-built React app to Prisma, with queries configured visually in Plasmic Studio and credentials staying in your app's environment. ([prisma/web#8095](https://github.com/prisma/web/pull/8095))
81+
82+
## Breaking changes
83+
84+
> ⚠️ **Breaking:** Prisma Next 0.16.0 changes the emitted contract shape. Foreign keys and their backing indexes are now separate contract entries, a 1:1 relation over a non-unique foreign key fails emit with `PSL_NON_UNIQUE_BACKRELATION`, `contract infer` declares identity-column defaults, and inferred back-relation names no longer double-pluralize. Your database schema is unaffected. To migrate, re-run `contract emit` and follow the [0.15-to-0.16 upgrade recipe](https://github.com/prisma/prisma-next/blob/v0.16.0/skills/upgrade/prisma-next-upgrade/upgrades/0.15-to-0.16/). ([prisma/prisma-next#989](https://github.com/prisma/prisma-next/pull/989), [prisma/prisma-next#1015](https://github.com/prisma/prisma-next/pull/1015), [prisma/prisma-next#1011](https://github.com/prisma/prisma-next/pull/1011))
85+
86+
> ⚠️ **Breaking:** The deprecated experimental `/v1/compute-services` and `/v1/versions` Management API endpoints are removed. To migrate, use the [`/v1/apps` and `/v1/deployments` endpoints](https://www.prisma.io/docs/management-api), which cover the same operations.
87+
88+
## Guides and articles
89+
90+
- [Extending Prisma Next with Typed Postgres ltree](https://www.prisma.io/blog/prisma-next-ltree-extension): use PostgreSQL `ltree` in Prisma Next with `prisma-ltree`, with typed path columns plus ancestor and descendant queries.
91+
- [You Don't Need Elasticsearch, Postgres Already Has Full-Text Search](https://www.prisma.io/blog/you-dont-need-elasticsearch-postgres-already-has-full-text-search): build full-text search with `tsvector`, GIN indexes, and `pg_trgm` typo tolerance on Prisma Postgres.
92+
- [How to Make Your Docs Agent-Ready](https://www.prisma.io/blog/make-your-docs-agent-ready): coding agents fail silently on truncated indexes, broken links, and missing metadata. What we fixed in the Prisma docs, and how to audit yours.
93+
94+
---
95+
96+
_Need help applying these changes in production? [Prisma Enterprise Support](https://prisma.io/enterprise) can help with schema design, performance, security, and compliance._

apps/site/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
"@prisma/eclipse": "workspace:^",
2121
"@react-three/fiber": "^9.5.0",
2222
"cobe": "^2.0.1",
23+
"codehike": "^1.1.0",
2324
"cors": "^2.8.6",
2425
"fumadocs-core": "catalog:",
2526
"fumadocs-mdx": "catalog:",

apps/site/public/og/og-stack.png

-413 KB
Loading
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
"use client";
2+
3+
import { cn } from "@/lib/cn";
4+
import { useRef, useState } from "react";
5+
6+
/**
7+
* The primary CTA: the scaffold command with a copy button. The command is
8+
* plain text in the DOM (crawlable, selectable); the button is labelled and
9+
* announces success politely.
10+
*/
11+
export function CopyCommand({ command, className }: { command: string; className?: string }) {
12+
const [copied, setCopied] = useState(false);
13+
const timer = useRef<ReturnType<typeof setTimeout> | undefined>(undefined);
14+
15+
const copy = async () => {
16+
try {
17+
await navigator.clipboard.writeText(command);
18+
setCopied(true);
19+
clearTimeout(timer.current);
20+
timer.current = setTimeout(() => setCopied(false), 2000);
21+
} catch {
22+
// Clipboard can be unavailable (permissions, http); the text stays selectable.
23+
}
24+
};
25+
26+
return (
27+
<div
28+
className={cn(
29+
"flex items-center gap-3 rounded-square-high border border-stroke-neutral bg-background-neutral-weaker py-2.5 pl-4 pr-2.5",
30+
className,
31+
)}
32+
>
33+
<code className="font-mono text-sm text-foreground-neutral md:text-base">
34+
<span className="select-none text-foreground-neutral-weaker">$ </span>
35+
{command}
36+
</code>
37+
<button
38+
type="button"
39+
onClick={copy}
40+
aria-label={`Copy the command ${command}`}
41+
className="grid size-8 shrink-0 place-items-center rounded-square border border-stroke-neutral text-foreground-neutral-weak transition-colors hover:border-stroke-ppg hover:text-foreground-ppg"
42+
>
43+
<i className={copied ? "fa-regular fa-check" : "fa-regular fa-copy"} aria-hidden />
44+
</button>
45+
<span aria-live="polite" className="sr-only">
46+
{copied ? "Command copied to clipboard" : ""}
47+
</span>
48+
</div>
49+
);
50+
}

apps/site/src/app/stack/framework-carousel.tsx

Lines changed: 0 additions & 60 deletions
This file was deleted.
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
import { BunMark } from "./bun-mark";
2+
import { PrismaMark } from "./prisma-mark";
3+
import styles from "./stack.module.css";
4+
5+
const heroLayers = [
6+
{
7+
id: "app",
8+
eyebrow: "You write",
9+
title: "Your application",
10+
icon: <i className="fa-regular fa-laptop" aria-hidden />,
11+
accent: "violet" as const,
12+
},
13+
{
14+
id: "orm",
15+
eyebrow: "Talks through",
16+
title: "Prisma ORM",
17+
icon: <PrismaMark className="size-[14px]" />,
18+
accent: "orm" as const,
19+
},
20+
{
21+
id: "postgres",
22+
eyebrow: "Stores in",
23+
title: "Prisma Postgres",
24+
icon: <i className="fa-regular fa-database" aria-hidden />,
25+
accent: "ppg" as const,
26+
},
27+
{
28+
id: "compute",
29+
eyebrow: "Runs on",
30+
title: "Prisma Compute + Bun",
31+
icon: <BunMark className="size-[15px]" />,
32+
accent: "ppg" as const,
33+
},
34+
];
35+
36+
/**
37+
* The hero's animated stack: the four layers enter staggered, then a request
38+
* pulse travels the connectors on a loop. The layers widen toward the base so
39+
* the visual previews the stack pyramid the reader meets one scroll later.
40+
* Pure CSS, server-rendered; under prefers-reduced-motion everything is
41+
* simply visible and static, so the relationship reads the same without
42+
* animation.
43+
*/
44+
export function HeroVisual() {
45+
return (
46+
<div className={styles["hero-visual"]} aria-hidden>
47+
{heroLayers.map((layer, index) => (
48+
<div
49+
key={layer.id}
50+
className={styles["hero-layer-slot"]}
51+
style={{ "--row": index } as React.CSSProperties}
52+
>
53+
{index > 0 && <span className={styles["hero-connector"]} />}
54+
<div
55+
className={`${styles["hero-layer"]} ${styles[`accent-${layer.accent}`]}`}
56+
style={{ animationDelay: `${index * 140}ms` }}
57+
>
58+
<span className={styles["hero-layer-icon"]}>{layer.icon}</span>
59+
<span className={styles["hero-layer-text"]}>
60+
<span className={styles["hero-layer-eyebrow"]}>{layer.eyebrow}</span>
61+
<span className={styles["hero-layer-title"]}>{layer.title}</span>
62+
</span>
63+
</div>
64+
</div>
65+
))}
66+
</div>
67+
);
68+
}
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
import { prisma_highlighter } from "@/lib/shiki_prisma";
2+
import type { HighlightedCode } from "codehike/code";
3+
import type { CSSProperties } from "react";
4+
import { journeySteps, type JourneyStep } from "./journey-steps";
5+
6+
/** Code Hike token: plain text, or [text, color, style?]. */
7+
type CodeToken = string | [string, string, CSSProperties?];
8+
9+
/**
10+
* Tokenize with the site's shiki `prisma-dark` theme (CSS-variable colors, so
11+
* it adapts to both themes) and re-shape into Code Hike's token format. Tokens
12+
* are split per word because Code Hike's transitions move tokens
13+
* independently; coarser tokens make the animation lurch.
14+
*/
15+
function toCodeTokens(text: string, color: string, out: CodeToken[]) {
16+
for (const part of text.split(/(\s+)/)) {
17+
if (!part) continue;
18+
if (/^\s+$/.test(part)) {
19+
out.push(part);
20+
} else {
21+
out.push([part, color]);
22+
}
23+
}
24+
}
25+
26+
async function highlightStep(code: string, lang: JourneyStep["lang"]): Promise<HighlightedCode> {
27+
const tokens: CodeToken[] = [];
28+
if (lang === "text") {
29+
// Plain-text steps (the project tree): names in the normal code color,
30+
// trailing `# …` annotations dimmed like comments.
31+
code.split("\n").forEach((line, index) => {
32+
if (index > 0) tokens.push("\n");
33+
const hash = line.indexOf("# ");
34+
if (hash > -1) {
35+
toCodeTokens(line.slice(0, hash), "var(--color-foreground-neutral-weak)", tokens);
36+
toCodeTokens(line.slice(hash), "var(--color-disabled)", tokens);
37+
} else {
38+
toCodeTokens(line, "var(--color-foreground-neutral-weak)", tokens);
39+
}
40+
});
41+
} else {
42+
const highlighter = await prisma_highlighter();
43+
const lines = highlighter.codeToTokensBase(code, {
44+
lang,
45+
theme: highlighter.getTheme("prisma-dark"),
46+
});
47+
lines.forEach((line, index) => {
48+
if (index > 0) tokens.push("\n");
49+
for (const token of line) {
50+
toCodeTokens(token.content, token.color ?? "currentColor", tokens);
51+
}
52+
});
53+
}
54+
return {
55+
tokens,
56+
code,
57+
lang,
58+
meta: "",
59+
themeName: "prisma-dark",
60+
style: {},
61+
annotations: [],
62+
} as unknown as HighlightedCode;
63+
}
64+
65+
/** Highlight every journey step on the server; the player receives plain data. */
66+
export async function highlightJourney(): Promise<HighlightedCode[]> {
67+
return Promise.all(journeySteps.map((step) => highlightStep(step.code, step.lang)));
68+
}

0 commit comments

Comments
 (0)