Skip to content

tendb vs Neon

If you use Neon for branch-per-PR development, tendb gives you the same day-to-day workflow — instant copy-on-write branches, a connection string per branch, a CLI, a web console, and a CI contract — running on a single EC2 host in your own AWS account, powered by DBLab Engine (ZFS thin clones). The fundamental difference: Neon is managed serverless Postgres where branches fork the live parent at the instant you create them; tendb is a self-hosted clone host that syncs from a source database (Neon, Aurora, RDS, any Postgres URL) and branches from the last sync, not from live production. Your source stays wherever it is — tendb can even use a Neon production database as its source.

Honest in both directions. tendb claims are grounded in the CLI and console source; Neon claims reflect Neon’s documented product as of mid-2026 — check neon.com/docs for current plan limits.

FeatureNeontendbNotes
Branch create / delete / listYes (neonctl, console, API)Yes (tendb branches create|list|get|delete, console, SDK)tendb create is idempotent create-or-reuse; delete of an absent branch exits 0. Bare numbers are PR shorthand: 42pr-42.
Branch resetYes — neonctl branches reset <branch> --parent resets to the parent’s latest stateYes — tendb branches reset <name> discards writes, back to the branch’s own snapshotDifferent semantics. To pick up newer data in tendb, delete and recreate the branch (optionally with --fresh).
Branch-from-branchYes (--parent)Yes (--from <branch>, default main)--from is honored only when the branch doesn’t already exist.
Time-to-branchSeconds (storage-level copy-on-write)Seconds (ZFS copy-on-write clone)tendb footgun: right after first provisioning, the first branch waits for the first sync snapshot — up to 15 minutes.
Connection string per branchYes — public TLS endpoint per branch, pooled variant availableYes — postgres:// URI per branch with stateless derived credentialstendb URIs are in-VPC only: reachable from inside your VPC or through an SSM tunnel. No public endpoint, no TLS, by design.
psql accesspsql "$(neonctl connection-string my-branch)" over the internettendb psql my-branch — opens an SSM tunnel automaticallyNo VPN or bastion needed; auth is your AWS IAM credentials.
CLIneonctl (projects, branches, databases, roles, …)tendb (branches, snapshots, schema, migrate, checkup, ci, console)tendb has no project/org/role management — one engine is one implicit project with one database.
Web consoleFull SaaS console (console.neon.tech)tendb console — local dashboard: branches, snapshots, alerts, tables, SQL editor, per-branch monitoringtendb’s console runs on your machine (or self-hosted behind an auth proxy); secrets never reach the browser.
CI previewsOfficial GitHub Actions, Vercel/Netlify integrationstendb ci ensure|url|delete — a strict stdout contract you wire into any CINo prebuilt Action shipped; the wiring is a few lines of workflow YAML. See CI previews.
SnapshotsRestore points across the history retention window, plus explicit snapshotsExplicit ZFS pool snapshots — scheduled or tendb snapshots create (~10 s at any size)tendb snapshots are the only available branch points. On-demand snapshots require the streaming deployment.
Schema diffneonctl branches schema-diff — branch vs. branchtendb schema diffsource vs. sync target drift onlyNot equivalent. tendb has no branch-to-branch schema diff; use your migration tool’s diff instead.
Scale-to-zero / autoscalingYes — computes suspend when idle and autoscale under loadNo — all branches run on one fixed-size hosttendb capacity is a static port pool (e.g. 10 concurrent branches); exhaustion is a distinct exit code 42.
Point-in-time restoreYes — branch or restore from any timestamp/LSN in the retention window (hours to weeks by plan)No — no WAL archive, no arbitrary-timestamp branchestendb branch points are exactly its snapshots. tendb is not a backup tool; keep your source’s own PITR.
Read replicasYes — read-only computes on a branchNoClosest analog: in streaming mode, main is a live read-only view of the sync target.
High availabilityManaged — replicated storage, compute rescheduled on failureNo — single engine hostIf the host dies, terraform apply rebuilds it and it resyncs. Branches are disposable; your source database is never at risk.
Managed-nessFully managed SaaSSelf-hosted: Terraform-provisioned EC2, you operate ittendb checkup, tendb status, and console Slack alerts do the watching; you do the acting. See Operations.
Data freshnessBranches fork the live parent at creation timeBranches are of the last sync: nightly in dump mode, near-live in streaming mode (--fresh snapshots first)The flip side: branch workloads can never load or endanger production, and production credentials never reach developers. See Data refresh.
Where data livesNeon-operated cloud regionsYour AWS account, your VPCData never leaves your account — relevant for compliance and data residency.
Cost modelUsage-based: compute hours + storage, scale-to-zero trims idle cost; free tierFixed: one EC2 instance + EBS, whatever your AWS pricing saystendb costs the same with 1 branch or 10 — each branch stores only the blocks it changes. No per-seat or plan limits.

