Backend in einer einzigen Datei: moderne Oberfläche, einfaches Deployment und Anpassungsfähigkeit – aber auch kein SQL über die API, ein Pre-1.0-Stand und ein Admin-Panel, das sich nicht erweitern lässt
Stefan Flaschko · 08.09.2026
Ich habe PocketBase für LingoDeck verwendet, eine Karteikarten-App zum Sprachenlernen mit Spaced Repetition, KI-generierten Karten und Vorlesefunktion. Das Frontend ist eine Nuxt-4-App, als Backend läuft PocketBase 0.30 mit dem JavaScript-SDK. Zeit für ein ehrliches Fazit.
PocketBase ist ein Open-Source-Backend (MIT-Lizenz), das aus einer einzigen ausführbaren Datei besteht. Sie ist in Go geschrieben und bringt alles Wichtige mit:
Man startet die Datei mit ./pocketbase serve und hat ein fertiges Backend. Für das Frontend gibt es SDKs für JavaScript und Dart. In der App sprechen die Nuxt-Seiten und der Nuxt-Server über das JS-SDK mit PocketBase. Realtime und OAuth habe ich bisher nicht gebraucht.

Das Admin-Panel ist schnell, aufgeräumt und für ein Backend, das man in einer Minute installiert hat, erstaunlich vollständig. Auf dem Screenshot sieht man die Collection cards mit Suche und Filter. Auch sonst ist alles an einem Ort:
Die Oberfläche richtet sich allerdings an Entwickler. Für Redakteure, die Texte pflegen, ist sie kein Ersatz für ein klassisches CMS. Dazu später mehr.
Das Datenmodell ist frei, und die Zugriffsregeln sind mächtiger, als sie auf den ersten Blick aussehen. Jede Collection hat fünf Regeln (List, View, Create, Update, Delete), und jede davon ist ein kurzer Ausdruck. Nutzer dürfen zum Beispiel nur ihre eigenen Datensätze sehen und anlegen:
notes.listRule = 'owner = @request.auth.id'
notes.createRule = '@request.auth.id != "" && owner = @request.auth.id'
Oder Inhalte sind öffentlich lesbar, geändert werden dürfen sie aber nur von angemeldeten Nutzern, die den Datensatz selbst angelegt haben:
articles.listRule = ''
articles.updateRule = '@request.auth.id != "" && author = @request.auth.id'
Eine leere Regel bedeutet „für alle“, null bedeutet „nur Superuser“.
Es gibt keine Middleware und keinen Endpoint, der das prüft. PocketBase wertet die Regeln bei jeder Anfrage selbst aus, auch wenn jemand die API direkt anspricht. Das spart eigene Berechtigungslogik.
Wenn die Regeln nicht reichen, gibt es mehrere Wege:
pb_hooks) direkt im Programmauth-refresh prüfen und danach externe APIs aufrufen, deren Schlüssel nicht im Browser landen sollen.Die Grenze ist das Admin-Panel. Es lässt sich nicht erweitern. Es gibt keine eigenen Views, Dashboards oder Felder im Backend. Wer zum Beispiel eine eigene Nutzerverwaltung oder ein Dashboard braucht, muss es selbst in der App bauen, und für Kunden würde ich PocketBase nicht ohne eine eigene Oberfläche einsetzen. Bei Payload oder Statamic ist das einfacher.
Hier gibt es Licht und Schatten. Positiv ist, dass sich fast alles als Text beschreiben lässt:
getFullList, getList, create, update und delete, dazu filter, sort und expand.types.d.ts) mit, die der Editor und der Assistent nutzen können.Weniger gut: Die Wahrheit über das Schema steckt in der Datenbank, nicht im Code. Im Gegensatz zu einem Code-First-System wie Payload sieht ein Assistent das Schema nur, wenn die Migrationen vollständig sind. Und die Wahrscheinlichkeit, dass er veralteten Code erzeugt, ist real. PocketBase hat sich mit Version 0.23 stark verändert, und viele Beispiele im Netz gehören noch zur alten API. Bei mir waren die ersten Migrationen gegen eine ältere Version geschrieben. Die Folge war, dass created und updated fehlten und eine Sortierung nach -updated mit einem 400-Fehler abbrach. Eine zusätzliche Migration hat das repariert.
Mein Fazit: gut geeignet, solange man die Migrationen im Repository pflegt und dem Assistenten die verwendete Version mitgibt. Bei mir steht sie, zusammen mit den Regeln und Besonderheiten, in der AGENTS.md.
Das ist für mich der größte Vorteil. Ein Deployment besteht aus einer Datei, und bei mir läuft es so:
pb_migrations/ werden hochgeladen./api/health) bestätigt, dass es wieder läuft.Es gibt keine Datenbank, die separat installiert und gewartet werden muss, und keine Abhängigkeiten, die gebaut werden müssen. Updates von PocketBase selbst sind ebenfalls eine neue Datei (./pocketbase update). Auch der Betrieb ist einfach: PocketBase lauscht auf 127.0.0.1:8090, nginx leitet /pb dorthin und übernimmt SSL.
Zwei Dinge sollte man beachten:
pb_data verloren gehen.Die Datei ist rund 32 MB groß. Auf meinem Rechner belegte der Prozess mit rund 500 Datensätzen etwa 60 MB Arbeitsspeicher. Es gibt keine Lizenz, keine Preise pro Nutzer und keine Beschränkung auf ein Projekt. Dafür muss man sich um Server und Backups selbst kümmern.
Hier muss man unterscheiden. Die Anforderungen sind gering, aber PocketBase ist kein statisches Hosting. Es braucht:
pb_data mit Datenbank und UploadsVerglichen mit einem Node-basierten CMS ist das ein Vorteil, verglichen mit einem Baukasten oder statischen Seiten ein Nachteil. Dazu kommt, dass SQLite genau einen Schreibzugriff gleichzeitig zulässt und sich nicht auf mehrere Server verteilen lässt. Für eine App mit einem Server ist das kein Problem. Wer horizontal skalieren will, hat mit PocketBase aber ein Problem.
Das stimmt nur zum Teil, deshalb eine genauere Einordnung. Unter der Haube ist PocketBase echtes SQL, denn die Daten liegen in einer SQLite-Datei. Der Zugriff von außen läuft aber nicht über SQL, sondern über die eigene API mit einer eigenen Filter-Syntax:
const defaults = await pb.collection('cards').getFullList({
filter: 'owner = ""',
})
const progress = await pb.collection('card_progress').getFullList({
expand: 'card',
})
Das ist für die meisten Abfragen angenehm, aber nicht mehr als das, was die API anbietet:
expand.Es gibt Auswege. View Collections definiert man selbst mit einem SQL-SELECT, sie sind schreibgeschützt, lassen sich aber wie jede andere Collection abfragen. In den Hooks kann man außerdem rohes SQL ausführen. Wer von Anfang an mit Joins, Berichten und komplexen Abfragen rechnet, sollte stattdessen eine klassische Datenbank wie Postgres wählen. PocketBase unterstützt keine andere Datenbank als SQLite.
PocketBase ist weiterhin Version 0.x. Das Projekt weist selbst darauf hin, dass die Abwärtskompatibilität vor 1.0 nicht garantiert ist. Der Umstieg auf 0.23 hat das gezeigt: Collections und Migrationen wurden umgebaut, und alte Beispiele funktionieren nicht mehr. Mit eigenen Migrationen und festen Versionen ist das beherrschbar, ein Update sollte man trotzdem bewusst einplanen und nicht beim nächsten Deploy nebenbei mitnehmen.
Dazu kommt, dass PocketBase im Wesentlichen von einer einzelnen Person betreut wird. Das Projekt ist sehr aktiv und stabil, trotzdem muss man bei einem langlebigen Produkt mit diesem Risiko leben. Weil die Daten in einer SQLite-Datei liegen und die API-Regeln lesbar sind, wäre ein späterer Umzug aber möglich.
Wie bei jedem Backend mit Datenbank gehören die Inhalte nicht zu Git. Die Migrationen beschreiben nur die Struktur. Startet PocketBase ohne den Ordner pb_data, in dem die Datenbank liegt (auf einem neuen Rechner oder einem neu aufgesetzten Server), beginnt es mit einer leeren Datenbank. Die Migrationen legen dann die Struktur an, aber keine Inhalte, und die App startet mit leeren Collections.
PocketBase kann zwar automatisch Backups erstellen, auch in einen S3-Speicher, aber das muss man einrichten und gelegentlich testen. Ein Backup ist erst dann eins, wenn man es zurückspielen kann.
[email protected] trifft nicht auf [email protected] zu. E-Mail-Adressen sollte man deshalb schon im Formular kleinschreiben.emailVisibility setzen.PocketBase passt gut zu kleinen bis mittleren Apps mit Login, Nutzerdaten und klaren Zugriffsregeln, vor allem wenn man das Backend selbst betreibt und möglichst wenig Infrastruktur will. Das Admin-Panel ist modern, die Regeln sparen viel Backend-Code, und das Deployment ist so einfach, wie es bei einem Backend mit Datenbank sein kann. Mit Migrationen im Repository arbeiten auch KI-Assistenten gut damit.
Die Nachteile sind real: Es gibt kein SQL über die API, das Admin-Panel lässt sich nicht erweitern, die Skalierung ist auf einen Server begrenzt, und mit Version 0.x muss man Updates sorgfältig planen. Für Projekte, in denen Redakteure Inhalte pflegen, würde ich ein CMS wie Payload oder Statamic wählen. PocketBase ist ein interessantes Produkt, aber für ein neues Projekt würde ich mich für ein anderes System wie Payload oder Appwrite entscheiden.