Skip to content

dAvePi vs. PocketBase

PocketBase is a single Go binary plus a SQLite database. You download one executable, point a browser at it, and define collections (schemas) through the admin UI. REST routes, auth, realtime subscriptions, and file uploads come out of the box. The whole thing weighs in at ~30MB total and runs anywhere.

dAvePi is a much larger surface in exchange for a different production posture: REST + GraphQL + MCP + typed client + admin SPA from one schema file, state machines / audit / idempotency / ACL built in, Node + Mongo runtime. Heavier, but covers more of what production apps need without app-side glue.

FeaturedAvePiPocketBase
RuntimeNode.js + MongoDBSingle Go binary (~30MB), SQLite embedded
APIREST + GraphQL + MCPREST + realtime
MCP / agent surfaceFirst-class (HTTP + stdio); _describe manifestNone built-in
Schema definitionOne JS file per resourceCollections defined in the admin UI (or JS migrations)
Hot reloadYes (dev)Schema applies on save in the admin UI
ACL modelDocument + field-level on the schemaAPI rules (one expression per CRUD verb) per collection
Audit logDefault-on, per-record diffNone built-in
Soft delete + restoreDefault-on with restore_* MCP toolNone built-in (you wire a deleted flag)
File uploadstype: 'File' field; local / S3 / GCSFile-type field; local storage by default, S3 supported
Computed fieldscomputed: (r) => … at response timeNone
RelationsDeclarative belongsTo / hasMany; batched __includerelation field type, expansion via ?expand=
State machinesPer-field, generated mutation, audited transitionsNone built-in
IdempotencyStripe-style Idempotency-KeyNot built in
Typed clientdavepi gen-client per-resource TS interfacesOfficial JS SDK + a few community-typed ones
Admin UIRefine-based SPA, auto-rendered from _describeFirst-party admin (the killer feature)
RealtimeOutbound webhooks for change eventsWebSocket subscriptions per collection
AuthJWT + refresh, /login / /registerEmail/password, OAuth, magic link, anonymous
HostingBring your ownBring your own — single binary, anywhere

Both auto-generate CRUD endpoints from declared schemas. Both ship a working admin UI. Both support file fields, relations, and role-based access. Both have a “you point your frontend at it and it works” out-of-box experience.

  • State machines, audit log, soft delete, idempotency, computed fields. All built in as schema vocabulary. In PocketBase these are either missing or “wire it in app code”.
  • Agent surface. MCP tools per resource, _describe for one-round-trip capability discovery, typed errors with recoverable. PocketBase has no MCP integration story today.
  • GraphQL. PocketBase is REST + realtime only — no GraphQL surface. dAvePi exposes both, generated from the same schema.
  • Schema as code. PocketBase’s primary schema editor is the admin UI; JS migrations exist but the canonical pattern is click-to-define. dAvePi’s schema-as-a-file path is friendlier to code review, branching, and AI-agent-driven changes (which is most of the eval suite).
  • Typed client. A first-class TS client generated from the schema map. PocketBase’s official JS SDK is untyped at the per-record level (you supply your own types).
  • Audit + retention. Default-on per-record audit trail with field-level diffs and retention sweeps. To get this in PocketBase you’d add a hook that writes audit rows, build the query endpoint, and wire retention manually.
  • Operational simplicity. Single binary. No database to run, no Node version to pin, no npm install. SQLite means backups are a file copy. Self-host on a $5 VPS, your laptop, or an embedded device.
  • Resource footprint. ~30MB binary, single-process Go, minimal runtime overhead. dAvePi pulls in Node + Mongo, which is a meaningful step up in memory / disk / boot time.
  • First-party admin UI. PocketBase’s admin is one of its best features — polished, opinionated, and works with no configuration. dAvePi ships a Refine-based admin SPA pre-built inside the package; both are zero-config out of the box, but PocketBase’s UI is the more mature surface.
  • Realtime WebSockets. Native subscriptions to row changes. dAvePi pushes change events via outbound webhooks; clients poll or use a webhook-receiver service for similar effect.
  • Authentication breadth. OAuth, magic link, anonymous sign-in, email confirmation, password reset flows — all built in. dAvePi ships JWT + refresh + password reset; broader auth flows are app-side.
  • Single-binary deploy. No Docker compose, no Mongo container, no npm install on the server.
  • You’re building a side project, prototype, or single-tenant app where simplicity is the value.
  • You want WebSocket realtime out of the box.
  • You want to deploy to a Raspberry Pi / $5 VPS / Fly micro VM and forget about it.
  • The schema is small enough that the UI editor is faster than writing JS files.
  • You want a polished admin UI as a primary feature.
  • You’re building for AI agents and want MCP integration without proxying a custom server.
  • The app will need state machines, audit logs, multi-tenant ACL, or other production-shaped features — and you’d rather the framework handle them than wire them in app code.
  • You need GraphQL alongside REST.
  • The schema is large enough that “file per resource” is faster than clicking through an admin UI.
  • You want a generated typed TS client driving frontend development.

PocketBase → dAvePi:

  1. Export collections. Use PocketBase’s admin → settings → backup, or the API to dump records to JSON.
  2. Collection → schema file. Each collection becomes a schema/versions/v1/<name>.js. PocketBase field types map pretty directly:
    • text / email / urlString
    • numberNumber
    • boolBoolean
    • dateDate
    • relation → a plain String FK + a relations entry
    • filetype: 'File' with the accept / maxBytes from the original config.
  3. API rules → ACL. PocketBase’s per-CRUD-verb expressions roughly map to dAvePi’s acl.list / acl.delete (document level) and field-level acl.read / acl.create / acl.update. “@request.auth.id = id” is the default owner-only mode — no policy needed in dAvePi.
  4. Auth. Re-register users; password hashes don’t migrate directly. A one-time password-reset flow is the usual path.
  5. Realtime subscribers. Switch from PocketBase’s WebSocket subscribe() to dAvePi’s outbound webhooks for change events, or poll the relevant resource if push isn’t strictly required.

The full guide — collection-to-schema mapping, API-rule translation, SQLite ETL, realtime → webhook relay, cutover checklist — is at Migrate from PocketBase.