Things Neon has that tendb has no equivalent for at all: connection pooler endpoints, a serverless/HTTP driver, branch protection and expiry/TTL, IP allow-lists, multi-region, org/project hierarchy, usage metering, and the Neon extras (Auth, Data API). Things tendb has that Neon doesn’t: it works with any source Postgres — your production can stay on Aurora, RDS, or Neon itself.

Pick Neon when you want production itself to be serverless managed Postgres: scale-to-zero for spiky workloads, PITR, read replicas, HA, and zero servers to operate. If your production database can live in Neon’s cloud, branching there is the shortest path.

Pick tendb when:

  • Production already lives on RDS, Aurora, or another Postgres you can’t (or won’t) move — tendb bolts Neon-style branching onto it without a migration.
  • Data must stay in your AWS account. Branch databases, connection strings, and the console all live inside your VPC; access rides on AWS IAM + SSM.
  • You want a fixed, predictable bill. One EC2 host serves every branch; a busy PR week costs the same as a quiet one.
  • You want branches of production-sized, production-shaped data that can never touch production — branch workloads run on a synced copy, and the SQL editor and migrations get full write access precisely because clones are disposable.

Use both. tendb’s source is any Postgres URL, so a common setup is Neon (or Aurora) as production and tendb serving the disposable copies:

Neon production nightly dump / logical replication tendb host EC2 + ZFS CoW clones pr-42 pr-43 staging
Neon keeps serving production while the tendb host syncs from it and fans out disposable copy-on-write branches.

Production keeps its managed HA, PITR, and autoscaling; PR previews, migration rehearsals, and ad-hoc experiments hammer clones in your VPC instead of consuming production compute. Set it up in the Quickstart.

You do this on NeonYou do this on tendbNotes
neonctl branches create --name feat-xtendb branches create feat-xIdempotent; prints the connection URI on stdout.
neonctl branches create --name x --parent stagingtendb branches create x --from staging
neonctl branches listtendb branches listAdd -o json for machine output.
neonctl branches delete feat-xtendb branches delete feat-xExit 0 even if the branch is already gone.
neonctl branches reset feat-x --parent (discard writes, take parent’s latest)tendb branches delete feat-x && tendb branches create feat-x --freshTwo steps because tendb separates the intents — see next row.
— (discard writes, keep the original branch point)tendb branches reset feat-xBack to the state the branch was created from.
neonctl connection-string feat-xtendb connection-string feat-xBoth print the URI and nothing else.
psql "$(neonctl connection-string feat-x)"tendb psql feat-xtendb tunnels over SSM automatically.
neonctl branches schema-diff main feat-x(no equivalent)tendb schema diff checks source↔sync-target drift, a different job.
Create-branch GitHub Action on PR openURI=$(tendb ci ensure "$PR_NUMBER" | tail -1)Mask it: echo "::add-mask::$URI". Re-runs return the same URI.
Delete-branch GitHub Action on PR closetendb ci delete "$PR_NUMBER"Exits 0 even when the branch never existed or the platform is torn down.
Temporary branch for migration testingtendb migrate --scratch -- npx prisma migrate deployCreates an ephemeral branch, runs the command, deletes it even on failure.
neonctl projects listtendb statusOne tendb engine = one implicit project.