Comparison

Baselyra against Supabase, Appwrite and Firebase.

Written to be useful rather than flattering. Supabase is the more capable product and this page says so in several places; so is Firebase, at a scale Baselyra is not designed for. What follows is where each one wins, so you can pick on the axis that matters to you instead of on a table that loses nowhere.

How to read this. The Baselyra column is drawn from this repository and is checkable line by line. The other three columns describe those projects’ own published self-hosting documentation and pricing at the time of writing; they move fast, so verify anything you are about to depend on rather than trusting a comparison table written by a competitor.

The short version

Pick on this, not on the feature count

Choose Baselyra when

You want RLS-backed APIs over your own Postgres on a small box you control, you would rather read one process than operate thirteen, and the missing pieces — edge functions, image transforms, replicas — are ones you do not need.

Choose Supabase when

You want the same Postgres-and-RLS model with far more around it: managed hosting, edge functions, image transforms, dozens of sign-in providers, read replicas, branching, pooling at scale and an ecosystem with answers already written.

Choose Appwrite when

You want a batteries-included backend with server-side functions in many runtimes, messaging, a mature mobile SDK story and a permissions model per document rather than SQL policies — and you are happy to run MariaDB and Redis.

Choose Firebase when

You want zero operations, global scale from day one, offline-first mobile sync and the deepest client SDKs of the four — and you accept a proprietary, hosted-only platform with a metered bill and a NoSQL data model.

Feature by feature

The whole table

Self-hosted configurations for Supabase and Appwrite, because that is the comparable thing. Firebase has no self-hosted form at all, which is itself one of the rows.

  Baselyra Supabase (self-hosted) Appwrite (self-hosted) Firebase
Containers to run2~12–15~10–20, server plus workersn/a — hosted only
Idle memory~400–600 MB~2–4 GB~2–3 GBn/a
Fits a 1 GB VPSyesnonon/a
DatastorePostgres 17PostgresMariaDB, plus RedisFirestore / RTDB, document store
SQL you can runyes, it is your databaseyesnot the intended interfaceno
Authorisation modelPostgres RLSPostgres RLSPer-document permission stringsSecurity Rules DSL
REST API over your tablesbuilt in, PostgREST-compatible subsetPostgREST, the full surfaceAppwrite SDK protocolSDK, not REST over tables
Realtimechanges, broadcast, presence, RLS re-checked per subscriberchanges, broadcast, presenceyesyes, best-in-class offline sync
File storagelocal disk, signed URLs, Range and ETaglocal or S3local or S3Cloud Storage
Image transformationsnoyes, imgproxyyes, built invia an extension
Edge / server functionsno — Postgres functions over RPC onlyyes, Denoyes, many runtimesyes, Cloud Functions
Sign-in providers7far more — dozensfar more — dozensmany, plus Apple and phone at scale
Phone / SMS sign-inyes, 6 back endsyesyesyes
Password migration inbcrypt preserved from Supabase and Postgresvia your own scriptvia your own scriptvia your own script
Guided import from other backendsSupabase, Postgres, Appwrite, Firebase, SQL dumpPostgres sourceslimitedno
Admin consoleyes, in the same processyes, its own containeryesyes, hosted
Operator accounts and roles in the consoleaccounts, three built-in roles, custom capability setsself-hosted: one shared dashboard loginteams and rolesGoogle Cloud IAM
AI assistant over your schemayes, DeepSeek, optionalyespartialyes, Gemini
Read replicas and failovernoyesvia your own MariaDB setupmanaged and global
Connection pooling at scaleone pg poolSupavisoryesn/a by design
Branching / preview environmentsnoyesnomultiple projects
Multiple projects per instancenot yet — the plumbing exists, nothing creates a second oneyesyesyes
Managed hosting availablenoyesyesyes, only
Runs without vendor accountsyesyes, self-hostedyes, self-hostedno
Telemetry in the default installnonea self-hosted analytics pipeline ships in the stackconfigurablen/a, it is the vendor
LicenceApache-2.0Apache-2.0 for most componentsBSD-3-Clauseproprietary
Runtime dependencies of the server8 npm packagesKong, GoTrue, PostgREST, Realtime, Storage, imgproxy, meta, Vector…Traefik, MariaDB, Redis, ~10 workersn/a
Upgradecompose pull && up -dcoordinated across servicescoordinated across servicesnothing to do
Ecosystem, tutorials, answersnew and smalllargelargeenormous
Community supporta repositoryDiscord, forums, paid supportDiscord, forums, paid supportpaid support, huge Q&A corpus

