Skip to content

Content/init - #7

Merged
nikolasburk merged 12 commits into
masterfrom
content/init
Mar 23, 2020
Merged

Content/init#7
nikolasburk merged 12 commits into
masterfrom
content/init

Conversation

@nikolasburk

Copy link
Copy Markdown
Contributor

No description provided.

@nikolasburk
nikolasburk merged commit f277701 into master Mar 23, 2020
andrefiori-cf referenced this pull request in conversionfactory/prisma-web Jul 24, 2026
…approved homepage

Self-contained workspace app carrying its own toolkit (Next.js 16,
Tailwind v4, React 19) so the redesign can evolve without touching
apps/site or the shared packages. Snapshot of the client-approved
homepage from the CF prototype repo (its PR #7). Refs #1

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
sneub pushed a commit that referenced this pull request Aug 14, 2026
Hero with the message form, three support channels, CtaBurst closer. Copy verbatim; client approved 2026-08-13.

Open with Prisma: form confirmation copy, a form endpoint (their team is taking the backend), and /docs, which the closing CTA links.

closes #7
nurul3101 added a commit that referenced this pull request Aug 24, 2026
* Add apps/site-redesign: CF marketing site rebuild, starting with the approved homepage

Self-contained workspace app carrying its own toolkit (Next.js 16,
Tailwind v4, React 19) so the redesign can evolve without touching
apps/site or the shared packages. Snapshot of the client-approved
homepage from the CF prototype repo (its PR #7). Refs #1

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* site-redesign: product page template + postgres page using it

Generic product page template (hero, problem, features, platform
cross-sell, CTA) from the prototype repo's approved outline, plus the
new brand components it introduced (GlassGlide, IconTile, LearnMore)
and the /postgres page built on it. Copy slots are placeholders until
each product's copy is approved. Refs #2

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* site-redesign: pricing page WIP — hero, how-it-works, includes strip

From the V2 copy doc; sections past these are blocked on the client's
answers to the open copy questions. Refs #5

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* site-redesign: pricing page built out from the approved V2 copy

Completes /pricing against the V2 copy doc: plan cards, calculator,
comparison, testimonials, CTA and FAQs, plus the fixes needed to make the
app build in production for the first time.

Pricing data — every figure confirmed by Gregory and cross-checked against
the live prisma.io/pricing page and its calculator:
  - Business gains an operations overage rate ($0.0010 per 1,000), which V2
    listed for Starter and Pro only
  - Business storage overage is $1.00/GB, taken from the live page. The
    calculator previously carried $1.50/GB copied from Pro, which
    overcharged every Business storage estimate
  - "No connection limits" removed — pooled limits do exist (10/100/500/1000)

Calculator rebuilt to match the live one: quick-start presets, an
operations slider that also reports estimated SQL queries (5x), monthly and
annual billing (-25%), and all three paid plans priced with the cheapest
recommended. Verified figure-for-figure against prisma.io/pricing.

Design system:
  - RoleKicker promoted out of stack-bento into a shared brand component and
    documented in /brand as the standard tagline. Four uppercase, letter-
    spaced eyebrows that never matched the homepage are now kickers
  - --paper added as an opt-in resting surface. --card is unchanged, so no
    other surface on the site moves

Build fixes, all pre-existing:
  - react-icons was never installed, so the relume-library scaffold failed
    with 983 module-not-found errors and no production build could succeed
  - button.tsx failed type-checking on a Slot/button handler union
  - badge.tsx needed "use client" — its radix-ui Slot import calls
    createContext, which 500'd every server page importing Badge (/brand)

Mobile: hero grid children were 25px wider than their track and clipped by
the panel; slider hit areas were 24px against a 44px touch minimum.

allowedDevOrigins set so the dev server can be opened over the LAN.

Co-Authored-By: Claude <noreply@anthropic.com>

* site-redesign: align pricing section widths with the homepage standard

The how-it-works, plans and calculator sections carried their horizontal
padding inside the max-w-6xl container, so the 1152px box was 1088px of
content plus 32px of padding — content sat 32px in from where it should and
ran 64px narrow.

Padding now sits on the <section> and max-w-6xl is the content box, matching
how-it-works.tsx on the homepage ("Ship a production TypeScript app in three
steps"), which is the standard for unwrapped sections. All three now measure
1152px starting at x=224, identical to the reference.

Co-Authored-By: Claude <noreply@anthropic.com>

* Rebrand Prisma Next to Prisma 8 across docs, blog, and site

The early-access major version keeps its working-name identifiers but is
now called Prisma 8 everywhere users read it:

- All prose, frontmatter, changelog entries, and UI labels (docs version
  dropdown now "v8 (Early Access)"; sidebar matchers keep URL fallbacks).
- Reworded ~35 now-redundant "becomes Prisma 8 at GA" sentences and the
  announcement post's naming section; added a one-line editor's note to
  the nine posts that were about Prisma Next under its working name.
- Replaced 14 images carrying the old wordmark: outlined badge/headline
  text in the teal covers swapped for live Mona Sans text, the indigo
  announcement family (incl. roadmap, TS-migrations, EA meta and the
  docs sidebar banner) rebuilt from the announcement SVG, and metas
  re-rendered from their heroes. Hero-image skill logos renamed to
  prisma-8-*.
- Fixed 27 links pointing at renamed heading anchors.

Deliberately unchanged (product-owned identifiers and live URLs):
create prisma@next npm dist-tags, the prisma-next CLI and config file,
the @prisma-next/* npm scope, /docs/orm/next URL segments (GA cutover
plan in next.config.mjs), published blog slugs, pris.ly/pn-* links,
Discord #prisma-next channels, and the EA banner CSS selectors that
PostHog CTA actions target.

Verified: types:check (docs, blog), lint:links, lint:agent-ready,
test:llm-markdown, lint:spellcheck, pnpm check, plus rendered-page and
image review on dev servers. Pre-commit hook skipped (pnpm is not
callable in this non-interactive shell); its check command was run
manually and passed.

* Reframe Prisma 8 status from Early Access to Release Candidate

Everywhere the site describes Prisma 8's current stage now says the
Release Candidate is available instead of Early Access:

- Docs: the EA banner, the version dropdown ("v8 (RC)"), section
  meta.json titles, llms.txt topics, the standard "Prisma 8 is in Early
  Access" callout on nine pages, and status prose across the next tree.
- New "release-candidate" badge type (badge-types.ts drives the zod
  enum, label, and color maps); the 41 Prisma 8 pages switched to it.
  Other products keep the early-access badge (e.g. the Postgres
  serverless driver) and the generic maturity-tier docs are untouched.
- Blog: the "Looking ahead" footers, per-post status notes, and
  pris.ly/pn-ea link text; site stack page descriptions.

Kept as historical artifacts: the Early Access announcement post
(title, slug, cover, body), launch-story references to it, dated
changelog entries, the April roadmap metaDescription, and every other
product's Early Access mentions.

Verified: docs types:check, lint:links, lint:agent-ready,
test:llm-markdown, lint:spellcheck, pnpm check, and rendered-page
checks on dev servers (banner, dropdown, callouts, footers, ltree
heading). Pre-commit hook skipped; its check command was run manually
and passed.

* site-redesign: pricing corrections from Shane's review

Shane Neubauer's feedback (2026-07-29), which also corrected several things
their own live pricing page currently gets wrong.

Corrections applied:
  - No annual billing. The monthly/yearly toggle and the 25% discount are
    removed — their live page offers annual, and Shane confirms they don't.
  - The "5x SQL queries per operation" readout is a stale technical detail
    that is no longer true. Removed; the caption now reads 1 query =
    1 operation.
  - "Most popular" moves from Pro to Starter, to anchor on the lower price
    rather than making Prisma read as more expensive than Vercel. This
    overrides the approved V2 copy, which puts it on Pro.
  - Free states that it is free forever.

Calculator recommendations were broken: with the presets copied from the live
calculator (12M / 36M / 84M ops) every preset recommended Pro or Business, so
Starter was never recommended and Free never appeared at all. Presets are now
100K/0.5GB, 1M/8GB and 20M/40GB, which recommend Free, Starter and Pro
respectively, and Free is priced alongside the paid plans instead of being
excluded — it goes "Not available" above its caps.

New detailed spec table (Shane: "these tend to be quite important for our
users"; also the full limits table Ankur asked for). Rows and values come from
their live "Compare plans" table so the structure matches what their users
already know.

Anything not confirmed is a visible TBC placeholder rather than a guess:
  - Supabase comparison column — Shane asked for it, no figures supplied
  - Free-tier backup retention — absent from their own table
  - Support tiers — live page says Standard/Premium, Gregory's notes said
    24h/2h response times
  - Global cache rows — published as a Postgres feature, but Gregory said
    Accelerate is being deprecated
Placeholders render as a dashed TBC badge, deliberately distinct from an em
dash, which means "not included on that plan".

Still outstanding: the plan cards are not above the fold, and the $385-450 vs
$70-90 comparison figures and "up to 5x" claim remain unverified.

Co-Authored-By: Claude <noreply@anthropic.com>

* site-redesign: pricing reorder, comparison rework, responsive spec table

Plan cards move directly under the hero so the prices are reachable without
hunting for them (Shane's ask). This does not fully satisfy "visible without
scrolling" — measured, the cards still start 182px below the fold at 1440x800,
and reordering alone cannot close that: below the 100px fixed header there is
700px of room and the card block is 605px, leaving 95px for the whole hero.
Finishing it needs the hero compacted, which costs approved V2 copy and so
needs a copy decision.

Comparison section: the price gap is the argument, so it is now drawn — cost
bars scaled from the figures, with the Supabase column's unknown rendered as a
dashed empty track rather than zero. Bars and the savings multiple are derived
from the cost strings so the figures keep one source of truth and the multiple
cannot drift from the copy. Note this makes the section lean harder on the
still-unverified $385-450 / $70-90 numbers.

Also fixes the Supabase column reading as a claim about Supabase: it used an em
dash, which this page states in print means "not included on that plan". It now
uses the dashed TBC badge, matching the spec table.

Badges: rounded-full belongs to prism-button, whose two variants are a dark
filled pill and a white outlined pill — so a pill badge reads as a CTA whichever
way it is filled. Adds brand/marker.tsx, a squared chip with colour in a dot per
the role-kicker rule, and moves all four badge sites onto it.

Spec table: the group headers were uppercase and letter-spaced, which the brand
rule forbids; they are now sentence case with a coloured glyph per group. Adds
the hero's conic halo at a third of its opacity. Below lg the table is pivoted
feature-first — it was 832px wide against a 356px viewport, so two plans sat
outside a scroller with nothing to signal them. Rows identical across all four
plans (12 of 23) collapse to one line, which keeps the pivot short and makes the
rows that actually differ the prominent ones.

Co-Authored-By: Claude <noreply@anthropic.com>

* site-redesign: /orm page from the approved V4 copy

Builds the ORM product page on the existing template, plus the two
top-level sections V4 adds that the template had no slot for: the
migrations argument and the fast-feedback blocks.

Copy is verbatim from the Notion card "Product Page Batch One (3-5) -
Copy", toggle V4. The code previously pointed at V1, which is the oldest
draft — different headlines, different CTAs, fewer sections. Comments now
name V4 so the next page doesn't repeat the mistake.

Three template changes were needed to fit real copy:

- The closer is per-page content now. Review feedback flagged all three
  product pages ending on an identical paragraph as reading templated,
  so nothing in it is defaulted or appended.
- Features pick their column count from the item count. V4 ships 3 (ORM),
  4 (Compute) and 5 (Postgres), and a row of three beats two-plus-an-orphan.
- "Learn more" links only render where the copy names a destination,
  rather than pointing at a guessed /docs.

Five hand-built abstractions follow the homepage idiom (real labels and
commands over skeleton lines): the schema file, the migration history as
a git-style graph, and one per feature. Space for the 3D renders is
reserved and sized where the cards have room for it, and the agent
character from the homepage's agent-loop section stands in as the runner
of the feedback loop.

Refs #2

* site-redesign: /compute page from the approved V4 copy

Second product page on the /orm layout. Copy is verbatim from the Notion
card "Product Page Batch One (3-5) - Copy", toggle V4.

V4 shapes this page differently from /orm in two ways that matter:

- No testimonial section. /orm and /postgres carry one and Compute does
  not, so this composes the sections directly rather than going through
  ProductPage, which always renders them.
- No "in public beta" callout. V3 had one and V4 dropped it. The homepage
  still labels Compute as beta, so this is easy to reintroduce by
  accident — noted in the content file.

Four features, so the grid resolves to two rows of two on its own.

Five new abstractions in the established idiom: a deployments panel
pairing each environment's app with its branched database, and one per
feature. The co-located one shows the round trip disappearing without
inventing a latency figure — the only unit on it is the microseconds the
copy itself claims.

Refs #2

* site-redesign: /postgres page from the approved V4 copy

Third and last product page, replacing the placeholder instance. Copy is
verbatim from the Notion card "Product Page Batch One (3-5) - Copy",
toggle V4.

This is the one page whose approved copy matches the template's standard
shape exactly, so it goes through ProductPage rather than composing its
own sections — which is what that wrapper is for.

Five features is the count with no tidy answer: three-then-two hangs left,
two-two-one leaves an orphan. Six tracks with every card spanning two gives
three per row, and starting the fourth at track two centres the remaining
pair beneath them. Card widths stay identical and both rows centre on the
same axis.

Two accuracy calls in the illustrations:

- The certifications are Business-tier in the copy, so the compliance card
  labels the tier rather than leaving it to imply they apply everywhere.
- "no cold starts" stays in the body copy where V4 put it, but is kept out
  of the artwork: a standing guardrail says not to promote it to a claim.

The pricing card carries no figures either — the claim is the shape of the
bill, not a price, so the meter and its cap are unnumbered.

Refs #2

* site-redesign: product page taglines follow the brand standard

The product hero eyebrow rendered as uppercase, letter-spaced, grey text
— the exact three things /brand documents the tagline must never be.
The homepage uses RoleKicker: sentence case, ink at 70%, colour carried by
a dot. The heroes now use it too, so the tagline reads the same everywhere.

The eyebrow predates RoleKicker, which arrived with the pricing branch, so
these pages inherited a treatment the style guide had since replaced.

Adds PLATFORM_PRODUCT_ACCENTS beside PLATFORM_PRODUCT_ICONS: one canonical
dot colour per product — ORM cyan, Postgres yellow, Compute red — matching
the homepage stack and the /brand examples, so pages can't drift from it.
Content names its product by key rather than repeating a class string.

Verified by computed style: text-transform, letter-spacing, size, weight,
colour and dot colour are now identical to the homepage's taglines.

* site-redesign: 3D renders in the product hero abstractions

Fills the reserved hero slots with the render the homepage already pairs
with each product: cards-3d on /orm, cpu-3d on /compute, database-3d on
/postgres, matching orm/compute/postgres-illustration.tsx. ThreeDSlot now
draws with object-contain so a render keeps its aspect inside whatever
footprint the placeholder held, and the slots grew slightly now that real
art sits in them.

Also fixes the /postgres headline, which ran into the illustration. Two
separate causes:

- The headline box could exceed its own grid column, because 16ch at the
  top of the clamp is wider than the column. The column is the hard limit
  now.
- The real overflow was the emphasis. GlassGlide is whitespace-nowrap from
  md up, deliberately, so the light travels an unbroken phrase — and the
  emphasis here was seven words, one unbreakable ~790px token in a 544px
  column, which pushed "stack" out of sight. Shortened to one word.

All three headlines now set in three lines and clear the illustration by
65px or more. "Production-ready Postgres," cannot share a line at any
sensible size (790px at 56px, still 649px at 46px), so "already" leads the
second line instead. headlineEmphasis now documents the length constraint.

* site-redesign: pricing hero unwrapped, Supabase figures, more breathing room

Client feedback 2026-07-30, in two parts.

Fold: Shane asked to land on the plans rather than read introductory copy first,
citing Vercel's pricing page. The hero is now a title band — testimonial, subhead,
checks and CTAs all removed (each is represented elsewhere; only the per-plan
blurbs have nowhere else to live, so they stay in the data unrendered). Headline
and cards then moved into one wrapper, and the wrapper came off entirely when the
page still read tighter than the reference.

Width turned out to matter more than spacing: four cards of dense feature text at
max-w-6xl were 270px wide and wrapped an overage line onto three lines. At 84rem
they are 318px and 482px tall instead of 528px — wider AND shorter, which is the
only reason the added padding still leaves every CTA above the fold at 1440x800.

Unwrapping needed the wash and grain to dissolve themselves: anchored to the
section edge they cut off and drew a visible seam across the page.

Supabase: figures supplied by the client ("Recommended website comparison", fair
50K MAU model) and used verbatim, including the "database compute excluded" caveat
on their spend cap. Their doc also puts Prisma Pro at $72-90 where V2 said $70-90;
taking theirs, since the old number was never verified.

The savings marker now names its basis. Unqualified "Up to 5x less" sat directly
beside a Supabase column only ~1.5x more expensive, so it read as a claim about
Supabase and was wrong by 3x. NOTE: the 5x still derives from the unverified
$385-450 Neon + Vercel figure, which now looks like an outlier next to the
client's own numbers — flagged, needs their answer.

Co-Authored-By: Claude <noreply@anthropic.com>

* site-redesign: drop the ray and 3D slot from the migrations graphic

The band existed to have light pass through the 3D element beside it, so
with the render gone it had no subject and read as decoration. The card is
just the migration history now, on its ray photo frame like the feature
cards.

Also removes what only existed to support the band: the `relative` on the
row list and the command strip, and on CardChrome, which no illustration
needs any longer.

The hero abstractions keep their renders, and the ray crossing behind them
is a separate treatment from the template and is untouched.

* site-redesign: one site-wide content width (max-w-site, 1400px)

The site had no container width defined anywhere — no token in globals.css, no
Tailwind config, and /brand documents prisms and rays but nothing about layout.
Every section picked its own, so four values had drifted in:

  1152px  max-w-6xl              the brand-redesign sections
  1280px  max-w-7xl              the older/generic sections
  1280px  Tailwind's `container`  the secondary pages (blog, solutions, versus…)
  1536px  max-w-[96rem]           the wrapped-panel shells

The panels made it read worse rather than better: the shell was 1536px but its
contents were 1152px, so the widest thing on a page was decorative while the
content sat in the middle third. That is the "not using the horizontal space"
against Vercel.

Adds --container-site (87.5rem / 1400px) and --container-panel to @theme,
generating a `max-w-site` utility, and applies it to every live layout
container: 25 section/product components, 12 page files, and the two auth
wrappers. 1400px matches Vercel's pricing page, measured in headless Chromium as
a hard cap at both 1440 and 1920. Tuned for the 1440 viewport this project
designs against: with the usual px-4 sm:px-8 gutter the content renders 1376px
there, reaching the full 1400 past 1464.

Prose containers are deliberately untouched — max-w-2xl/3xl/[62ch] are text
measure and matter more at this width, not less. Unused scaffolding
(relume-library, the six root *-section components, gallery and demo routes) is
left alone.

Two things the audit turned up that a grep for `mx-auto max-w-*` missed: six
pages write the classes in reverse order (`max-w-6xl mx-auto`), and ten more use
Tailwind's built-in `container`, which silently caps at 1280px at this viewport.

Evidence that width beats padding here: the pricing cards went 270px -> 326px
wide and 528px -> 482px TALL, because two feature lines stopped wrapping. Wider
and shorter at once, and every plan CTA is still above the fold at 1440x800.

Verified 24 routes x {1440, 390}: all 200, zero horizontal overflow, no page
errors, no 1152/1280 container left on any live page. Formatting deliberately
excluded — running oxfmt over src/ rewrites ~485 untouched files to add
semicolons, which belongs in its own commit.

Co-Authored-By: Claude <noreply@anthropic.com>

* site-redesign: adopt max-w-site in the two sections the sweep couldn't reach

The site-wide width commit landed on the pricing branch and converted the
four product components that existed there. The two this branch added
afterwards — the migrations narrative and the feedback blocks, both on
/orm — were invisible to it and stayed at max-w-6xl, so those sections
would have rendered 1152px inside an otherwise 1400px page.

A token cannot retroactively rewrite hardcoded classes in files that did
not exist when the sweep ran, and the merge was clean, so nothing flagged
it. Measured after: every page now shows exactly two container widths,
1400 for content and 1536 for the wrapped-panel shells, matching the
homepage and pricing.

* Move Prisma 8 docs from /next to /v8 and adopt ADR 242 package names

URL rename: the /next version segment (a working-name artifact) becomes
/v8 across all four trees: /orm/next -> /orm/v8, /cli/next -> /cli/v8,
/guides/next -> /guides/v8, and the getting-started tree /next -> /v8.
Content directories moved with git mv; every internal link, url:
frontmatter field, meta.json entry, llms.txt prefix and section slug
(/docs/llms/v8.txt), sidebar matcher, badge-visibility path, and the
version key ("next" -> "v8" in version.ts, the switcher, and the
sidebar tree) updated to match. Permanent redirects cover the old URLs,
including /llms/next.txt; the commented GA cutover map now speaks v8.

Package rename (ADR 242, prisma/prisma#29864): app-facing installs and
imports move from the @prisma-next scope to the consolidated @prisma
facades. Mappings verified against the merged monorepo's converted
example apps and facade export maps, e.g.:
- @prisma-next/postgres -> @prisma/orm-postgres (one dependency)
- @prisma-next/sql-runtime -> @prisma/orm-postgres/family-runtime
- @prisma-next/sql-orm-client -> @prisma/orm-postgres/orm-client
- @prisma-next/mongo-query-builder -> @prisma/orm-mongo/query-builder
- @prisma-next/target-postgres/migration -> @prisma/orm-postgres/target/migration
- @prisma-next/middleware-cache -> @prisma/orm-extension-middleware-cache
- extensions -> @prisma/orm-extension-{pgvector,postgis,paradedb,supabase,arktype-json}
Extension source links now point at prisma/prisma's
packages/3-extensions (verified to exist there).

Unchanged on purpose: the prisma-next bin and prisma-next.config.ts
(the Slack announcement defers that rename to a pre-RC roadmap task),
npm create prisma@next, blog slugs, pris.ly short links, and
prisma/prisma-next repo links whose targets have no equivalent in the
monorepo (retail-store example, planning docs).

Verified: docs types:check, lint:links (0 errors across the moved
trees), lint:agent-ready, test:llm-markdown, lint:spellcheck, pnpm
check; rendered /orm/v8 page with v8 (RC) dropdown and collapsed
sidebar; 308 redirects confirmed for all old-URL forms. Pre-commit hook
skipped; its check command was run manually and passed.

* Apply branding to eclipse

* product-pages: show the product first, and say the stack is swappable

Client review of /postgres, /orm and /compute: the pages explain the
product where the live site demonstrates it, the primary CTA gets lost,
and the platform diagram reads as "you must adopt all of Prisma".

Hero CTA. It sat under the subheadline AND three benefit lines, landing
at 675-757px — below the fold on /orm at 1440x800 — as the same black
pill as the navbar's, so it read as a repeat rather than the page's
action. It now follows a one-sentence subheadline directly, at a new lg
size, with the benefits demoted underneath and a reassurance microline.
Measured: 507-568px, 193x58 against the navbar's 109x36.

Hero visual. Each hero now runs a product tour (product-tour.tsx): a tab
strip over one panel, auto-advancing until a visitor drives it, stopping
for good when they do. Stops share a single grid cell so the frame takes
its tallest stop and nothing reflows or clips. /postgres tours the three
things a bare managed Postgres doesn't give you (branching, Studio,
Query Insights); /orm walks schema -> typed client -> a destructive
migration being refused -> the same client over any database; /compute
walks Connect -> Deploy -> Live -> Templates.

Nine new hero-scale abstractions back those stops. No screenshots — the
existing stylised idiom, carrying far more real detail.

Platform section. Four layers instead of three, each showing what it
swaps out for, always legible rather than hidden behind the interaction,
under a line that states the point in words. The node canvas generalised
from three hardcoded positions to N.

Copy. /orm's hero led with the agent; it now leads with the schema and
the typed client, and Features moves ahead of the migrations argument so
the page says what the ORM is before it argues agent safety. Feature and
problem prose trimmed where a panel now carries the explaining.

Co-Authored-By: Claude <noreply@anthropic.com>

* Apply branding design direction to blog

* product-pages: make the platform section's active layer legible

Clicking a node already drove the section, but the card's response was a
border going from 6% to 14% black — indistinguishable in practice, so
the interaction read as nothing happening. The active card now lifts on
a shadow, its "Swaps for" label goes to ink, and its alternatives get
borders and a white fill while every other card's sit flat and grey.

Co-Authored-By: Claude <noreply@anthropic.com>

* product-pages: rebuild the platform section as a stack you can swap

The card grid said the right thing and nobody felt it — feedback was that
it read as a table and nothing looked clickable. The information design
was the problem: every alternative sat at the same weight as everything
else, so there was no "current" to change and no reason to touch it.

Rebuilt around one mechanic. Each layer has a single slot, and you swap
what's in it: click an alternative and it flies up into the slot on a
shared-layout tween while the current occupant drops into its place. The
motion is the affordance — things move where you clicked, so the control
looks like a control. Hierarchy does the rest: one big lit slot per
layer, alternatives small beneath it.

The argument rides on the mechanic rather than sitting beside it. A slot
holding its Prisma option glows in that product's hue and the pipe out of
it flows; swap it and that stretch goes grey and still. The path dims, it
never breaks. A "Golden path" badge is the scoreboard, so a swap costs
something, and the footer says what each one actually costs — what still
works, and what you now own yourself.

The agent row sits outside the pipeline deliberately: no Prisma option to
pick, every agent equal, highlight cycling on its own.

platform.integrations is gone from the content contract — the layers and
their trade-offs are page-independent, so they live in the component and
only the section's body copy stays per page.

Co-Authored-By: Claude <noreply@anthropic.com>

* product-pages: fix the one-second stall when swapping a stack layer

Clicking an alternative appeared to freeze the control. Measured: no
main-thread block at all (11-18ms per click, zero long tasks) — the
element was going to opacity 0, parking at the OLD bench position for
~1s, then snapping into the slot at ~1500ms.

Cause was the shared `layoutId` between the bench chip and the slot chip.
The two nodes sit in very different parents, and framer treats that
pairing as a crossfade rather than a flight: it drove the incoming
element toward the position it came from and held it invisible until the
tween finished.

Replaced with directional slides, which read the same and are
deterministic — the bench is below the slot, so an incoming pick rises
from below while the outgoing one drops toward the bench it is joining.
The displaced item now animates into the bench from above, and the rest
of the bench reflows with a position-only layout animation.

Measured after: settled at ~200ms, no dead zone, still no long tasks.

The agent row keeps its layoutId — that one is siblings in a single row,
the case shared-layout handles correctly.

Co-Authored-By: Claude <noreply@anthropic.com>

* product-pages: never let the stack reach zero Prisma layers

A stack of Supabase + Drizzle + Vercel is an advert for other people, so
the builder now has a floor. Swapping out the last Prisma layer pulls one
back instead — specifically the longest-ago swap, never the layer just
clicked, since overriding the input someone just gave reads as the
control refusing them.

The restored slot pops so the change never happens where the eye isn't
looking, and the footer owns it in plain words rather than dressing it up
as a technical constraint: "<X> slid back in — we'll swap out any layer,
just not all of them at once."

Verified with a 25-click fuzz over the bench: minimum Prisma layers 1,
zero breaches, and the restored layer was the oldest swap every time.

Co-Authored-By: Claude <noreply@anthropic.com>

* product-pages: drag a layer onto its slot to swap it

Drag was the first reflex reached for, so it should work. Bench items are
now draggable onto their layer's slot; the slot advertises itself with a
dashed outline the moment a drag starts, and anything dropped elsewhere
snaps back. Click stays the primary path — it is the keyboard-reachable
one, and the only one on touch.

Three things this needed, each found by driving it rather than reading it:

- Drag is enabled only for a fine pointer. On touch, framer captures the
  gesture and the page stops scrolling wherever the bench sits under your
  thumb. Subscribed via useSyncExternalStore rather than set from an
  effect, so the server snapshot is a plain false and hydration matches.

- Framer does not swallow the click a drag release fires, and the element
  has travelled under the cursor, so releasing anywhere lands a click on
  it: dropping on empty space swapped the layer anyway. Guarded — but the
  flag has to go up on drag START, because onDragEnd runs after the click.

- That guard is cleared on the next pointerdown, not on a timer. A first
  attempt cleared it inside onClick, which never ran after a successful
  drop (the button unmounts), so the flag survived and swallowed the next
  click on a different option.

Verified: drag swaps, cross-layer drops do nothing, drops on empty space
do nothing, click still works after a drag, the no-zero-Prisma floor
holds through drags as well as clicks, and touch renders no drag handles.

Co-Authored-By: Claude <noreply@anthropic.com>

* product-pages: stop announcing the no-zero-Prisma rule

The footer said "<X> slid back in — we'll swap out any layer, just not
all of them at once." That tells the visitor the control is rigged to
protect us, which is the precise opposite of what this section exists to
argue. My call and a bad one.

The floor still holds; it is just quiet now. The footer always answers
the choice the visitor actually made — their pick did take effect, and
it is the only thing they are expecting a response about. The restored
layer runs the same exchange animation as any other swap, so it reads as
the stack rebalancing rather than as a correction, and the attention-
grabbing pop on the restored slot is gone with it.

Left a comment at the rule so nobody helpfully explains it again.

Co-Authored-By: Claude <noreply@anthropic.com>

* product-pages: make the hero tour one card, and firm up the hero bullets

The tour was three loose pieces sitting on the hero background — a tab
strip, a caption, and a framed panel. Now it's a single card: the tabs
are its header on a tinted track, each stop sits flush inside, and the
caption closes it on a matching track. Reads as one instrument, and the
stop's own window chrome under the tab strip gives it a browser-ish
logic — tabs above, the surface below.

That meant the chrome had to move up a level, so HeroPanel is now flush.
Those panels only ever render as tour stops, so nothing else is affected,
and database-panel / schema-file / deployments finally use HeroPanel
instead of each repeating its wrapper inline.

The caption stacks every stop in one grid cell rather than relying on a
min-height. A fixed height only holds until a caption wraps to an extra
line at some viewport: measured, /orm was resizing the card by 7px
between tabs. All three pages are now pixel-identical across every tab.

Hero bullets go back to their original weight. It was the position that
was pushing the CTA below the fold, not the type, and below the CTA they
can carry weight without competing with it.

Co-Authored-By: Claude <noreply@anthropic.com>

* docs: prism rebrand — token pass + reading-sheet shell

Retheme apps/docs to the site-redesign (prism) direction, matching the
eclipse/blog rounds, in two passes:

Token pass: Sora/Inter/Mona-mono via next/font/local (Barlow and the
MonaSansVF display registration removed), the paired :root/.dark
shadcn-variable remap onto eclipse tokens, floating-morph header inside
the sticky notebook grid, prism-hued Prisma Next banner (animation kept),
OG route on ink + Sora, component/asset de-teal.

Composition pass (the reading sheet): grain-textured paper ground, the
article floating as a rounded sheet, sidebar/TOC directly on paper with
sheet-white active pills, CF headline scale, and the ported prism-ray
crossing behind the panels (negative-z under an isolated grid).

Functionality preserved: search, version switcher, AI chat, theme
toggle, agent-readiness surface (llms.txt/llms-full/skill.md/.well-known)
byte-identical.

* docs: landing hero prismatics + shell polish from the review findings

Make the report's outstanding items real:

- Getting-started hero takes site-redesign's hero grammar inside the
  sheet: spectral washes bloom behind the stack column, the structural
  prism ray crosses behind the card, and the card gets the reference's
  conic spectrum halo (theme-tuned opacities). Primary CTA becomes the
  ink pill — cyan stays accent, ink carries the action.
- Sidebar 'Prisma Next' card: old-brand navy/indigo raster replaced by
  a brand-drawn tile (ink panel, hero-intensity triple-band ray,
  wordmark) — on-palette by construction; OG-image fallback skipped
  for visual slides.
- Mobile TOC popover goes fully opaque when open (page no longer
  ghosts through the rows).
- Mobile drawer gets a dedicated Theme row: the custom sidebar footer
  (banner carousel) swallowed the ThemeToggle children, leaving mobile
  with no theme control.
- AI chat drawer: aria-labels on copy/clear/close/feedback buttons;
  Escape closes the drawer.

* site-redesign: port real pages from the old site

/customers (case-studies), /company (about), /company/careers, /changelog
(53 MDX entries via next-mdx-remote), /legal/{privacy,terms,sla}, /support,
/community, plus an interim /stack reusing the homepage bento. All rebuilt
in the redesign language; CF placeholder routes they replace removed.
Changelog entry images still serve from the live site (78MB not duplicated).

* Apply eclipse branding to docs chrome

Sora display / Inter body via eclipse's fonts (Mona Sans override removed),
shadcn+fumadocs shell variables remapped onto eclipse tokens for light and
dark, sidebar on the paper surface, and the new full-color logo lockup.
Scoped to apps/docs; packages/ui and eclipse untouched.

* chore: oxfmt formatting sweep and dev launch config

Formatting-only churn from running pnpm check across the repo (line
wrapping and indentation; no semantic changes), plus blog/site-redesign
dev server entries in .claude/launch.json.

* site-redesign: complete the old-site page set

/programs hub with startups, partners, and oss-friends subpages (Tally
forms linked, not embedded), /enterprise condensed from the old page,
/demo replaced CF's dead-end form with Prisma's real live demos.
Footer now points Trust Center / Status / Data Guide at their real
external homes; sitemap lists real routes only; legacy paths
(/about, /careers, /case-studies, /privacy, /terms, /sla, /startups,
/partners, /oss-friends) 308 to their new locations. Em dashes swept
out of page copy per content style.

* Update blog and docs favicons to the new brand mark

Same prism icon set the redesigned site uses: multi-size favicon.ico,
icon.svg, and apple-icon.png, served under each app's basePath.

* Pull the docs design treatment into the blog

Docs accent language on all interactive elements (cyan accent wash on
chip/pagination/popover/series hovers), the docs' cyan TOC rail restored
(it was force-overridden to grey), dark-mode cards lifted to the docs
card surface, and the footer seated on paper with a top hairline. Also
flushes a stale pre-rebrand CSS compile the dev server had been serving,
which was hiding the existing blog branding locally.

* site-redesign: review fixes

Remove the /demo page (calculator-options playground stays), show the
/company team photos in a full grid instead of an edge-clipped strip,
and add /legal/security-and-compliance (footer linked it but it 404'd) —
claims sourced from the pricing spec table, reports via the Trust Center.

* site-redesign: re-sync copied content after merging main

Privacy policy picks up main's Aug 7 DPF-renewal update, and the two
changelog entries main added (2026-07-24, 2026-08-02) join the copied
set. Terms and SLA were unchanged on main; no other ported source
pages moved.

* Rebrand the content-create-hero-image skill to the 2026 brand

Light paper surfaces with spectral prism washes replace the dark teal
aurora; Sora 500 / Inter / Mona Sans Mono replace Mona Sans 800 / Geist
Mono; kicker dot + sentence-case label replaces the uppercase dash
eyebrow; product accents remap to prism cyan (ORM/Prisma 8), yellow
(Postgres), red (Compute). New tokens.json, design-system.md, template,
variable-font embeds, and the new lockup/mark bundled. Legacy assets
kept, marked structure-reference-only.

* blog: regenerate the seven most recent 2026 covers in the new brand

Compute public beta, schema-as-LLM-context, infraslopture, local-to-
production, agent-can't-drop-prod, CipherStash, and Object Store buckets
all move from the dark Eclipse style to the rebranded covers (paper
surface, prism accents, Sora). Each keeps its post's real data in the
module; the compute post's hero switches from raster to the SVG standard.

* Merge the redesign into apps/site as the one marketing app

apps/site now carries the 2026 rebrand directly: the redesign's layout
(Sora/Inter, new Header/Footer, light theme) becomes the root layout,
with the production analytics stack intact — CookieYes consent, GTM,
Tolt, PostHog via instrumentation-client (verified loading), UTM
persistence, structured data, and the llms.txt / skill.md / api / og
infrastructure untouched. All rebuilt routes replace their old
implementations; absorbed pages 308 (/showcase→/customers,
/client|/typedsql|/migrate→/orm) alongside the earlier rebrand
redirects. CF scaffolding routes and the relume kit are dropped.
pricing-data moves to lib/ for the llms endpoints. apps/site-redesign
is deleted; not-yet-rebuilt pages (studio, mcp, query-insights, events,
ecosystem, newsletter, prisma-with, support-policy, code-of-conduct)
keep serving under the new shell pending their restyle.

* site: drop CF's relume component-gallery route

/components imported the deleted relume library and broke the
production build (dev never compiled the route). Full next build now
passes locally, all 122 static pages.

* site: restyle the last nine legacy pages into the 2026 brand

Every page now ships in the new design system: /studio and
/query-insights (yellow accent, ink-framed dark mockups, feature rows),
/mcp (cyan; agents grid, ink config/prompt cards, capabilities),
/ecosystem (static grouped package cards), /events (red; meetups,
sponsored, past), /newsletter with restyled signup and unsubscribe,
/support-policy (new-language tables), /event-code-of-conduct on the
legal shell with main's Aug 7 SF-event strengthening merged in, and all
twelve prisma-with SEO pages via their six rebuilt shared sections.

Analytics parity restored on the new components: PrismButton,
PrismButtonOutline, and the header CTAs now fire the cta_click GTM
event for console destinations exactly as ConsoleCtaButton did, keeping
the GA4 + Google Ads conversion series alive (UTM decoration already
rides the document-level persistence listener). createPageMetadata
emits absolute titles so the root template stops double-branding.
Full production build passes: 122/122 static pages.

* site: fix unreadable code blocks — shiki theme lost its palette

The custom prisma-dark shiki theme colored tokens with eclipse CSS
variables that died with the old global.css, so every token rendered
in one dark grey on the ink cards (visible on the prisma-with pages).
The theme now uses concrete new-brand values: cyan #7be7f0 keywords
and types, yellow #f8da85 strings and functions, red #ff9fa4 numerics
and parameters, #d5d5d4 plain text, #646567 comments.

* blog: pull the docs landing's prismatics into the index

The docs got Shane's prism-ray hero treatment; the blog index now
speaks the same language. PrismRay ported (API-identical to the docs
and marketing-site copies), spectral washes bloom behind the centered
title with a whisper ray gliding beneath the subtitle, and the
featured-series card takes the docs path-card treatment: corner prism
washes plus a whisper ray under the copy, replacing the flat card-wash
fill. Both tuned down in dark mode.

* blog: one prismatic moment per view, not two

Review caught the hero ray and the featured-card ray rendering as a
near-identical duplicate at desktop width, both crossing content (the
filter chips, the card copy). The hero keeps only its spectral washes:
a diagonal band cannot safely cross centered text at every breakpoint.
The featured-series card carries the page's single ray as a structural
corner bleed clipped by the card's own bounds, top-right where text
never reaches, echoing the cover-art corner stripes on the post below.
Card description capped at 72ch so copy never chases into the corner.

* covers: in-situ learnings — lockup sign-off, thumbnail legibility, dual-surface

Reviewing the seven covers inside the blog grid (light and dark)
surfaced rules the skill now encodes: covers render ~400px wide beside
the post's real title on both white and ink cards, so the headline must
be a compressed thesis (never the title restated), kickers are 20px or
omitted, critical elements stay inside a 72px crop-safe margin that
survives the cards' 16:9 object-cover crop, washes run a step stronger
so artwork carries color at small sizes and on dark, and the sign-off
is the full-color lockup, which reads at thumbnail scale where grey
wordmark text vanished.

All seven covers regenerated to the new rules: lockup inlined in the
clear corner, kickers at 20px with larger dots, wash stops +0.05.

* covers: rebrand every 2026 blog cover to the 2026 brand

All 60 posts from 2026 now carry new-brand cover art: light paper
surfaces with spectral prism washes, Sora headlines, the full-color
lockup as sign-off, and one product accent per cover (cyan for ORM and
Prisma 8, yellow for Postgres, red for Compute). The retired dark teal
aurora, Mona Sans display, and Geist Mono are gone from the set.

Authored as 54 new hand-built SVGs plus the seven improved earlier, with
a distinct visual module per cover: replacement diagrams, ink code and
terminal cards, benchmark bars, migration graphs, pub/sub and
provisioning flows, DNS and pricing tables, evaluation matrices, a bloom
bit-array, a clock-drift plot, deploy-tile grids, an IA tree, docs-search
and query-insights panels, and editorial pull-quotes. 17 carry no
headline at all. Every figure, command, and label is sourced from its own
post; where a post had no measured number the module is structural rather
than invented, and those cases are noted in the PR.

Frontmatter repointed on 53 posts (heroImagePath, metaImagePath, rewritten
heroImageAlt) and 27 superseded rasters deleted after confirming each was
referenced only by its own frontmatter. Body images left untouched.

Skill updated with what the batch taught: xml:space="preserve" is not
inherited from a wrapping <g> in Chrome, so code indentation collapses
silently and only shows in the raster; the SVG size target was
unrealistic (30-55KB typographic, 55-75KB code-heavy); and covers must be
judged at grid-thumbnail scale on both light and ink cards, which is why
kickers are now 20px minimum and the lockup replaced the grey wordmark.

* product-pages: fix what /review found in the stack and the tour

Five real defects, four of them mine from this batch.

Keyboard activation was dead after any drag. `didDrag` suppressed the
click a drag release fires, but it was only cleared on pointerdown — and
keyboard activation never fires pointerdown. Drag a bench row off-target
and every subsequent Enter/Space on the whole control did nothing.
Reproduced in a browser, then fixed by scoping the flag to the drag
itself: raised on drag start, dropped on drag end, which brackets exactly
the one click that needs suppressing.

Focus was lost on every keyboard swap. Activating an option unmounts it
(it moves into the slot), so focus fell to <body> and the next Tab
restarted from the top of the page. The slot now takes focus, but only
when the click came from the keyboard (detail === 0).

The section had no links at all. The card grid it replaced carried a
"Learn more" per product; without it this section — and so /orm and
/compute entirely — had no in-body link to a sibling product page. Each
slot now links out while it holds its Prisma option.

The tour announced itself as ARIA tabs while implementing none of the
pattern: no ids, no aria-controls, no aria-labelledby, no arrow keys.
Wired up, with roving tabIndex and Arrow/Home/End.

The dwell bar desynced on hover. Pause was a ref, so the bar kept
tweening while the tour stood still and sat full under a stop that wasn't
advancing. It's state now, and the timer restarts per stop so dwell
always measures from when the stop actually became current.

Also removed a `??` fallback in the floor rule that was both unreachable
and wrong — its only branch could return -1 and assign next[-1], leaving
zero Prisma layers, the one thing the rule exists to prevent. And
`hero.tour` is now length-checked, not truthiness-checked: `tour: []` is
truthy and rendered a tour whose `% 0` is NaN.

Co-Authored-By: Claude <noreply@anthropic.com>

* site: match the console host exactly for cta_click, not by substring

CodeQL flagged the substring test in PrismButton and it was right:
href.includes("console.prisma.io") also matches
https://evil.com/?next=console.prisma.io and
https://console.prisma.io.evil.com, so the conversion event could fire
on a non-console link and pollute the GA4/Ads series this tracking
exists to preserve. Parse the href and compare the hostname instead.

Also fixes a latent throw: the old code called new URL(href) on the
label fallback path, which raised on a relative href that happened to
contain the substring. Parsing with a base handles relative hrefs and
rejects them correctly.

* docs: point the spellcheck ignore at the moved error reference

The Prisma 8 rebrand moved the generated error reference from
orm/next/reference/ to orm/v8/reference/, but cspell's ignorePaths still
named the old location. The file was silently pulled into the spellcheck
set for the first time and failed on four technical identifiers it has
always contained: the CONTRACT.CHECK_OPTOUT_INVALID error code, the SQL
keyword in WITH ORDINALITY, and the bigintnumber / unboundedint codec ids.

Repointing the ignore is the right fix rather than adding those words to
the dictionary: the file is generated and synced from the engine repo, so
every future sync would otherwise introduce new codec ids and error codes
that fail the same way. Spellcheck is green locally, 783 files checked.

* chore(docs): sync Prisma 8 error reference

prisma/prisma main gained CONTRACT.CHECK_NAME_RESERVED and
CONTRACT.CHECK_ON_STI_VARIANT with the @@check feature commit, one minute
after this branch's last green run of the completeness check. That check
re-clones prisma/prisma on every run, so the page drifted out of date
without anything in this PR changing.

Regenerated with the same generator the sync bot runs
(apps/docs/scripts/generate-error-reference.mjs), which also picks up the
two upstream description edits that now mention CHECK constraints. 279
codes, matching the verifier's count.

* contact: build /contact from the approved copy

Hero (homepage wrapper, copy left, form right), three support channels,
CtaBurst as the closer. Copy verbatim — no words added or removed, which
is why two things look the way they do: the topic select has no
placeholder (its label already says it, and printing the sentence twice
was worse), and submitting shows the dashed TBC badge instead of an
invented "thanks, we'll be in touch".

The hero's wash is product-hero's calibration, not the homepage's. At
this panel height (~870px vs the homepage's 1222px) the homepage values
bloom up behind the headline and cost the subhead its contrast.

Discord has no Forma Thin glyph and its brand mark only ships solid,
which reads twice as heavy as the Github outline beside it, so the
simple-icons path is stroked at 1 unit to match how Forma draws its own
outlines.

The hero proof stats moved to siteConfig.proof, shared with the homepage
hero — they were already duplicated twice and the star count dates fast.

Still needs Prisma: the form confirmation copy, an endpoint to post to,
and /docs, which "Read the docs" points at and which doesn't exist yet.

Co-Authored-By: Claude <noreply@anthropic.com>

* feat(site): add /templates directory page in the new brand

Ports the template directory from codex/dr-8815-template-directory,
keeping its data layer (prisma-examples manifest fetch, zod validation,
5-min revalidate, graceful empty state) and rebuilding the UI in the
2026 brand: framed Texture hero with a compute-red wash, RoleKicker,
PrismButtonOutline card CTAs with console cta_click tracking, and a
Templates link in the footer Resources column.

* contact: announce the form's confirmation state

Submitting replaces the whole form, so a screen reader announced nothing
and focus died with the submit button, falling back to <body>. Found by
/review. Nothing else on the site swaps a form for a confirmation yet, so
this is the precedent.

Co-Authored-By: Claude <noreply@anthropic.com>

* feat(docs): add Prisma Composer section and move Prisma 8 CLI docs to the unified CLI

Adds a top-level Composer docs section (15 pages, Early Access): quickstart,
concepts (apps/modules, contracts, service input, databases, object storage,
building blocks), workflows (local dev, testing, deploying, porting), and
reference. Registered in the root meta.json, the navbar, and llmsSections.

Rewrites the cli/v8 tree from the standalone prisma-next binary to the
unified Prisma CLI (npx @prisma/cli@next until the prisma@next tag lands),
with command surfaces verified against 8.0.0-rc.2: init becomes orm init,
migration apply becomes migrate, migration ref becomes ref.

Composer commands were tested end to end locally (dev, log, watch-restart,
service-key 401s); deploy wording follows the composer repo guides.

* docs(v8): move guides, quickstarts, ORM, and Studio pages to the unified CLI

Replaces prisma-next invocations with npx @prisma/cli@next across the
Prisma 8 getting-started funnel, add-to-existing-project and import
guides, the ORM v8 concept/migrations/contract-authoring trees, the
Studio Prisma 8 page, the Deno guide, and the agent prompt blocks,
applying the verified command renames (init -> orm init).

Left untouched on purpose: quoted CLI output (the bundled toolchain
still prints prisma-next in hints), skill names, repo and blog URLs,
prisma-next.config.ts / prisma-next.md file names, and listings of
scaffold-generated files, which orm init still emits in that form. The
generated error reference is owned by the upstream sync.

* docs(v8): move Compute and blog to the unified CLI, consolidate skills, version the CLI section

Compute: rewrites the section around the unified CLI's real surface
(verified against @prisma/cli@next 8.0.0-rc.2): app -> service +
service deployment/domain, database -> postgres, the new bucket group,
and the changed deploy model, where deployments come from a git push,
the Console, or Composer rather than a CLI app deploy, and promote
rebuilds with production env vars. Drops the beta-only error-code
tables in favor of the verified dotted-code envelope.

Blog: swaps prisma-next invocations to npx @prisma/cli@next in the
four posts that show runnable commands.

Skills: the twelve prisma-next-* skills were consolidated upstream
into one prisma-8 skill in prisma/prisma/skills; updates the skills
page (install command and table) and every Prompt-your-coding-agent
section to reference prisma-8.

CLI versioning: the CLI section's version dropdown now lists v6, and
any pre-v8 selection resolves to the classic prisma CLI tree instead
of jumping to that version's ORM docs.

The /prisma-compute/deploy funnel page keeps the old flow on purpose;
it is being rebuilt around Composer in a parallel stream.

* docs(compute): move the deploy quickstart to the unified CLI's push flow

Rewrites /prisma-compute/deploy around the real deploy model: init +
project create + git connect, then push, with service show/open and
build logs for verification and promote/rollback for shipping. The
create-prisma path now hands off to the GitHub connection instead of
the removed app deploy loop, and the agent prompt teaches the new
command set.

* feat(site): highlight Object Store buckets on /compute as a fifth feature

* docs(compute): add the Object storage page for Object Store buckets

* docs(compute): fix the broken endpoint table and flatten the voice on Object storage

* brand: update logo assets to the more-spacing revision

New kit widens the gap between the prism mark and the wordmark, and the
white gaps between the mark's three color bands. Applied everywhere the
current-generation logo appears:

- lockup SVGs in site/docs/blog public/logo (background rect stripped
  for transparency; full-color-white derived from full-color since the
  kit doesn't ship a color-mark + white-text variant)
- favicons (src/app/icon.svg) in all three apps
- inline PrismaMark in platform-stack.tsx
- hero-image skill logo templates
- intrinsic img dims updated for the new 264x67 canvas

Left as-is: prisma-footer-* (separate stripes-and-rays treatment, no
mark), historical blog hero images, and the legacy triangle-era logos
in eclipse and docs/public/img.

* feat(site): replace trusted-by strip with verified customer logo carousel

Swap the tech-partner tiles for wordmarks of companies verified as Prisma
users (customer stories, Slack confirmations, and the previous homepage's
customer wall): Cursor, Reddit, Okta, Lush, ClickHouse, Cal.com, Accenture,
Dub, Rapha, Gamma, Kapa.ai, Documenso, Elsevier, Grover, Formbricks,
Papermark, Inbox Zero. Every SVG is viewBox-cropped to its ink so the
per-logo pixel heights give equal optical mass on one centerline, and the
marquee slows from 45s to 100s per loop.

* feat(site): redesign testimonials as counter-drifting quote marquee

Replace the blurred three-card queue with two slow marquee rows of quote
cards moving in opposite directions, reusing the logo carousel's keyframes
and edge fades so the page shares one motion vocabulary. Twelve verbatim
quotes (case studies plus showcase voices like Cal.com, Gamma, and
Stellate), six unique per row so nothing repeats within a viewport; hover
pauses both rows and reduced-motion falls back to scrollable rows. The
component is now a state-free server component.

* Copy adjustment and banner spacing

* Update favicons/logos

* fix: page layout when banner add to the page

* fix: add presign to docs spellcheck dictionary

* fix: update bucket CLI link to new cli/v8 reference page

* fix: rebrand sidebar banner wordmark to Prisma 8

* Docs IA restructure: drill-in sidebar, REST API rename, CLI consolidation, Storage (#8154)

* docs: vertical drill-in sidebar, Build/Deploy/Manage/Reference IA, REST API rename

Replace the horizontal top tab strip with a Vercel-style left sidebar: a
grouped "All docs" view (Start, Build, Deploy, Manage, Reference) that
drills into each section's tree behind an always-visible "All docs" back
link. The docs root pairs the top-level menu with the Get started content.

Rename Management API to REST API (folder, generator, openapi key, llms
prefixes, postman collection, CI workflow) with wildcard redirects. Move
the Composer CLI reference to cli/v8/composer with a redirect. Reorder the
root meta, drop the dangling "platform" entry, list console, and refresh
section icons.

Sidebar and TOC states use new global spectrum styles (hover fade-in text,
active ring, gradient TOC thumb) built on the brand gradient tokens. Adds
apps/docs/AGENTS.md recording the Reference/Concepts/Guides taxonomy and
page-move mechanics.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* docs: CLI reference regroup, Storage section, spectrum nav states

Regroup the v8 CLI sidebar (Platform/ORM/Migration/Utility, alphabetised),
rename the overview and configuration pages, extract Global flags to its
own page, and replace the overview's command tables with prose entry
points and per-product workflows. Fold the Composer and Compute CLI
pointer pages into the v8 reference with redirects.

Add a top-level Storage section documenting object-store buckets from
verified CLI/REST/control-plane sources, wired into the sidebar, root
meta, and llms sections. Rename Local development to Local Postgres and
surface it in the Manage group.

Unify sidebar/TOC states on the spectrum styles (fading gradient hover,
ring select, gradient TOC thumb), drop the legacy blue depth rail and
folder-trigger hover wash, and remove the white background from the
favicon SVG.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* chore: drop formatter-only churn in apps/site

Repo-wide oxfmt run swept eight apps/site files into the docs branch;
restore them to the base branch state to keep this PR docs-only.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* docs: address PR review findings

Gate the sidebar top-view focus handoff on an explicit back-press so an
ordinary page load does not steal keyboard focus. Rename the sample
GitHub Actions workflow file to match the REST API naming and hyphenate
"real-world" in the partner integration guide.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* docs: scope sidebar focus handoff to the visible surface

Both sidebar surfaces (desktop aside, mobile drawer) render the top view,
and the hidden aside could consume the shared back-press focus request on
mobile. Gate consumption on the container being visible, and void pending
requests on navigation so a later mount cannot inherit one.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* docs: say "Build an app" on the Get started page

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>

* chore(site): oxfmt formatting sweep

* site: port /brand-kit brand & press kit from cf/development

Brings over the agency's press-kit stream (CF PRs #12–#14): the /brand-kit
page, its components (incl. the Prismo mascot section), the downloadable
asset library under public/brand-kit (~20MB incl. prisma-brand-kit.zip),
the smooth-scroll anchor behavior it relies on, and the Download glyph
grafted into the existing forma icon set.

* site: adopt cf/development's transparent favicons and all-white full-color-white logo

Favouring the agency's versions over ours per launch decision: transparent
icon.svg (white bg rect removed), regenerated smaller favicon.ico and
edge-to-edge apple-icon.png, and the all-white mark in full-color-white.svg.

* site: restore /demo request flow from cf/development

Restores demo/page.tsx, the multi-step demo-form, and /demo/thank-you that
were dropped in the site-redesign→site merge (calculator-options kept the
site's evolved version). Thank-you links remapped to routes that exist here:
/features→/orm, /case-studies→/customers. Note: the form is still front-end
only — it captures no submission and never navigates to /demo/thank-you.

* docs: rebuild the Get started page around the Build and Deploy workflow

The hero is now two linked panels (Build: local development, Composer,
ORM; Deploy: Compute, Storage, Postgres, deploy) with a one-CLI callout,
replacing the stack diagram and the condensed tutorial tabs. Tiles get
the sidebar's spectrum ring and text on hover, the cool gradient's edges
move from cyan to purple, Storage gets a custom bucket icon, and nested
sidebar rows no longer overlap the indent guide line.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* docs: address Composer tutorial feedback for Bun workspaces

Add a Bun-workspaces note to the Composer quickstart (alchemy and
@prisma/dev must be direct dependencies under isolated installs), state
the effect pin value up front instead of sending readers into
node_modules, and make the local docs base URL respect PORT.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* site: price Compute alongside Postgres on the pricing page

Compute GA: the pricing page now covers both products as equals.

- Plan cards: symmetric labelled groups per card — Prisma Compute
  (included allowance), Prisma Postgres, and Platform (spend limits,
  compliance)
- Compare-plans table: new Prisma Compute group with included/overage
  row pairs at the GA meter rates; "Database usage" renamed
  "Prisma Postgres" and Monthly price hoisted above the product groups
- How-it-works and FAQ copy updated for GA (no more beta hedging);
  egress answer scoped to Postgres now that Compute bills bandwidth
- Meter rates added to pricing-data.ts and the llms surfaces

⚠ Compute *included allowance* numbers in the cards and table are
placeholders to establish the format — real figures TBD (rates are
the confirmed GA meter prices).

* Deploy-first Getting Started: quickstart rewrite, Local Development section, Start menu group (#8160)

* Getting started reorder, Composer-first deploy quickstart, Local Development section

- Getting Started sidebar: Prisma Compute and the deploy quickstart move above Prisma 8
- Deploy your first app: rewritten Composer-first with two paths (from scratch, existing app)
- New top-level Local Development section (local app on Bun, local storage, Local Postgres moved from Postgres with redirects and inbound links updated)
- Sidebar groups: Local Development under Build, AI under Reference
- TEMPORARY: docs dev server on port 3002 for this worktree; revert before merge

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* Start sub-group, tutorial move to /full-stack-tutorial, top-level menu polish

- Getting Started section: explicit Start sub-group (Get started, Deploy your
  first app, Deploy the full Prisma stack), sub-group order Start / Prisma 8 /
  Prisma 7 / Prisma Postgres
- Tutorial moved to /full-stack-tutorial, retitled "Deploy the full Prisma
  stack", badge dropped; redirect and inbound links updated, llms v8 prefix added
- Get started hero wired to /local-development and /prisma-compute/deploy
- Top-level menu: "Deploy your first app" + tutorial in Start, Console first in Manage
- Docs dev port restored to 3001

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* Address CodeRabbit review: card title consistency, Composer injection vs hand-wired config

Rename the tutorial cards to match …
ankur-arch added a commit that referenced this pull request Aug 25, 2026
)

* Add apps/site-redesign: CF marketing site rebuild, starting with the approved homepage

Self-contained workspace app carrying its own toolkit (Next.js 16,
Tailwind v4, React 19) so the redesign can evolve without touching
apps/site or the shared packages. Snapshot of the client-approved
homepage from the CF prototype repo (its PR #7). Refs #1

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* site-redesign: product page template + postgres page using it

Generic product page template (hero, problem, features, platform
cross-sell, CTA) from the prototype repo's approved outline, plus the
new brand components it introduced (GlassGlide, IconTile, LearnMore)
and the /postgres page built on it. Copy slots are placeholders until
each product's copy is approved. Refs #2

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* site-redesign: pricing page WIP — hero, how-it-works, includes strip

From the V2 copy doc; sections past these are blocked on the client's
answers to the open copy questions. Refs #5

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* site-redesign: pricing page built out from the approved V2 copy

Completes /pricing against the V2 copy doc: plan cards, calculator,
comparison, testimonials, CTA and FAQs, plus the fixes needed to make the
app build in production for the first time.

Pricing data — every figure confirmed by Gregory and cross-checked against
the live prisma.io/pricing page and its calculator:
  - Business gains an operations overage rate ($0.0010 per 1,000), which V2
    listed for Starter and Pro only
  - Business storage overage is $1.00/GB, taken from the live page. The
    calculator previously carried $1.50/GB copied from Pro, which
    overcharged every Business storage estimate
  - "No connection limits" removed — pooled limits do exist (10/100/500/1000)

Calculator rebuilt to match the live one: quick-start presets, an
operations slider that also reports estimated SQL queries (5x), monthly and
annual billing (-25%), and all three paid plans priced with the cheapest
recommended. Verified figure-for-figure against prisma.io/pricing.

Design system:
  - RoleKicker promoted out of stack-bento into a shared brand component and
    documented in /brand as the standard tagline. Four uppercase, letter-
    spaced eyebrows that never matched the homepage are now kickers
  - --paper added as an opt-in resting surface. --card is unchanged, so no
    other surface on the site moves

Build fixes, all pre-existing:
  - react-icons was never installed, so the relume-library scaffold failed
    with 983 module-not-found errors and no production build could succeed
  - button.tsx failed type-checking on a Slot/button handler union
  - badge.tsx needed "use client" — its radix-ui Slot import calls
    createContext, which 500'd every server page importing Badge (/brand)

Mobile: hero grid children were 25px wider than their track and clipped by
the panel; slider hit areas were 24px against a 44px touch minimum.

allowedDevOrigins set so the dev server can be opened over the LAN.

Co-Authored-By: Claude <noreply@anthropic.com>

* site-redesign: align pricing section widths with the homepage standard

The how-it-works, plans and calculator sections carried their horizontal
padding inside the max-w-6xl container, so the 1152px box was 1088px of
content plus 32px of padding — content sat 32px in from where it should and
ran 64px narrow.

Padding now sits on the <section> and max-w-6xl is the content box, matching
how-it-works.tsx on the homepage ("Ship a production TypeScript app in three
steps"), which is the standard for unwrapped sections. All three now measure
1152px starting at x=224, identical to the reference.

Co-Authored-By: Claude <noreply@anthropic.com>

* Rebrand Prisma Next to Prisma 8 across docs, blog, and site

The early-access major version keeps its working-name identifiers but is
now called Prisma 8 everywhere users read it:

- All prose, frontmatter, changelog entries, and UI labels (docs version
  dropdown now "v8 (Early Access)"; sidebar matchers keep URL fallbacks).
- Reworded ~35 now-redundant "becomes Prisma 8 at GA" sentences and the
  announcement post's naming section; added a one-line editor's note to
  the nine posts that were about Prisma Next under its working name.
- Replaced 14 images carrying the old wordmark: outlined badge/headline
  text in the teal covers swapped for live Mona Sans text, the indigo
  announcement family (incl. roadmap, TS-migrations, EA meta and the
  docs sidebar banner) rebuilt from the announcement SVG, and metas
  re-rendered from their heroes. Hero-image skill logos renamed to
  prisma-8-*.
- Fixed 27 links pointing at renamed heading anchors.

Deliberately unchanged (product-owned identifiers and live URLs):
create prisma@next npm dist-tags, the prisma-next CLI and config file,
the @prisma-next/* npm scope, /docs/orm/next URL segments (GA cutover
plan in next.config.mjs), published blog slugs, pris.ly/pn-* links,
Discord #prisma-next channels, and the EA banner CSS selectors that
PostHog CTA actions target.

Verified: types:check (docs, blog), lint:links, lint:agent-ready,
test:llm-markdown, lint:spellcheck, pnpm check, plus rendered-page and
image review on dev servers. Pre-commit hook skipped (pnpm is not
callable in this non-interactive shell); its check command was run
manually and passed.

* Reframe Prisma 8 status from Early Access to Release Candidate

Everywhere the site describes Prisma 8's current stage now says the
Release Candidate is available instead of Early Access:

- Docs: the EA banner, the version dropdown ("v8 (RC)"), section
  meta.json titles, llms.txt topics, the standard "Prisma 8 is in Early
  Access" callout on nine pages, and status prose across the next tree.
- New "release-candidate" badge type (badge-types.ts drives the zod
  enum, label, and color maps); the 41 Prisma 8 pages switched to it.
  Other products keep the early-access badge (e.g. the Postgres
  serverless driver) and the generic maturity-tier docs are untouched.
- Blog: the "Looking ahead" footers, per-post status notes, and
  pris.ly/pn-ea link text; site stack page descriptions.

Kept as historical artifacts: the Early Access announcement post
(title, slug, cover, body), launch-story references to it, dated
changelog entries, the April roadmap metaDescription, and every other
product's Early Access mentions.

Verified: docs types:check, lint:links, lint:agent-ready,
test:llm-markdown, lint:spellcheck, pnpm check, and rendered-page
checks on dev servers (banner, dropdown, callouts, footers, ltree
heading). Pre-commit hook skipped; its check command was run manually
and passed.

* site-redesign: pricing corrections from Shane's review

Shane Neubauer's feedback (2026-07-29), which also corrected several things
their own live pricing page currently gets wrong.

Corrections applied:
  - No annual billing. The monthly/yearly toggle and the 25% discount are
    removed — their live page offers annual, and Shane confirms they don't.
  - The "5x SQL queries per operation" readout is a stale technical detail
    that is no longer true. Removed; the caption now reads 1 query =
    1 operation.
  - "Most popular" moves from Pro to Starter, to anchor on the lower price
    rather than making Prisma read as more expensive than Vercel. This
    overrides the approved V2 copy, which puts it on Pro.
  - Free states that it is free forever.

Calculator recommendations were broken: with the presets copied from the live
calculator (12M / 36M / 84M ops) every preset recommended Pro or Business, so
Starter was never recommended and Free never appeared at all. Presets are now
100K/0.5GB, 1M/8GB and 20M/40GB, which recommend Free, Starter and Pro
respectively, and Free is priced alongside the paid plans instead of being
excluded — it goes "Not available" above its caps.

New detailed spec table (Shane: "these tend to be quite important for our
users"; also the full limits table Ankur asked for). Rows and values come from
their live "Compare plans" table so the structure matches what their users
already know.

Anything not confirmed is a visible TBC placeholder rather than a guess:
  - Supabase comparison column — Shane asked for it, no figures supplied
  - Free-tier backup retention — absent from their own table
  - Support tiers — live page says Standard/Premium, Gregory's notes said
    24h/2h response times
  - Global cache rows — published as a Postgres feature, but Gregory said
    Accelerate is being deprecated
Placeholders render as a dashed TBC badge, deliberately distinct from an em
dash, which means "not included on that plan".

Still outstanding: the plan cards are not above the fold, and the $385-450 vs
$70-90 comparison figures and "up to 5x" claim remain unverified.

Co-Authored-By: Claude <noreply@anthropic.com>

* site-redesign: pricing reorder, comparison rework, responsive spec table

Plan cards move directly under the hero so the prices are reachable without
hunting for them (Shane's ask). This does not fully satisfy "visible without
scrolling" — measured, the cards still start 182px below the fold at 1440x800,
and reordering alone cannot close that: below the 100px fixed header there is
700px of room and the card block is 605px, leaving 95px for the whole hero.
Finishing it needs the hero compacted, which costs approved V2 copy and so
needs a copy decision.

Comparison section: the price gap is the argument, so it is now drawn — cost
bars scaled from the figures, with the Supabase column's unknown rendered as a
dashed empty track rather than zero. Bars and the savings multiple are derived
from the cost strings so the figures keep one source of truth and the multiple
cannot drift from the copy. Note this makes the section lean harder on the
still-unverified $385-450 / $70-90 numbers.

Also fixes the Supabase column reading as a claim about Supabase: it used an em
dash, which this page states in print means "not included on that plan". It now
uses the dashed TBC badge, matching the spec table.

Badges: rounded-full belongs to prism-button, whose two variants are a dark
filled pill and a white outlined pill — so a pill badge reads as a CTA whichever
way it is filled. Adds brand/marker.tsx, a squared chip with colour in a dot per
the role-kicker rule, and moves all four badge sites onto it.

Spec table: the group headers were uppercase and letter-spaced, which the brand
rule forbids; they are now sentence case with a coloured glyph per group. Adds
the hero's conic halo at a third of its opacity. Below lg the table is pivoted
feature-first — it was 832px wide against a 356px viewport, so two plans sat
outside a scroller with nothing to signal them. Rows identical across all four
plans (12 of 23) collapse to one line, which keeps the pivot short and makes the
rows that actually differ the prominent ones.

Co-Authored-By: Claude <noreply@anthropic.com>

* site-redesign: /orm page from the approved V4 copy

Builds the ORM product page on the existing template, plus the two
top-level sections V4 adds that the template had no slot for: the
migrations argument and the fast-feedback blocks.

Copy is verbatim from the Notion card "Product Page Batch One (3-5) -
Copy", toggle V4. The code previously pointed at V1, which is the oldest
draft — different headlines, different CTAs, fewer sections. Comments now
name V4 so the next page doesn't repeat the mistake.

Three template changes were needed to fit real copy:

- The closer is per-page content now. Review feedback flagged all three
  product pages ending on an identical paragraph as reading templated,
  so nothing in it is defaulted or appended.
- Features pick their column count from the item count. V4 ships 3 (ORM),
  4 (Compute) and 5 (Postgres), and a row of three beats two-plus-an-orphan.
- "Learn more" links only render where the copy names a destination,
  rather than pointing at a guessed /docs.

Five hand-built abstractions follow the homepage idiom (real labels and
commands over skeleton lines): the schema file, the migration history as
a git-style graph, and one per feature. Space for the 3D renders is
reserved and sized where the cards have room for it, and the agent
character from the homepage's agent-loop section stands in as the runner
of the feedback loop.

Refs #2

* site-redesign: /compute page from the approved V4 copy

Second product page on the /orm layout. Copy is verbatim from the Notion
card "Product Page Batch One (3-5) - Copy", toggle V4.

V4 shapes this page differently from /orm in two ways that matter:

- No testimonial section. /orm and /postgres carry one and Compute does
  not, so this composes the sections directly rather than going through
  ProductPage, which always renders them.
- No "in public beta" callout. V3 had one and V4 dropped it. The homepage
  still labels Compute as beta, so this is easy to reintroduce by
  accident — noted in the content file.

Four features, so the grid resolves to two rows of two on its own.

Five new abstractions in the established idiom: a deployments panel
pairing each environment's app with its branched database, and one per
feature. The co-located one shows the round trip disappearing without
inventing a latency figure — the only unit on it is the microseconds the
copy itself claims.

Refs #2

* site-redesign: /postgres page from the approved V4 copy

Third and last product page, replacing the placeholder instance. Copy is
verbatim from the Notion card "Product Page Batch One (3-5) - Copy",
toggle V4.

This is the one page whose approved copy matches the template's standard
shape exactly, so it goes through ProductPage rather than composing its
own sections — which is what that wrapper is for.

Five features is the count with no tidy answer: three-then-two hangs left,
two-two-one leaves an orphan. Six tracks with every card spanning two gives
three per row, and starting the fourth at track two centres the remaining
pair beneath them. Card widths stay identical and both rows centre on the
same axis.

Two accuracy calls in the illustrations:

- The certifications are Business-tier in the copy, so the compliance card
  labels the tier rather than leaving it to imply they apply everywhere.
- "no cold starts" stays in the body copy where V4 put it, but is kept out
  of the artwork: a standing guardrail says not to promote it to a claim.

The pricing card carries no figures either — the claim is the shape of the
bill, not a price, so the meter and its cap are unnumbered.

Refs #2

* site-redesign: product page taglines follow the brand standard

The product hero eyebrow rendered as uppercase, letter-spaced, grey text
— the exact three things /brand documents the tagline must never be.
The homepage uses RoleKicker: sentence case, ink at 70%, colour carried by
a dot. The heroes now use it too, so the tagline reads the same everywhere.

The eyebrow predates RoleKicker, which arrived with the pricing branch, so
these pages inherited a treatment the style guide had since replaced.

Adds PLATFORM_PRODUCT_ACCENTS beside PLATFORM_PRODUCT_ICONS: one canonical
dot colour per product — ORM cyan, Postgres yellow, Compute red — matching
the homepage stack and the /brand examples, so pages can't drift from it.
Content names its product by key rather than repeating a class string.

Verified by computed style: text-transform, letter-spacing, size, weight,
colour and dot colour are now identical to the homepage's taglines.

* site-redesign: 3D renders in the product hero abstractions

Fills the reserved hero slots with the render the homepage already pairs
with each product: cards-3d on /orm, cpu-3d on /compute, database-3d on
/postgres, matching orm/compute/postgres-illustration.tsx. ThreeDSlot now
draws with object-contain so a render keeps its aspect inside whatever
footprint the placeholder held, and the slots grew slightly now that real
art sits in them.

Also fixes the /postgres headline, which ran into the illustration. Two
separate causes:

- The headline box could exceed its own grid column, because 16ch at the
  top of the clamp is wider than the column. The column is the hard limit
  now.
- The real overflow was the emphasis. GlassGlide is whitespace-nowrap from
  md up, deliberately, so the light travels an unbroken phrase — and the
  emphasis here was seven words, one unbreakable ~790px token in a 544px
  column, which pushed "stack" out of sight. Shortened to one word.

All three headlines now set in three lines and clear the illustration by
65px or more. "Production-ready Postgres," cannot share a line at any
sensible size (790px at 56px, still 649px at 46px), so "already" leads the
second line instead. headlineEmphasis now documents the length constraint.

* site-redesign: pricing hero unwrapped, Supabase figures, more breathing room

Client feedback 2026-07-30, in two parts.

Fold: Shane asked to land on the plans rather than read introductory copy first,
citing Vercel's pricing page. The hero is now a title band — testimonial, subhead,
checks and CTAs all removed (each is represented elsewhere; only the per-plan
blurbs have nowhere else to live, so they stay in the data unrendered). Headline
and cards then moved into one wrapper, and the wrapper came off entirely when the
page still read tighter than the reference.

Width turned out to matter more than spacing: four cards of dense feature text at
max-w-6xl were 270px wide and wrapped an overage line onto three lines. At 84rem
they are 318px and 482px tall instead of 528px — wider AND shorter, which is the
only reason the added padding still leaves every CTA above the fold at 1440x800.

Unwrapping needed the wash and grain to dissolve themselves: anchored to the
section edge they cut off and drew a visible seam across the page.

Supabase: figures supplied by the client ("Recommended website comparison", fair
50K MAU model) and used verbatim, including the "database compute excluded" caveat
on their spend cap. Their doc also puts Prisma Pro at $72-90 where V2 said $70-90;
taking theirs, since the old number was never verified.

The savings marker now names its basis. Unqualified "Up to 5x less" sat directly
beside a Supabase column only ~1.5x more expensive, so it read as a claim about
Supabase and was wrong by 3x. NOTE: the 5x still derives from the unverified
$385-450 Neon + Vercel figure, which now looks like an outlier next to the
client's own numbers — flagged, needs their answer.

Co-Authored-By: Claude <noreply@anthropic.com>

* site-redesign: drop the ray and 3D slot from the migrations graphic

The band existed to have light pass through the 3D element beside it, so
with the render gone it had no subject and read as decoration. The card is
just the migration history now, on its ray photo frame like the feature
cards.

Also removes what only existed to support the band: the `relative` on the
row list and the command strip, and on CardChrome, which no illustration
needs any longer.

The hero abstractions keep their renders, and the ray crossing behind them
is a separate treatment from the template and is untouched.

* site-redesign: one site-wide content width (max-w-site, 1400px)

The site had no container width defined anywhere — no token in globals.css, no
Tailwind config, and /brand documents prisms and rays but nothing about layout.
Every section picked its own, so four values had drifted in:

  1152px  max-w-6xl              the brand-redesign sections
  1280px  max-w-7xl              the older/generic sections
  1280px  Tailwind's `container`  the secondary pages (blog, solutions, versus…)
  1536px  max-w-[96rem]           the wrapped-panel shells

The panels made it read worse rather than better: the shell was 1536px but its
contents were 1152px, so the widest thing on a page was decorative while the
content sat in the middle third. That is the "not using the horizontal space"
against Vercel.

Adds --container-site (87.5rem / 1400px) and --container-panel to @theme,
generating a `max-w-site` utility, and applies it to every live layout
container: 25 section/product components, 12 page files, and the two auth
wrappers. 1400px matches Vercel's pricing page, measured in headless Chromium as
a hard cap at both 1440 and 1920. Tuned for the 1440 viewport this project
designs against: with the usual px-4 sm:px-8 gutter the content renders 1376px
there, reaching the full 1400 past 1464.

Prose containers are deliberately untouched — max-w-2xl/3xl/[62ch] are text
measure and matter more at this width, not less. Unused scaffolding
(relume-library, the six root *-section components, gallery and demo routes) is
left alone.

Two things the audit turned up that a grep for `mx-auto max-w-*` missed: six
pages write the classes in reverse order (`max-w-6xl mx-auto`), and ten more use
Tailwind's built-in `container`, which silently caps at 1280px at this viewport.

Evidence that width beats padding here: the pricing cards went 270px -> 326px
wide and 528px -> 482px TALL, because two feature lines stopped wrapping. Wider
and shorter at once, and every plan CTA is still above the fold at 1440x800.

Verified 24 routes x {1440, 390}: all 200, zero horizontal overflow, no page
errors, no 1152/1280 container left on any live page. Formatting deliberately
excluded — running oxfmt over src/ rewrites ~485 untouched files to add
semicolons, which belongs in its own commit.

Co-Authored-By: Claude <noreply@anthropic.com>

* site-redesign: adopt max-w-site in the two sections the sweep couldn't reach

The site-wide width commit landed on the pricing branch and converted the
four product components that existed there. The two this branch added
afterwards — the migrations narrative and the feedback blocks, both on
/orm — were invisible to it and stayed at max-w-6xl, so those sections
would have rendered 1152px inside an otherwise 1400px page.

A token cannot retroactively rewrite hardcoded classes in files that did
not exist when the sweep ran, and the merge was clean, so nothing flagged
it. Measured after: every page now shows exactly two container widths,
1400 for content and 1536 for the wrapped-panel shells, matching the
homepage and pricing.

* Move Prisma 8 docs from /next to /v8 and adopt ADR 242 package names

URL rename: the /next version segment (a working-name artifact) becomes
/v8 across all four trees: /orm/next -> /orm/v8, /cli/next -> /cli/v8,
/guides/next -> /guides/v8, and the getting-started tree /next -> /v8.
Content directories moved with git mv; every internal link, url:
frontmatter field, meta.json entry, llms.txt prefix and section slug
(/docs/llms/v8.txt), sidebar matcher, badge-visibility path, and the
version key ("next" -> "v8" in version.ts, the switcher, and the
sidebar tree) updated to match. Permanent redirects cover the old URLs,
including /llms/next.txt; the commented GA cutover map now speaks v8.

Package rename (ADR 242, prisma/prisma#29864): app-facing installs and
imports move from the @prisma-next scope to the consolidated @prisma
facades. Mappings verified against the merged monorepo's converted
example apps and facade export maps, e.g.:
- @prisma-next/postgres -> @prisma/orm-postgres (one dependency)
- @prisma-next/sql-runtime -> @prisma/orm-postgres/family-runtime
- @prisma-next/sql-orm-client -> @prisma/orm-postgres/orm-client
- @prisma-next/mongo-query-builder -> @prisma/orm-mongo/query-builder
- @prisma-next/target-postgres/migration -> @prisma/orm-postgres/target/migration
- @prisma-next/middleware-cache -> @prisma/orm-extension-middleware-cache
- extensions -> @prisma/orm-extension-{pgvector,postgis,paradedb,supabase,arktype-json}
Extension source links now point at prisma/prisma's
packages/3-extensions (verified to exist there).

Unchanged on purpose: the prisma-next bin and prisma-next.config.ts
(the Slack announcement defers that rename to a pre-RC roadmap task),
npm create prisma@next, blog slugs, pris.ly short links, and
prisma/prisma-next repo links whose targets have no equivalent in the
monorepo (retail-store example, planning docs).

Verified: docs types:check, lint:links (0 errors across the moved
trees), lint:agent-ready, test:llm-markdown, lint:spellcheck, pnpm
check; rendered /orm/v8 page with v8 (RC) dropdown and collapsed
sidebar; 308 redirects confirmed for all old-URL forms. Pre-commit hook
skipped; its check command was run manually and passed.

* Apply branding to eclipse

* product-pages: show the product first, and say the stack is swappable

Client review of /postgres, /orm and /compute: the pages explain the
product where the live site demonstrates it, the primary CTA gets lost,
and the platform diagram reads as "you must adopt all of Prisma".

Hero CTA. It sat under the subheadline AND three benefit lines, landing
at 675-757px — below the fold on /orm at 1440x800 — as the same black
pill as the navbar's, so it read as a repeat rather than the page's
action. It now follows a one-sentence subheadline directly, at a new lg
size, with the benefits demoted underneath and a reassurance microline.
Measured: 507-568px, 193x58 against the navbar's 109x36.

Hero visual. Each hero now runs a product tour (product-tour.tsx): a tab
strip over one panel, auto-advancing until a visitor drives it, stopping
for good when they do. Stops share a single grid cell so the frame takes
its tallest stop and nothing reflows or clips. /postgres tours the three
things a bare managed Postgres doesn't give you (branching, Studio,
Query Insights); /orm walks schema -> typed client -> a destructive
migration being refused -> the same client over any database; /compute
walks Connect -> Deploy -> Live -> Templates.

Nine new hero-scale abstractions back those stops. No screenshots — the
existing stylised idiom, carrying far more real detail.

Platform section. Four layers instead of three, each showing what it
swaps out for, always legible rather than hidden behind the interaction,
under a line that states the point in words. The node canvas generalised
from three hardcoded positions to N.

Copy. /orm's hero led with the agent; it now leads with the schema and
the typed client, and Features moves ahead of the migrations argument so
the page says what the ORM is before it argues agent safety. Feature and
problem prose trimmed where a panel now carries the explaining.

Co-Authored-By: Claude <noreply@anthropic.com>

* Apply branding design direction to blog

* product-pages: make the platform section's active layer legible

Clicking a node already drove the section, but the card's response was a
border going from 6% to 14% black — indistinguishable in practice, so
the interaction read as nothing happening. The active card now lifts on
a shadow, its "Swaps for" label goes to ink, and its alternatives get
borders and a white fill while every other card's sit flat and grey.

Co-Authored-By: Claude <noreply@anthropic.com>

* product-pages: rebuild the platform section as a stack you can swap

The card grid said the right thing and nobody felt it — feedback was that
it read as a table and nothing looked clickable. The information design
was the problem: every alternative sat at the same weight as everything
else, so there was no "current" to change and no reason to touch it.

Rebuilt around one mechanic. Each layer has a single slot, and you swap
what's in it: click an alternative and it flies up into the slot on a
shared-layout tween while the current occupant drops into its place. The
motion is the affordance — things move where you clicked, so the control
looks like a control. Hierarchy does the rest: one big lit slot per
layer, alternatives small beneath it.

The argument rides on the mechanic rather than sitting beside it. A slot
holding its Prisma option glows in that product's hue and the pipe out of
it flows; swap it and that stretch goes grey and still. The path dims, it
never breaks. A "Golden path" badge is the scoreboard, so a swap costs
something, and the footer says what each one actually costs — what still
works, and what you now own yourself.

The agent row sits outside the pipeline deliberately: no Prisma option to
pick, every agent equal, highlight cycling on its own.

platform.integrations is gone from the content contract — the layers and
their trade-offs are page-independent, so they live in the component and
only the section's body copy stays per page.

Co-Authored-By: Claude <noreply@anthropic.com>

* product-pages: fix the one-second stall when swapping a stack layer

Clicking an alternative appeared to freeze the control. Measured: no
main-thread block at all (11-18ms per click, zero long tasks) — the
element was going to opacity 0, parking at the OLD bench position for
~1s, then snapping into the slot at ~1500ms.

Cause was the shared `layoutId` between the bench chip and the slot chip.
The two nodes sit in very different parents, and framer treats that
pairing as a crossfade rather than a flight: it drove the incoming
element toward the position it came from and held it invisible until the
tween finished.

Replaced with directional slides, which read the same and are
deterministic — the bench is below the slot, so an incoming pick rises
from below while the outgoing one drops toward the bench it is joining.
The displaced item now animates into the bench from above, and the rest
of the bench reflows with a position-only layout animation.

Measured after: settled at ~200ms, no dead zone, still no long tasks.

The agent row keeps its layoutId — that one is siblings in a single row,
the case shared-layout handles correctly.

Co-Authored-By: Claude <noreply@anthropic.com>

* product-pages: never let the stack reach zero Prisma layers

A stack of Supabase + Drizzle + Vercel is an advert for other people, so
the builder now has a floor. Swapping out the last Prisma layer pulls one
back instead — specifically the longest-ago swap, never the layer just
clicked, since overriding the input someone just gave reads as the
control refusing them.

The restored slot pops so the change never happens where the eye isn't
looking, and the footer owns it in plain words rather than dressing it up
as a technical constraint: "<X> slid back in — we'll swap out any layer,
just not all of them at once."

Verified with a 25-click fuzz over the bench: minimum Prisma layers 1,
zero breaches, and the restored layer was the oldest swap every time.

Co-Authored-By: Claude <noreply@anthropic.com>

* product-pages: drag a layer onto its slot to swap it

Drag was the first reflex reached for, so it should work. Bench items are
now draggable onto their layer's slot; the slot advertises itself with a
dashed outline the moment a drag starts, and anything dropped elsewhere
snaps back. Click stays the primary path — it is the keyboard-reachable
one, and the only one on touch.

Three things this needed, each found by driving it rather than reading it:

- Drag is enabled only for a fine pointer. On touch, framer captures the
  gesture and the page stops scrolling wherever the bench sits under your
  thumb. Subscribed via useSyncExternalStore rather than set from an
  effect, so the server snapshot is a plain false and hydration matches.

- Framer does not swallow the click a drag release fires, and the element
  has travelled under the cursor, so releasing anywhere lands a click on
  it: dropping on empty space swapped the layer anyway. Guarded — but the
  flag has to go up on drag START, because onDragEnd runs after the click.

- That guard is cleared on the next pointerdown, not on a timer. A first
  attempt cleared it inside onClick, which never ran after a successful
  drop (the button unmounts), so the flag survived and swallowed the next
  click on a different option.

Verified: drag swaps, cross-layer drops do nothing, drops on empty space
do nothing, click still works after a drag, the no-zero-Prisma floor
holds through drags as well as clicks, and touch renders no drag handles.

Co-Authored-By: Claude <noreply@anthropic.com>

* product-pages: stop announcing the no-zero-Prisma rule

The footer said "<X> slid back in — we'll swap out any layer, just not
all of them at once." That tells the visitor the control is rigged to
protect us, which is the precise opposite of what this section exists to
argue. My call and a bad one.

The floor still holds; it is just quiet now. The footer always answers
the choice the visitor actually made — their pick did take effect, and
it is the only thing they are expecting a response about. The restored
layer runs the same exchange animation as any other swap, so it reads as
the stack rebalancing rather than as a correction, and the attention-
grabbing pop on the restored slot is gone with it.

Left a comment at the rule so nobody helpfully explains it again.

Co-Authored-By: Claude <noreply@anthropic.com>

* product-pages: make the hero tour one card, and firm up the hero bullets

The tour was three loose pieces sitting on the hero background — a tab
strip, a caption, and a framed panel. Now it's a single card: the tabs
are its header on a tinted track, each stop sits flush inside, and the
caption closes it on a matching track. Reads as one instrument, and the
stop's own window chrome under the tab strip gives it a browser-ish
logic — tabs above, the surface below.

That meant the chrome had to move up a level, so HeroPanel is now flush.
Those panels only ever render as tour stops, so nothing else is affected,
and database-panel / schema-file / deployments finally use HeroPanel
instead of each repeating its wrapper inline.

The caption stacks every stop in one grid cell rather than relying on a
min-height. A fixed height only holds until a caption wraps to an extra
line at some viewport: measured, /orm was resizing the card by 7px
between tabs. All three pages are now pixel-identical across every tab.

Hero bullets go back to their original weight. It was the position that
was pushing the CTA below the fold, not the type, and below the CTA they
can carry weight without competing with it.

Co-Authored-By: Claude <noreply@anthropic.com>

* docs: prism rebrand — token pass + reading-sheet shell

Retheme apps/docs to the site-redesign (prism) direction, matching the
eclipse/blog rounds, in two passes:

Token pass: Sora/Inter/Mona-mono via next/font/local (Barlow and the
MonaSansVF display registration removed), the paired :root/.dark
shadcn-variable remap onto eclipse tokens, floating-morph header inside
the sticky notebook grid, prism-hued Prisma Next banner (animation kept),
OG route on ink + Sora, component/asset de-teal.

Composition pass (the reading sheet): grain-textured paper ground, the
article floating as a rounded sheet, sidebar/TOC directly on paper with
sheet-white active pills, CF headline scale, and the ported prism-ray
crossing behind the panels (negative-z under an isolated grid).

Functionality preserved: search, version switcher, AI chat, theme
toggle, agent-readiness surface (llms.txt/llms-full/skill.md/.well-known)
byte-identical.

* docs: landing hero prismatics + shell polish from the review findings

Make the report's outstanding items real:

- Getting-started hero takes site-redesign's hero grammar inside the
  sheet: spectral washes bloom behind the stack column, the structural
  prism ray crosses behind the card, and the card gets the reference's
  conic spectrum halo (theme-tuned opacities). Primary CTA becomes the
  ink pill — cyan stays accent, ink carries the action.
- Sidebar 'Prisma Next' card: old-brand navy/indigo raster replaced by
  a brand-drawn tile (ink panel, hero-intensity triple-band ray,
  wordmark) — on-palette by construction; OG-image fallback skipped
  for visual slides.
- Mobile TOC popover goes fully opaque when open (page no longer
  ghosts through the rows).
- Mobile drawer gets a dedicated Theme row: the custom sidebar footer
  (banner carousel) swallowed the ThemeToggle children, leaving mobile
  with no theme control.
- AI chat drawer: aria-labels on copy/clear/close/feedback buttons;
  Escape closes the drawer.

* site-redesign: port real pages from the old site

/customers (case-studies), /company (about), /company/careers, /changelog
(53 MDX entries via next-mdx-remote), /legal/{privacy,terms,sla}, /support,
/community, plus an interim /stack reusing the homepage bento. All rebuilt
in the redesign language; CF placeholder routes they replace removed.
Changelog entry images still serve from the live site (78MB not duplicated).

* Apply eclipse branding to docs chrome

Sora display / Inter body via eclipse's fonts (Mona Sans override removed),
shadcn+fumadocs shell variables remapped onto eclipse tokens for light and
dark, sidebar on the paper surface, and the new full-color logo lockup.
Scoped to apps/docs; packages/ui and eclipse untouched.

* chore: oxfmt formatting sweep and dev launch config

Formatting-only churn from running pnpm check across the repo (line
wrapping and indentation; no semantic changes), plus blog/site-redesign
dev server entries in .claude/launch.json.

* site-redesign: complete the old-site page set

/programs hub with startups, partners, and oss-friends subpages (Tally
forms linked, not embedded), /enterprise condensed from the old page,
/demo replaced CF's dead-end form with Prisma's real live demos.
Footer now points Trust Center / Status / Data Guide at their real
external homes; sitemap lists real routes only; legacy paths
(/about, /careers, /case-studies, /privacy, /terms, /sla, /startups,
/partners, /oss-friends) 308 to their new locations. Em dashes swept
out of page copy per content style.

* Update blog and docs favicons to the new brand mark

Same prism icon set the redesigned site uses: multi-size favicon.ico,
icon.svg, and apple-icon.png, served under each app's basePath.

* Pull the docs design treatment into the blog

Docs accent language on all interactive elements (cyan accent wash on
chip/pagination/popover/series hovers), the docs' cyan TOC rail restored
(it was force-overridden to grey), dark-mode cards lifted to the docs
card surface, and the footer seated on paper with a top hairline. Also
flushes a stale pre-rebrand CSS compile the dev server had been serving,
which was hiding the existing blog branding locally.

* site-redesign: review fixes

Remove the /demo page (calculator-options playground stays), show the
/company team photos in a full grid instead of an edge-clipped strip,
and add /legal/security-and-compliance (footer linked it but it 404'd) —
claims sourced from the pricing spec table, reports via the Trust Center.

* site-redesign: re-sync copied content after merging main

Privacy policy picks up main's Aug 7 DPF-renewal update, and the two
changelog entries main added (2026-07-24, 2026-08-02) join the copied
set. Terms and SLA were unchanged on main; no other ported source
pages moved.

* Rebrand the content-create-hero-image skill to the 2026 brand

Light paper surfaces with spectral prism washes replace the dark teal
aurora; Sora 500 / Inter / Mona Sans Mono replace Mona Sans 800 / Geist
Mono; kicker dot + sentence-case label replaces the uppercase dash
eyebrow; product accents remap to prism cyan (ORM/Prisma 8), yellow
(Postgres), red (Compute). New tokens.json, design-system.md, template,
variable-font embeds, and the new lockup/mark bundled. Legacy assets
kept, marked structure-reference-only.

* blog: regenerate the seven most recent 2026 covers in the new brand

Compute public beta, schema-as-LLM-context, infraslopture, local-to-
production, agent-can't-drop-prod, CipherStash, and Object Store buckets
all move from the dark Eclipse style to the rebranded covers (paper
surface, prism accents, Sora). Each keeps its post's real data in the
module; the compute post's hero switches from raster to the SVG standard.

* Merge the redesign into apps/site as the one marketing app

apps/site now carries the 2026 rebrand directly: the redesign's layout
(Sora/Inter, new Header/Footer, light theme) becomes the root layout,
with the production analytics stack intact — CookieYes consent, GTM,
Tolt, PostHog via instrumentation-client (verified loading), UTM
persistence, structured data, and the llms.txt / skill.md / api / og
infrastructure untouched. All rebuilt routes replace their old
implementations; absorbed pages 308 (/showcase→/customers,
/client|/typedsql|/migrate→/orm) alongside the earlier rebrand
redirects. CF scaffolding routes and the relume kit are dropped.
pricing-data moves to lib/ for the llms endpoints. apps/site-redesign
is deleted; not-yet-rebuilt pages (studio, mcp, query-insights, events,
ecosystem, newsletter, prisma-with, support-policy, code-of-conduct)
keep serving under the new shell pending their restyle.

* site: drop CF's relume component-gallery route

/components imported the deleted relume library and broke the
production build (dev never compiled the route). Full next build now
passes locally, all 122 static pages.

* site: restyle the last nine legacy pages into the 2026 brand

Every page now ships in the new design system: /studio and
/query-insights (yellow accent, ink-framed dark mockups, feature rows),
/mcp (cyan; agents grid, ink config/prompt cards, capabilities),
/ecosystem (static grouped package cards), /events (red; meetups,
sponsored, past), /newsletter with restyled signup and unsubscribe,
/support-policy (new-language tables), /event-code-of-conduct on the
legal shell with main's Aug 7 SF-event strengthening merged in, and all
twelve prisma-with SEO pages via their six rebuilt shared sections.

Analytics parity restored on the new components: PrismButton,
PrismButtonOutline, and the header CTAs now fire the cta_click GTM
event for console destinations exactly as ConsoleCtaButton did, keeping
the GA4 + Google Ads conversion series alive (UTM decoration already
rides the document-level persistence listener). createPageMetadata
emits absolute titles so the root template stops double-branding.
Full production build passes: 122/122 static pages.

* site: fix unreadable code blocks — shiki theme lost its palette

The custom prisma-dark shiki theme colored tokens with eclipse CSS
variables that died with the old global.css, so every token rendered
in one dark grey on the ink cards (visible on the prisma-with pages).
The theme now uses concrete new-brand values: cyan #7be7f0 keywords
and types, yellow #f8da85 strings and functions, red #ff9fa4 numerics
and parameters, #d5d5d4 plain text, #646567 comments.

* blog: pull the docs landing's prismatics into the index

The docs got Shane's prism-ray hero treatment; the blog index now
speaks the same language. PrismRay ported (API-identical to the docs
and marketing-site copies), spectral washes bloom behind the centered
title with a whisper ray gliding beneath the subtitle, and the
featured-series card takes the docs path-card treatment: corner prism
washes plus a whisper ray under the copy, replacing the flat card-wash
fill. Both tuned down in dark mode.

* blog: one prismatic moment per view, not two

Review caught the hero ray and the featured-card ray rendering as a
near-identical duplicate at desktop width, both crossing content (the
filter chips, the card copy). The hero keeps only its spectral washes:
a diagonal band cannot safely cross centered text at every breakpoint.
The featured-series card carries the page's single ray as a structural
corner bleed clipped by the card's own bounds, top-right where text
never reaches, echoing the cover-art corner stripes on the post below.
Card description capped at 72ch so copy never chases into the corner.

* covers: in-situ learnings — lockup sign-off, thumbnail legibility, dual-surface

Reviewing the seven covers inside the blog grid (light and dark)
surfaced rules the skill now encodes: covers render ~400px wide beside
the post's real title on both white and ink cards, so the headline must
be a compressed thesis (never the title restated), kickers are 20px or
omitted, critical elements stay inside a 72px crop-safe margin that
survives the cards' 16:9 object-cover crop, washes run a step stronger
so artwork carries color at small sizes and on dark, and the sign-off
is the full-color lockup, which reads at thumbnail scale where grey
wordmark text vanished.

All seven covers regenerated to the new rules: lockup inlined in the
clear corner, kickers at 20px with larger dots, wash stops +0.05.

* covers: rebrand every 2026 blog cover to the 2026 brand

All 60 posts from 2026 now carry new-brand cover art: light paper
surfaces with spectral prism washes, Sora headlines, the full-color
lockup as sign-off, and one product accent per cover (cyan for ORM and
Prisma 8, yellow for Postgres, red for Compute). The retired dark teal
aurora, Mona Sans display, and Geist Mono are gone from the set.

Authored as 54 new hand-built SVGs plus the seven improved earlier, with
a distinct visual module per cover: replacement diagrams, ink code and
terminal cards, benchmark bars, migration graphs, pub/sub and
provisioning flows, DNS and pricing tables, evaluation matrices, a bloom
bit-array, a clock-drift plot, deploy-tile grids, an IA tree, docs-search
and query-insights panels, and editorial pull-quotes. 17 carry no
headline at all. Every figure, command, and label is sourced from its own
post; where a post had no measured number the module is structural rather
than invented, and those cases are noted in the PR.

Frontmatter repointed on 53 posts (heroImagePath, metaImagePath, rewritten
heroImageAlt) and 27 superseded rasters deleted after confirming each was
referenced only by its own frontmatter. Body images left untouched.

Skill updated with what the batch taught: xml:space="preserve" is not
inherited from a wrapping <g> in Chrome, so code indentation collapses
silently and only shows in the raster; the SVG size target was
unrealistic (30-55KB typographic, 55-75KB code-heavy); and covers must be
judged at grid-thumbnail scale on both light and ink cards, which is why
kickers are now 20px minimum and the lockup replaced the grey wordmark.

* product-pages: fix what /review found in the stack and the tour

Five real defects, four of them mine from this batch.

Keyboard activation was dead after any drag. `didDrag` suppressed the
click a drag release fires, but it was only cleared on pointerdown — and
keyboard activation never fires pointerdown. Drag a bench row off-target
and every subsequent Enter/Space on the whole control did nothing.
Reproduced in a browser, then fixed by scoping the flag to the drag
itself: raised on drag start, dropped on drag end, which brackets exactly
the one click that needs suppressing.

Focus was lost on every keyboard swap. Activating an option unmounts it
(it moves into the slot), so focus fell to <body> and the next Tab
restarted from the top of the page. The slot now takes focus, but only
when the click came from the keyboard (detail === 0).

The section had no links at all. The card grid it replaced carried a
"Learn more" per product; without it this section — and so /orm and
/compute entirely — had no in-body link to a sibling product page. Each
slot now links out while it holds its Prisma option.

The tour announced itself as ARIA tabs while implementing none of the
pattern: no ids, no aria-controls, no aria-labelledby, no arrow keys.
Wired up, with roving tabIndex and Arrow/Home/End.

The dwell bar desynced on hover. Pause was a ref, so the bar kept
tweening while the tour stood still and sat full under a stop that wasn't
advancing. It's state now, and the timer restarts per stop so dwell
always measures from when the stop actually became current.

Also removed a `??` fallback in the floor rule that was both unreachable
and wrong — its only branch could return -1 and assign next[-1], leaving
zero Prisma layers, the one thing the rule exists to prevent. And
`hero.tour` is now length-checked, not truthiness-checked: `tour: []` is
truthy and rendered a tour whose `% 0` is NaN.

Co-Authored-By: Claude <noreply@anthropic.com>

* site: match the console host exactly for cta_click, not by substring

CodeQL flagged the substring test in PrismButton and it was right:
href.includes("console.prisma.io") also matches
https://evil.com/?next=console.prisma.io and
https://console.prisma.io.evil.com, so the conversion event could fire
on a non-console link and pollute the GA4/Ads series this tracking
exists to preserve. Parse the href and compare the hostname instead.

Also fixes a latent throw: the old code called new URL(href) on the
label fallback path, which raised on a relative href that happened to
contain the substring. Parsing with a base handles relative hrefs and
rejects them correctly.

* docs: point the spellcheck ignore at the moved error reference

The Prisma 8 rebrand moved the generated error reference from
orm/next/reference/ to orm/v8/reference/, but cspell's ignorePaths still
named the old location. The file was silently pulled into the spellcheck
set for the first time and failed on four technical identifiers it has
always contained: the CONTRACT.CHECK_OPTOUT_INVALID error code, the SQL
keyword in WITH ORDINALITY, and the bigintnumber / unboundedint codec ids.

Repointing the ignore is the right fix rather than adding those words to
the dictionary: the file is generated and synced from the engine repo, so
every future sync would otherwise introduce new codec ids and error codes
that fail the same way. Spellcheck is green locally, 783 files checked.

* chore(docs): sync Prisma 8 error reference

prisma/prisma main gained CONTRACT.CHECK_NAME_RESERVED and
CONTRACT.CHECK_ON_STI_VARIANT with the @@check feature commit, one minute
after this branch's last green run of the completeness check. That check
re-clones prisma/prisma on every run, so the page drifted out of date
without anything in this PR changing.

Regenerated with the same generator the sync bot runs
(apps/docs/scripts/generate-error-reference.mjs), which also picks up the
two upstream description edits that now mention CHECK constraints. 279
codes, matching the verifier's count.

* contact: build /contact from the approved copy

Hero (homepage wrapper, copy left, form right), three support channels,
CtaBurst as the closer. Copy verbatim — no words added or removed, which
is why two things look the way they do: the topic select has no
placeholder (its label already says it, and printing the sentence twice
was worse), and submitting shows the dashed TBC badge instead of an
invented "thanks, we'll be in touch".

The hero's wash is product-hero's calibration, not the homepage's. At
this panel height (~870px vs the homepage's 1222px) the homepage values
bloom up behind the headline and cost the subhead its contrast.

Discord has no Forma Thin glyph and its brand mark only ships solid,
which reads twice as heavy as the Github outline beside it, so the
simple-icons path is stroked at 1 unit to match how Forma draws its own
outlines.

The hero proof stats moved to siteConfig.proof, shared with the homepage
hero — they were already duplicated twice and the star count dates fast.

Still needs Prisma: the form confirmation copy, an endpoint to post to,
and /docs, which "Read the docs" points at and which doesn't exist yet.

Co-Authored-By: Claude <noreply@anthropic.com>

* feat(site): add /templates directory page in the new brand

Ports the template directory from codex/dr-8815-template-directory,
keeping its data layer (prisma-examples manifest fetch, zod validation,
5-min revalidate, graceful empty state) and rebuilding the UI in the
2026 brand: framed Texture hero with a compute-red wash, RoleKicker,
PrismButtonOutline card CTAs with console cta_click tracking, and a
Templates link in the footer Resources column.

* contact: announce the form's confirmation state

Submitting replaces the whole form, so a screen reader announced nothing
and focus died with the submit button, falling back to <body>. Found by
/review. Nothing else on the site swaps a form for a confirmation yet, so
this is the precedent.

Co-Authored-By: Claude <noreply@anthropic.com>

* feat(docs): add Prisma Composer section and move Prisma 8 CLI docs to the unified CLI

Adds a top-level Composer docs section (15 pages, Early Access): quickstart,
concepts (apps/modules, contracts, service input, databases, object storage,
building blocks), workflows (local dev, testing, deploying, porting), and
reference. Registered in the root meta.json, the navbar, and llmsSections.

Rewrites the cli/v8 tree from the standalone prisma-next binary to the
unified Prisma CLI (npx @prisma/cli@next until the prisma@next tag lands),
with command surfaces verified against 8.0.0-rc.2: init becomes orm init,
migration apply becomes migrate, migration ref becomes ref.

Composer commands were tested end to end locally (dev, log, watch-restart,
service-key 401s); deploy wording follows the composer repo guides.

* docs(v8): move guides, quickstarts, ORM, and Studio pages to the unified CLI

Replaces prisma-next invocations with npx @prisma/cli@next across the
Prisma 8 getting-started funnel, add-to-existing-project and import
guides, the ORM v8 concept/migrations/contract-authoring trees, the
Studio Prisma 8 page, the Deno guide, and the agent prompt blocks,
applying the verified command renames (init -> orm init).

Left untouched on purpose: quoted CLI output (the bundled toolchain
still prints prisma-next in hints), skill names, repo and blog URLs,
prisma-next.config.ts / prisma-next.md file names, and listings of
scaffold-generated files, which orm init still emits in that form. The
generated error reference is owned by the upstream sync.

* docs(v8): move Compute and blog to the unified CLI, consolidate skills, version the CLI section

Compute: rewrites the section around the unified CLI's real surface
(verified against @prisma/cli@next 8.0.0-rc.2): app -> service +
service deployment/domain, database -> postgres, the new bucket group,
and the changed deploy model, where deployments come from a git push,
the Console, or Composer rather than a CLI app deploy, and promote
rebuilds with production env vars. Drops the beta-only error-code
tables in favor of the verified dotted-code envelope.

Blog: swaps prisma-next invocations to npx @prisma/cli@next in the
four posts that show runnable commands.

Skills: the twelve prisma-next-* skills were consolidated upstream
into one prisma-8 skill in prisma/prisma/skills; updates the skills
page (install command and table) and every Prompt-your-coding-agent
section to reference prisma-8.

CLI versioning: the CLI section's version dropdown now lists v6, and
any pre-v8 selection resolves to the classic prisma CLI tree instead
of jumping to that version's ORM docs.

The /prisma-compute/deploy funnel page keeps the old flow on purpose;
it is being rebuilt around Composer in a parallel stream.

* docs(compute): move the deploy quickstart to the unified CLI's push flow

Rewrites /prisma-compute/deploy around the real deploy model: init +
project create + git connect, then push, with service show/open and
build logs for verification and promote/rollback for shipping. The
create-prisma path now hands off to the GitHub connection instead of
the removed app deploy loop, and the agent prompt teaches the new
command set.

* feat(site): highlight Object Store buckets on /compute as a fifth feature

* docs(compute): add the Object storage page for Object Store buckets

* docs(compute): fix the broken endpoint table and flatten the voice on Object storage

* brand: update logo assets to the more-spacing revision

New kit widens the gap between the prism mark and the wordmark, and the
white gaps between the mark's three color bands. Applied everywhere the
current-generation logo appears:

- lockup SVGs in site/docs/blog public/logo (background rect stripped
  for transparency; full-color-white derived from full-color since the
  kit doesn't ship a color-mark + white-text variant)
- favicons (src/app/icon.svg) in all three apps
- inline PrismaMark in platform-stack.tsx
- hero-image skill logo templates
- intrinsic img dims updated for the new 264x67 canvas

Left as-is: prisma-footer-* (separate stripes-and-rays treatment, no
mark), historical blog hero images, and the legacy triangle-era logos
in eclipse and docs/public/img.

* feat(site): replace trusted-by strip with verified customer logo carousel

Swap the tech-partner tiles for wordmarks of companies verified as Prisma
users (customer stories, Slack confirmations, and the previous homepage's
customer wall): Cursor, Reddit, Okta, Lush, ClickHouse, Cal.com, Accenture,
Dub, Rapha, Gamma, Kapa.ai, Documenso, Elsevier, Grover, Formbricks,
Papermark, Inbox Zero. Every SVG is viewBox-cropped to its ink so the
per-logo pixel heights give equal optical mass on one centerline, and the
marquee slows from 45s to 100s per loop.

* feat(site): redesign testimonials as counter-drifting quote marquee

Replace the blurred three-card queue with two slow marquee rows of quote
cards moving in opposite directions, reusing the logo carousel's keyframes
and edge fades so the page shares one motion vocabulary. Twelve verbatim
quotes (case studies plus showcase voices like Cal.com, Gamma, and
Stellate), six unique per row so nothing repeats within a viewport; hover
pauses both rows and reduced-motion falls back to scrollable rows. The
component is now a state-free server component.

* Copy adjustment and banner spacing

* Update favicons/logos

* fix: page layout when banner add to the page

* fix: add presign to docs spellcheck dictionary

* fix: update bucket CLI link to new cli/v8 reference page

* fix: rebrand sidebar banner wordmark to Prisma 8

* Docs IA restructure: drill-in sidebar, REST API rename, CLI consolidation, Storage (#8154)

* docs: vertical drill-in sidebar, Build/Deploy/Manage/Reference IA, REST API rename

Replace the horizontal top tab strip with a Vercel-style left sidebar: a
grouped "All docs" view (Start, Build, Deploy, Manage, Reference) that
drills into each section's tree behind an always-visible "All docs" back
link. The docs root pairs the top-level menu with the Get started content.

Rename Management API to REST API (folder, generator, openapi key, llms
prefixes, postman collection, CI workflow) with wildcard redirects. Move
the Composer CLI reference to cli/v8/composer with a redirect. Reorder the
root meta, drop the dangling "platform" entry, list console, and refresh
section icons.

Sidebar and TOC states use new global spectrum styles (hover fade-in text,
active ring, gradient TOC thumb) built on the brand gradient tokens. Adds
apps/docs/AGENTS.md recording the Reference/Concepts/Guides taxonomy and
page-move mechanics.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* docs: CLI reference regroup, Storage section, spectrum nav states

Regroup the v8 CLI sidebar (Platform/ORM/Migration/Utility, alphabetised),
rename the overview and configuration pages, extract Global flags to its
own page, and replace the overview's command tables with prose entry
points and per-product workflows. Fold the Composer and Compute CLI
pointer pages into the v8 reference with redirects.

Add a top-level Storage section documenting object-store buckets from
verified CLI/REST/control-plane sources, wired into the sidebar, root
meta, and llms sections. Rename Local development to Local Postgres and
surface it in the Manage group.

Unify sidebar/TOC states on the spectrum styles (fading gradient hover,
ring select, gradient TOC thumb), drop the legacy blue depth rail and
folder-trigger hover wash, and remove the white background from the
favicon SVG.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* chore: drop formatter-only churn in apps/site

Repo-wide oxfmt run swept eight apps/site files into the docs branch;
restore them to the base branch state to keep this PR docs-only.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* docs: address PR review findings

Gate the sidebar top-view focus handoff on an explicit back-press so an
ordinary page load does not steal keyboard focus. Rename the sample
GitHub Actions workflow file to match the REST API naming and hyphenate
"real-world" in the partner integration guide.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* docs: scope sidebar focus handoff to the visible surface

Both sidebar surfaces (desktop aside, mobile drawer) render the top view,
and the hidden aside could consume the shared back-press focus request on
mobile. Gate consumption on the container being visible, and void pending
requests on navigation so a later mount cannot inherit one.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* docs: say "Build an app" on the Get started page

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>

* chore(site): oxfmt formatting sweep

* site: port /brand-kit brand & press kit from cf/development

Brings over the agency's press-kit stream (CF PRs #12–#14): the /brand-kit
page, its components (incl. the Prismo mascot section), the downloadable
asset library under public/brand-kit (~20MB incl. prisma-brand-kit.zip),
the smooth-scroll anchor behavior it relies on, and the Download glyph
grafted into the existing forma icon set.

* site: adopt cf/development's transparent favicons and all-white full-color-white logo

Favouring the agency's versions over ours per launch decision: transparent
icon.svg (white bg rect removed), regenerated smaller favicon.ico and
edge-to-edge apple-icon.png, and the all-white mark in full-color-white.svg.

* site: restore /demo request flow from cf/development

Restores demo/page.tsx, the multi-step demo-form, and /demo/thank-you that
were dropped in the site-redesign→site merge (calculator-options kept the
site's evolved version). Thank-you links remapped to routes that exist here:
/features→/orm, /case-studies→/customers. Note: the form is still front-end
only — it captures no submission and never navigates to /demo/thank-you.

* Getting started reorder, Composer-first deploy quickstart, Local Development section

- Getting Started sidebar: Prisma Compute and the deploy quickstart move above Prisma 8
- Deploy your first app: rewritten Composer-first with two paths (from scratch, existing app)
- New top-level Local Development section (local app on Bun, local storage, Local Postgres moved from Postgres with redirects and inbound links updated)
- Sidebar groups: Local Development under Build, AI under Reference
- TEMPORARY: docs dev server on port 3002 for this worktree; revert before merge

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* docs: rebuild the Get started page around the Build and Deploy workflow

The hero is now two linked panels (Build: local development, Composer,
ORM; Deploy: Compute, Storage, Postgres, deploy) with a one-CLI callout,
replacing the stack diagram and the condensed tutorial tabs. Tiles get
the sidebar's spectrum ring and text on hover, the cool gradient's edges
move from cyan to purple, Storage gets a custom bucket icon, and nested
sidebar rows no longer overlap the indent guide line.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* docs: address Composer tutorial feedback for Bun workspaces

Add a Bun-workspaces note to the Composer quickstart (alchemy and
@prisma/dev must be direct dependencies under isolated installs), state
the effect pin value up front instead of sending readers into
node_modules, and make the local docs base URL respect PORT.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* Align CLI reference and docs with the rc.8 command-surface rework

- cli/v8: service versions + explicit targeting, root-level dev/deploy pages,
  init/build/configuration pages removed, migrate -> db migrate, ref -> migration ref,
  delete-verb renames, redirects for all moved/removed pages
- Compute section: deployments rewritten around versions, init step removed,
  prisma.compute.ts references removed
- Composer section: dev/deploy respelled, destroy/log routed through the control API
- Known gaps: guides and Getting Started prompts still use the removed app deploy

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* Start sub-group, tutorial move to /full-stack-tutorial, top-level menu polish

- Getting Started section: explicit Start sub-group (Get started, Deploy your
  first app, Deploy the full Prisma stack), sub-group order Start / Prisma 8 /
  Prisma 7 / Prisma Postgres
- Tutorial moved to /full-stack-tutorial, retitled "Deploy the full Prisma
  stack", badge dropped; redirect and inbound links updated, llms v8 prefix added
- Get started hero wired to /local-development and /prisma-compute/deploy
- Top-level menu: "Deploy your first app" + tutorial in Start, Console first in Manage
- Docs dev port restored to 3001

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* Align the v8 CLI reference with the rc.9 command surface

rc.9 deletes the agent group and installs agent skills from the npm
packages a project already has. Document the new skills group (sync,
list) and the staleness check with its off switches. Document the new
top-level init command, moving the orm init page to /cli/v8/orm-init
since /cli/v8/init now belongs to init itself. Switch config examples
to definePrismaConfig from prisma/conf…
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant