Skip to content

Blog: Serverless Postgres, the definitive guide (hub + interactive decision tree) - #8046

Merged
ankur-arch merged 21 commits into
mainfrom
blog/serverless-postgres-hub
Jul 10, 2026
Merged

Blog: Serverless Postgres, the definitive guide (hub + interactive decision tree)#8046
ankur-arch merged 21 commits into
mainfrom
blog/serverless-postgres-hub

Conversation

@vanrensbird

@vanrensbird vanrensbird commented Jul 9, 2026

Copy link
Copy Markdown
Contributor

What

New evergreen hub post at /blog/serverless-postgres: the category guide for serverless Postgres, anchoring the hub-and-spoke cluster (comparison and migration spokes follow separately). Reviewed and approved by Martin on localhost.

  • Profiles the five most-shortlisted providers (Prisma Postgres, Neon, Supabase, Aurora Serverless v2, PlanetScale) with verified prices and behaviors
  • The rest of the field: Xata, Nile, the Tembo pivot, DigitalOcean/Render/Heroku/Railway, and the non-Aurora hyperscaler options, sorted honestly into serverless vs managed
  • The three-pricing-models framing with a worked cost-crossover example (30M queries/month: ~$89 operations billing vs ~$77 always-on Neon CU)
  • Interactive decision tree (DecisionTree + ServerlessPostgresChooser): schema-diagram-style cards on a dotted canvas, answers fan into up to two candidate cards with dashed connectors, sibling answers are mutually exclusive, clicked rows stay pinned in the viewport. The complete tree also ships as server-rendered text (visible details block), so crawlers and AI engines read every branch. Prisma cards carry a subtle accent; competitor recommendations are real (Neon, PlanetScale, Aurora, and Supabase each win branches)
  • Six FAQ accordions, answer-first lead, canonical links, updated bundled-backend guidance including Prisma Postgres + Compute (public beta stated)

Provenance

Researched via a 105-agent deep-research run (24 claims verified 3-0 against primary sources) plus targeted primary-source sweeps for Supabase, Aurora auto-pause, PlanetScale, and ten additional providers. Then six rounds of adversarial review per the new Step 10 process (#8044): 51 findings found and fixed across rounds, including two flatly wrong claims and a steered decision-tree branch, closing on zero-finding verification rounds. Every price and behavior cites the vendor's live page as of July 2026; vendor claims (including ours) are labeled as such.

Open item

No hero image yet: heroImagePath is intentionally absent and can land as a follow-up (input welcome from design).

Measurement

Five Promptwatch prompts tracking the target queries were created before publication for a clean before/after citation baseline.

🤖 Generated with Claude Code

Summary by CodeRabbit

  • New Features
    • Added a new blog post on serverless PostgreSQL explaining how billing units and idle behavior affect provider choice, with side-by-side comparisons and a workload chooser.
    • Introduced an interactive decision-tree UI with expandable questions, visual connectors, a “collapse all” option, and a plain-text fallback for non-interactive rendering.
  • Documentation
    • Enabled the new serverless PostgreSQL chooser to be embedded directly within blog MDX content.

vanrensbird and others added 16 commits July 9, 2026 00:17
Local only, pending Martin's review. First piece of the serverless-Postgres
hub-and-spoke cluster; all provider claims verified against primary sources.

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

Fact: removed invented free-branching claim (Prisma docs say no branching),
fixed Neon misquote, ACU step size, Databricks standalone attribution.
Reader-skeptic: honest Prisma trade-offs added (no branching, youngest
platform, cost crossover at volume), verified-numbers banner corrected,
Supabase cold-start cell made apples-to-apples, pooler enumeration fixed,
scoping disclosed, editorial flourish cut. Positioning: competitive judgments
made criteria-based.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Four-ways-out in the idle+latency bucket (was a false dilemma), organizing
claims reconciled, worked cost-crossover example added (30M ops: ~$89 ops
plan vs ~$77 1-CU Neon), table cells made factual, operation definition
quoted verbatim from pricing page, 'youngest of five' corrected, Neon
per-project free tier stated explicitly, stat denominators unified.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…reate-db temporary, agent-stat attribution)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Generic DecisionTree client component (breadcrumb walker, restart, go-back,
eclipse tokens) + ServerlessPostgresChooser with the guide's choosing logic.
Full tree ships server-rendered: interactive walker plus a complete plain-text
version in a details block, so crawlers and AI engines read every branch.
Prose recommendations stay above as the canonical citation surface.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…anaged instances, hyperscalers), all primary-verified

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…t card flows from the chosen one

Answered cards remain visible with the chosen answer highlighted and
siblings dimmed (click any to re-branch); new cards animate in beneath a
connector; options stagger in. Text fallback unchanged.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
… (8 findings)