green is the stronger position on that row, amber is qualified, grey is absent. Several of the green cells are not in the Baselyra column, which is the point of publishing the table.

The honest part

Where the others are genuinely ahead

A comparison that loses nowhere is not believed, and rightly. These are the reasons to not pick Baselyra, written by the people who made it.

Supabase

  • Managed hosting. Somebody else is on call. That alone outweighs everything on this page for many teams.
  • Edge functions. A real deploy target for your own code, which Baselyra simply does not have.
  • More sign-in providers by a wide margin, Apple included.
  • Image transforms, S3 storage, read replicas, branching, Supavisor. Each is a whole capability Baselyra lacks.
  • The full PostgREST surface rather than a compatible subset, and a much larger ecosystem of libraries and answers.
  • Maturity. More people have hit the sharp edges and written about them.

Appwrite

  • Server-side functions in many languages, deployed through the console.
  • Messaging — push, email and SMS as a first-class product rather than an auth detail.
  • A mature mobile SDK story, including offline affordances Baselyra has none of.
  • Dozens of OAuth providers and a per-document permission model some teams find easier to reason about than SQL policies.
  • A hosted Cloud, and a large community.

Firebase

  • Zero operations, global scale. Nothing here competes with that and nothing here tries to.
  • Offline-first sync that genuinely works on a phone in a tunnel. Baselyra’s realtime reconnects; it does not reconcile.
  • The deepest client SDKs of the four, on every platform that matters.
  • Analytics, Crashlytics, Messaging, Remote Config — a product suite, not a backend.
  • Cloud Functions and an enormous body of existing answers.

The other direction

Where Baselyra is genuinely ahead

It fits on the box you have

Two containers and a few hundred megabytes. A self-hosted Supabase or Appwrite wants several gigabytes before it serves a request, which is the difference between a 1 GB VPS and a bill.

One process to debug

When a request behaves oddly there is one log and one codebase — eight runtime dependencies, no ORM, no broker, no sidecar. Not simpler in theory: smaller in fact.

One upgrade, not a matrix

docker compose pull && docker compose up -d. No version compatibility to check across a fleet of services that must agree with each other.

Migration in, with passwords

Supabase and Postgres bcrypt hashes are carried across verbatim and retire themselves to scrypt as users return. No reset email to anybody. None of the other three offers a guided import from its competitors.

The control plane is outside

Studio accounts live in a separate database that a project connection cannot read, even holding the service key. Postgres has no cross-database joins without FDW, so it is a boundary rather than a convention.

Nothing is metered

No MAU band, no egress meter, no invocation count, no project fee, no pausing when idle, no telemetry. Your bill is the box, and it does not move when a job loops.

Coming from Supabase

How much of what you know transfers

ConceptIn Baselyra
createClient(url, anonKey)the same call
.from().select().eq().order()the same builder
Embedded resources author:users(name)one level deep
auth.uid() in policiesidentical
Anon key and service keyidentical roles and meaning
storage.from().upload()the same shape
Realtime channels and postgres_changesthe same frames
Prefer: return=representationsupported
Edge functionsabsent — use Postgres functions over RPC
Image transform query parametersabsent
Supabase CLI, migrations, branchingabsent — plain SQL files in db/
The client is not a drop-in replacement for @supabase/supabase-js. It is deliberately shaped like it, which means a port is mostly changing an import and a couple of option names — not that every method exists.
Deep embeds and some PostgREST corners are not there. One level of embedded resources is supported; nested-two-deep selects are not. Check the REST reference against your hottest queries before you commit.

The migration guide, including what happens to passwords

Decide by running it

Half an hour with a real instance beats any table.

Import a copy of your Supabase project into a throwaway instance and try your three most awkward queries. That answers this page far better than this page does.