<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Max S.</title>
    <description>The latest articles on DEV Community by Max S. (@max4nhost).</description>
    <link>https://dev.to/max4nhost</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3968007%2Ffbdd8440-4254-4e4a-a5b0-e90ae4ff72b9.jpg</url>
      <title>DEV Community: Max S.</title>
      <link>https://dev.to/max4nhost</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/max4nhost"/>
    <language>en</language>
    <item>
      <title>Supabase Alternatives in 2026</title>
      <dc:creator>Max S.</dc:creator>
      <pubDate>Mon, 15 Jun 2026 09:26:09 +0000</pubDate>
      <link>https://dev.to/max4nhost/supabase-alternatives-in-2026-6of</link>
      <guid>https://dev.to/max4nhost/supabase-alternatives-in-2026-6of</guid>
      <description>&lt;p&gt;&lt;em&gt;Disclaimer: Supabase is a great platform, with by far the largest ecosystem and community.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;However, if you're looking to leave, the reasons usually come down to three things:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The pricing&lt;/strong&gt; gets non-linear at the exact moment a project starts working&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PostgREST doesn't scale&lt;/strong&gt; gracefully to complex relational frontends&lt;/li&gt;
&lt;li&gt;You have requirements (self-hosting mandates, a reactive data model, compliance regimes, or &lt;strong&gt;AI agent workflows&lt;/strong&gt;) that the platform doesn't model well&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If none of that is your situation, stop reading.&lt;/p&gt;

&lt;p&gt;What follows is Nhost, Neon, Appwrite, Convex, Firebase, PocketBase. Not Railway, not Render. Those are infra platforms and comparing them to Supabase doesn't make sense, like comparing a toolbox to a hammer.&lt;/p&gt;




&lt;h2&gt;
  
  
  Nhost
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu692mhdsji6ghg4mx38k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu692mhdsji6ghg4mx38k.png" alt="Nhost AI Agent Backend" width="400" height="157"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://nhost.io/" rel="noopener noreferrer"&gt;Nhost&lt;/a&gt; is, structurally, very similar to Supabase: Postgres, auth, storage, serverless functions. The difference is &lt;strong&gt;the API layer&lt;/strong&gt;. GraphQL instead of PostgREST, powered by Constellation, their own open-source GraphQL engine written in Go.&lt;/p&gt;

&lt;p&gt;If you have a dashboard that needs data from six related tables, a GraphQL query gives you exactly that in one round trip. PostgREST gives you a series of choices: chain multiple requests, write RPC functions that fake the join, or start questioning your data model. It gets unwieldy fast.&lt;/p&gt;

&lt;p&gt;The permission system compounds this: role-based row and column access is defined inside the query engine itself, so you're not maintaining separate RLS policies in SQL that drift from your actual auth logic.&lt;/p&gt;

&lt;p&gt;Nhost fits naturally for &lt;strong&gt;AI agent workflows&lt;/strong&gt;. Agents touching shared Postgres state get real-time updates via subscriptions, and the permission model means no separate access control layer bolted around your database calls.&lt;/p&gt;




&lt;h2&gt;
  
  
  Neon
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5rnwv7aw9nus6l94dzgr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5rnwv7aw9nus6l94dzgr.png" alt="Neon logo" width="400" height="146"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://neon.com/" rel="noopener noreferrer"&gt;Neon&lt;/a&gt; is not a full Supabase replacement. &lt;strong&gt;It's a database.&lt;/strong&gt; That's it. No auth, no storage, no functions, no realtime. If you pick Neon, you're assembling the rest of the backend yourself.&lt;/p&gt;

&lt;p&gt;Why would you do that? Because what Neon actually built is genuinely impressive: they separated compute from storage at the Postgres level, which makes &lt;strong&gt;database branching&lt;/strong&gt; possible. A full copy-on-write snapshot of your database in seconds. One branch per pull request, against real data, gone when the PR closes. Databricks acquired them last year and it's continued to develop. It's become the thing other providers benchmark against.&lt;/p&gt;

&lt;p&gt;Neon is a good fit if the database itself is your unsolved problem and the rest of your infrastructure is already handled: platforms provisioning a database per customer, CI pipelines that need isolated environments per test suite, teams with existing auth that just want better Postgres without ripping everything else out.&lt;/p&gt;




