Install
openclaw skills install pocketbaseBuild backends with PocketBase collections, auth, and realtime.
openclaw skills install pocketbasepocketbase not pocketbase/dist — the dist path is internal and breaks on updatespb.authStore.isValid before using pb.authStore.model — expired tokens return stale data without errorexpand parameter to load relations: pb.collection('posts').getList(1, 20, { expand: 'author,comments' })record.expand.fieldName — not directly on the record objectfilter: "status = 'active' && created >= '2024-01-01'"&& and ||, not AND/OR — SQL keywords don't workusers (lowercase) — _users or Users returns empty resultsauthWithPassword(email, password) returns the full user record plus tokenauthWithOAuth2({ provider: 'google' }) opens popup automatically in browserpb.authStore.clear() and invalidating server-side if using tokens elsewherepb.collection('posts').subscribe('*', callback) — the '*' means all record changes{ action: 'create'|'update'|'delete', record } — check action before processingpb.collection('posts').unsubscribe() — orphan subscriptions leak memoryformData.append('document', file) then pass to create()pb.files.getURL(record, record.filename) — don't construct URLs manually"" (empty string) rule = open to everyone — counterintuitive@request.auth.id to reference logged-in user, @request.data for submitted data@request.auth.id = user.id in View/Update/Delete rulespb_hooks/*.pb.js — the .pb.js extension is required$app, event data with e — common: e.record, e.httpContextpb.admins.authWithPassword(email, password)pb.admins or pb.collections, not pb.collection()