TL;DR
- Choose Firebase if you’re building a mobile app, you want Google’s ecosystem (FCM push notifications, Crashlytics, GA4 integration), and you’re OK with a closed-source backend.
- Choose Pylon if you want self-host, no vendor lock-in, structured data, faceted search, or game shards.
Big picture differences
| Pylon | Firebase | |
|---|---|---|
| License | MIT / Apache 2.0 | Closed source |
| Self-hostable | ✅ | ❌ Google-only |
| Schema | ✅ declarative | ❌ Firestore is schemaless |
| Realtime sync | ✅ | ✅ |
| Functions | ✅ Bun, in-process | ✅ Cloud Functions (Node, separate) |
| Auth | ✅ built-in | ✅ Firebase Auth |
| File storage | ✅ + S3/Stack0 backends | ✅ Cloud Storage |
| Push notifications | ❌ (use any provider) | ✅ FCM |
| Analytics | ❌ (use any provider) | ✅ GA4 |
| Crash reporting | ❌ (use Sentry/Crashlytics) | ✅ Crashlytics |
| Game shards | ✅ | ❌ |
| Faceted search | ✅ | ❌ requires Algolia |
Schema and data
Firestore is schemaless: any document can have any shape. Rules act as a soft schema by validating fields. This is great for rapid prototyping and a constant problem at scale (typos become orphan rows; refactoring fields is a manual sweep). Pylon’s schema is declarative TypeScript:Realtime model
Both ship realtime sync. The mental model differs:- Firestore listeners are per-document or per-query. You attach a listener; it fires when the matching documents change. Listeners are stateful — you manage their lifecycle.
- Pylon’s sync engine maintains a local replica of every entity you’ve subscribed to.
useQuery("Todo")returns the live array; the engine handles tombstones, optimistic mutations, and reconnection.
Search
Firestore has no full-text search. The official recommendation is to mirror your data to Algolia and search there:“Cloud Firestore doesn’t offer native indexing or search for text fields in documents. Additionally, downloading an entire collection to search for fields client-side isn’t practical. To enable full-text search of your Cloud Firestore data, use a third-party search service like Algolia, Typesense, or Meilisearch.”Pylon ships FTS5 + roaring-bitmap facets in the binary. No Algolia bill, no second system to keep in sync.
Functions
| Pylon | Firebase | |
|---|---|---|
| Runtime | Bun (in-process) | Node (separate Cloud Functions) |
| Cold start | None | 1–10 seconds for cold containers |
| DB access | Direct (ctx.db) | Via Admin SDK over network |
| Atomicity | ✅ wrapped in transaction | ❌ separate process |
| Type sharing | ✅ after codegen | Manual |
| Pricing | Included in your binary | Per-invocation + per-GB-second |
Push notifications
Pylon doesn’t ship a push provider. FCM is excellent and free up to enormous volumes — keep using it on top of any backend, including Pylon. Pattern: register the device token via a Pylonaction, send via FCM from your function or a separate worker.
Pricing
Firebase pricing is famously hard to reason about — Firestore reads, writes, deletes, network egress, function invocations, function GB-seconds, storage, downloads, all priced separately. The Blaze plan auto-scales, which is great until it isn’t. Pylon Cloud is one number per dimension (requests, WS connection-minutes, storage, bandwidth). Self-hosted, you pay your VPS bill.Migrating from Firebase
This is the hardest migration of any of the comparisons. Firestore’s schemaless documents typically denormalize aggressively (embed user info inside every post, etc.) — porting to Pylon’s relational model means:- Identify entities — what’s a top-level row vs. nested data?
- Normalize denormalized data — extract
User,Org, etc. into their own tables - Port security rules to policies — Firestore rules use a custom DSL; Pylon policies are simpler boolean expressions
- Re-shape clients —
firestore.collection("todos").onSnapshot(...)→useQuery("Todo")
User rows with emailVerified set, ask users to sign in once via magic code (which auto-binds their existing email).