← All comparisons

Concile vs Firebase

Firebase is Google's managed backend. Concile is an open-source backend you host yourself. This page is about what that trade actually buys and costs.

Checked against Firebase's public docs and pricing on Mon Sep 21 2026. Spotted something out of date? Open an issue.

The short version

Side by side

ConcileFirebase
Live results from your own server codeYes, read-set precisePartly, document listeners
Backend is plain TypeScript functionsYesPartly, Cloud Functions
Authorization is ordinary code, not a rules languageYesNo, Security Rules DSL
Self-host the whole productYesNo, Google Cloud only
Single binary with no database to runYesNo
Swap the database without touching app codeYes, SQLite or PostgresNo, Firestore or Realtime Database
Durable workflows with rollbackYes, saga compensationNo, bring your own
Offline writes that survive a reloadYes, durable outboxYes, Firestore persistence
Full-text and vector searchNot built yetPartly, vector only; text needs an add-on
Hosted cloudNoneYes, only
PriceFree to self-hostSpark free; Blaze pay as you go, metered per service

Realtime: listeners versus live queries

Firestore realtime uses onSnapshot(). You attach a listener to a document or a query. You get an initial snapshot right away. You get a new snapshot on every change. Local writes trigger the listener immediately through latency compensation. This happens before the backend confirms them. The metadata.hasPendingWrites property tells you which state you are viewing. It is a good model with documented limitations. Pipeline operations do not support realtime listeners. The PHP client library does not support them at all.

In Concile, you do not attach listeners. A query is a subscription. The server records what it read. It re-runs the read when a commit touches that data. The server then pushes the new result. Optimistic updates work here too. A durable outbox means an offline write survives a page reload. It replays exactly once.

Authorization: rules versus code

Firebase Security Rules live outside your app. You manage them in the console or the CLI. They combine a path match with a condition. Firestore and Cloud Storage use a service/match/allow if block. Realtime Database uses a separate JSON .read/.write format. Rules combine as OR. If any matching rule grants access, access is granted. The documentation notes this as something to design around.

In Concile, the client never touches the database. Every read and write goes through a function you wrote. This happens in a transaction. The authorization check is a line of TypeScript in that function. It is type-checked with the app. It is unit tested with the app.

Where Firebase is ahead

Where Concile is ahead

Moving from Firebase

There is no automatic migration. You export your Firestore collections. You define the same shapes in schema.ts. You import with concile migrate import. Each Security Rule becomes a check inside the function that reads or writes data. Client code changes from onSnapshot() to useQuery(). It changes from direct document writes to useMutation() calls.

When to pick Firebase

You want a fully managed backend from Google. You want first-party mobile SDKs. You never want to run a server. You accept that Google Cloud is the only place it lives.

When to pick Concile

You want to own the backend. You want to run it anywhere. You want to write authorization as code. You want live queries without listener bookkeeping. You prefer one process over a set of metered services.