Tree: volume split moved to the guide's own ~24M crossover with the Neon
counterexample in the caveat, middle volumes no longer funnel to Prisma,
crossover card lists all four options, fleet superlative dropped. Prose:
sorting test applied honestly to the five profiled providers, intro split
and de-hyped, Heroku Advanced hedge, AlloyDB read-pool nuance, FAQ title
matches its answer.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
… the exception)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Cards on a dotted-grid canvas styled like model cards (header + badge,
answers as field rows), dashed bezier connectors from the chosen row to
the next card, horizontal growth with slight stagger, horizontal scroll
on small screens. Offset-based measurement so entrance animations don't
skew connectors. Text fallback unchanged.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ree; clearer first question

Branches toggle open beneath their card (several can be open side by side
for comparison), dashed connectors run vertically, no stagger bounce.
First question reworded from a compound yes/no to a plain what-are-you-
building split.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ng answers mutually exclusive

An answer can lead to several cards side by side (side project fans into
Prisma/Neon/Supabase free tiers; high volume fans into all four crossover
candidates), each badged Option when it has siblings, Match when sole.
Options within one question are radio-exclusive: opening one collapses
its sibling's branch.

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

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…no page jump)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…kend branch, gentle Prisma accent

Fans limited to two cards so the canvas never widens the page (always-on
candidates merged into one card; Supabase free tier pointed to from the
Neon card). Bundled-backend answer fans into Supabase and Prisma
Postgres + Compute (public beta stated, different-bundle honesty), with a
matching prose bullet and docs link. Prisma result cards carry a subtle
ppg tint; competitor cards render neutral.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@vanrensbird
vanrensbird requested a review from ankur-arch July 9, 2026 12:32
@vercel

vercel Bot commented Jul 9, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
blog Ready Ready Preview, Comment Jul 10, 2026 3:19pm
docs Ready Ready Preview, Comment Jul 10, 2026 3:19pm
eclipse Ready Ready Preview, Comment Jul 10, 2026 3:19pm
site Ready Ready Preview, Comment Jul 10, 2026 3:19pm

Request Review

@coderabbitai

coderabbitai Bot commented Jul 9, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: bf95662b-2854-4989-8ae6-01f6e4011d93

📥 Commits

Reviewing files that changed from the base of the PR and between 5637d80 and b4db6dc.

⛔ Files ignored due to path filters (2)
  • apps/blog/public/serverless-postgres/imgs/hero.svg is excluded by !**/*.svg
  • apps/blog/public/serverless-postgres/imgs/meta.png is excluded by !**/*.png
📒 Files selected for processing (1)
  • apps/blog/content/blog/serverless-postgres/index.mdx

Walkthrough

Adds a serverless Postgres guide with provider comparisons, pricing and idle-behavior guidance, an interactive chooser, a reusable client-side decision-tree component with SVG connectors and text fallback, and MDX registry wiring.

Changes

Serverless Postgres Guide and Chooser

Layer / File(s) Summary
DecisionTree component core
apps/blog/src/components/DecisionTree.tsx
Adds exported decision-tree types and a client component with expansion state, DOM-measured SVG connectors, branch rendering, collapse controls, and a text-only fallback.
ServerlessPostgresChooser decision data and wiring
apps/blog/src/components/ServerlessPostgresChooser.tsx, apps/blog/src/mdx-components.tsx
Defines the provider-selection graph, renders it through DecisionTree, and registers the chooser in the MDX component map.
Serverless Postgres article foundations
apps/blog/content/blog/serverless-postgres/index.mdx
Adds article metadata, framing, provider comparisons, workload recommendations, and explanations of billing models and idle behavior.
Provider profiles and selection guidance
apps/blog/content/blog/serverless-postgres/index.mdx
Adds provider profiles, cost crossover analysis, secondary considerations, alternative provider categories, FAQ entries, and the closing call to action.

Estimated code review effort: 3 (Moderate) | ~30 minutes

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly matches the new Serverless Postgres blog post and its interactive decision tree.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick comments (1)
apps/blog/src/components/DecisionTree.tsx (1)

347-379: 🩺 Stability & Availability | 🔵 Trivial | ⚡ Quick win

Add cycle detection to recursive tree components

Both TextTree and TreeBranch recurse through next targets without tracking visited nodes. The current tree data is acyclic, but since DecisionTree is a reusable exported component, a future data change introducing a cycle would cause TextTree to infinitely recurse during server rendering (crashing the page) and TreeBranch to hang the tab on user interaction. A simple visited-set guard prevents both.

🛡️ Proposed fix for TextTree cycle detection
 function TextTree({
   byId,
   nodeId,
+  visited = new Set<string>(),
 }: {
   byId: Map<string, DecisionNode>;
   nodeId: string;
+  visited?: Set<string>;
 }) {
   const node = byId.get(nodeId);
-  if (!node) return null;
+  if (!node || visited.has(nodeId)) return null;
   if (isResult(node)) {
     return (
       <p className="text-sm text-foreground-neutral my-2">
         <strong>{node.title}.</strong> {node.why}
         {node.caveat ? ` ${node.caveat}` : ""}
       </p>
     );
   }
+  const nextVisited = new Set(visited);
+  nextVisited.add(nodeId);
   return (
     <div className="my-2">
       <p className="text-sm font-semibold text-foreground-neutral my-2">{node.question}</p>
       <ul className="list-none pl-4 my-0">
         {node.options.map((opt) => (
           <li key={opt.label} className="my-2 border-l border-stroke-neutral-strong pl-3">
             <span className="text-sm text-foreground-neutral-weak">{opt.label}:</span>
             {targetsOf(opt.next).map((childId) => (
-              <TextTree key={childId} byId={byId} nodeId={childId} />
+              <TextTree key={childId} byId={byId} nodeId={childId} visited={nextVisited} />
             ))}
           </li>
         ))}
       </ul>
     </div>
   );
 }