&lt;h2&gt;
  
  
  Appwrite
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fanissqa8paohhdtpkqsw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fanissqa8paohhdtpkqsw.png" alt="Appwrite logo" width="400" height="114"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The thing &lt;a href="https://appwrite.io/" rel="noopener noreferrer"&gt;Appwrite&lt;/a&gt; does well, genuinely well in a way the other platforms kind of half-ass, is &lt;strong&gt;self-hosting&lt;/strong&gt;. One &lt;code&gt;docker-compose&lt;/code&gt; command and you have a full working stack. Not "full working stack but you need to configure eight more things." Actually full, actually working.&lt;/p&gt;

&lt;p&gt;This matters more than people give it credit for. Air-gapped environments, healthcare compliance, regions where AWS and GCP are politically complicated, enterprise contracts with data residency clauses that say the words "within the EU" in boldface. Appwrite handles all of this without treating self-hosting as a community project that the founders are vaguely embarrassed by.&lt;/p&gt;

&lt;p&gt;Here's the catch, and it's a real one: &lt;strong&gt;Appwrite is not Postgres.&lt;/strong&gt; The data layer is its own collection and document model. Which means no SQL, no &lt;code&gt;pg_dump&lt;/code&gt;, no &lt;code&gt;EXPLAIN ANALYZE&lt;/code&gt; when a query gets slow, no connecting a BI tool to it. One of the quiet reasons Postgres-backed platforms feel safe is that the escape hatches are all there if you need them. Appwrite closes most of them.&lt;/p&gt;

&lt;p&gt;If your team thinks in SQL, you'll notice this within the first week. There's no workaround for it.&lt;/p&gt;

&lt;p&gt;If you're building something mobile-first, especially on Flutter, Appwrite's Flutter SDK is one of the best in this space and the SQL thing might genuinely not matter. Different problem, different tradeoffs.&lt;/p&gt;




&lt;h2&gt;
  
  
  Convex
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs6xib4vvvzd1j1rltxwh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs6xib4vvvzd1j1rltxwh.png" alt="Convex logo" width="400" height="153"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Almost every comparison article gets &lt;a href="https://www.convex.dev/" rel="noopener noreferrer"&gt;Convex&lt;/a&gt; wrong, usually by fitting it into a row in a feature table next to Firebase and calling it a document database alternative. &lt;em&gt;It's not that.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The actual model: your backend is TypeScript functions. The data layer is document-relational. The important part, the part that sounds like a detail but isn't, is that &lt;strong&gt;queries are reactive subscriptions by default&lt;/strong&gt;. When data changes, every subscribed client updates. Automatically. Without you writing cache invalidation logic. Without you managing subscription channels. Without you thinking about whether two parts of the UI are looking at stale data from the same table.&lt;/p&gt;

&lt;p&gt;End-to-end TypeScript from the schema to the React component means the types aren't generated artifacts you have to remember to regenerate. They're the same code.&lt;/p&gt;

&lt;p&gt;When does this matter? Collaborative editors. Live multiplayer state. AI agent applications where multiple processes are writing to shared state concurrently and the UI has to reflect it immediately. Convex makes a whole class of synchronization bugs structurally impossible. Not hard to write — the runtime doesn't let them exist.&lt;/p&gt;

&lt;p&gt;When does it not matter? Analytical stuff. Reporting. Anything that needs direct SQL access. Convex's document model won't bend to accommodate an ad-hoc &lt;code&gt;GROUP BY&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The learning curve is also real: the first two weeks are genuinely disorienting. The mental model is different enough from "database + API" that your existing instincts are wrong in subtle ways. Developers who get through that describe the next few months as feeling like they have superpowers. I believe both descriptions. Whether the trade is worth it depends on whether realtime consistency is your actual hard problem.&lt;/p&gt;




&lt;h2&gt;
  
  
  Firebase
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3pt4f8ekgkwejhakucyx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3pt4f8ekgkwejhakucyx.png" alt="Firebase logo" width="400" height="109"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Hard to imagine cases when people move from Supabase to &lt;a href="https://firebase.google.com/" rel="noopener noreferrer"&gt;Firebase&lt;/a&gt;, but I can't skip this.&lt;/p&gt;

