Content/init - #2
Merged
Merged
Conversation
This was referenced Oct 14, 2025
carlagn
pushed a commit
that referenced
this pull request
Oct 15, 2025
nurul3101
pushed a commit
that referenced
this pull request
Aug 11, 2026
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
nurul3101
pushed a commit
that referenced
this pull request
Aug 11, 2026
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
nurul3101
pushed a commit
that referenced
this pull request
Aug 11, 2026
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
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…
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
No description provided.