{
  "schemaVersion": "1.0",
  "item": {
    "slug": "truenas-skill",
    "name": "Truenas Skill",
    "source": "tencent",
    "type": "skill",
    "category": "开发工具",
    "sourceUrl": "https://clawhub.ai/anotb/truenas-skill",
    "canonicalUrl": "https://clawhub.ai/anotb/truenas-skill",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/truenas-skill",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=truenas-skill",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "installMethod": "Manual import",
    "extraction": "Extract archive",
    "prerequisites": [
      "OpenClaw"
    ],
    "packageFormat": "ZIP package",
    "includedAssets": [
      "README.md",
      "SKILL.md",
      "package-lock.json",
      "package.json",
      "references/app-installation.md",
      "references/bookmarks.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. Then review README.md for any prerequisites, environment setup, or post-install checks. 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. Then review README.md for any prerequisites, environment setup, or post-install checks. Summarize what changed and any follow-up checks I should run."
        }
      ]
    },
    "sourceHealth": {
      "source": "tencent",
      "status": "healthy",
      "reason": "direct_download_ok",
      "recommendedAction": "download",
      "checkedAt": "2026-05-07T17:22:31.273Z",
      "expiresAt": "2026-05-14T17:22:31.273Z",
      "httpStatus": 200,
      "finalUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=afrexai-annual-report",
      "contentType": "application/zip",
      "probeMethod": "head",
      "details": {
        "probeUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=afrexai-annual-report",
        "contentDisposition": "attachment; filename=\"afrexai-annual-report-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/truenas-skill"
    },
    "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/truenas-skill",
    "agentPageUrl": "https://openagent3.xyz/skills/truenas-skill/agent",
    "manifestUrl": "https://openagent3.xyz/skills/truenas-skill/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/truenas-skill/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. Then review README.md for any prerequisites, environment setup, or post-install checks. 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. Then review README.md for any prerequisites, environment setup, or post-install checks. Summarize what changed and any follow-up checks I should run."
      }
    ]
  },
  "documentation": {
    "source": "clawhub",
    "primaryDoc": "SKILL.md",
    "sections": [
      {
        "title": "TrueNAS SCALE Skill",
        "body": "Manage a TrueNAS SCALE server and its apps via the TrueNAS API and Dockge Socket.IO."
      },
      {
        "title": "Required Environment Variables",
        "body": "TRUENAS_URL       — TrueNAS base URL (e.g., https://10.0.0.5:444)\nTRUENAS_API_KEY   — API key from TrueNAS UI → API Keys"
      },
      {
        "title": "Optional: TLS Configuration",
        "body": "TRUENAS_VERIFY_TLS  — Set to \"1\" to enforce TLS certificate validation (default: skip for self-signed certs)"
      },
      {
        "title": "Optional: Dockge (Docker Compose UI)",
        "body": "DOCKGE_URL        — Dockge URL (e.g., http://10.0.0.5:5001)\nDOCKGE_USER       — Dockge login username\nDOCKGE_PASS       — Dockge login password"
      },
      {
        "title": "Optional: Homelab Service API Keys",
        "body": "See the references/ directory for per-service env vars. Common ones:\n\nSONARR_URL, SONARR_API_KEY           — TV show management\nRADARR_URL, RADARR_API_KEY           — Movie management\nPROWLARR_URL, PROWLARR_API_KEY       — Indexer management\nOVERSEERR_URL, OVERSEERR_API_KEY     — Media request UI\nPLEX_URL                             — Media server (no auth on LAN)\nTAUTULLI_URL, TAUTULLI_API_KEY       — Plex analytics\nQBITTORRENT_URL                      — Torrent client (no auth)\nSABNZBD_URL, SABNZBD_API_KEY         — Usenet client\nAUDIOBOOKSHELF_URL, AUDIOBOOKSHELF_API_KEY\nNTFY_URL                             — Push notifications\nSYNCTHING_URL, SYNCTHING_API_KEY     — File sync\nN8N_URL, N8N_API_KEY                 — Workflow automation\nNOCODB_URL, NOCODB_API_KEY           — Database\nCHANGEDETECTION_URL, CHANGEDETECTION_API_KEY\nCRAFTY_URL, CRAFTY_API_KEY           — Game servers\nLAZYLIBRARIAN_URL, LAZYLIBRARIAN_API_KEY\nMETUBE_URL                           — YouTube downloader\nKARAKEEP_URL, KARAKEEP_API_KEY       — Bookmarks with AI tagging"
      },
      {
        "title": "API Notes",
        "body": "HTTPS REQUIRED: TrueNAS auto-revokes API keys used over HTTP.\n\nREST API Deprecation Notice: The REST API (/api/v2.0/) is deprecated in TrueNAS 25.04\nand fully removed in 26.04. Use the WebSocket API (via scripts/truenas-ws.mjs) as\nthe forward-compatible method. REST examples below still work on 24.10 and 25.x."
      },
      {
        "title": "REST API (Legacy)",
        "body": "curl -sk \"$TRUENAS_URL/api/v2.0/[endpoint]\" \\\n  -H \"Authorization: Bearer $TRUENAS_API_KEY\"\n\nThe -k flag is needed for self-signed certificates (common on home servers)."
      },
      {
        "title": "WebSocket API (Recommended)",
        "body": "The WebSocket API uses a DDP-like protocol (Meteor style). REST paths become dot notation:\n/api/v2.0/app → app.query, /api/v2.0/system/info → system.info.\n\n// Connect: wss://<host>/websocket (rejectUnauthorized: false for self-signed)\n\n// 1. Handshake\nsend: {\"msg\": \"connect\", \"version\": \"1\", \"support\": [\"1\"]}\nrecv: {\"msg\": \"connected\", \"session\": \"...\"}\n\n// 2. Authenticate\nsend: {\"id\": \"1\", \"msg\": \"method\", \"method\": \"auth.login_with_api_key\", \"params\": [\"API_KEY\"]}\nrecv: {\"id\": \"1\", \"msg\": \"result\", \"result\": true}\n\n// 3. Call methods\nsend: {\"id\": \"2\", \"msg\": \"method\", \"method\": \"system.info\", \"params\": []}\nsend: {\"id\": \"3\", \"msg\": \"method\", \"method\": \"app.query\", \"params\": []}\n\nUse the helper script for WebSocket calls: node scripts/truenas-ws.mjs <method> [params_json]"
      },
      {
        "title": "Security Notes",
        "body": "Self-signed certificates: TLS verification is skipped by default (curl -k, rejectUnauthorized: false) because homelab servers typically use self-signed certs. Set TRUENAS_VERIFY_TLS=1 to enforce strict TLS validation.\nAPI key scope: Use a read-only or least-privilege API key when possible. TrueNAS lets you scope keys to specific endpoints.\nCredentials stay local: All env vars are read at runtime and sent only to the configured service endpoints. Nothing is phoned home."
      },
      {
        "title": "System Info",
        "body": "curl -sk \"$TRUENAS_URL/api/v2.0/system/info\" -H \"Authorization: Bearer $TRUENAS_API_KEY\""
      },
      {
        "title": "Pool Health",
        "body": "# All pools with health status\ncurl -sk \"$TRUENAS_URL/api/v2.0/pool\" -H \"Authorization: Bearer $TRUENAS_API_KEY\" \\\n  | jq '.[] | {name, healthy}'\n\n# Or via WebSocket\nnode scripts/truenas-ws.mjs pool.query '[]'\n\nThe API returns a .healthy boolean per pool. For deeper status, inspect the full pool object."
      },
      {
        "title": "Active Alerts",
        "body": "curl -sk \"$TRUENAS_URL/api/v2.0/alert/list\" -H \"Authorization: Bearer $TRUENAS_API_KEY\" \\\n  | jq '.[] | {level, formatted}'"
      },
      {
        "title": "Running Services",
        "body": "curl -sk \"$TRUENAS_URL/api/v2.0/service\" -H \"Authorization: Bearer $TRUENAS_API_KEY\" \\\n  | jq '.[] | select(.state == \"RUNNING\") | .service'"
      },
      {
        "title": "List Datasets",
        "body": "curl -sk \"$TRUENAS_URL/api/v2.0/pool/dataset\" -H \"Authorization: Bearer $TRUENAS_API_KEY\" \\\n  | jq '.[] | {name, type, used: .used.parsed, available: .available.parsed}'"
      },
      {
        "title": "Create Dataset",
        "body": "curl -sk -X POST \"$TRUENAS_URL/api/v2.0/pool/dataset\" \\\n  -H \"Authorization: Bearer $TRUENAS_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"name\": \"pool/path/new-dataset\"}'"
      },
      {
        "title": "Delete Dataset",
        "body": "# Destructive — confirm with user first\ncurl -sk -X DELETE \"$TRUENAS_URL/api/v2.0/pool/dataset/id/DATASET_ID\" \\\n  -H \"Authorization: Bearer $TRUENAS_API_KEY\""
      },
      {
        "title": "List Snapshots",
        "body": "# WebSocket (required on 25.10+, /api/v2.0/zfs/snapshot returns 404)\nnode scripts/truenas-ws.mjs zfs.snapshot.query '[]'"
      },
      {
        "title": "Create Snapshot",
        "body": "node scripts/truenas-ws.mjs zfs.snapshot.create '[{\"dataset\": \"pool/dataset\", \"name\": \"manual-YYYY-MM-DD\"}]'"
      },
      {
        "title": "Snapshot Task Status",
        "body": "curl -sk \"$TRUENAS_URL/api/v2.0/pool/snapshottask\" -H \"Authorization: Bearer $TRUENAS_API_KEY\" \\\n  | jq '.[] | {dataset, schedule, enabled}'"
      },
      {
        "title": "Replication Health",
        "body": "curl -sk \"$TRUENAS_URL/api/v2.0/replication\" -H \"Authorization: Bearer $TRUENAS_API_KEY\" \\\n  | jq '.[] | {name, state: .state.state}'"
      },
      {
        "title": "App Management",
        "body": "TrueNAS Apps are the official marketplace for installing containerized services."
      },
      {
        "title": "List Installed Apps",
        "body": "curl -sk \"$TRUENAS_URL/api/v2.0/app\" -H \"Authorization: Bearer $TRUENAS_API_KEY\" \\\n  | jq '.[] | {name, state, version}'"
      },
      {
        "title": "Check for Updates",
        "body": "curl -sk \"$TRUENAS_URL/api/v2.0/app\" -H \"Authorization: Bearer $TRUENAS_API_KEY\" \\\n  | jq '.[] | select(.upgrade_available) | .name'"
      },
      {
        "title": "Install / Update Apps",
        "body": "See references/app-installation.md for the full installation guide covering:\n\nChecking app templates and storage requirements\nCreating datasets with proper ACLs\nInstalling with correct storage mappings\nHandling apps with multiple storage mounts"
      },
      {
        "title": "App Status",
        "body": "curl -sk \"$TRUENAS_URL/api/v2.0/app?name=APP_NAME\" -H \"Authorization: Bearer $TRUENAS_API_KEY\" \\\n  | jq '.[0] | {name, state, portals}'"
      },
      {
        "title": "Dockge (Docker Compose Stacks)",
        "body": "Dockge is a companion UI for Docker Compose stacks not in the TrueNAS Apps catalog.\nIt uses Socket.IO, not REST. Use the provided scripts."
      },
      {
        "title": "Prerequisites",
        "body": "npm install   # in this skill's root directory"
      },
      {
        "title": "List Stacks",
        "body": "node scripts/dockge-list.mjs"
      },
      {
        "title": "Update Stacks",
        "body": "# Update all running stacks\nnode scripts/dockge-update.mjs\n\n# Update specific stacks\nnode scripts/dockge-update.mjs mystack1 mystack2"
      },
      {
        "title": "Socket.IO Protocol Details",
        "body": "Dockge uses Socket.IO with WebSocket transport.\n\nStatus codes:\n\n1 = inactive/exited\n3 = running\n4 = updating\n\nKey events:\n\nlogin — authenticate with username/password\nstackList — get all stacks (received via agent event)\nagent, \"\", \"updateStack\", stackName — trigger pull + restart\n\nNote: Stacks prefixed with ix- are TrueNAS-managed apps visible to Dockge — skip those when updating."
      },
      {
        "title": "Monitoring Checklist",
        "body": "Run these commands for a quick health overview:\n\n# Pool health\ncurl -sk \"$TRUENAS_URL/api/v2.0/pool\" -H \"Authorization: Bearer $TRUENAS_API_KEY\" \\\n  | jq '.[] | {name, healthy}'\n\n# Active alerts\ncurl -sk \"$TRUENAS_URL/api/v2.0/alert/list\" -H \"Authorization: Bearer $TRUENAS_API_KEY\" \\\n  | jq '.[] | {level, formatted}'\n\n# Running services\ncurl -sk \"$TRUENAS_URL/api/v2.0/service\" -H \"Authorization: Bearer $TRUENAS_API_KEY\" \\\n  | jq '.[] | select(.state == \"RUNNING\") | .service'\n\n# App updates available\ncurl -sk \"$TRUENAS_URL/api/v2.0/app\" -H \"Authorization: Bearer $TRUENAS_API_KEY\" \\\n  | jq '.[] | select(.upgrade_available) | .name'\n\n# Replication status\ncurl -sk \"$TRUENAS_URL/api/v2.0/replication\" -H \"Authorization: Bearer $TRUENAS_API_KEY\" \\\n  | jq '.[] | {name, state: .state.state}'"
      },
      {
        "title": "Homelab Services",
        "body": "This skill includes reference files for common homelab service categories. Each covers\nAPI patterns, env vars, and common agent tasks for services that typically run alongside\nTrueNAS:\n\nReferenceServicesFileMedia managementOverseerr, Sonarr, Radarr, Prowlarr, Plex, Tautullireferences/media-management.mdApp installationTrueNAS native app install guidereferences/app-installation.mdDownload clientsqBittorrent, SABnzbd, FlareSolverrreferences/downloads.mdHomelab servicesntfy, Syncthing, n8n, NocoDB, ChangeDetection, Craftyreferences/homelab-services.mdBooks & mediaAudiobookshelf, LazyLibrarian, Calibre-Web, MeTubereferences/books-and-media.mdBookmarksKarakeep (AI-powered bookmark manager)references/bookmarks.md\n\nLoad the relevant reference file when the user asks about a specific service category."
      },
      {
        "title": "\"Check NAS health\"",
        "body": "Run the monitoring checklist above. Summarize pool states, alerts, and any pending updates."
      },
      {
        "title": "\"What's running?\"",
        "body": "# TrueNAS apps\ncurl -sk \"$TRUENAS_URL/api/v2.0/app\" -H \"Authorization: Bearer $TRUENAS_API_KEY\" \\\n  | jq '.[] | select(.state == \"RUNNING\") | .name'\n\n# Dockge stacks (if configured)\nnode scripts/dockge-list.mjs"
      },
      {
        "title": "\"Install an app\"",
        "body": "Follow the guide in references/app-installation.md:\n\nCheck app template for storage requirements\nCreate dataset(s) under the apps pool\nSet ACL with apps preset\nInstall app with correct storage mappings"
      },
      {
        "title": "\"Take a snapshot\"",
        "body": "node scripts/truenas-ws.mjs zfs.snapshot.create '[{\"dataset\": \"pool/dataset\", \"name\": \"manual-snapshot-name\"}]'"
      },
      {
        "title": "\"What's downloading?\"",
        "body": "See references/downloads.md for qBittorrent and SABnzbd API commands."
      },
      {
        "title": "\"Add a movie/show\"",
        "body": "See references/media-management.md for Overseerr request workflow."
      }
    ],
    "body": "TrueNAS SCALE Skill\n\nManage a TrueNAS SCALE server and its apps via the TrueNAS API and Dockge Socket.IO.\n\nSetup\nRequired Environment Variables\nTRUENAS_URL       — TrueNAS base URL (e.g., https://10.0.0.5:444)\nTRUENAS_API_KEY   — API key from TrueNAS UI → API Keys\n\nOptional: TLS Configuration\nTRUENAS_VERIFY_TLS  — Set to \"1\" to enforce TLS certificate validation (default: skip for self-signed certs)\n\nOptional: Dockge (Docker Compose UI)\nDOCKGE_URL        — Dockge URL (e.g., http://10.0.0.5:5001)\nDOCKGE_USER       — Dockge login username\nDOCKGE_PASS       — Dockge login password\n\nOptional: Homelab Service API Keys\n\nSee the references/ directory for per-service env vars. Common ones:\n\nSONARR_URL, SONARR_API_KEY           — TV show management\nRADARR_URL, RADARR_API_KEY           — Movie management\nPROWLARR_URL, PROWLARR_API_KEY       — Indexer management\nOVERSEERR_URL, OVERSEERR_API_KEY     — Media request UI\nPLEX_URL                             — Media server (no auth on LAN)\nTAUTULLI_URL, TAUTULLI_API_KEY       — Plex analytics\nQBITTORRENT_URL                      — Torrent client (no auth)\nSABNZBD_URL, SABNZBD_API_KEY         — Usenet client\nAUDIOBOOKSHELF_URL, AUDIOBOOKSHELF_API_KEY\nNTFY_URL                             — Push notifications\nSYNCTHING_URL, SYNCTHING_API_KEY     — File sync\nN8N_URL, N8N_API_KEY                 — Workflow automation\nNOCODB_URL, NOCODB_API_KEY           — Database\nCHANGEDETECTION_URL, CHANGEDETECTION_API_KEY\nCRAFTY_URL, CRAFTY_API_KEY           — Game servers\nLAZYLIBRARIAN_URL, LAZYLIBRARIAN_API_KEY\nMETUBE_URL                           — YouTube downloader\nKARAKEEP_URL, KARAKEEP_API_KEY       — Bookmarks with AI tagging\n\nAPI Notes\n\nHTTPS REQUIRED: TrueNAS auto-revokes API keys used over HTTP.\n\nREST API Deprecation Notice: The REST API (/api/v2.0/) is deprecated in TrueNAS 25.04 and fully removed in 26.04. Use the WebSocket API (via scripts/truenas-ws.mjs) as the forward-compatible method. REST examples below still work on 24.10 and 25.x.\n\nREST API (Legacy)\ncurl -sk \"$TRUENAS_URL/api/v2.0/[endpoint]\" \\\n  -H \"Authorization: Bearer $TRUENAS_API_KEY\"\n\n\nThe -k flag is needed for self-signed certificates (common on home servers).\n\nWebSocket API (Recommended)\n\nThe WebSocket API uses a DDP-like protocol (Meteor style). REST paths become dot notation: /api/v2.0/app → app.query, /api/v2.0/system/info → system.info.\n\n// Connect: wss://<host>/websocket (rejectUnauthorized: false for self-signed)\n\n// 1. Handshake\nsend: {\"msg\": \"connect\", \"version\": \"1\", \"support\": [\"1\"]}\nrecv: {\"msg\": \"connected\", \"session\": \"...\"}\n\n// 2. Authenticate\nsend: {\"id\": \"1\", \"msg\": \"method\", \"method\": \"auth.login_with_api_key\", \"params\": [\"API_KEY\"]}\nrecv: {\"id\": \"1\", \"msg\": \"result\", \"result\": true}\n\n// 3. Call methods\nsend: {\"id\": \"2\", \"msg\": \"method\", \"method\": \"system.info\", \"params\": []}\nsend: {\"id\": \"3\", \"msg\": \"method\", \"method\": \"app.query\", \"params\": []}\n\n\nUse the helper script for WebSocket calls: node scripts/truenas-ws.mjs <method> [params_json]\n\nSecurity Notes\nSelf-signed certificates: TLS verification is skipped by default (curl -k, rejectUnauthorized: false) because homelab servers typically use self-signed certs. Set TRUENAS_VERIFY_TLS=1 to enforce strict TLS validation.\nAPI key scope: Use a read-only or least-privilege API key when possible. TrueNAS lets you scope keys to specific endpoints.\nCredentials stay local: All env vars are read at runtime and sent only to the configured service endpoints. Nothing is phoned home.\nCore Operations\nSystem Info\ncurl -sk \"$TRUENAS_URL/api/v2.0/system/info\" -H \"Authorization: Bearer $TRUENAS_API_KEY\"\n\nPool Health\n# All pools with health status\ncurl -sk \"$TRUENAS_URL/api/v2.0/pool\" -H \"Authorization: Bearer $TRUENAS_API_KEY\" \\\n  | jq '.[] | {name, healthy}'\n\n# Or via WebSocket\nnode scripts/truenas-ws.mjs pool.query '[]'\n\n\nThe API returns a .healthy boolean per pool. For deeper status, inspect the full pool object.\n\nActive Alerts\ncurl -sk \"$TRUENAS_URL/api/v2.0/alert/list\" -H \"Authorization: Bearer $TRUENAS_API_KEY\" \\\n  | jq '.[] | {level, formatted}'\n\nRunning Services\ncurl -sk \"$TRUENAS_URL/api/v2.0/service\" -H \"Authorization: Bearer $TRUENAS_API_KEY\" \\\n  | jq '.[] | select(.state == \"RUNNING\") | .service'\n\nDataset Management\nList Datasets\ncurl -sk \"$TRUENAS_URL/api/v2.0/pool/dataset\" -H \"Authorization: Bearer $TRUENAS_API_KEY\" \\\n  | jq '.[] | {name, type, used: .used.parsed, available: .available.parsed}'\n\nCreate Dataset\ncurl -sk -X POST \"$TRUENAS_URL/api/v2.0/pool/dataset\" \\\n  -H \"Authorization: Bearer $TRUENAS_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"name\": \"pool/path/new-dataset\"}'\n\nDelete Dataset\n# Destructive — confirm with user first\ncurl -sk -X DELETE \"$TRUENAS_URL/api/v2.0/pool/dataset/id/DATASET_ID\" \\\n  -H \"Authorization: Bearer $TRUENAS_API_KEY\"\n\nSnapshots & Replication\nList Snapshots\n# WebSocket (required on 25.10+, /api/v2.0/zfs/snapshot returns 404)\nnode scripts/truenas-ws.mjs zfs.snapshot.query '[]'\n\nCreate Snapshot\nnode scripts/truenas-ws.mjs zfs.snapshot.create '[{\"dataset\": \"pool/dataset\", \"name\": \"manual-YYYY-MM-DD\"}]'\n\nSnapshot Task Status\ncurl -sk \"$TRUENAS_URL/api/v2.0/pool/snapshottask\" -H \"Authorization: Bearer $TRUENAS_API_KEY\" \\\n  | jq '.[] | {dataset, schedule, enabled}'\n\nReplication Health\ncurl -sk \"$TRUENAS_URL/api/v2.0/replication\" -H \"Authorization: Bearer $TRUENAS_API_KEY\" \\\n  | jq '.[] | {name, state: .state.state}'\n\nApp Management\n\nTrueNAS Apps are the official marketplace for installing containerized services.\n\nList Installed Apps\ncurl -sk \"$TRUENAS_URL/api/v2.0/app\" -H \"Authorization: Bearer $TRUENAS_API_KEY\" \\\n  | jq '.[] | {name, state, version}'\n\nCheck for Updates\ncurl -sk \"$TRUENAS_URL/api/v2.0/app\" -H \"Authorization: Bearer $TRUENAS_API_KEY\" \\\n  | jq '.[] | select(.upgrade_available) | .name'\n\nInstall / Update Apps\n\nSee references/app-installation.md for the full installation guide covering:\n\nChecking app templates and storage requirements\nCreating datasets with proper ACLs\nInstalling with correct storage mappings\nHandling apps with multiple storage mounts\nApp Status\ncurl -sk \"$TRUENAS_URL/api/v2.0/app?name=APP_NAME\" -H \"Authorization: Bearer $TRUENAS_API_KEY\" \\\n  | jq '.[0] | {name, state, portals}'\n\nDockge (Docker Compose Stacks)\n\nDockge is a companion UI for Docker Compose stacks not in the TrueNAS Apps catalog. It uses Socket.IO, not REST. Use the provided scripts.\n\nPrerequisites\nnpm install   # in this skill's root directory\n\nList Stacks\nnode scripts/dockge-list.mjs\n\nUpdate Stacks\n# Update all running stacks\nnode scripts/dockge-update.mjs\n\n# Update specific stacks\nnode scripts/dockge-update.mjs mystack1 mystack2\n\nSocket.IO Protocol Details\n\nDockge uses Socket.IO with WebSocket transport.\n\nStatus codes:\n\n1 = inactive/exited\n3 = running\n4 = updating\n\nKey events:\n\nlogin — authenticate with username/password\nstackList — get all stacks (received via agent event)\nagent, \"\", \"updateStack\", stackName — trigger pull + restart\n\nNote: Stacks prefixed with ix- are TrueNAS-managed apps visible to Dockge — skip those when updating.\n\nMonitoring Checklist\n\nRun these commands for a quick health overview:\n\n# Pool health\ncurl -sk \"$TRUENAS_URL/api/v2.0/pool\" -H \"Authorization: Bearer $TRUENAS_API_KEY\" \\\n  | jq '.[] | {name, healthy}'\n\n# Active alerts\ncurl -sk \"$TRUENAS_URL/api/v2.0/alert/list\" -H \"Authorization: Bearer $TRUENAS_API_KEY\" \\\n  | jq '.[] | {level, formatted}'\n\n# Running services\ncurl -sk \"$TRUENAS_URL/api/v2.0/service\" -H \"Authorization: Bearer $TRUENAS_API_KEY\" \\\n  | jq '.[] | select(.state == \"RUNNING\") | .service'\n\n# App updates available\ncurl -sk \"$TRUENAS_URL/api/v2.0/app\" -H \"Authorization: Bearer $TRUENAS_API_KEY\" \\\n  | jq '.[] | select(.upgrade_available) | .name'\n\n# Replication status\ncurl -sk \"$TRUENAS_URL/api/v2.0/replication\" -H \"Authorization: Bearer $TRUENAS_API_KEY\" \\\n  | jq '.[] | {name, state: .state.state}'\n\nHomelab Services\n\nThis skill includes reference files for common homelab service categories. Each covers API patterns, env vars, and common agent tasks for services that typically run alongside TrueNAS:\n\nReference\tServices\tFile\nMedia management\tOverseerr, Sonarr, Radarr, Prowlarr, Plex, Tautulli\treferences/media-management.md\nApp installation\tTrueNAS native app install guide\treferences/app-installation.md\nDownload clients\tqBittorrent, SABnzbd, FlareSolverr\treferences/downloads.md\nHomelab services\tntfy, Syncthing, n8n, NocoDB, ChangeDetection, Crafty\treferences/homelab-services.md\nBooks & media\tAudiobookshelf, LazyLibrarian, Calibre-Web, MeTube\treferences/books-and-media.md\nBookmarks\tKarakeep (AI-powered bookmark manager)\treferences/bookmarks.md\n\nLoad the relevant reference file when the user asks about a specific service category.\n\nCommon Tasks\n\"Check NAS health\"\n\nRun the monitoring checklist above. Summarize pool states, alerts, and any pending updates.\n\n\"What's running?\"\n# TrueNAS apps\ncurl -sk \"$TRUENAS_URL/api/v2.0/app\" -H \"Authorization: Bearer $TRUENAS_API_KEY\" \\\n  | jq '.[] | select(.state == \"RUNNING\") | .name'\n\n# Dockge stacks (if configured)\nnode scripts/dockge-list.mjs\n\n\"Install an app\"\n\nFollow the guide in references/app-installation.md:\n\nCheck app template for storage requirements\nCreate dataset(s) under the apps pool\nSet ACL with apps preset\nInstall app with correct storage mappings\n\"Take a snapshot\"\nnode scripts/truenas-ws.mjs zfs.snapshot.create '[{\"dataset\": \"pool/dataset\", \"name\": \"manual-snapshot-name\"}]'\n\n\"What's downloading?\"\n\nSee references/downloads.md for qBittorrent and SABnzbd API commands.\n\n\"Add a movie/show\"\n\nSee references/media-management.md for Overseerr request workflow."
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/anotb/truenas-skill",
    "publisherUrl": "https://clawhub.ai/anotb/truenas-skill",
    "owner": "anotb",
    "version": "1.2.0",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/truenas-skill",
    "downloadUrl": "https://openagent3.xyz/downloads/truenas-skill",
    "agentUrl": "https://openagent3.xyz/skills/truenas-skill/agent",
    "manifestUrl": "https://openagent3.xyz/skills/truenas-skill/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/truenas-skill/agent.md"
  }
}