&lt;p&gt;If you outgrow Supabase or Nhost and need to leave, your data is Postgres. You run &lt;code&gt;pg_dump&lt;/code&gt;, you load it somewhere else, you update your connection strings. It's a project, not a crisis.&lt;/p&gt;

&lt;p&gt;If you outgrow Firestore, you're transforming a data model, not migrating rows. The access patterns you built around Firestore's model (the denormalization, the collection structure, the places where you stuffed data into subcollections to avoid a join) don't translate. It's months of work under pressure, usually when the thing that forced the move isn't waiting for you.&lt;/p&gt;

&lt;p&gt;That's not a dealbreaker for the right use cases. Offline-first mobile sync where the app needs to work through genuinely unreliable networks and reconcile cleanly when connectivity returns: Firebase is still the best answer here, and it's not close. Simple read-heavy access patterns at scale without relational complexity. Google ecosystem products where auth, analytics, and ML are already in Cloud.&lt;/p&gt;




&lt;h2&gt;
  
  
  PocketBase
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frla7cixc14lzpipj4z3q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frla7cixc14lzpipj4z3q.png" alt="Pocketbase logo" width="400" height="94"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I'll just say it: &lt;a href="https://pocketbase.io/" rel="noopener noreferrer"&gt;PocketBase&lt;/a&gt; is one of my favorite pieces of software that exists right now.&lt;/p&gt;

&lt;p&gt;It's one Go binary. SQLite, realtime subscriptions, auth, file storage, admin UI. Runs on a $5 VPS. ~60k GitHub stars. &lt;strong&gt;One maintainer.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That last part is both the appeal and the risk. The total system fits in one person's head, which means deployment is copying a file, the admin UI is actually good, and there are no abstractions hiding from you. For internal tools, admin panels, side projects, prototypes, hobby things that are more complex than a static site: PocketBase is more elegantly suited to these than anything else on this list by a significant margin.&lt;/p&gt;

&lt;p&gt;The ceiling is real too. SQLite means single node. There's no path to horizontal scaling, no managed hosting tier for when self-managing gets annoying. There was a meaningful auth-bypass CVE earlier this year, patched quickly and responsibly disclosed, handled well by the maintainer. But &lt;em&gt;"handled well by a single person"&lt;/em&gt; is a different risk profile than &lt;em&gt;"handled by a security team at a funded company,"&lt;/em&gt; and that's a real input to a production decision depending on what you're building.&lt;/p&gt;

&lt;p&gt;The failure mode I've watched happen: someone uses PocketBase as a placeholder while the project proves out, then migrates to something "real" after it does. That migration always happens under deadline, always takes longer than anyone estimated, and is always more painful than if they'd made the decision upfront. Better to either commit to it for what it actually is (a complete backend for things that fit on one node, which is honestly a bigger category than people admit) or pick something else from the start.&lt;/p&gt;




&lt;h2&gt;
  
  
  So How Do You Actually Pick
&lt;/h2&gt;

&lt;p&gt;Start with the data model. This is the decision that matters most and people skip over it to compare pricing tiers instead.&lt;/p&gt;

&lt;p&gt;If you need GraphQL, a strong permission layer, or your backend will serve AI agents: &lt;strong&gt;Nhost&lt;/strong&gt;. If you want the most mature REST-based Postgres BaaS with the largest ecosystem: go back to Supabase. If the database is your only unsolved problem and everything else is handled: &lt;strong&gt;Neon&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Document-shaped data with stable, simple access patterns: &lt;strong&gt;Firebase&lt;/strong&gt; or &lt;strong&gt;Appwrite&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Then self-hosting. If it's a hard requirement, not a nice-to-have: Appwrite or PocketBase. Self-hosted Supabase exists but the full service stack is a real ops commitment. Not a one-afternoon project.&lt;/p&gt;

&lt;p&gt;Then realtime. If live synchronization is the core mechanic of what you're building and not just a feature checkbox, actually evaluate &lt;strong&gt;Convex&lt;/strong&gt;. Don't just put it in the table and move on.&lt;/p&gt;

