{
  "schemaVersion": "1.0",
  "item": {
    "slug": "pocketbase",
    "name": "PocketBase",
    "source": "tencent",
    "type": "skill",
    "category": "开发工具",
    "sourceUrl": "https://clawhub.ai/ivangdavila/pocketbase",
    "canonicalUrl": "https://clawhub.ai/ivangdavila/pocketbase",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/pocketbase",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=pocketbase",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "installMethod": "Manual import",
    "extraction": "Extract archive",
    "prerequisites": [
      "OpenClaw"
    ],
    "packageFormat": "ZIP package",
    "includedAssets": [
      "SKILL.md"
    ],
    "primaryDoc": "SKILL.md",
    "quickSetup": [
      "Download the package from Yavira.",
      "Extract the archive and review SKILL.md first.",
      "Import or place the package into your OpenClaw setup."
    ],
    "agentAssist": {
      "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
      "steps": [
        "Download the package from Yavira.",
        "Extract it into a folder your agent can access.",
        "Paste one of the prompts below and point your agent at the extracted folder."
      ],
      "prompts": [
        {
          "label": "New install",
          "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
        },
        {
          "label": "Upgrade existing",
          "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
        }
      ]
    },
    "sourceHealth": {
      "source": "tencent",
      "status": "healthy",
      "reason": "direct_download_ok",
      "recommendedAction": "download",
      "checkedAt": "2026-04-30T16:55:25.780Z",
      "expiresAt": "2026-05-07T16:55:25.780Z",
      "httpStatus": 200,
      "finalUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=network",
      "contentType": "application/zip",
      "probeMethod": "head",
      "details": {
        "probeUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=network",
        "contentDisposition": "attachment; filename=\"network-1.0.0.zip\"",
        "redirectLocation": null,
        "bodySnippet": null
      },
      "scope": "source",
      "summary": "Source download looks usable.",
      "detail": "Yavira can redirect you to the upstream package for this source.",
      "primaryActionLabel": "Download for OpenClaw",
      "primaryActionHref": "/downloads/pocketbase"
    },
    "validation": {
      "installChecklist": [
        "Use the Yavira download entry.",
        "Review SKILL.md after the package is downloaded.",
        "Confirm the extracted package contains the expected setup assets."
      ],
      "postInstallChecks": [
        "Confirm the extracted package includes the expected docs or setup files.",
        "Validate the skill or prompts are available in your target agent workspace.",
        "Capture any manual follow-up steps the agent could not complete."
      ]
    },
    "downloadPageUrl": "https://openagent3.xyz/downloads/pocketbase",
    "agentPageUrl": "https://openagent3.xyz/skills/pocketbase/agent",
    "manifestUrl": "https://openagent3.xyz/skills/pocketbase/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/pocketbase/agent.md"
  },
  "agentAssist": {
    "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
    "steps": [
      "Download the package from Yavira.",
      "Extract it into a folder your agent can access.",
      "Paste one of the prompts below and point your agent at the extracted folder."
    ],
    "prompts": [
      {
        "label": "New install",
        "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
      },
      {
        "label": "Upgrade existing",
        "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
      }
    ]
  },
  "documentation": {
    "source": "clawhub",
    "primaryDoc": "SKILL.md",
    "sections": [
      {
        "title": "SDK Basics",
        "body": "Import from pocketbase not pocketbase/dist — the dist path is internal and breaks on updates\nAlways check pb.authStore.isValid before using pb.authStore.model — expired tokens return stale data without error\nAfter login, token is auto-attached to requests — no need to manually set Authorization headers"
      },
      {
        "title": "Fetching Records",
        "body": "Use expand parameter to load relations: pb.collection('posts').getList(1, 20, { expand: 'author,comments' })\nExpanded records appear in record.expand.fieldName — not directly on the record object\nFilter syntax is SQL-like but uses single quotes: filter: \"status = 'active' && created >= '2024-01-01'\"\nCombine conditions with && and ||, not AND/OR — SQL keywords don't work"
      },
      {
        "title": "Authentication",
        "body": "Users collection is users (lowercase) — _users or Users returns empty results\nauthWithPassword(email, password) returns the full user record plus token\nOAuth flow: authWithOAuth2({ provider: 'google' }) opens popup automatically in browser\nLogout requires both pb.authStore.clear() and invalidating server-side if using tokens elsewhere"
      },
      {
        "title": "Realtime",
        "body": "Subscribe with pb.collection('posts').subscribe('*', callback) — the '*' means all record changes\nCallback receives { action: 'create'|'update'|'delete', record } — check action before processing\nAlways unsubscribe on cleanup: pb.collection('posts').unsubscribe() — orphan subscriptions leak memory"
      },
      {
        "title": "File Uploads",
        "body": "Files require FormData, not JSON: formData.append('document', file) then pass to create()\nGet file URL with pb.files.getURL(record, record.filename) — don't construct URLs manually\nMultiple files to same field: append with same key multiple times"
      },
      {
        "title": "Collection Rules",
        "body": "Empty rule = blocked for everyone, \"\" (empty string) rule = open to everyone — counterintuitive\nUse @request.auth.id to reference logged-in user, @request.data for submitted data\nExample restrict to owner: @request.auth.id = user.id in View/Update/Delete rules"
      },
      {
        "title": "Hooks (pb_hooks/)",
        "body": "JavaScript hooks go in pb_hooks/*.pb.js — the .pb.js extension is required\nHooks run synchronously and block the request — keep them fast or use routines\nAccess app with $app, event data with e — common: e.record, e.httpContext"
      },
      {
        "title": "Admin API",
        "body": "Admin endpoints need superuser auth, not regular user tokens\nCreate admin token: pb.admins.authWithPassword(email, password)\nAdmin operations use pb.admins or pb.collections, not pb.collection()"
      }
    ],
    "body": "SDK Basics\nImport from pocketbase not pocketbase/dist — the dist path is internal and breaks on updates\nAlways check pb.authStore.isValid before using pb.authStore.model — expired tokens return stale data without error\nAfter login, token is auto-attached to requests — no need to manually set Authorization headers\nFetching Records\nUse expand parameter to load relations: pb.collection('posts').getList(1, 20, { expand: 'author,comments' })\nExpanded records appear in record.expand.fieldName — not directly on the record object\nFilter syntax is SQL-like but uses single quotes: filter: \"status = 'active' && created >= '2024-01-01'\"\nCombine conditions with && and ||, not AND/OR — SQL keywords don't work\nAuthentication\nUsers collection is users (lowercase) — _users or Users returns empty results\nauthWithPassword(email, password) returns the full user record plus token\nOAuth flow: authWithOAuth2({ provider: 'google' }) opens popup automatically in browser\nLogout requires both pb.authStore.clear() and invalidating server-side if using tokens elsewhere\nRealtime\nSubscribe with pb.collection('posts').subscribe('*', callback) — the '*' means all record changes\nCallback receives { action: 'create'|'update'|'delete', record } — check action before processing\nAlways unsubscribe on cleanup: pb.collection('posts').unsubscribe() — orphan subscriptions leak memory\nFile Uploads\nFiles require FormData, not JSON: formData.append('document', file) then pass to create()\nGet file URL with pb.files.getURL(record, record.filename) — don't construct URLs manually\nMultiple files to same field: append with same key multiple times\nCollection Rules\nEmpty rule = blocked for everyone, \"\" (empty string) rule = open to everyone — counterintuitive\nUse @request.auth.id to reference logged-in user, @request.data for submitted data\nExample restrict to owner: @request.auth.id = user.id in View/Update/Delete rules\nHooks (pb_hooks/)\nJavaScript hooks go in pb_hooks/*.pb.js — the .pb.js extension is required\nHooks run synchronously and block the request — keep them fast or use routines\nAccess app with $app, event data with e — common: e.record, e.httpContext\nAdmin API\nAdmin endpoints need superuser auth, not regular user tokens\nCreate admin token: pb.admins.authWithPassword(email, password)\nAdmin operations use pb.admins or pb.collections, not pb.collection()"
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/ivangdavila/pocketbase",
    "publisherUrl": "https://clawhub.ai/ivangdavila/pocketbase",
    "owner": "ivangdavila",
    "version": "1.0.0",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/pocketbase",
    "downloadUrl": "https://openagent3.xyz/downloads/pocketbase",
    "agentUrl": "https://openagent3.xyz/skills/pocketbase/agent",
    "manifestUrl": "https://openagent3.xyz/skills/pocketbase/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/pocketbase/agent.md"
  }
}