How ZigBase compares
This comparison is maintained by the ZigBase project. We've tried to be fair; corrections welcome via GitHub issue.
ZigBase is built for individuals and small teams who want integrated application services, custom logic in Zig, and explicit control over resources and deployment. Write the application directly or work with a coding agent. Its combination of an embeddable framework, resource tooling, and a single binary is the reason to evaluate it. Read Why ZigBase for the design rationale. The table below is a dated feature comparison, not a performance ranking; evaluate capacity against your own workload.
Comparison table
| Dimension | ZigBase | PocketBase | TrailBase | Supabase | Firebase |
|---|---|---|---|---|---|
| Model | Self-hosted single binary | Self-hosted single binary | Self-hosted single binary | Hosted platform; self-host possible (multi-service) | Hosted only |
| Database | Embedded SQLite; PostgreSQL opt-in (verified TLS by default) | Embedded SQLite | Embedded SQLite; Postgres experimental | PostgreSQL | Proprietary (Firestore) |
| Scale path | Opt-in Postgres build; migrate-db for data migration; review SQL, shared files, and jobs before adding replicas | Single node (SQLite) | Single node (SQLite); experimental Postgres backend | Postgres-native scaling | Managed |
| Migrating in | Declarative schema apply, whole-dataset import --manifest in relation order, bcrypt password import (rehashed to argon2id on first login), parity-replay harness | Collection schema JSON import/export; JS/Go migrations | SQL migrations | CLI dump/restore; the wider Postgres ecosystem | Managed import/export |
| Agent operability | init scaffolding with a generated AGENTS.md, self-backgrounding serve, --json CLI output, frozen error codes + explain-code, /api/meta probe, published llms.txt | — | — | MCP server; AI assistant (hosted) | MCP server (CLI); Gemini in Firebase (hosted) |
| SPA hosting | Zero-config .spa marker fallback for client-routed apps, plus comptime static_routes match→serve maps in custom builds | Built-in --indexFallback on the static handler (default on) | Built-in --spa flag on --public-dir serving | No built-in static hosting product — pair with Netlify/Vercel/etc. | Firebase Hosting rewrites (the reference implementation for this) |
| Extension model | Compiled, typed Zig (comptime-checked hooks/routes/jobs) | Go framework, or embedded JS (goja) via the optional jsvm plugin | WASM runtime (Wasmtime) — currently JS/TS and Rust guest languages | SQL/RLS + Deno edge functions | JS Cloud Functions |
| Auth | Password, magic-link, OTP, passkeys/WebAuthn, OAuth2+PKCE | Password, email OTP, OAuth2, optional MFA (2 of the above) — no passkeys | Password/username, OAuth2 (PKCE), anonymous sign-in — no passkeys | Full GoTrue incl. SAML SSO (Pro plan and above) | Broad incl. phone/SMS auth |
| Authorization | Rules + relationship abilities + first-class multi-tenancy, fail-closed | Rule expressions | Access-rule expressions | Postgres RLS | Security rules |
| Realtime | WebSocket + SSE record subs + custom broadcast; record subs cross-instance on PG | Server-Sent Events (SSE) record/collection subscriptions | Realtime record subscriptions | CDC + broadcast + presence | Native listeners |
| Search | Built-in FTS (+ opt-in vector) | Filter queries only — no built-in full-text index | Vector search built-in (bundled sqlite-vec); no first-party full-text feature | PG FTS + pgvector | Text search requires Firestore Enterprise edition; no native search on standard tier |
| Jobs/queues | Built-in durable queues, retries, webhooks | Cron (cronAdd) only — no built-in queue | Cron jobs (incl. via WASM components) — no queue yet (on roadmap) | pg_cron + Queues (built on pgmq) | Cloud Tasks/Scheduler |
| Built-in templates + SES/Postmark/SMTP, suppression | SMTP (self-configured) | Auth emails: sendmail by default, configurable SMTP | Built-in sender capped at 2 msg/hour; custom SMTP required for production | Via extensions (e.g. Trigger Email + a 3rd-party SMTP provider) | |
| Analytics | Built-in event capture + rollups | — | — | — (external) | Google Analytics |
| Admin UI | Embedded SPA at /_/ | Embedded | Embedded, incl. a mobile-friendly layout | Hosted studio | Console |
| Client SDKs | TypeScript, Dart, Python, Kotlin — each with typed codegen from your schema | JavaScript + Dart | JS/TS, Dart, Rust, C#/.NET, Swift, Kotlin, Go, Python | Many | Many |
| Platforms | Linux & macOS binaries · Docker (no native Windows) | Linux/macOS/Windows | Linux/macOS/Windows | n/a (hosted) / Docker for self-host | n/a |
| Maturity | Pre-1.0 (v0.13.0) | Pre-1.0 (v0.39.x) | Alpha, pre-1.0 (v0.32.x) | GA hosted | GA |
| Resource footprint | Single ~7 MB binary, ~29 MB RSS idle, zero external services (measured, ReleaseSafe) | Single Go binary (~31 MB; ~12 MB zipped), zero external services | Single Rust binary, zero external services | Self-host: multi-service Docker Compose (Postgres, Auth, Storage, Realtime, PostgREST, Studio, Kong, and more — 13 containers) | n/a — fully hosted, no footprint to operate |
| License / cost | Apache-2.0, free | MIT, free | OSL-3.0 (core, copyleft scoped to TrailBase itself); Apache-2.0 client libraries | Apache-2.0 core; hosted tiers | Proprietary, usage-billed |
Different constraints, different tools
Choose ZigBase if you want one self-hosted binary, a typed compiled extension surface, and a SQLite→Postgres scale path without a rewrite — and you're on Linux or macOS. Also if you're pointing a coding agent at your backend, or moving an existing app onto one: the CLI, error codes, and migration tooling are built to be driven rather than clicked through.
Choose PocketBase if you want Windows support or a JS extension surface, or its larger community and ecosystem.
Choose TrailBase if you want a Rust core with a WebAssembly extension runtime (JS/TS or Rust), the widest first-party client SDK spread, and Windows support.
Choose Supabase or Firebase if you want a managed platform and don't want to operate a server at all.