&lt;p&gt;Before you commit to anything: run your actual schema through the top two options. Real tables, real auth flow, real queries from the app. Not a tutorial, not a hello world. The places where something breaks or needs a workaround are the information you need, and you won't get it from any comparison article including this one.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>backend</category>
      <category>database</category>
      <category>postgres</category>
    </item>
    <item>
      <title>We Built an Open-Source GraphQL Engine to Replace Hasura</title>
      <dc:creator>Max S.</dc:creator>
      <pubDate>Thu, 04 Jun 2026 15:13:37 +0000</pubDate>
      <link>https://dev.to/max4nhost/we-built-an-open-source-graphql-engine-to-replace-hasura-56l</link>
      <guid>https://dev.to/max4nhost/we-built-an-open-source-graphql-engine-to-replace-hasura-56l</guid>
      <description>&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;p&gt;We built &lt;a href="https://github.com/nhost/nhost/tree/main/services/constellation" rel="noopener noreferrer"&gt;Constellation&lt;/a&gt; — an open-source GraphQL engine written in Go that is a near drop-in replacement for Hasura Community Edition. It reads the same metadata, generates the same schema, and serves the same GraphQL API. In production it uses &lt;strong&gt;~90% less memory than Hasura&lt;/strong&gt; with comparable or better latency, before any dedicated performance work.&lt;/p&gt;

&lt;p&gt;If you run Hasura today, this post is for you. If you build GraphQL infrastructure, care about open-source sustainability, or just want to see real production memory numbers from a fresh Go rewrite — keep reading.&lt;/p&gt;




&lt;h2&gt;
  
  
  The problem with depending on someone else's engine
&lt;/h2&gt;

&lt;p&gt;Hasura v2 has been the backbone of Nhost's GraphQL layer for years. It's a genuinely good piece of engineering, and we built a lot on top of it.&lt;/p&gt;

&lt;p&gt;But three things changed:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hasura v2 is winding down.&lt;/strong&gt; Development has shifted to Hasura v3, which takes a different approach to open source — the engine core is Apache-licensed, but the CLI, web console, and developer tooling are proprietary. That's a meaningful shift from v2, where the full stack was open. Continuing to depend on an engine that's winding down toward end-of-life, or migrating our GraphQL and permissions layer to one where the tooling is closed, weren't paths we were willing to take.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Memory was consistently our heaviest service per project.&lt;/strong&gt; A GraphQL engine sits between every client request and your database. It should be fast and lean. Instead, it was the most expensive thing we ran per project — and memory in particular is hard to throttle gracefully under load.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;We didn't own a critical piece of our infrastructure.&lt;/strong&gt; The API and permissions layer sits at the center of every Nhost application. When something goes wrong, or when you want to ship something new, depending on someone else's roadmap is expensive in ways that don't show up in dashboards.&lt;/p&gt;

&lt;p&gt;So we built our own — while keeping full compatibility with Hasura on the GraphQL request path.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Constellation actually is
&lt;/h2&gt;

&lt;p&gt;Constellation is a GraphQL engine that turns a relational database into a role-based GraphQL API. It is designed to be a &lt;strong&gt;near drop-in replacement for Hasura Community Edition&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Concretely, that means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Same metadata format.&lt;/strong&gt; It reads your existing Hasura metadata — either from a YAML/JSON file on disk, or straight from Hasura's &lt;code&gt;hdb_catalog.hdb_metadata&lt;/code&gt; table.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Same generated schema.&lt;/strong&gt; Same types, same relationships, same permission-aware shape per role. We verify this with byte-level schema diffs (more on that below).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Same request surface.&lt;/strong&gt; Queries, mutations, and subscriptions over the same &lt;code&gt;/v1/graphql&lt;/code&gt; endpoint, plus remote schemas and cross-source remote relationships.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It's a fresh Go codebase — not a fork of Hasura. PostgreSQL and SQLite are first-class backends today. The connector design is built so additional databases can plug in without touching the query planner.&lt;/p&gt;

&lt;p&gt;Where Hasura's behavior is surprising or outright wrong, we occasionally diverge — and every such divergence is documented in &lt;a href="https://github.com/nhost/nhost/blob/main/services/constellation/KNOWN_DIFFERENCES.md" rel="noopener noreferrer"&gt;&lt;code&gt;KNOWN_DIFFERENCES.md&lt;/code&gt;&lt;/a&gt;. Correctness over surface area is one of our explicit goals.&lt;/p&gt;




&lt;h2&gt;
  
  
  The numbers that made us ship it
&lt;/h2&gt;