The same pattern (or a simpler depth limit) should be applied to TreeBranch for consistency.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@apps/blog/src/components/DecisionTree.tsx` around lines 347 - 379, Add cycle
detection to the recursive DecisionTree renderers: both TextTree and TreeBranch
should track visited node IDs while traversing next targets and stop recursing
when a node is revisited. Update the recursive calls in TextTree (and mirror the
same guard in TreeBranch) to pass along a visited-set or equivalent depth guard
so future cyclic data cannot cause infinite recursion during SSR or in the
browser.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Nitpick comments:
In `@apps/blog/src/components/DecisionTree.tsx`:
- Around line 347-379: Add cycle detection to the recursive DecisionTree
renderers: both TextTree and TreeBranch should track visited node IDs while
traversing next targets and stop recursing when a node is revisited. Update the
recursive calls in TextTree (and mirror the same guard in TreeBranch) to pass
along a visited-set or equivalent depth guard so future cyclic data cannot cause
infinite recursion during SSR or in the browser.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 702d50cf-d9e6-43f5-a5ea-5963ae17939a

📥 Commits

Reviewing files that changed from the base of the PR and between d062d35 and ce4d703.

📒 Files selected for processing (4)
  • apps/blog/content/blog/serverless-postgres/index.mdx
  • apps/blog/src/components/DecisionTree.tsx
  • apps/blog/src/components/ServerlessPostgresChooser.tsx
  • apps/blog/src/mdx-components.tsx

@argos-ci

argos-ci Bot commented Jul 9, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Argos notifications ↗︎

Build Status Details Updated (UTC)
default (Inspect) ✅ No changes detected - Jul 10, 2026, 3:25 PM

Break up dense paragraphs, cut jargon, and split the giant lead and
provider profiles into digestible chunks without dropping any price,
date, link, or vendor-claim disclosure. Add the missing hero.svg and
meta.png cover (three-pricing-models comparison card, Eclipse style)
and wire heroImagePath/metaImagePath/heroImageAlt into frontmatter.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick comments (1)
apps/blog/content/blog/serverless-postgres/index.mdx (1)

107-114: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Consider hyphenating "open-source" as a compound adjective.

LanguageTool flags "open source project" on line 113 — when used as a compound adjective before a noun, "open-source" is the more standard form.

✏️ Optional style fix
- In March 2026, the Drizzle ORM team joined PlanetScale; Drizzle is stated to remain an independent open source project.
+ In March 2026, the Drizzle ORM team joined PlanetScale; Drizzle is stated to remain an independent open-source project.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@apps/blog/content/blog/serverless-postgres/index.mdx` around lines 107 - 114,
Hyphenate “open source” when it directly modifies a noun in the PlanetScale
section: update the phrase “open source project” in the paragraph mentioning
Drizzle to “open-source project.”

Source: Linters/SAST tools

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Nitpick comments:
In `@apps/blog/content/blog/serverless-postgres/index.mdx`:
- Around line 107-114: Hyphenate “open source” when it directly modifies a noun
in the PlanetScale section: update the phrase “open source project” in the
paragraph mentioning Drizzle to “open-source project.”

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 95bb9d59-ea5b-4b6d-8c47-29af13af6b0b

📥 Commits

Reviewing files that changed from the base of the PR and between ce4d703 and 5637d80.

⛔ Files ignored due to path filters (2)
  • apps/blog/public/serverless-postgres/imgs/hero.svg is excluded by !**/*.svg
  • apps/blog/public/serverless-postgres/imgs/meta.png is excluded by !**/*.png
📒 Files selected for processing (1)
  • apps/blog/content/blog/serverless-postgres/index.mdx

…logo cover

Reorder around the reader's decision instead of a research memo: lead
with a glance table and the workload chooser, distill the framework into
"the two decisions that matter" (billing model + idle behaviour), then
standardize every provider profile to the same scannable attributes
(Best for / Bills for / Idle / Free-entry / Watch out for). Demote
branching, pooling, and ecosystem to a secondary section; move the wider
market to an "other providers" appendix; pull the cost crossover into its
own short section; and end with an actionable "bottom line". No prices,
dates, links, or vendor-claim disclosures dropped.

Rework the cover to show the five compared providers' brand logos
(Prisma Postgres accented, Neon, Aurora, Supabase, PlanetScale) under a
direct title, "Serverless Postgres providers, compared".

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants