@@ -24,59 +82,93 @@ export function CustomersGrid() {
);
}
-function StoryCard({
- story,
- className,
- lead = false,
-}: {
- story: (typeof CUSTOMER_STORIES)[number];
- className?: string;
- lead?: boolean;
-}) {
+function StoryCard({ story, lead = false }: { story: CustomerStory; lead?: boolean }) {
+ const internal = STORY_DETAIL_SLUGS.has(story.slug);
+ const href = internal ? `/customers/${story.slug}` : story.href;
+ // Detail pages are this app's own routes, so they get client-side routing;
+ // the fallback to a live blog post is another zone and hard-navigates.
+ const Card = internal ? Link : "a";
+
return (
-
-
{story.company}
-
+
+
+
{story.title}
-
-
+
+
+ {story.stack.length > 0 && (
+
+ {story.stack.slice(0, MAX_CHIPS).map((tech, i) => (
+ -
+
+ {STACK_LABELS[tech] ?? tech}
+
+
+ ))}
+
+ )}
+
+ {/* No `grow` on the clamped paragraph: line-clamp needs
+ display:-webkit-box, and letting flex stretch that box makes it tall
+ enough to paint a fourth line which then gets sliced through the
+ middle by the clamp. The link takes mt-auto instead, so cards still
+ bottom-align without the paragraph having to absorb the slack. */}
+
{story.excerpt}
-
- Read the story
-
+
+ {/* Grid cards push the link to the bottom edge so it lines up across a
+ row whatever the excerpt length. The lead card must not: its column
+ is vertically centred, so mt-auto strands the link at the bottom
+ with a gap above it — visible as soon as the card was made taller. */}
+ {/* The underline needs its own box to sit under, so it goes on an inner
+ span — putting it on the outer one would draw the rule 3px below the
+ card's bottom padding instead of under the words. */}
+
+
+ Read the story
+
+
-
+
);
}
diff --git a/apps/site/src/components/sections/customers-hero.tsx b/apps/site/src/components/sections/customers-hero.tsx
index e65505ccfc1..92b64409d39 100644
--- a/apps/site/src/components/sections/customers-hero.tsx
+++ b/apps/site/src/components/sections/customers-hero.tsx
@@ -1,46 +1,130 @@
-import { RoleKicker } from "@/components/brand/role-kicker";
+import { GlassGlide } from "@/components/brand/glass-glide";
+import { PrismButton, PrismButtonOutline } from "@/components/brand/prism-button";
import { Texture } from "@/components/brand/texture";
+import { BAND_LOGOS } from "@/data/customers";
-// Customers hero — wrapped-panel title band (same shell as product-hero, with
-// the spectral wash dialed down: this page's color comes from the story grid,
-// so the hero stays a quiet paper surface).
+// /customers hero — the wrapped prismatic panel, centred rather than split:
+// this page opens on a claim and a proof band, not on a form or a product
+// visual, so there is no second column to balance (contact-hero.tsx splits at
+// lg for exactly that reason).
+//
+// A split layout with the marks drifting in a constellation beside the copy was
+// tried and reverted (André, 2026-08-17). Centred, with the band reading as one
+// roster across the full width, is the version that stays.
+//
+// The "Built with Prisma" logo band lives INSIDE the panel, sitting on the
+// spectral wash. The approved copy runs that label straight off the CTAs with
+// no heading marker, so it reads as the panel's footer rather than as its own
+// section. The second, much wider logo moment (all 44 community marks) is the
+// marquee further down, which answers "how many" where this answers "who".
+//
+// Wash values are product-hero's calibration, not the homepage's, for the same
+// reason contact-hero gives: this panel is short, and the homepage's stronger
+// values bloom up behind the headline and cost the subhead its contrast.
export function CustomersHero() {
return (
+ {/* spectral bottom — wash + beam fan dispersing to white above, same
+ values as product-hero.tsx and contact-hero.tsx */}
-
-
- Customer stories
-
-
- Teams ship faster on Prisma
-
-
- How engineering teams use Prisma in production to speed up delivery, simplify database
- workflows, and scale without slowing down.
-
+ {/* top padding = bottom padding + the fixed header's footprint */}
+
+
+
+ How teams ship faster with Prisma
+
+
+ Real teams, real production stories. See how developers use Prisma to build, deploy,
+ and scale without wrestling their backend at every step.
+
+
+
+ Get started free
+
+
+ Talk to us
+
+
+
+
+ {/* the proof band, on the wash */}
+
+
+ Built with Prisma
+
+ {/* Static rather than a marquee: twelve marks are few enough to
+ show at once, and a fixed roster reads as "these companies"
+ where a marquee reads as "a crowd". The crowd is the marquee
+ below.
+ An explicit grid rather than flex-wrap — twelve items divide
+ evenly at every breakpoint here (6/4/3/2 per row), where
+ wrapping left a lopsided 8-then-4 at desktop width. */}
+
+ {BAND_LOGOS.map((logo) => (
+ -
+
+
+ ))}
+
+
);
}
+
+function BandLogo({ logo }: { logo: (typeof BAND_LOGOS)[number] }) {
+ const mark = (
+ // eslint-disable-next-line @next/next/no-img-element
+

+ );
+
+ const tile =
+ "spectrum-border flex h-[4.5rem] w-full items-center justify-center rounded-2xl border border-neutral-200 bg-white/80 px-5 backdrop-blur-sm";
+
+ // Insta Group is the one mark prisma.io carries without a link.
+ if (!logo.href) {
+ return
{mark}
;
+ }
+
+ return (
+
+ {mark}
+
+ );
+}
diff --git a/apps/site/src/components/sections/logo-cloud.tsx b/apps/site/src/components/sections/logo-cloud.tsx
index 28cb8712032..55b08fc1fd3 100644
--- a/apps/site/src/components/sections/logo-cloud.tsx
+++ b/apps/site/src/components/sections/logo-cloud.tsx
@@ -1,4 +1,5 @@
import { Reveal } from "@/components/motion/reveal";
+import { cn } from "@/lib/utils";
type CompanyLogo = {
name: string;
@@ -40,7 +41,7 @@ const companies: CompanyLogo[] = [
/* The row is rendered twice per track (and the track twice) so the strip is
wider than any viewport and the -50% marquee loop is seamless. */
-function Track({ hidden = false }: { hidden?: boolean }) {
+function CompanyTrack({ hidden = false }: { hidden?: boolean }) {
return (
+ ) : (
+
+ {logo.name}
+
+ );
+
+ if (!logo.href) {
+ return
{mark}
;
+ }
+
+ return (
+
+ {mark}
+
+ );
+}
+
+function TileTrack({
+ logos,
+ wide,
+ hidden = false,
+}: {
+ logos: Logo[];
+ wide?: boolean;
+ hidden?: boolean;
+}) {
+ return (
+
+ {logos.map((logo) => (
+
+ ))}
+
+ );
+}
+
+type LogoCloudProps = {
+ /** A tiled roster in place of the homepage's company wordmarks. */
+ logos?: Logo[];
+ /** Defaults to the homepage's small uppercase kicker. */
+ heading?: React.ReactNode;
+ /**
+ * Landscape tiles for wordmark logos. The square tile is sized for icon
+ * marks; customer logos are nearly all wordmarks, and squeezing those into
+ * a 48px box renders them unreadably small.
+ */
+ wide?: boolean;
+ /**
+ * Seconds for one full loop. The keyframe duration is per-loop, not
+ * per-pixel, so a longer list covers more ground in the same time and drifts
+ * proportionally faster. Set it to hold px/s steady across differently sized
+ * sets.
+ */
+ durationSeconds?: number;
+ className?: string;
+};
+
+// The marquee is shared: the homepage runs it over the company wordmarks, and
+// /customers runs it over all 44 community projects under its own heading.
+export function LogoCloud({
+ logos,
+ heading,
+ wide,
+ durationSeconds,
+ className,
+}: LogoCloudProps = {}) {
return (
-
+
-
- Trusted by leading companies
-
+ {heading ?? (
+
+ Trusted by leading companies
+
+ )}
-
-
-
+
+ {logos ? (
+ <>
+
+
+ >
+ ) : (
+ <>
+
+
+ >
+ )}
diff --git a/apps/site/src/components/sections/orm-illustration.tsx b/apps/site/src/components/sections/orm-illustration.tsx
index 69f651b30ca..391a3c11bd5 100644
--- a/apps/site/src/components/sections/orm-illustration.tsx
+++ b/apps/site/src/components/sections/orm-illustration.tsx
@@ -29,7 +29,11 @@ const IN_VIEW = { margin: "0px 0px -20% 0px" } as const;
// autocomplete. On scroll-in it loops: the dropdown drops down, a cursor glides
// in and hovers an option (the highlight follows), then the cursor retreats and
// the dropdown closes. The schema stack (3D) floats gently throughout.
-export function OrmIllustration() {
+//
+// `compact` fits the illustration into a narrow column (the /platform product
+// cards) instead of the homepage's half-page cell: tighter frame padding and a
+// smaller schema stack, so the editor keeps its breathing room.
+export function OrmIllustration({ compact = false }: { compact?: boolean } = {}) {
const reduce = useReducedMotion();
const ref = useRef
(null);
const inView = useInView(ref, IN_VIEW);
@@ -42,7 +46,10 @@ export function OrmIllustration() {
{/* ray backdrop — saturation boosted (bold pass) on its own layer so the
filter doesn't touch the card content */}
@@ -132,19 +139,23 @@ export function OrmIllustration() {
)
-
-
- for {" "}
- of users {"{"}
-
-
-
-
-
-
-
-
{"}"}
-
+ {/* the loop below the query is the first thing to go in a narrow
+ column — the autocomplete is what the illustration is about */}
+ {!compact && (
+
+
+ for {" "}
+ of users {"{"}
+
+
+
+
+
+
+
+
{"}"}
+
+ )}
@@ -152,11 +163,16 @@ export function OrmIllustration() {
- {/* the schema stack — floats gently over the editor's right half */}
+ {/* the schema stack — floats gently over the editor's right half. In a
+ narrow column it rides higher and smaller, clear of the autocomplete
+ popup that would otherwise sit underneath it. */}
+
+
+
+ Why the three belong on one platform
+
+
+
+
+
+
+
+
+ {/* without — quiet, on the page's own white */}
+
+
+ Without an integrated stack
+
+
+ {WITHOUT.map((item) => (
+ -
+
+ {item}
+
+ ))}
+
+
+
+ {/* with — lifted on white behind the spectrum border, the brand mark
+ standing in for the heading (same idiom as the homepage's After) */}
+
+
+ {/* eslint-disable-next-line @next/next/no-img-element */}
+
+
+ {WITH.map((item) => (
+ -
+
+ {item}
+
+ ))}
+
+
+
+
+
+ );
+}
diff --git a/apps/site/src/components/sections/platform-flow.tsx b/apps/site/src/components/sections/platform-flow.tsx
new file mode 100644
index 00000000000..f3b3767e589
--- /dev/null
+++ b/apps/site/src/components/sections/platform-flow.tsx
@@ -0,0 +1,115 @@
+import { Code, Console, Rocket } from "@/components/icons/forma";
+import { Texture } from "@/components/brand/texture";
+import { Reveal } from "@/components/motion/reveal";
+
+// Step tiles sit 1.5rem in from each column's left edge (half of size-12), and
+// the columns are (100% - 2.5rem)/3 wide with gap-5 between them — so the track
+// runs from the first tile's center to the last tile's center exactly.
+const TRACK_INSET_RIGHT = "calc((100% - 2.5rem) / 3 - 1.5rem)";
+
+const STEPS = [
+ {
+ icon: Code,
+ title: "Build",
+ body: "Model your data and write type-safe queries with Prisma ORM.",
+ },
+ {
+ icon: Rocket,
+ title: "Deploy",
+ body: "Provision a Prisma Postgres database and deploy to Prisma Compute, co-located on the same host.",
+ },
+ {
+ icon: Console,
+ title: "Debug",
+ body: "Read your logs, update your schema, migrate, and redeploy, without switching tools.",
+ },
+];
+
+// A node on the track: the white tile idiom (see stack-bento's ToolIcon) turned
+// round, so it reads as something the wire passes through.
+function StepNode({ children }: { children: React.ReactNode }) {
+ return (
+
+
+ {children}
+
+ );
+}
+
+// The happy path, before the page breaks into the three products: build, deploy,
+// debug as three nodes on one continuous wire, with the same spectral pulse the
+// platform diagram uses running through them. Wrapped panel, so it separates the
+// "why" above from the product detail below.
+export function PlatformFlow() {
+ return (
+
+
+ {/* the panel's spectral wash, quieter than the hero's — the track has to
+ stay the most legible thing in the frame */}
+
+
+
+
+
+
+
+ From building to shipping, in one flow
+
+
+
+
+ {/* the one wire every step hangs off, level with the tile centers */}
+
+
+
+
+
+ {STEPS.map(({ icon: Icon, title, body }, i) => (
+
+
+
+
+ {title}
+
+ {body}
+
+
+ ))}
+
+
+
+
+
+ );
+}
diff --git a/apps/site/src/components/sections/platform-hero.tsx b/apps/site/src/components/sections/platform-hero.tsx
new file mode 100644
index 00000000000..d05d69583f1
--- /dev/null
+++ b/apps/site/src/components/sections/platform-hero.tsx
@@ -0,0 +1,77 @@
+import { GlassPrismSpin } from "@/components/brand/glass-prism-spin";
+import { PrismButton, PrismButtonOutline } from "@/components/brand/prism-button";
+import { Texture } from "@/components/brand/texture";
+
+// Spectrum gradient matching the brand CTA glow (see prism-button.tsx).
+const SPECTRUM =
+ "linear-gradient(85deg, #01d7e4 0%, #f3c306 25%, #f37a03 50%, #f43531 74%, #f00e5c 100%)";
+
+// Platform index hero: the homepage's wrapped prismatic panel reduced to its
+// quietest state — heading and description only, so the product list below is
+// what the page actually asks you to act on.
+// The section's pb matches the page gutter, so the products panel below sits
+// in the same 3/4 rhythm as the panel's other edges.
+export function PlatformHero() {
+ return (
+
+
+ {/* prismatic backdrop — spectral wash along the bottom edge dispersing
+ to white above, the same treatment as the homepage hero */}
+
+
+ {/* beam fan rising from below */}
+
+
+
+ {/* dispersion back to white above */}
+
+
+ {/* the glass monument rising out of the corner where the spectrum
+ concentrates behind it */}
+
+
+
+
+ {/* pt clears the fixed navbar in its docked state */}
+
+ {/* h1 and description carry the homepage hero's exact type
+ treatment — same clamp, leading, and measure (see hero-home) */}
+
+ Build and ship your whole backend in one place
+
+
+ A type-safe ORM, managed Postgres, and TypeScript app hosting, built to work together
+ natively rather than wired together after the fact. Start with any one of them and add
+ the rest when you're ready to ship.
+
+
+
Get started free
+
See pricing
+
+
+
+
+
+ );
+}
diff --git a/apps/site/src/components/sections/platform-open.tsx b/apps/site/src/components/sections/platform-open.tsx
new file mode 100644
index 00000000000..e7f31e7e8a4
--- /dev/null
+++ b/apps/site/src/components/sections/platform-open.tsx
@@ -0,0 +1,50 @@
+import { Database, Layers, Swap } from "@/components/icons/forma";
+import { Reveal } from "@/components/motion/reveal";
+
+const POINTS = [
+ { icon: Database, label: "Prisma Postgres is standard Postgres" },
+ { icon: Swap, label: "Prisma ORM works with other databases" },
+ { icon: Layers, label: "Each product can be adopted on its own" },
+];
+
+// The escape hatch, stated plainly: integrated is the default, not a lock-in.
+// Quiet and unwrapped — the claim carries it, so the section stays a two-column
+// text block rather than another set of cards.
+export function PlatformOpen() {
+ return (
+
+
+
+
+
+ Integrated by default, open by design
+
+
+
+
+ Prisma gives you a stack that works together out of the box, with room to use the
+ tools you already trust.
+
+
+
+
+
+
+ {POINTS.map(({ icon: Icon, label }, i) => (
+ - 0 ? "border-t border-black/[0.06]" : ""}`}
+ >
+
+ {label}
+
+ ))}
+
+
+ Start with the piece you need today, then add more when it makes sense.
+
+
+
+
+ );
+}
diff --git a/apps/site/src/components/sections/platform-products.tsx b/apps/site/src/components/sections/platform-products.tsx
new file mode 100644
index 00000000000..978e7d83c8a
--- /dev/null
+++ b/apps/site/src/components/sections/platform-products.tsx
@@ -0,0 +1,149 @@
+import { ArrowRightBold } from "@/components/icons/forma";
+import { OrmIllustration } from "@/components/sections/orm-illustration";
+import { PostgresIllustration } from "@/components/sections/postgres-illustration";
+import { ComputeIllustration } from "@/components/sections/compute-illustration";
+import { Reveal } from "@/components/motion/reveal";
+import { cn } from "@/lib/utils";
+
+// TODO: /orm, /postgres and /compute are Phase 1 sitemap routes not built yet
+// (see design-ref/sitemap.md) — same as the homepage StackBento links.
+const PRODUCTS = [
+ {
+ name: "Prisma ORM",
+ role: "Type-safe data layer",
+ href: "/orm",
+ dot: "bg-prism-cyan-400",
+ Illustration: OrmIllustration,
+ description:
+ "One declarative schema in native TypeScript — the single config your app, your migrations, and your agent all build against.",
+ points: [
+ "Free and open source, trusted by 500,000+ developers",
+ "Schema small and dense enough to hand an LLM as context",
+ "Errors structured for agents, not just humans",
+ ],
+ },
+ {
+ name: "Prisma Postgres",
+ role: "Managed database",
+ href: "/postgres",
+ dot: "bg-prism-yellow-400",
+ Illustration: PostgresIllustration,
+ description:
+ "Managed Postgres that arrives already wired to your schema, co-located with your hosting on infrastructure built for single-digit ms boot times.",
+ points: [
+ "Unikernel microVMs on bare metal, single-digit ms boot",
+ "Operation-based pricing with spend limits, no bill shock",
+ "Free per-branch databases for every preview",
+ ],
+ },
+ {
+ name: "Prisma Compute",
+ role: "App hosting",
+ href: "/compute",
+ dot: "bg-prism-red-500",
+ badge: "Public Beta",
+ Illustration: ComputeIllustration,
+ description:
+ "TypeScript app hosting on the same host as your database, so your agent can deploy, debug, and redeploy without leaving the loop.",
+ points: [
+ "Bun runtime on bare metal",
+ "Co-located with Postgres for single-digit ms queries",
+ "Versioned deploys with preview URLs, by git push or CLI",
+ ],
+ },
+];
+
+function Bullet({ children }: { children: React.ReactNode }) {
+ return (
+
+
+ {children}
+
+ );
+}
+
+// Product role kicker — the product's color lives in a small dot, the label
+// stays ink (pills are reserved for buttons). Same idiom as StackBento.
+function RoleKicker({ dot, children }: { dot: string; children: React.ReactNode }) {
+ return (
+
+
+ {children}
+
+ );
+}
+
+// The inline spectrum-ink link that closes each card — same treatment as
+// StackBento's LearnMore (see stack-bento.tsx).
+function LearnMore({ href, product }: { href: string; product: string }) {
+ return (
+
+
+ Learn more
+ about {product}
+
+
+
+ );
+}
+
+// The platform index: the three products as cards, each card a link into its
+// own page. Same card type as the homepage's "The TypeScript stack, integrated
+// by design" (see stack-bento.tsx) — rounded-2xl on bg-card, the product's
+// animated illustration above the copy, closed by an inline "Learn more" link —
+// with the illustrations in `compact` mode to suit the narrower column.
+// Unwrapped: the hero above carries the wrapped panel, so this sits on the
+// page's own white (see platform/page.tsx for the wrapped/unwrapped rhythm).
+export function PlatformProducts() {
+ return (
+
+
+
+
+ Start with one, add the rest when you need them
+
+
+
+
+ {PRODUCTS.map(({ Illustration, ...product }, i) => (
+ -
+
+
+
+
{product.role}
+
+
{product.name}
+ {product.badge && (
+
+
+ {product.badge}
+
+ )}
+
+
+ {product.description}
+
+
+ {product.points.map((point) => (
+ {point}
+ ))}
+
+
+
+
+
+ ))}
+
+
+
+ );
+}
diff --git a/apps/site/src/components/sections/platform-stack-map.tsx b/apps/site/src/components/sections/platform-stack-map.tsx
new file mode 100644
index 00000000000..313d98d8cb8
--- /dev/null
+++ b/apps/site/src/components/sections/platform-stack-map.tsx
@@ -0,0 +1,131 @@
+import { Swap } from "@/components/icons/forma";
+import { Pattern } from "@/components/brand/pattern";
+import { cn } from "@/lib/utils";
+
+// Node centers in a 3-column grid with gap-5 (1.25rem): the outer columns are
+// each (100% - 2.5rem)/3 wide, so their centers sit one half-column in from
+// the edges. Every wire below is positioned off these values, which is why the
+// bus and the drops line up with the cards exactly at any width.
+const COL = "calc((100% - 2.5rem) / 6)";
+// Midpoint between the middle and right node centers — where the co-location
+// bracket hangs its caption.
+const MID = "calc(75% - (100% - 2.5rem) / 12)";
+
+const CO_LOCATED = "Postgres and your app on the same host — single-digit ms queries";
+
+const NODES = [
+ { name: "Prisma ORM", role: "Type-safe data layer", dot: "bg-prism-cyan-400" },
+ { name: "Prisma Postgres", role: "Managed database", dot: "bg-prism-yellow-400" },
+ { name: "Prisma Compute", role: "App hosting", dot: "bg-prism-red-500" },
+];
+
+// `flow` carries the brand's sliding spectrum gradient along the wire (the
+// same motif as .spectrum-border / .spectrum-ink, on a hairline) — "x" runs
+// along the wire, "y" runs down it. Without it the wire is a plain hairline.
+function Wire({
+ className,
+ style,
+ flow,
+}: {
+ className?: string;
+ style?: React.CSSProperties;
+ flow?: "x" | "y";
+}) {
+ return (
+
+ );
+}
+
+// The schema chip — the same file-chip idiom as the homepage's ConnectorStrip,
+// promoted to the thing the whole diagram hangs off.
+function SchemaChip() {
+ return (
+
+
+ config.prisma
+ one config
+
+ );
+}
+
+function Node({ name, role, dot }: (typeof NODES)[number]) {
+ return (
+
+
+
+ {name}
+
+
{role}
+
+ );
+}
+
+// The system overview the page opens on: one schema up top, the three products
+// wired to it, and the two runtime pieces bracketed together because they share
+// a host. The pulse travelling the bus is the schema propagating — the whole
+// claim of the page in one movement.
+export function StackMap() {
+ return (
+
+
+
+
+
+
+
+
+ {/* mobile: one spine straight down instead of the bus */}
+
+
+ {/* desktop wiring: drop from the chip, a bus across the three node
+ centers, then a drop into each node — every segment carrying the
+ spectrum, so the schema visibly runs out into all three products */}
+
+
+
+
+
+
+
+
+
+ {/* the mobile spine, showing through the gaps between stacked nodes */}
+
+ {NODES.map((node) => (
+
+ ))}
+
+
+ {/* co-location bracket joining the two runtime pieces */}
+
+
+
+
+
+
+ {CO_LOCATED}
+
+
+
{CO_LOCATED}
+
+
+ );
+}
diff --git a/apps/site/src/components/sections/postgres-illustration.tsx b/apps/site/src/components/sections/postgres-illustration.tsx
index f3ca2b60246..b1d0981dacb 100644
--- a/apps/site/src/components/sections/postgres-illustration.tsx
+++ b/apps/site/src/components/sections/postgres-illustration.tsx
@@ -35,7 +35,11 @@ const IN_VIEW = { margin: "0px 0px -20% 0px" } as const;
// the database floats, the brand ray breathes light through it, a boot pulse
// sweeps across the branch strip (main → pr-214 → feat-auth, the story of a
// preview branch spinning up), and the "Live" dot breathes.
-export function PostgresIllustration() {
+//
+// `compact` fits the illustration into a narrow column (the /platform product
+// cards) instead of the homepage's half-page cell: a fixed frame height rather
+// than stretching to the row, tighter padding, and a smaller database.
+export function PostgresIllustration({ compact = false }: { compact?: boolean } = {}) {
const reduce = useReducedMotion();
const ref = useRef
(null);
const inView = useInView(ref, IN_VIEW);
@@ -45,7 +49,10 @@ export function PostgresIllustration() {
{/* ray backdrop — saturation boosted (bold pass) on its own layer so the
filter doesn't touch the card content */}
@@ -88,7 +95,10 @@ export function PostgresIllustration() {
| Prisma" PNGs prisma.io ships in
+// /photos/showcase/stories. Those are flat 1266x711 images: one per customer,
+// no way to restyle them, and unusable on a light surface. This renders the
+// same lockup from the customer's own logo file, so adding a story is a data
+// entry rather than a trip to a design tool, and it stays crisp at any size.
+//
+// The light is at the EDGES rather than pooled at the bottom (the light-panel
+// idiom): the centre has to stay dark enough for white marks to hold contrast,
+// so the spectrum enters from outside the frame and falls off inward. Beam
+// angles and the cyan/yellow/red order match hero-home.tsx.
+export function StoryArt({
+ story,
+ className,
+ size = "card",
+}: {
+ story: CustomerStory;
+ className?: string;
+ /** `card` is the grid plate; `lead` scales the lockup up for the wide card. */
+ size?: "card" | "lead";
+}) {
+ const lead = size === "lead";
+
+ return (
+
+ {/* Two prismatic blurs on the diagonal — cyan into the top-left corner,
+ red out of the bottom-right (André, 2026-08-17).
+ Both sources sit just OUTSIDE their corner and are drawn large, so
+ what lands in frame is the broad body of the glow sweeping across the
+ corner rather than a discrete blob. Anchored inside the frame and
+ smaller, they read as two spots with dead black stranded between them.
+ `screen` is what keeps it reading as light: painted normally, these
+ gradients composite toward their own muddy midtones over black (the
+ cyan goes swampy teal, the red goes maroon). Screening against black
+ is additive, so the hues stay true and the untouched middle stays at
+ true #08090b — no vignette needed to protect the marks, which is what
+ the first pass used and what was dulling the colour. */}
+
+
+ {/* Grain, doubled from the 0.04 first pass (André asked for it to read
+ more). Still well under the value that works on white: Texture is
+ calibrated at 0.06 multiply there, and hard-light on black amplifies
+ it — 0.14 tips from print grain into a scratched, dirty surface. */}
+
+
+
+ {/* full-color-white is the dark-surface sibling of the full-color mark
+ the header uses: brand-coloured icon, white wordmark. The all-white
+ white.svg flattened the icon into the customer's mark beside it —
+ two white shapes either side of the divider with nothing to say
+ which one is the host. */}
+ {/* eslint-disable-next-line @next/next/no-img-element */}
+

+
+
+
+
+ );
+}
+
+// Height caps per optical weight, for both plate sizes. `md` is the baseline;
+// `sm` reins in heavy blocked wordmarks that read oversized at the common
+// height, `lg` lifts marks drawn light or small.
+const MARK_SIZE = {
+ sm: { card: "max-h-6 max-w-[9rem]", lead: "max-h-7 max-w-[11rem]" },
+ md: { card: "max-h-8 max-w-[11rem]", lead: "max-h-9 max-w-[13rem]" },
+ lg: { card: "max-h-10 max-w-[12rem]", lead: "max-h-11 max-w-[14rem]" },
+} as const;
+
+function CustomerMark({ story, lead }: { story: CustomerStory; lead: boolean }) {
+ if (!story.logo) {
+ return (
+
+ {story.name}
+
+ );
+ }
+
+ return (
+ // eslint-disable-next-line @next/next/no-img-element
+
+ );
+}
diff --git a/apps/site/src/components/use-case/ai-agents/agent-toolchain.tsx b/apps/site/src/components/use-case/ai-agents/agent-toolchain.tsx
new file mode 100644
index 00000000000..7c1b6cb9a9c
--- /dev/null
+++ b/apps/site/src/components/use-case/ai-agents/agent-toolchain.tsx
@@ -0,0 +1,84 @@
+import { AgentRobot } from "@/components/brand/agent-robot";
+import { IconTile } from "@/components/brand/icon-tile";
+import { Pattern } from "@/components/brand/pattern";
+import { Code, Console, Database, Server } from "@/components/icons/forma";
+
+// The intro's 1:1 abstraction: Prismo at the centre of one connected toolchain.
+// The four pieces the copy names — schema, database, hosting, CLI — sit on a
+// rail wired up to the agent above them, so the picture says the section's
+// point: one connected Prisma toolchain the agent drives, not four separate
+// contexts. Square by design (1:1), filling its column so it reads as one large
+// object; the copy beside it is centred to the square (see AgentIntro).
+const NODES = [
+ { Icon: Code, label: "Schema" },
+ { Icon: Database, label: "Database" },
+ { Icon: Server, label: "Hosting" },
+ { Icon: Console, label: "CLI" },
+];
+
+export function AgentToolchain() {
+ return (
+
+ {/* cube pattern, faint at the top (the panel idiom) */}
+
+ {/* the spectral bottom wash, as on the hero panel */}
+
+
+ {/* Prismo, floating over a soft bloom */}
+
+
+ {/* the connected toolchain: a rail wired up to the agent */}
+
+ {/* drop line from the agent to the rail */}
+
+ {/* the rail */}
+
+
+ {NODES.map(({ Icon, label }) => (
+
+ {/* connector stub rising to the rail */}
+
+
+
+
+
+ {label}
+
+
+ ))}
+
+
+
+ );
+}
diff --git a/apps/site/src/components/use-case/ai-agents/ai-agents-page.tsx b/apps/site/src/components/use-case/ai-agents/ai-agents-page.tsx
new file mode 100644
index 00000000000..cbb2250b49b
--- /dev/null
+++ b/apps/site/src/components/use-case/ai-agents/ai-agents-page.tsx
@@ -0,0 +1,70 @@
+import { CtaBurst } from "@/components/sections/cta-burst";
+import { LogoCloud } from "@/components/sections/logo-cloud";
+import { TestimonialsReveal } from "@/components/sections/testimonials-reveal";
+import { UseCaseHero } from "@/components/use-case/use-case-hero";
+import { aiAgentsUseCase } from "./content";
+import {
+ AgentBuilds,
+ AgentCompare,
+ AgentDeploy,
+ AgentFit,
+ AgentIntro,
+ AgentStack,
+ AgentWhen,
+} from "./sections";
+
+// Rotates through the brand's three hues, in the order the homepage uses.
+const CHECK_COLORS = ["text-prism-cyan-500", "text-prism-yellow-400", "text-prism-red-500"];
+
+// The AI & Agents use-case page, in the doc's section order:
+//
+// hero → logo strip → what Prisma is → when to use → is it the right fit →
+// the stack → where can I deploy → how it compares → what agents can build →
+// testimonials → closer
+//
+// Some sections are existing site components reused as-is rather than restyled,
+// so a fix to the homepage or product pages reaches this page too:
+// - the logo strip is the homepage LogoCloud;
+// - testimonials and the closer are the site's TestimonialsReveal and CtaBurst;
+// - the hero is the one every use-case page shares (use-case-hero.tsx). It
+// used to be this page's own purpose-built agent console; the console went
+// and the agent character took its place (client feedback, 2026-09-04), at
+// which point there was nothing left for the four pages to disagree about.
+//
+// The rest are this page's own sections (see sections.tsx) — the doc's copy has
+// no slot in the /use-cases template shape.
+export function AiAgentsUseCasePage() {
+ const c = aiAgentsUseCase;
+ return (
+ <>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ({
+ label,
+ color: CHECK_COLORS[i % CHECK_COLORS.length],
+ // the third benefit is a long list — drop it to its own line below
+ ownLine: i === 2,
+ }))}
+ primaryCta={c.cta.primaryCta}
+ secondaryCta={c.cta.secondaryCta}
+ />
+ >
+ );
+}
diff --git a/apps/site/src/components/use-case/ai-agents/compare-abstractions.tsx b/apps/site/src/components/use-case/ai-agents/compare-abstractions.tsx
new file mode 100644
index 00000000000..86a4806e360
--- /dev/null
+++ b/apps/site/src/components/use-case/ai-agents/compare-abstractions.tsx
@@ -0,0 +1,85 @@
+import { IconTile } from "@/components/brand/icon-tile";
+import { Pattern } from "@/components/brand/pattern";
+import { Code, Console, Database, Rocket, Server } from "@/components/icons/forma";
+import { cn } from "@/lib/utils";
+
+// The two abstractions for "How Prisma compares to stitched-together stacks",
+// one per column of AgentCompare. Both are labelled only with terms the section
+// copy already uses — the five separate concerns on the left ("the database,
+// ORM, hosting, logs, and deployment"), the Prisma pieces on the right ("the
+// Prisma schema, Prisma Postgres, Prisma Compute … CLIs and Management API").
+// No invented product copy.
+
+// Left — five separate tools sitting apart: dashed, muted, staggered, with no
+// rail joining them. The agent has to reason across each on its own.
+const SEPARATE = [
+ { Icon: Database, label: "Database" },
+ { Icon: Code, label: "ORM" },
+ { Icon: Server, label: "Hosting" },
+ { Icon: Console, label: "Logs" },
+ { Icon: Rocket, label: "Deployment" },
+];
+
+export function StitchedAbstraction() {
+ return (
+
+
+ {SEPARATE.map(({ Icon, label }, i) => (
+
+
+ {label}
+
+ ))}
+
+
+ );
+}
+
+// Right — one connected layer: the Prisma pieces stacked in a single spectrum-
+// edged panel, joined by a spine, so they read as one thing rather than five.
+const PIECES = [
+ { Icon: Code, label: "Prisma schema" },
+ { Icon: Database, label: "Prisma Postgres" },
+ { Icon: Server, label: "Prisma Compute" },
+ { Icon: Console, label: "CLIs & Management API" },
+];
+
+export function PrismaAbstraction() {
+ return (
+
+
+
+ {PIECES.map(({ Icon, label }) => (
+
+
+
+
+ {label}
+
+ ))}
+
+
+ );
+}
diff --git a/apps/site/src/components/use-case/ai-agents/content.ts b/apps/site/src/components/use-case/ai-agents/content.ts
new file mode 100644
index 00000000000..7036e97290c
--- /dev/null
+++ b/apps/site/src/components/use-case/ai-agents/content.ts
@@ -0,0 +1,194 @@
+import type { ProductIconName } from "@/components/product/icons";
+import type { ProductPageContent } from "@/components/product/types";
+
+// The "AI & Agents" use-case page, at /use-cases/ai-agents.
+//
+// Copy is André's "USE CASE — AI & AGENTS" doc, transcribed verbatim — no line
+// added, removed, tightened or reworded (André, 2026-08-25). This copy carries
+// a different section set from the /use-cases/template shape (it has no
+// three-step Define/Deploy/Iterate, no D4 differentiators and no FAQs; it adds
+// "What Prisma is for AI agents", "When to use", "Is it the right fit", "The
+// stack", "Where can I deploy", "How it compares" and "What agents can build"),
+// so it gets its own composition (ai-agents-page.tsx) that reuses the template's
+// components and idioms rather than being forced into the template's slots.
+//
+// Two copy-placement calls, both preserving every word:
+// - The doc's top label "USE CASE — AI & AGENTS" is the page-type marker, the
+// same role the RoleKicker already plays; the eyebrow carries the use-case
+// name "AI & Agents" (sentence-cased per the RoleKicker rule — the dot is
+// the accent, the label is never all-caps).
+// - The doc's hero has no visual and no stats microline, so neither is
+// invented: the hero visual is filled with the existing Console illustration
+// (see ai-agents-page.tsx) and the microline is left off.
+const CONSOLE = "https://console.prisma.io";
+const CONTACT = "/contact";
+
+type Cta = { label: string; href: string };
+/** Icon + heading + body — the "When to use" and "The stack" grids. */
+type IconItem = { icon: ProductIconName; title: string; body: string };
+/** Heading + body, no icon — the "What agents can build" cards (no icons in copy). */
+type TextItem = { title: string; body: string };
+
+export type AgentUseCaseContent = {
+ /** Route segment: /use-cases/. */
+ slug: string;
+ meta: { title: string; description: string };
+ /** Hero eyebrow — the use-case name, rendered as the site's RoleKicker. */
+ eyebrow: string;
+ /** Runs through the shared ProductHero; subheadline is the two hero paragraphs. */
+ hero: ProductPageContent["hero"];
+ /** "What Prisma is for AI agents" — a lede and two narrative paragraphs. */
+ intro: { headline: string; lede: string; body: string[] };
+ /** "When to use Prisma for agent-driven apps" — intro + four icon cards. */
+ when: { headline: string; intro: string; items: IconItem[] };
+ /** "Is Prisma the right fit for AI and agents?" — the suited line and the honest caveat. */
+ fit: { headline: string; suited: string; caveat: string };
+ /** "A stack built for agents to drive end to end" — intro + four layers. */
+ stack: { headline: string; intro: string; items: IconItem[] };
+ /** "Where can I deploy my agent-built TypeScript app?" — intro, the terminal animation, the loop line. */
+ deploy: { headline: string; intro: string; animationLabel: string; body: string };
+ /** "How Prisma compares to stitched-together stacks" — the two prose columns. */
+ compare: { headline: string; before: string; after: string };
+ /** "What agents can build with Prisma" — three build types. */
+ builds: { headline: string; items: TextItem[] };
+ /** The testimonials section heading, carried by the shared TestimonialsReveal. */
+ testimonialsHeading: string;
+ /** Closing CTA. */
+ cta: { headline: string; body: string; benefits: string[]; primaryCta: Cta; secondaryCta: Cta };
+};
+
+export const aiAgentsUseCase: AgentUseCaseContent = {
+ slug: "ai-agents",
+ meta: {
+ title: "AI & Agents",
+ description: "The infrastructure layer for agent-driven TypeScript apps.",
+ },
+ eyebrow: "AI & Agents",
+ hero: {
+ headline: "The infrastructure layer for agent-driven TypeScript apps",
+ headlineEmphasis: "infrastructure",
+ subheadline: [
+ "Prisma is integrated TypeScript infrastructure for AI coding agents. It gives agents a readable data model, managed Postgres, app hosting, migrations, logs, and deploy workflows they can operate through Prisma’s CLIs and Management API.",
+ "Prisma is best for teams building TypeScript apps with agents like Claude Code, Cursor, Codex, Windsurf, v0, or Bolt, especially when the app needs a real database, a deployable backend, and a workflow the agent can keep moving through after it writes the first version of the code.",
+ ],
+ benefits: [
+ "A machine-readable Prisma schema your agent can inspect, update, and migrate",
+ "Prisma Postgres and Prisma Compute in one connected TypeScript stack",
+ "CLIs and Management API for provisioning, deployment, logs, and redeployment",
+ ],
+ primaryCta: { label: "Get started free", href: CONSOLE },
+ secondaryCta: { label: "Talk to us", href: CONTACT },
+ },
+ intro: {
+ headline: "What Prisma is for AI agents",
+ lede: "Prisma is the infrastructure layer for agent-driven TypeScript apps.",
+ body: [
+ "It connects the parts an agent needs to ship a working application: the data model, database, ORM, migrations, hosting, logs, and deployment workflow. The agent gets one connected Prisma toolchain instead of separate database, ORM, and hosting contexts to reason through.",
+ "For AI-assisted development, that matters because the agent can keep working through the backend loop: update the schema, provision the database, run migrations, deploy the app, inspect logs, fix issues, and redeploy.",
+ ],
+ },
+ when: {
+ headline: "When to use Prisma for agent-driven apps",
+ intro:
+ "Use Prisma when you want an AI coding agent to help ship a TypeScript app that needs more than generated code.",
+ items: [
+ {
+ icon: "code",
+ title: "Use Prisma when your agent needs a clear data model",
+ body: "Prisma schema gives the agent a readable view of your data model, relationships, and migrations, so it can make changes with shared context.",
+ },
+ {
+ icon: "database",
+ title: "Use Prisma when your agent needs a database it can provision",
+ body: "Prisma Postgres gives the agent a managed Postgres database it can create and connect as part of the same Prisma workflow.",
+ },
+ {
+ icon: "rocket",
+ title: "Use Prisma when your agent needs to deploy the app",
+ body: "Prisma Compute gives the agent a place to deploy the TypeScript app in the same Prisma project, alongside its Prisma Postgres database.",
+ },
+ {
+ icon: "repeat",
+ title: "Use Prisma when your agent needs to debug and redeploy",
+ body: "Prisma’s CLIs and Management API expose the workflow programmatically, so an agent can deploy, inspect logs, diagnose issues, apply fixes, and redeploy.",
+ },
+ ],
+ },
+ fit: {
+ headline: "Is Prisma the right fit for AI and agents?",
+ suited:
+ "Prisma is best suited for TypeScript applications and agent-driven TypeScript workflows.",
+ caveat:
+ "Prisma may not be the right fit if your app is primarily outside the TypeScript ecosystem, if you need a fully bundled backend platform with built-in auth, or if you only need a standalone database without the ORM, schema, migration, and deployment workflow around it.",
+ },
+ stack: {
+ headline: "A stack built for agents to drive end to end",
+ intro: "Prisma gives agents one connected TypeScript stack to operate across.",
+ items: [
+ {
+ icon: "code",
+ title: "Schema",
+ body: "The Prisma schema gives the agent a structured source of context for the data model.",
+ },
+ {
+ icon: "database",
+ title: "Database",
+ body: "Prisma Postgres gives the agent a managed Postgres database to provision and connect.",
+ },
+ {
+ icon: "server",
+ title: "Hosting",
+ body: "Prisma Compute gives the agent a deployment target for the TypeScript app.",
+ },
+ {
+ icon: "console",
+ title: "CLI and Management API",
+ body: "Prisma’s CLIs and Management API give the agent structured interfaces for provisioning, deployment, logs, and redeployment.",
+ },
+ ],
+ },
+ deploy: {
+ headline: "Where can I deploy my agent-built TypeScript app?",
+ intro:
+ "Prisma is a strong fit for deploying agent-built TypeScript apps when the app needs a database, migrations, hosting, and a repeatable deploy/debug/redeploy workflow.",
+ animationLabel:
+ "Terminal animation: agent runs the full build → deploy → debug → redeploy loop",
+ body: "An agent can use Prisma to move from prompt to deploy in one loop: update the schema, migrate the database, deploy the app, inspect the logs, fix what broke, and redeploy through Prisma’s toolchain.",
+ },
+ compare: {
+ headline: "How Prisma compares to stitched-together stacks",
+ before:
+ "In a stitched-together stack, the agent has to reason across separate tools for the database, ORM, hosting, logs, and deployment.",
+ after:
+ "With Prisma, those pieces live in one TypeScript infrastructure layer. The agent can work from the Prisma schema, provision Prisma Postgres, deploy to Prisma Compute, and continue through logs and redeploys using Prisma’s CLIs and Management API.",
+ },
+ builds: {
+ headline: "What agents can build with Prisma",
+ items: [
+ {
+ title: "Internal tools",
+ body: "Generate a data model, connect a database, deploy the app, and keep iterating as requirements change.",
+ },
+ {
+ title: "AI products",
+ body: "Build TypeScript apps that need a real database, server-side logic, and a deployable TypeScript backend.",
+ },
+ {
+ title: "SaaS prototypes",
+ body: "Move from an idea to a working app without spending the first day wiring infrastructure together.",
+ },
+ ],
+ },
+ testimonialsHeading: "Trusted by more than 500K monthly active developers globally",
+ cta: {
+ headline: "Give your agent infrastructure it can keep working through",
+ body: "Prisma gives AI coding agents the connected TypeScript infrastructure to build, deploy, debug, and iterate on real apps.",
+ benefits: [
+ "Free to start, no credit card required",
+ "One integrated TypeScript stack",
+ "Built around Prisma schema, Prisma Postgres, Prisma Compute, CLIs, and Management API",
+ ],
+ primaryCta: { label: "Get started free", href: CONSOLE },
+ secondaryCta: { label: "Talk to us", href: CONTACT },
+ },
+};
diff --git a/apps/site/src/components/use-case/ai-agents/deploy-loop-terminal.tsx b/apps/site/src/components/use-case/ai-agents/deploy-loop-terminal.tsx
new file mode 100644
index 00000000000..12167250118
--- /dev/null
+++ b/apps/site/src/components/use-case/ai-agents/deploy-loop-terminal.tsx
@@ -0,0 +1,237 @@
+"use client";
+
+import { useEffect, useState } from "react";
+import { AnimatePresence, motion, useReducedMotion } from "framer-motion";
+import { Bot, Check, CheckCircle, XCircle } from "@/components/icons/forma";
+import { cn } from "@/lib/utils";
+
+// The build → deploy → debug → redeploy loop, running. Not a still and not a
+// caption: the four stages light up in sequence, each streaming its own CLI
+// lines, then it wraps back to the start — the loop the copy describes, shown
+// as a loop. Commands and results are illustrative in the step-mocks idiom
+// (real `prisma` verbs, skeleton results), not invented product copy.
+//
+// prefers-reduced-motion holds the finished state with every stage lit, so the
+// picture still reads without any movement.
+
+type Line =
+ | { kind: "cmd"; text: string }
+ | { kind: "ok"; text: string }
+ | { kind: "warn"; text: string }
+ | { kind: "agent"; text: string };
+
+const STAGES: { label: string; lines: Line[] }[] = [
+ {
+ label: "build",
+ lines: [
+ { kind: "cmd", text: "prisma migrate deploy" },
+ { kind: "ok", text: "3 migrations applied" },
+ ],
+ },
+ {
+ label: "deploy",
+ lines: [
+ { kind: "cmd", text: "prisma deploy" },
+ { kind: "ok", text: "web · api · worker built" },
+ { kind: "ok", text: "health check — 200 OK" },
+ ],
+ },
+ {
+ label: "debug",
+ lines: [
+ { kind: "cmd", text: "prisma app logs" },
+ { kind: "warn", text: "TypeError in /api/checkout" },
+ { kind: "agent", text: "agent: patch applied" },
+ ],
+ },
+ {
+ label: "redeploy",
+ lines: [
+ { kind: "cmd", text: "prisma deploy" },
+ { kind: "ok", text: "redeployed to us-west-1" },
+ ],
+ },
+];
+
+const STEP_MS = 1700;
+
+const SPECTRUM = "linear-gradient(90deg,#01d7e4,#f3c306 25%,#f37a03 50%,#f43531 74%,#f00e5c)";
+
+// The deploy result summary — every value is a fact the log above already
+// streamed, so nothing new is invented; the panel just states the outcome.
+const RESULT: { label: string; value: string; ok?: boolean }[] = [
+ { label: "url", value: "acme-dashboard.prisma.app" },
+ { label: "services", value: "web · api · worker", ok: true },
+ { label: "migrations", value: "3 applied", ok: true },
+ { label: "health", value: "200 OK", ok: true },
+ { label: "region", value: "us-west-1" },
+];
+
+function LogLine({ line, caret }: { line: Line; caret?: boolean }) {
+ return (
+
+ {line.kind === "cmd" ? (
+ <>
+ $
+ {line.text}
+ >
+ ) : line.kind === "ok" ? (
+ <>
+
+ {line.text}
+ >
+ ) : line.kind === "warn" ? (
+ <>
+
+ {line.text}
+ >
+ ) : (
+ <>
+
+ {line.text}
+ >
+ )}
+ {caret ? (
+
+ ) : null}
+
+ );
+}
+
+export function DeployLoopTerminal({ label }: { label: string }) {
+ const reduce = useReducedMotion();
+ const [step, setStep] = useState(0);
+
+ useEffect(() => {
+ // Under reduced motion the render shows every stage lit already, so there's
+ // nothing to drive — leave `step` be and don't start the interval.
+ if (reduce) return;
+ const id = setInterval(() => setStep((s) => (s + 1) % STAGES.length), STEP_MS);
+ return () => clearInterval(id);
+ }, [reduce]);
+
+ // Accumulate lines through the current stage, so the log fills across a cycle
+ // and clears when it wraps — the loop restarting.
+ const shown = reduce ? STAGES : STAGES.slice(0, step + 1);
+ const flat = shown.flatMap((s, si) => s.lines.map((line, li) => ({ line, si, li })));
+
+ return (
+
+ {/* window chrome */}
+
+
+
+ agent — deploy loop
+
+
+ running
+
+
+
+ {/* stage strip — the four loop stages, filling in sequence */}
+
+ {STAGES.map((s, i) => {
+ const active = reduce || i <= step;
+ return (
+
+
+
+ {s.label}
+
+ {i < STAGES.length - 1 ? (
+
+
+
+ ) : null}
+
+ );
+ })}
+
+
+ {/* the log — a fixed band, newest anchored to the bottom so accumulating
+ lines scroll under the fold rather than resizing the card */}
+
+
+
+ {flat.map(({ line, si, li }) => (
+
+ ))}
+
+
+
+
+ {/* the deploy result — a clean summary of what the loop shipped, drawn
+ only from the log's own facts. Fills the rest of the card so the space
+ reads as the deployed outcome rather than an empty terminal. */}
+
+
+
+
+ Deployed
+
+
+ live
+
+
+
+
+ {RESULT.map(({ label, value, ok }) => (
+
+ {label}
+
+ {ok ? (
+
+ ) : null}
+ {value}
+
+
+ ))}
+
+
+
+ );
+}
diff --git a/apps/site/src/components/use-case/ai-agents/sections.tsx b/apps/site/src/components/use-case/ai-agents/sections.tsx
new file mode 100644
index 00000000000..45c2f94cf27
--- /dev/null
+++ b/apps/site/src/components/use-case/ai-agents/sections.tsx
@@ -0,0 +1,292 @@
+import { IconTile } from "@/components/brand/icon-tile";
+import { Pattern } from "@/components/brand/pattern";
+import { Bot, CheckBold, LayoutGrid, Rocket, X } from "@/components/icons/forma";
+import { PRODUCT_ICONS } from "@/components/product/icons";
+import { ProductFeatures } from "@/components/product/product-features";
+import { ProductNarrative } from "@/components/product/product-narrative";
+import type { ProductIllustrationName } from "@/components/product/illustrations";
+import { Reveal } from "@/components/motion/reveal";
+import { cn } from "@/lib/utils";
+import { AgentToolchain } from "./agent-toolchain";
+import { PrismaAbstraction, StitchedAbstraction } from "./compare-abstractions";
+import { DeployLoopTerminal } from "./deploy-loop-terminal";
+import type { AgentUseCaseContent } from "./content";
+
+// The AI & Agents page's own sections — an illustrated narrative, an icon-card
+// grid, an asymmetric split, the product feature grid, a running terminal, a
+// two-column comparison, a card row. The "When to use" and "What agents
+// can build" sections both use the site's icon-tile card, since the copy for
+// each names an icon per item and asks to be read as one card per point; the
+// layouts between them keep the page from reading as one long card wall. Where a
+// section is anchored by a visual, it reuses
+// the product pages' own abstractions (the feature cards) or builds a first-
+// class one (the toolchain diagram, the deploy-loop terminal). Shared sections
+// (hero, logo strip, testimonials, closer) are composed in ai-agents-page.tsx.
+
+const HEADING = "text-balance text-[clamp(1.75rem,2.75vw,2.375rem)] leading-[1.1]";
+const SPECTRUM = "linear-gradient(85deg,#01d7e4,#f3c306 25%,#f37a03 50%,#f43531 74%,#f00e5c)";
+
+// "What Prisma is for AI agents" — the /orm "argue one point with a visual"
+// pattern (ProductNarrative): the headline and copy on the left, a purpose-built
+// 1:1 abstraction on the right — Prismo at the centre of one connected toolchain
+// (schema, database, hosting, CLI), which is exactly what the copy argues. The
+// lede leads the paragraphs, so all three lines are kept.
+export function AgentIntro({ intro }: Pick) {
+ return (
+
+
+
+ }
+ />
+ );
+}
+
+// "When to use Prisma for agent-driven apps" — icon cards. The copy names an
+// icon per item (schema→code, database, deploy→rocket, debug→repeat), so the
+// section respects them: the /postgres "outcomes" tile (ProductProblem) — an
+// icon tile, a heading, a line of copy, a quiet border — in the same four-up row
+// that page uses, so the four "Use Prisma when your agent needs…" points each
+// read as one card.
+export function AgentWhen({ when }: Pick) {
+ return (
+
+
+
+
+ {when.headline}
+
+
+
+ {when.intro}
+
+
+
+
+
+ {when.items.map(({ icon, title, body }, i) => {
+ const Icon = PRODUCT_ICONS[icon];
+ return (
+
+
+
+
+
+
{title}
+
+ {body}
+
+
+
+ );
+ })}
+
+
+
+ );
+}
+
+// "Is Prisma the right fit for AI and agents?" — an asymmetric split, not two
+// equal boxes. The affirmative is promoted: wider, elevated, spectrum-edged,
+// set larger. The honest caveat sits beside it, plain and muted — present, but
+// visibly the secondary voice.
+export function AgentFit({ fit }: Pick) {
+ return (
+
+
+
+ {fit.headline}
+
+
+
+
+
+ );
+}
+
+// "A stack built for agents to drive end to end" — the four layers as the
+// product pages' own feature grid (ProductFeatures): a wrapped prismatic panel
+// of ray-photo cards, each carrying the real abstraction that product page
+// shows — the schema file, the database panel, the co-located app, the deploy
+// log. Reusing the component (not a copy) keeps this page in lockstep with
+// /orm, /postgres and /compute.
+const STACK_ILLUSTRATIONS: ProductIllustrationName[] = [
+ "schemaFile",
+ "databasePanel",
+ "coLocated",
+ "deployLog",
+];
+export function AgentStack({ stack }: Pick) {
+ return (
+ ({
+ name: item.title,
+ description: item.body,
+ illustration: STACK_ILLUSTRATIONS[i],
+ })),
+ }}
+ // four cards run two-up, where the default block leaves them squat; the
+ // hero panels need the extra height so their content isn't clipped
+ mediaHeight="h-[26rem]"
+ // these are the full-bleed hero panels; float them so they read as one
+ // card each instead of hitting the edges (André, 2026-08-26)
+ frameIllustration
+ />
+ );
+}
+
+// "Where can I deploy my agent-built TypeScript app?" — the loop, running. The
+// terminal cycles build → deploy → debug → redeploy on its own (see
+// deploy-loop-terminal.tsx), so the section shows the animation the doc asked
+// for rather than describing it. The doc's animation note is carried as the
+// terminal's accessible label, so nothing is lost. Intro and body copy frame it.
+export function AgentDeploy({ deploy }: Pick) {
+ return (
+
+ {/* headline sits with its copy on the left; the loop runs on the right in
+ a 1:1 frame, matching the intro's square visual */}
+
+
+
+ {deploy.headline}
+
+
+
+
+ {deploy.intro}
+
+
+
+
+ {deploy.body}
+
+
+
+
+
+
+
+ {/* spectrum bloom low in the card, the deploy glow */}
+
+ {/* terminal fills the square so the loop reads as the visual, not a
+ small card floating in it */}
+
+
+
+
+
+
+
+ );
+}
+
+// "How Prisma compares to stitched-together stacks" — two columns, each an
+// abstraction over its paragraph: the five separate tools on the left, the one
+// connected Prisma layer on the right (see compare-abstractions.tsx). The
+// headline carries the comparison; the copy stays verbatim, one paragraph a
+// side, nothing labelled or invented.
+export function AgentCompare({ compare }: Pick) {
+ return (
+
+
+
+ {compare.headline}
+
+
+ {/* both abstractions are the same fixed height so their panels align
+ top and bottom; the paragraphs sit beneath, lengths free to differ */}
+
+
+
+
+
+
+
+ {compare.before}
+
+
+
+
+
+
+
+
+ {compare.after}
+
+
+
+
+
+
+ );
+}
+
+// "What agents can build with Prisma" — three build types in the site's own
+// card idiom (the /postgres "ships with the rest of your stack" tiles): an icon
+// tile, a heading, a line of copy, a quiet border. One distinct icon each —
+// internal tools, an AI product, a prototype to launch.
+const BUILD_ICONS = [LayoutGrid, Bot, Rocket];
+export function AgentBuilds({ builds }: Pick) {
+ return (
+
+
+
+ {builds.headline}
+
+
+
+ {builds.items.map(({ title, body }, i) => {
+ const Icon = BUILD_ICONS[i % BUILD_ICONS.length];
+ return (
+
+
+
+
+
+
{title}
+
+ {body}
+
+
+
+ );
+ })}
+
+
+
+ );
+}
diff --git a/apps/site/src/components/use-case/segment/abstractions/engineering-teams.tsx b/apps/site/src/components/use-case/segment/abstractions/engineering-teams.tsx
new file mode 100644
index 00000000000..a9f6abc7bf7
--- /dev/null
+++ b/apps/site/src/components/use-case/segment/abstractions/engineering-teams.tsx
@@ -0,0 +1,12 @@
+import { OrmIllustration } from "@/components/sections/orm-illustration";
+
+// Intro — the ORM illustration: the schema-backed, fully typed client the team
+// shares. Reuses the landing-page illustration so the picture shows the real
+// product, not a placeholder (teammate feedback, 2026-08-26).
+//
+// The hero visual that used to live here — a fabricated PR-workflow console —
+// is gone: the use-case heroes carry the agent character now (client feedback,
+// 2026-09-04). See use-case-hero.tsx.
+export function EngineeringIntroVisual() {
+ return ;
+}
diff --git a/apps/site/src/components/use-case/segment/abstractions/saas-teams.tsx b/apps/site/src/components/use-case/segment/abstractions/saas-teams.tsx
new file mode 100644
index 00000000000..60695dfc0ec
--- /dev/null
+++ b/apps/site/src/components/use-case/segment/abstractions/saas-teams.tsx
@@ -0,0 +1,12 @@
+import { ConsoleIllustration } from "@/components/sections/console-illustration";
+
+// Intro — the actual Prisma Console: one project with an app and a database,
+// ready to deploy. Reuses the landing-page illustration so the picture shows
+// the real product, not a placeholder (teammate feedback, 2026-08-26).
+//
+// The hero visual that used to live here — a fabricated SaaS project console —
+// is gone: the use-case heroes carry the agent character now (client feedback,
+// 2026-09-04). See use-case-hero.tsx.
+export function SaasIntroVisual() {
+ return ;
+}
diff --git a/apps/site/src/components/use-case/segment/abstractions/startups.tsx b/apps/site/src/components/use-case/segment/abstractions/startups.tsx
new file mode 100644
index 00000000000..5b7220743fc
--- /dev/null
+++ b/apps/site/src/components/use-case/segment/abstractions/startups.tsx
@@ -0,0 +1,12 @@
+import { ComputeIllustration } from "@/components/sections/compute-illustration";
+
+// Intro — the Compute deploy illustration: a founder's app going live from the
+// same connected stack. Reuses the landing-page illustration so the picture
+// shows the real product, not a placeholder (teammate feedback, 2026-08-26).
+//
+// The hero visual that used to live here — a fabricated launch-to-scale
+// console — is gone: the use-case heroes carry the agent character now
+// (client feedback, 2026-09-04). See use-case-hero.tsx.
+export function StartupsIntroVisual() {
+ return ;
+}
diff --git a/apps/site/src/components/use-case/segment/comparison-table.tsx b/apps/site/src/components/use-case/segment/comparison-table.tsx
new file mode 100644
index 00000000000..43fa43bf7d8
--- /dev/null
+++ b/apps/site/src/components/use-case/segment/comparison-table.tsx
@@ -0,0 +1,147 @@
+import { Marker } from "@/components/brand/marker";
+import { Reveal } from "@/components/motion/reveal";
+import { cn } from "@/lib/utils";
+
+// The audience use-case comparison table. Design starts from the pricing spec
+// table (pricing-spec-table.tsx) — the haloed panel, the lit column with a
+// spectrum cap, the mobile pivot — but the shape is different: these tables are
+// a three-column prose comparison (the comparison point, an assembled/
+// fragmented stack, and Prisma) rather than a four-plan grid, so the cells hold
+// sentences and the Prisma column is the one that's lifted. Copy is verbatim.
+
+const SPECTRUM =
+ "linear-gradient(85deg, #01d7e4 0%, #f3c306 25%, #f37a03 50%, #f43531 74%, #f00e5c 100%)";
+const HALO =
+ "conic-gradient(var(--color-prism-yellow-300), var(--color-prism-red-500) 32%, var(--color-prism-cyan-400) 64%, var(--color-prism-yellow-300))";
+
+const HEADING = "text-balance text-[clamp(1.75rem,2.75vw,2.375rem)] leading-[1.1]";
+
+export type ComparisonRow = { point: string; assembled: string; prisma: string };
+
+export type ComparisonContent = {
+ headline: string;
+ intro: string[];
+ /** Header for the first (row-label) column, e.g. "Comparison point". */
+ pointHeader: string;
+ /** Header for the assembled/fragmented column, e.g. "Assembled SaaS stack". */
+ assembledHeader: string;
+ rows: ComparisonRow[];
+};
+
+export function ComparisonTable({ comparison }: { comparison: ComparisonContent }) {
+ const { headline, intro, pointHeader, assembledHeader, rows } = comparison;
+ return (
+
+
+
+ {headline}
+
+
+ {intro.map((para, i) => (
+
+ {para}
+
+ ))}
+
+
+
+ {/* the pricing table's prismatic halo — inner edge + soft bloom */}
+
+
+
+ {/* mobile / tablet: pivot each row to a label with the two values
+ stacked, the Prisma value lifted */}
+
+ {rows.map((row, i) => (
+
+
{row.point}
+
+
+
+ {assembledHeader}
+
+
+ {row.assembled}
+
+
+
+
+
Prisma
+
{row.prisma}
+
+
+
+ ))}
+
+
+ {/* desktop */}
+
+
+ {headline}
+
+
+
+
+
+
+
+ |
+
+ {pointHeader}
+
+ |
+
+
+ {assembledHeader}
+
+ |
+
+
+
+ Prisma
+ Recommended
+
+ |
+
+
+
+ {rows.map((row, i) => (
+
+ |
+ {row.point}
+ |
+
+ {row.assembled}
+ |
+
+ {row.prisma}
+ |
+
+ ))}
+
+
+
+
+
+
+ );
+}
diff --git a/apps/site/src/components/use-case/segment/content/engineering-teams.ts b/apps/site/src/components/use-case/segment/content/engineering-teams.ts
new file mode 100644
index 00000000000..7a9feab81a7
--- /dev/null
+++ b/apps/site/src/components/use-case/segment/content/engineering-teams.ts
@@ -0,0 +1,154 @@
+import type { SegmentUseCaseContent } from "../types";
+
+// "Engineering Teams" use case, at /use-cases/engineering-teams. Copy is
+// André's doc, transcribed verbatim — no line added, removed, or reworded.
+const CONSOLE = "https://console.prisma.io";
+const CONTACT = "/contact";
+
+export const engineeringTeamsUseCase: SegmentUseCaseContent = {
+ slug: "engineering-teams",
+ meta: {
+ title: "Engineering Teams",
+ description: "Best backend workflow for TypeScript engineering teams.",
+ },
+ eyebrow: "Engineering Teams",
+ hero: {
+ headline: "Best backend workflow for TypeScript engineering teams",
+ headlineEmphasis: "backend workflow",
+ subheadline: [
+ "Prisma is an integrated TypeScript stack for engineering teams that need one shared workflow across schema, queries, migrations, preview environments, and production.",
+ "Prisma is best for teams that want to keep engineers, environments, and coding agents aligned as the backend grows more complex.",
+ ],
+ benefits: [
+ "One schema as the shared contract across your team",
+ "Type-safe queries that catch mistakes before they ship",
+ "A production-like database for every branch and PR",
+ ],
+ primaryCta: { label: "Get started free", href: CONSOLE },
+ secondaryCta: { label: "Talk to us", href: CONTACT },
+ },
+ intro: {
+ headline: "Why engineering teams use Prisma",
+ lede: "As engineering teams grow, backend workflows can start to drift. Data models change, migrations get harder to review, preview environments fall out of sync, and different engineers may handle queries, database changes, and deploys in different ways.",
+ body: [
+ "Prisma gives teams one connected TypeScript workflow for the parts of the backend that need to stay aligned: schema, queries, migrations, database environments, and deployment workflows.",
+ "The result is a backend workflow that is easier to review, easier to share across the team, and easier for agents to reason about.",
+ ],
+ },
+ when: {
+ headline: "When Prisma is a good fit for engineering teams",
+ intro:
+ "Use Prisma when your team is building with TypeScript and needs a shared backend workflow that stays consistent from local development to production.",
+ items: [
+ {
+ icon: "code",
+ title: "Your team needs one shared data model",
+ body: "Prisma schema gives engineers one readable source of context for the data model, relationships, and migrations.",
+ },
+ {
+ icon: "shield",
+ title: "You want safer query changes",
+ body: "Prisma Client gives your team fully typed queries, so mismatches can be caught during development before they become production issues.",
+ },
+ {
+ icon: "swap",
+ title: "Migrations need to be easier to review",
+ body: "Prisma Migrate generates reviewable migrations from the schema, so database changes are easier to inspect before they reach production.",
+ },
+ {
+ icon: "gitBranch",
+ title: "Preview environments need real databases",
+ body: "Each deployed preview branch can get its own isolated app and database environment, so teams can test changes without touching production.",
+ },
+ ],
+ },
+ fit: {
+ headline: "Is Prisma the right fit for engineering teams?",
+ suited:
+ "Prisma is best suited for TypeScript engineering teams that want a shared workflow across the data model, queries, migrations, database environments, and deploy process.",
+ caveat:
+ "Prisma may not be the right fit if your team is primarily outside the TypeScript ecosystem, if you only need a standalone database, or if your team wants to manage the ORM, database, hosting, migrations, and preview environments as separate tools.",
+ },
+ comparison: {
+ headline: "Prisma vs. a fragmented backend workflow",
+ intro: [
+ "Engineering teams often start with an ORM, a database provider, a hosting platform, and a migration workflow that were chosen separately. That can work early on, but as the team grows, the seams between those tools become harder to manage.",
+ "Prisma brings the core backend workflow into one TypeScript stack, so engineers and agents work from the same schema, query layer, migration workflow, and project context.",
+ ],
+ pointHeader: "Engineering need",
+ assembledHeader: "Fragmented backend workflow",
+ rows: [
+ {
+ point: "Shared data model",
+ assembled:
+ "The data model may be spread across ORM files, SQL, migrations, and application code.",
+ prisma: "Prisma schema gives the team one shared, readable contract for the data model.",
+ },
+ {
+ point: "Query safety",
+ assembled: "Query mistakes may show up during review, testing, or production.",
+ prisma: "Prisma Client catches type mismatches during development.",
+ },
+ {
+ point: "Migration review",
+ assembled:
+ "Database changes can be hard to understand when schema, SQL, and application code drift.",
+ prisma: "Prisma Migrate creates reviewable migrations from the schema.",
+ },
+ {
+ point: "Preview environments",
+ assembled: "App previews and database changes may need to be coordinated across providers.",
+ prisma:
+ "Deployed preview branches can be paired with isolated app and database environments.",
+ },
+ {
+ point: "Team onboarding",
+ assembled: "New engineers have to learn conventions spread across tools and people.",
+ prisma: "New engineers can start from the schema and shared Prisma workflow.",
+ },
+ {
+ point: "Agent-assisted development",
+ assembled: "Agents may need to infer backend context across separate tools and files.",
+ prisma:
+ "Agents can reason from Prisma schema and work through Prisma’s CLIs and Management API.",
+ },
+ ],
+ },
+ builds: {
+ headline: "Who Prisma is best for",
+ items: [
+ {
+ icon: "layers",
+ title: "Growing TypeScript teams",
+ body: "Keep engineers aligned around one schema, one typed client, and one migration workflow.",
+ },
+ {
+ icon: "swap",
+ title: "Teams with frequent schema changes",
+ body: "Make database changes easier to review before they reach production.",
+ },
+ {
+ icon: "gitBranch",
+ title: "Teams using preview environments",
+ body: "Test app and database changes together before merging.",
+ },
+ {
+ icon: "bot",
+ title: "Teams using coding agents",
+ body: "Give agents a clearer backend context and a structured workflow for schema changes, deploys, logs, fixes, and redeploys.",
+ },
+ ],
+ },
+ testimonialsHeading: "Trusted by more than 500K monthly active developers globally",
+ cta: {
+ headline: "Keep your engineering team aligned from schema to production",
+ body: "Prisma gives engineering teams one connected TypeScript workflow for schema, queries, migrations, preview environments, and production.",
+ benefits: [
+ "Free to start, no credit card required",
+ "One shared stack across your whole team",
+ "Built for TypeScript teams and agent-assisted development",
+ ],
+ primaryCta: { label: "Get started free", href: CONSOLE },
+ secondaryCta: { label: "Talk to us", href: CONTACT },
+ },
+};
diff --git a/apps/site/src/components/use-case/segment/content/saas-teams.ts b/apps/site/src/components/use-case/segment/content/saas-teams.ts
new file mode 100644
index 00000000000..af5f6e1eba1
--- /dev/null
+++ b/apps/site/src/components/use-case/segment/content/saas-teams.ts
@@ -0,0 +1,193 @@
+import type { SegmentUseCaseContent } from "../types";
+
+// "SaaS Teams" use case, at /use-cases/saas-teams. Copy is André's doc,
+// transcribed verbatim — no line added, removed, tightened or reworded.
+const CONSOLE = "https://console.prisma.io";
+const CONTACT = "/contact";
+
+export const saasTeamsUseCase: SegmentUseCaseContent = {
+ slug: "saas-teams",
+ meta: {
+ title: "SaaS Teams",
+ description: "Best platform for SaaS apps built with TypeScript.",
+ },
+ eyebrow: "SaaS Teams",
+ hero: {
+ headline: "Best platform for SaaS apps built with TypeScript",
+ headlineEmphasis: "SaaS apps",
+ subheadline: [
+ "Prisma is a strong fit for SaaS apps built with TypeScript when your team wants the app, database, ORM, migrations, preview environments, and deployment workflow in one connected stack.",
+ "Prisma is best for SaaS teams that want to ship product faster, spend less time connecting separate tools, and give both developers and coding agents one stack to build, deploy, debug, and iterate on end to end.",
+ ],
+ benefits: [
+ "Database, ORM, and hosting in one integrated stack, one bill",
+ "Operation-based pricing with spend limits",
+ "Isolated app and database environments for preview branches and PRs",
+ ],
+ primaryCta: { label: "Get started free", href: CONSOLE },
+ secondaryCta: { label: "Talk to us", href: CONTACT },
+ },
+ intro: {
+ headline: "What Prisma is for SaaS teams",
+ lede: "Prisma is integrated TypeScript infrastructure for building and running SaaS apps.",
+ body: [
+ "It brings the data model, ORM, managed Postgres, app hosting, migrations, preview environments, and deployment workflow into one Prisma project. Your team works from the same stack, and your agent has one connected toolchain to operate through.",
+ "For SaaS teams, that means fewer vendors to connect, fewer bills to reconcile, fewer environments to keep aligned, and a clearer workflow from feature development to production.",
+ ],
+ },
+ when: {
+ headline: "When to use Prisma for a SaaS app",
+ intro:
+ "Use Prisma when your SaaS team is building with TypeScript and wants the app, database, queries, migrations, and deploy workflow to stay connected as the product grows.",
+ items: [
+ {
+ icon: "layers",
+ title: "Use Prisma when you want one connected stack",
+ body: "Prisma ORM, Prisma Postgres, and Prisma Compute work together in one Prisma project, so your team spends less time wiring separate vendors together.",
+ },
+ {
+ icon: "settings",
+ title: "Use Prisma when pricing predictability matters",
+ body: "Prisma uses operation-based pricing with spend limits, so teams can estimate usage, cap spend, and plan growth with fewer billing surprises.",
+ },
+ {
+ icon: "gitBranch",
+ title: "Use Prisma when your team needs safer preview environments",
+ body: "Each deployed preview branch can get its own isolated app and database, so changes can be tested without touching production.",
+ },
+ {
+ icon: "bot",
+ title: "Use Prisma when agents are part of your workflow",
+ body: "Prisma’s CLIs and Management API give coding agents a structured way to provision, deploy, inspect logs, fix issues, and redeploy across the stack.",
+ },
+ ],
+ },
+ fit: {
+ headline: "Is Prisma the right fit for SaaS teams?",
+ suited:
+ "Prisma is best suited for TypeScript SaaS teams that want an integrated app, database, ORM, and deployment workflow.",
+ caveat:
+ "Prisma may not be the right fit if your team needs built-in auth and storage from the same platform, if your app is primarily outside the TypeScript ecosystem, or if you only need a standalone database with no ORM, migrations, hosting, or agent-driven workflow around it.",
+ },
+ whyChoose: {
+ headline: "Why SaaS teams choose Prisma over a stitched-together stack",
+ intro: [
+ "A typical SaaS stack uses a database from one vendor, hosting from another, and an ORM in between. Each layer has its own setup, bill, environment model, and operational surface area.",
+ "Prisma brings the SaaS backend workflow closer together:",
+ ],
+ items: [
+ {
+ icon: "layoutGrid",
+ title: "Database, ORM, and hosting in one Prisma project",
+ body: "Your team can build against one connected TypeScript stack instead of managing separate database, ORM, and hosting contexts.",
+ },
+ {
+ icon: "repeat",
+ title: "One workflow from branch to production",
+ body: "Prisma keeps development, preview, and production workflows easier to reason about because app and database changes can move together.",
+ },
+ {
+ icon: "shield",
+ title: "One billing model with spend controls",
+ body: "Operation-based pricing and spend limits help teams plan usage before costs grow.",
+ },
+ {
+ icon: "console",
+ title: "One toolchain for developers and agents",
+ body: "Developers and coding agents can work through Prisma’s schema, CLIs, and Management API to keep the workflow moving.",
+ },
+ ],
+ },
+ comparison: {
+ headline: "How Prisma compares to Supabase, Neon, Vercel, and Drizzle for SaaS apps",
+ intro: [
+ "Prisma is a strong fit for TypeScript SaaS teams that want the core app, data model, database, queries, migrations, deploy workflow, and agent workflow to stay connected.",
+ "In an assembled stack, teams often combine tools like Supabase or Neon for Postgres, Vercel or Netlify for hosting, and Drizzle or another ORM for the data layer. Prisma brings those core workflows into one TypeScript stack with Prisma ORM, Prisma Postgres, Prisma Compute, Prisma schema, CLIs, and Management API.",
+ ],
+ pointHeader: "Comparison point",
+ assembledHeader: "Assembled SaaS stack",
+ rows: [
+ {
+ point: "Core setup",
+ assembled: "Database, ORM, and hosting are usually chosen and configured separately.",
+ prisma:
+ "Prisma ORM, Prisma Postgres, and Prisma Compute live in one connected TypeScript stack.",
+ },
+ {
+ point: "Data model",
+ assembled:
+ "The data model may be spread across ORM files, SQL, migrations, app code, and provider config.",
+ prisma: "Prisma schema gives the team one shared, typed data model to build from.",
+ },
+ {
+ point: "Deployment workflow",
+ assembled: "App deploys and database setup often happen in separate tools.",
+ prisma: "App, database, and deploy workflows can live in the same Prisma project.",
+ },
+ {
+ point: "Preview environments",
+ assembled:
+ "App previews and database branches may need to be coordinated across providers.",
+ prisma:
+ "Deployed preview branches can be paired with isolated app and database environments.",
+ },
+ {
+ point: "Pricing",
+ assembled: "Separate providers mean separate bills, limits, and usage models.",
+ prisma: "Operation-based pricing and spend limits help teams plan usage in one platform.",
+ },
+ {
+ point: "AI-assisted development",
+ assembled:
+ "Agents may need to move across separate contexts for database, ORM, hosting, logs, and deploys.",
+ prisma:
+ "Agents can work through Prisma schema, CLIs, and Management API across the workflow.",
+ },
+ {
+ point: "Best fit",
+ assembled:
+ "Teams that want to choose each layer separately and are comfortable managing the integration.",
+ prisma:
+ "TypeScript SaaS teams that want one connected workflow for app, data, deploys, previews, and agents.",
+ },
+ ],
+ },
+ builds: {
+ headline: "What SaaS teams build with Prisma",
+ intro: "Prisma is best for:",
+ items: [
+ {
+ icon: "layoutGrid",
+ title: "B2B SaaS products",
+ body: "Build and run your core app with a connected database, ORM, and hosting workflow.",
+ },
+ {
+ icon: "database",
+ title: "Multi-tenant SaaS apps",
+ body: "Model tenants in Prisma schema, manage migrations in the same workflow, and keep environments easier to reason about as the product grows.",
+ },
+ {
+ icon: "bot",
+ title: "AI-assisted SaaS teams",
+ body: "Give coding agents one stack to work through as they build, deploy, debug, and redeploy app changes.",
+ },
+ {
+ icon: "settings",
+ title: "Internal SaaS tools",
+ body: "Ship supporting dashboards, admin tools, and operational apps on the same stack your team already uses.",
+ },
+ ],
+ },
+ testimonialsHeading: "Trusted by more than 500K monthly active developers globally",
+ cta: {
+ headline: "Run your SaaS on one connected TypeScript stack",
+ body: "Prisma gives SaaS teams integrated TypeScript infrastructure for the app, database, queries, migrations, previews, and deploy workflow.",
+ benefits: [
+ "Free to start, no credit card required",
+ "One platform, one bill, predictable pricing",
+ "Trusted by 500K+ monthly active developers",
+ ],
+ primaryCta: { label: "Get started free", href: CONSOLE },
+ secondaryCta: { label: "Talk to us", href: CONTACT },
+ },
+};
diff --git a/apps/site/src/components/use-case/segment/content/startups.ts b/apps/site/src/components/use-case/segment/content/startups.ts
new file mode 100644
index 00000000000..807ba3a41cd
--- /dev/null
+++ b/apps/site/src/components/use-case/segment/content/startups.ts
@@ -0,0 +1,151 @@
+import type { SegmentUseCaseContent } from "../types";
+
+// "Startups & Founders" use case, at /use-cases/startups. Copy is André's doc,
+// transcribed verbatim — no line added, removed, tightened or reworded.
+const CONSOLE = "https://console.prisma.io";
+const CONTACT = "/contact";
+
+export const startupsUseCase: SegmentUseCaseContent = {
+ slug: "startups",
+ meta: {
+ title: "Startups & Founders",
+ description: "Best TypeScript stack for founders building from MVP to scale.",
+ },
+ eyebrow: "Startups & Founders",
+ hero: {
+ headline: "Best TypeScript stack for founders building from MVP to scale",
+ headlineEmphasis: "MVP to scale",
+ subheadline: [
+ "Prisma is an integrated TypeScript stack for founders who need to launch a real product quickly, then keep building on the same foundation as usage grows.",
+ "It brings your app, database, ORM, migrations, and deployment workflow into one connected stack, so you can start fast without planning for a rebuild the moment you find traction.",
+ "Prisma is best for technical founders, small startup teams, and AI-assisted builders who want to ship a TypeScript app with a real database, predictable pricing, and a path from first deploy to real traffic.",
+ ],
+ benefits: [
+ "Build your MVP on the same stack you can keep using as you grow",
+ "Start free, then keep costs capped as usage increases",
+ "Give developers and coding agents one workflow from schema to deploy",
+ ],
+ primaryCta: { label: "Get started free", href: CONSOLE },
+ secondaryCta: { label: "Talk to us", href: CONTACT },
+ },
+ intro: {
+ headline: "Why founders start with Prisma",
+ lede: "Prisma gives founders one connected TypeScript stack for the parts of the product that usually slow early teams down: the data model, database, queries, migrations, and deployment workflow.",
+ body: [
+ "Instead of assembling those pieces across separate vendors, founders can launch the first version faster and keep building on the same foundation as usage grows.",
+ ],
+ },
+ when: {
+ headline: "When Prisma is a good fit for startups",
+ intro:
+ "Use Prisma when you’re building a TypeScript product and want to get from idea to deployed app without assembling your backend stack from separate vendors first.",
+ items: [
+ {
+ icon: "rocket",
+ title: "You need to launch quickly",
+ body: "Define your data model, create a database, and deploy your TypeScript app from one connected Prisma workflow.",
+ },
+ {
+ icon: "layoutGrid",
+ title: "Your team is small",
+ body: "A founder or small team can manage the database, migrations, and deploy workflow without dedicated infrastructure support from day one.",
+ },
+ {
+ icon: "shield",
+ title: "Pricing needs to stay predictable",
+ body: "Start free with no credit card, then use operation-based pricing and spend limits as traffic grows.",
+ },
+ {
+ icon: "layers",
+ title: "You want less rework later",
+ body: "Start your MVP on a stack designed for real traffic, so early infrastructure decisions hold up as the product grows.",
+ },
+ ],
+ },
+ fit: {
+ headline: "Is Prisma the right fit for startups?",
+ suited:
+ "Prisma is best suited for TypeScript products and teams that want an integrated app, database, ORM, migration, and deployment workflow.",
+ caveat:
+ "Prisma may not be the right fit if your app is primarily outside the TypeScript ecosystem, if you need built-in auth and storage from the same backend platform, or if you only need a standalone database without the Prisma ORM, schema, migrations, or deployment workflow around it.",
+ },
+ comparison: {
+ headline: "Why founders start on Prisma instead of assembling a stack",
+ intro: [
+ "Early-stage teams usually need to answer one question quickly: can this product get real users?",
+ "Infrastructure decisions can slow that down. A typical startup stack means picking a database provider, choosing an ORM, selecting a host, setting up environments, wiring connection strings, and figuring out pricing across multiple tools.",
+ "Prisma gives founders one connected TypeScript stack for the core product workflow: schema, database, queries, migrations, deploys, previews, and agents.",
+ ],
+ pointHeader: "Startup need",
+ assembledHeader: "Assembled stack",
+ rows: [
+ {
+ point: "First launch",
+ assembled:
+ "The founder chooses and wires together a database, ORM, and host before shipping.",
+ prisma:
+ "Prisma brings the app, database, ORM, and deploy workflow into one connected stack.",
+ },
+ {
+ point: "MVP speed",
+ assembled: "Setup decisions can take time before users ever see the product.",
+ prisma: "Founders can move from data model to database to deployed app faster.",
+ },
+ {
+ point: "Cost control",
+ assembled: "Separate tools create separate bills and usage models.",
+ prisma: "Prisma starts free and supports spend limits as usage grows.",
+ },
+ {
+ point: "AI-assisted building",
+ assembled: "Coding agents may need to reason across separate tools and setup steps.",
+ prisma:
+ "Agents can work through Prisma schema, CLIs, and Management API across the workflow.",
+ },
+ {
+ point: "Growth path",
+ assembled: "The MVP stack may become harder to manage once traffic and complexity grow.",
+ prisma:
+ "Prisma is designed to carry the product from first deploy to real traffic on the same platform.",
+ },
+ ],
+ },
+ builds: {
+ headline: "Who Prisma is best for",
+ intro: "Prisma is best for:",
+ items: [
+ {
+ icon: "rocket",
+ title: "MVPs and first launches",
+ body: "Get a working TypeScript product in front of users without spending the first week assembling infrastructure.",
+ },
+ {
+ icon: "bot",
+ title: "AI-assisted products",
+ body: "Build apps with a real database, durable state, server-side logic, and a deployable TypeScript backend, often with help from a coding agent.",
+ },
+ {
+ icon: "layoutGrid",
+ title: "Early SaaS products",
+ body: "Start with one connected workflow for your app, database, queries, migrations, and deploys.",
+ },
+ {
+ icon: "layers",
+ title: "The company after the MVP",
+ body: "Keep building on the same stack as you add users, features, and your first hires.",
+ },
+ ],
+ },
+ testimonialsHeading: "Trusted by more than 500K monthly active developers globally",
+ cta: {
+ headline: "Start on Prisma and keep building as you grow",
+ body: "Prisma gives founders integrated TypeScript infrastructure for the first version of the product and the growth that comes after it.",
+ benefits: [
+ "Free to start, no credit card required",
+ "One connected stack from MVP to real traffic",
+ "Built for developers and coding agents building TypeScript apps",
+ ],
+ primaryCta: { label: "Get started free", href: CONSOLE },
+ secondaryCta: { label: "Talk to us", href: CONTACT },
+ },
+};
diff --git a/apps/site/src/components/use-case/segment/sections.tsx b/apps/site/src/components/use-case/segment/sections.tsx
new file mode 100644
index 00000000000..f15b69c2a3b
--- /dev/null
+++ b/apps/site/src/components/use-case/segment/sections.tsx
@@ -0,0 +1,194 @@
+import { IconTile } from "@/components/brand/icon-tile";
+import { Pattern } from "@/components/brand/pattern";
+import { CheckBold, X } from "@/components/icons/forma";
+import { PRODUCT_ICONS } from "@/components/product/icons";
+import { ProductNarrative } from "@/components/product/product-narrative";
+import { Reveal } from "@/components/motion/reveal";
+import { cn } from "@/lib/utils";
+import type { SegmentUseCaseContent } from "./types";
+
+// Shared sections for the audience use-case pages — the same idioms as the
+// AI-agents page (an illustrated narrative, icon-card grids, an asymmetric fit
+// split, card rows), generalised to take per-page content and abstractions.
+// The hero is the one every use-case page shares (use-case-hero.tsx) and the
+// comparison table is its own file.
+
+const HEADING = "text-balance text-[clamp(1.75rem,2.75vw,2.375rem)] leading-[1.1]";
+
+// "What Prisma is for … / Why … use Prisma" — the /orm narrative shape: copy on
+// the left, a purpose-built 1:1 abstraction on the right, the copy centred to it.
+export function SegmentIntro({
+ intro,
+ visual,
+}: Pick & { visual: React.ReactNode }) {
+ return (
+ {visual}}
+ />
+ );
+}
+
+// An icon-card grid — the /postgres outcomes tile. Used by "when to use" (four-
+// up) and "why choose" (two-up), so the two grids read at different rhythms.
+function IconCards({
+ headline,
+ intro,
+ items,
+ columns,
+}: {
+ headline: string;
+ intro: string[];
+ items: SegmentUseCaseContent["when"]["items"];
+ columns: "four" | "two";
+}) {
+ return (
+