&lt;p&gt;We ran Constellation against real production workloads, side by side with Hasura, on the same database and the same traffic. We didn't tune anything special for these results.&lt;/p&gt;

&lt;h3&gt;
  
  
  Memory
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6zws324al273yex6p7zv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6zws324al273yex6p7zv.png" alt="Memory usage" width="798" height="153"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Constellation's memory usage sits ~90% below Hasura's serving the same traffic. In absolute numbers: Hasura at ~180 MiB, Constellation at ~15 MiB. This is not a benchmark environment — these are production dashboards.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;A note on the CPU panel in that chart: Constellation's CPU looks dramatically lower, but we're talking millicpus here. Both engines are cheap on CPU in absolute terms; the gap is real but small. Memory is where the meaningful difference lives.&lt;/p&gt;

&lt;h3&gt;
  
  
  Latency
&lt;/h3&gt;

&lt;p&gt;Across the same window, Constellation also serves requests a little faster.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwq9xl9lznrjym0lfx9fl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwq9xl9lznrjym0lfx9fl.png" alt="Request latency over the same period" width="798" height="210"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Request latency over the same period: Hasura (blue) regularly spikes toward 60–80 ms, while Constellation (purple) mostly stays under 40 ms.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;To make the comparison concrete, here's the per-period delta of Constellation minus Hasura for the same traffic. Anything in the green region (below zero) means Constellation was faster; the occasional red spike above the line marks the moments it wasn't.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbcijydz2nukxx7g26diz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbcijydz2nukxx7g26diz.png" alt="Latency delta (Constellation minus Hasura)" width="799" height="246"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Latency delta (Constellation minus Hasura). Most of the line sits in the green, below-zero region, meaning Constellation was faster, with a handful of red spikes where it briefly wasn't.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;These are raw production dashboards, not a curated benchmark. That's rather the point. We didn't tune anything special to get here.&lt;/p&gt;




&lt;h2&gt;
  
  
  How it works alongside Hasura (not instead of it — yet)
&lt;/h2&gt;

&lt;p&gt;Constellation doesn't yet implement Hasura's metadata HTTP API (&lt;code&gt;POST /v1/metadata&lt;/code&gt;). It &lt;em&gt;consumes&lt;/em&gt; metadata but doesn't &lt;em&gt;author&lt;/em&gt; it. So the current deployment model is straightforward:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hasura owns metadata authoring. Constellation owns request serving.&lt;/strong&gt; Both point at the same database.&lt;/p&gt;

&lt;p&gt;In practice, an Nhost project running Constellation gets two endpoints:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;https://&amp;lt;subdomain&amp;gt;.hasura.&amp;lt;region&amp;gt;.nhost.run&lt;/code&gt; → Hasura (metadata authoring, plus anything Constellation doesn't serve yet)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;https://&amp;lt;subdomain&amp;gt;.graphql.&amp;lt;region&amp;gt;.nhost.run&lt;/code&gt; → Constellation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The key property: &lt;strong&gt;you can flip Constellation on, run real traffic through it, and remove it at any time to fall back to Hasura with zero migration.&lt;/strong&gt; That's the whole appeal of the side-by-side model.&lt;/p&gt;

&lt;p&gt;Once Constellation supports metadata mutations on its own, the Hasura half can be dropped entirely.&lt;/p&gt;




&lt;h2&gt;
  
  
  What's solid vs. what's missing
&lt;/h2&gt;

&lt;p&gt;Constellation is &lt;strong&gt;alpha&lt;/strong&gt;. That label reflects &lt;em&gt;feature coverage&lt;/em&gt; against Hasura — not the stability of what's already there.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solid and in production:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ PostgreSQL and SQLite connectors&lt;/li&gt;
&lt;li&gt;✅ Full GraphQL query, mutation, and subscription pipeline&lt;/li&gt;
&lt;li&gt;✅ JWT and admin-secret auth&lt;/li&gt;
&lt;li&gt;✅ Role-based permissions&lt;/li&gt;
&lt;li&gt;✅ Remote schemas&lt;/li&gt;
&lt;li&gt;✅ Cross-source remote relationships&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Not yet implemented:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;❌ Hasura Actions&lt;/li&gt;
&lt;li&gt;❌ Event and cron triggers&lt;/li&gt;
&lt;li&gt;❌ REST endpoints&lt;/li&gt;
&lt;li&gt;❌ Allowlists and query collections&lt;/li&gt;
&lt;li&gt;❌ Inherited roles, native queries, computed fields&lt;/li&gt;
&lt;li&gt;❌ MSSQL, BigQuery, Snowflake backends&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If your app lives mostly in the query/mutation/subscription world, there's a good chance Constellation already does what you need. If you lean heavily on Actions or event triggers, keep those on Hasura for now.&lt;/p&gt;




