Magic vs PocketBase: An Honest Feature Matrix

Magic vs PocketBase: An Honest Feature Matrix

Earlier this week I published an honest feature matrix against n8n. That one was easy mode, honestly — n8n and Magic are barely in the same category, so most rows were category differences wearing feature costumes.

This one is hard mode. PocketBase is the closest architectural sibling Magic has. Same MIT license, all of it, nothing gated. Same SQLite-first instinct. Same self-hosted-first philosophy. Same "the whole backend in one box" architecture. If you lined up every backend platform on Earth and asked which one shares the most DNA with Magic, PocketBase is the answer — and it is a genuinely excellent piece of software.

Which makes the interesting question the one the matrix has to answer: if the DNA is that similar, where do they diverge, and why?

One sentence of thesis before the table: PocketBase and Magic made opposite bets on who extends the backend. PocketBase bet on a human with a Go compiler. Magic bet on an AI agent with a prompt. Watch the rows cluster around that bet.

The matrix

FeaturePocketBaseMagic Cloud
LicenseMIT, everything — explicitly including offering it as a paid serviceMIT, everything — dead-even row
Deployment unitOne Go binary, zero dependencies, no Docker requiredDocker containers — backend and dashboard
FootprintTens of megabytes, runs on nearly anythingHeavier — a .NET runtime underneath
DatabaseEmbedded SQLite onlySQLite by default, plus SQL Server, MySQL, PostgreSQL
Schema managementVisual collection builder in the admin UI, automatic migrationsDashboard, SQL, or agent-driven DDL over MCP
API generationAutomatic REST API per collectionGenerated CRUD endpoints per table — real files you can open, read, and customize
Custom business logicWrite Go and recompile, or JavaScript hooks (ES5, in a VM)Inject custom logic directly into generated CRUD endpoints, or describe a new endpoint and the Hyperlambda Generator writes it — live in production, no compile, no deploy
RealtimeNative SSE subscriptions — automatic per-collection record-change events, zero codeSignalR — publish events from writes, tasks, or any logic; programmable rather than automatic
AuthEmail/password plus a turnkey OAuth2 provider list (Google, GitHub, and friends)Full OIDC and OAuth support, JWT, users, roles
Access controlDeclarative per-collection API rules as filter expressionsEndpoint-level role gating plus runtime slot whitelisting
Code execution safetyHooks run arbitrary Go or JavaScript — full trustWhitelisted slots — generated code structurally cannot exceed its permissions
File storageBuilt in, with thumbnail generationServer-side file system, upload tickets, image resize and convert
Frontend hostingServes static files, but hosting is not the storyFirst-class static and SPA hosting per cloudlet
Client SDKsOfficial JavaScript and Dart SDKs, genuinely polishedNone — you consume plain REST with OpenAPI specs
SchedulingCron hooks, written in codePersistent task scheduler, drivable by agents over MCP
AI and RAGNoneML types, website crawling, native vectorization, deployable chatbots
MCP and agentsThird-party community MCP servers doing record and collection CRUD; the capable one is paid and defaults to read-onlyNative MCP server; agents generate new tools for themselves at runtime, inside RBAC
Extending means redeploying?Yes for Go; JS hooks reload, but you are writing ES5 in a VMNo — generation is live in production
Write scalabilitySingle-writer SQLite ceilingSame ceiling on SQLite — but moving to PostgreSQL or SQL Server is a configuration change, not a platform migration
Managed hostingNone — self-host onlyAINIRO runs hosted cloudlets
CommunityLarge, active, and deservedly belovedSmall

Where PocketBase wins, stated plainly

Deployment simplicity. A single binary with zero dependencies is a genuinely better story than Docker containers. Download one file, run one command, backend is live — no container runtime, no compose file, nothing to orchestrate. For a laptop, a $5 VPS, or air-gapped infrastructure, PocketBase's deployment story is the best in the entire category, and I include Magic in that sentence.

Client SDKs. The official JavaScript and Dart SDKs are polished, typed, and maintained. Magic gives you REST and an OpenAPI spec, which is fine — but "fine" is not an SDK that autocompletes in your editor and handles auth token refresh for you.

Turnkey realtime for the vanilla case. If your need is "tell the client when this record changes," PocketBase does it declaratively with zero code. Magic's SignalR model covers that case too, but you publish the event yourself — more power, more typing. For the plain case, PocketBase's ergonomics win.

Consumer OAuth ergonomics. PocketBase's OAuth2 provider list is a checkbox UI. Magic speaks full OIDC and OAuth — the more capable protocol surface — but PocketBase makes "sign in with GitHub" a two-minute job.

Community. Larger, older in its niche, and full of people who love it for good reasons. Ecosystem gravity is real, and it is not on my side of this table.

Per the rules of this series: no rebuttals in this section. They live below.

Where the opposite bets diverge