&lt;h2&gt;
  
  
  What's next — and how you can shape it
&lt;/h2&gt;

&lt;p&gt;The near-term roadmap is focused on closing the gap: implementing the metadata HTTP API so Constellation can own the full stack without Hasura running alongside it, expanding the feature surface into Actions and triggers, and eventually supporting additional database backends.&lt;/p&gt;

&lt;p&gt;But the most valuable thing right now isn't what's on our roadmap. It's real-world usage.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;There are four concrete ways you can help:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Run real traffic through it.&lt;/strong&gt; Enable Constellation next to your existing Hasura instance (see below) and point production traffic at it. That's the fastest way to find real divergences and edge cases.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Report schema diffs.&lt;/strong&gt; If &lt;code&gt;nhost schema diff&lt;/code&gt; turns up a divergence that isn't covered in &lt;a href="https://github.com/nhost/nhost/blob/main/services/constellation/KNOWN_DIFFERENCES.md" rel="noopener noreferrer"&gt;&lt;code&gt;KNOWN_DIFFERENCES.md&lt;/code&gt;&lt;/a&gt;, open an issue with the diff hunk and a minimal metadata snippet. That's how new issues get documented — or fixed.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Report runtime bugs.&lt;/strong&gt; A query that returns different results, a subscription that misbehaves, a permission that doesn't line up — under live traffic these are the most valuable reports we can get.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Read the code and contribute.&lt;/strong&gt; It's open source and we've worked hard to make it approachable — small interfaces, golden-file tests, and per-package documentation. PRs and questions are welcome.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Try it yourself
&lt;/h2&gt;

&lt;p&gt;The lowest-friction path is enabling Constellation on any Nhost project. Add one block to &lt;code&gt;nhost/nhost.toml&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight toml"&gt;&lt;code&gt;&lt;span class="nn"&gt;[experimental.constellation]&lt;/span&gt;
&lt;span class="py"&gt;version&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"0.4.0"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pick the latest tag from &lt;a href="https://github.com/nhost/nhost/blob/main/services/constellation/CHANGELOG.md" rel="noopener noreferrer"&gt;CHANGELOG.md&lt;/a&gt;. With that in place, your project runs both engines. Remove the block and you're back to Hasura.&lt;/p&gt;

&lt;p&gt;To verify Constellation generates the same schema as Hasura for each role:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nhost schema dump &lt;span class="nt"&gt;--role&lt;/span&gt; user &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-u&lt;/span&gt; &lt;span class="s2"&gt;"https://&amp;lt;subdomain&amp;gt;.hasura.&amp;lt;region&amp;gt;.nhost.run/v1/graphql"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-o&lt;/span&gt; schema.hasura.user.graphqls

nhost schema dump &lt;span class="nt"&gt;--role&lt;/span&gt; user &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-u&lt;/span&gt; &lt;span class="s2"&gt;"https://&amp;lt;subdomain&amp;gt;.graphql.&amp;lt;region&amp;gt;.nhost.run/v1/graphql"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-o&lt;/span&gt; schema.constellation.user.graphqls

nhost schema diff &lt;span class="nt"&gt;-a&lt;/span&gt; schema.hasura.user.graphqls &lt;span class="nt"&gt;-b&lt;/span&gt; schema.constellation.user.graphqls
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;An empty diff means Constellation produced a byte-equivalent schema for that role. Any non-empty diff should map to a known difference — and if it doesn't, that's exactly the kind of issue we want to hear about.&lt;/p&gt;

&lt;p&gt;Prefer to run it standalone without an Nhost project? The &lt;a href="https://github.com/nhost/nhost/tree/main/services/constellation" rel="noopener noreferrer"&gt;repository README&lt;/a&gt; has full build and run instructions.&lt;/p&gt;

</description>
      <category>graphql</category>
      <category>go</category>
      <category>postgres</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