The extension model is the whole ballgame. When you outgrow what PocketBase generates for you, the platform's answer is: write code. Go with a recompile, or ES5 JavaScript executing in an embedded VM. That is a fine answer for the developer PocketBase was designed for. But notice what it assumes — that the person extending the backend has a compiler, knows the hook system, and ships a deploy for every change.

Magic's answer has three tiers, and none of them require any of that. Take the generated CRUD as-is. Or inject custom business logic directly into the generated endpoints — they are readable files, not black boxes. Or describe an entirely new endpoint in plain language and the Hyperlambda Generator produces it — saved, secured, live, without a compile step or a deploy cycle. This is the same catalog-versus-generator asymmetry the n8n article was built on, wearing different clothes: PocketBase enumerates what you can do without code, and everything past the enumeration costs a compiler. Magic generates.

The escape hatch. PocketBase's all-in bet on embedded SQLite is a huge part of its simplicity — and a wall. SQLite is single-writer; when your write throughput outgrows it, outgrowing SQLite means outgrowing PocketBase, and your exit is a migration to a different platform. Magic starts on SQLite for the same good reasons, but the day you need PostgreSQL or SQL Server, that is a connection string, not a farewell letter. You keep the platform, the generated endpoints, the auth, the frontend. Your 25-year-old legacy database is welcome too.

The agent story, which is really a security story. Here is the widest gap in the matrix, and the one that follows directly from the opposite bets. PocketBase has no native MCP server — what exists is third-party tooling doing record and collection CRUD against the API, with the capable option paid and defaulting to read-only. And that read-only default is not timidity. It is the correct engineering response to PocketBase's trust model: hooks and extensions run with full trust, so there is no runtime boundary that makes agent-written code safe. The only safe agent is a spectator.

Magic was built the other way around. Hyperlambda executes as an AST where every node must bind to a whitelisted slot — an agent generating code on a Magic backend cannot generate its way past its permissions, because the runtime, not the prompt, holds the keys. That is why Magic's agents hold production credentials and build things — new endpoints, new integrations, new tools for themselves — while PocketBase's agents read records. There is a standing $100 bounty on proving that boundary wrong.

Realtime, called fairly. I put this row as a model difference rather than a win, and I mean it. Declarative auto-subscriptions (PocketBase) are better ergonomics for record-change notifications. Programmable events (Magic's SignalR) express things auto-subscriptions cannot — domain events, computed notifications, events fired from scheduled tasks or agent-generated logic. Which model you want depends on which sentence describes your app.

The decision rule

Choose PocketBase if: you are a developer shipping an MVP, a mobile backend, or a side project; you want the simplest possible deployment on Earth; the JS or Dart SDK matches your stack; and you are comfortable that custom logic means writing Go or JS. In that lane it is superb, and picking Magic instead would buy you complexity you do not need yet.

Choose Magic if: you expect to outgrow SQLite without wanting to outgrow your platform; you need enterprise identity (OIDC), real frontend hosting, or RAG; or — the structural one — you expect AI agents to be building and operating the backend. PocketBase was designed before that question existed. Magic was designed as the answer to it.

The test that decides it in one question: who writes your next endpoint — a human with a compiler, or an agent with a prompt? Answer that and the matrix answers itself.

The fine print

What the table does not capture: PocketBase's community momentum compounds; its simplicity is a feature you feel every single day; and "small community" is a cost I pay on my side of the table every single day too. PocketBase also ships breaking changes at a healthy clip — the specifics above (JSVM behavior, provider lists, MCP tooling) were verified the day this was published, and if you are reading this much later, re-verify before quoting.

Magic is MIT-licensed and open source — the repository is at github.com/polterguy/magic, with documentation at docs.ainiro.io. Testing the generator-versus-compiler thesis yourself takes one copy-paste on a $6 DigitalOcean droplet.

FAQ

Is Magic Cloud a PocketBase alternative?

Yes, more directly than any other comparison in this series. Both are MIT-licensed, self-hosted, SQLite-first backends shipping database, generated APIs, auth, and file handling in one system. The divergence is the extension model — code-and-compile versus generate-and-review — and the agent story that follows from it.

Which is easier to deploy?

PocketBase, full stop. One binary, no dependencies. Magic runs as Docker containers, which is more moving parts — the trade is that those containers include frontend hosting, multi-engine database support, an ML layer, and a native MCP server the binary does not.

Can PocketBase work with AI agents like Claude?

Through third-party MCP servers, yes — for querying and managing records and collections. What it lacks is a runtime permission model for agent-written code, which is why those tools sensibly default to read-only. Magic's whitelisted execution model is what lets agents safely generate and run new code in production.

Do both really use the same license?

Yes — both are MIT, with nothing held back. This is the rare comparison where licensing is a dead-even row, which is exactly why the interesting differences are architectural rather than legal.