{
  "schemaVersion": "1.0",
  "item": {
    "slug": "privateapp",
    "name": "Private Web App (PWA)",
    "source": "tencent",
    "type": "skill",
    "category": "开发工具",
    "sourceUrl": "https://clawhub.ai/camopel/privateapp",
    "canonicalUrl": "https://clawhub.ai/camopel/privateapp",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/privateapp",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=privateapp",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "installMethod": "Manual import",
    "extraction": "Extract archive",
    "prerequisites": [
      "OpenClaw"
    ],
    "packageFormat": "ZIP package",
    "includedAssets": [
      "README.md",
      "SKILL.md",
      "apps/file-browser/app.json",
      "apps/file-browser/backend/routes.py",
      "apps/file-browser/frontend/index.html",
      "apps/file-browser/frontend/package-lock.json"
    ],
    "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",
      "slug": "privateapp",
      "status": "healthy",
      "reason": "direct_download_ok",
      "recommendedAction": "download",
      "checkedAt": "2026-05-07T09:49:17.859Z",
      "expiresAt": "2026-05-14T09:49:17.859Z",
      "httpStatus": 200,
      "finalUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=privateapp",
      "contentType": "application/zip",
      "probeMethod": "head",
      "details": {
        "probeUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=privateapp",
        "contentDisposition": "attachment; filename=\"privateapp-1.0.3.zip\"",
        "redirectLocation": null,
        "bodySnippet": null,
        "slug": "privateapp"
      },
      "scope": "item",
      "summary": "Item download looks usable.",
      "detail": "Yavira can redirect you to the upstream package for this item.",
      "primaryActionLabel": "Download for OpenClaw",
      "primaryActionHref": "/downloads/privateapp"
    },
    "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/privateapp",
    "agentPageUrl": "https://openagent3.xyz/skills/privateapp/agent",
    "manifestUrl": "https://openagent3.xyz/skills/privateapp/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/privateapp/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": "PrivateApp",
        "body": "Personal PWA dashboard — FastAPI backend + React/Vite frontend with plugin apps."
      },
      {
        "title": "Setup",
        "body": "# Clone and install (creates venv, builds frontends, sets up systemd/launchd)\ngit clone https://github.com/camopel/PrivateApp.git ~/Workspace/PrivateApp\ncd ~/Workspace/PrivateApp\nbash scripts/install.sh [--port 8800]\n\nCopy scripts/config.example.json → scripts/config.json and edit:\n\n{\n  \"host\": \"0.0.0.0\",\n  \"port\": 8800,\n  \"data_dir\": \"~/.local/share/privateapp\",\n  \"file_browser\": { \"root\": \"~\" },\n  \"push\": { \"vapid_email\": \"you@example.com\" }\n}"
      },
      {
        "title": "Service Management",
        "body": "# Linux (systemd user service)\nsystemctl --user start privateapp\nsystemctl --user stop privateapp\nsystemctl --user restart privateapp\nsystemctl --user status privateapp\n\n# macOS (launchd)\nlaunchctl load ~/Library/LaunchAgents/com.privateapp.server.plist\nlaunchctl unload ~/Library/LaunchAgents/com.privateapp.server.plist\n\n# Manual\n.venv/bin/python3 scripts/server.py --host 127.0.0.1 --port 8800"
      },
      {
        "title": "Build Frontends",
        "body": "After any frontend change, rebuild:\n\n# Build shell (home screen)\ncd frontend && npm run build\n\n# Build all app frontends\nfor app_dir in apps/*/frontend; do\n  [ -f \"$app_dir/package.json\" ] && (cd \"$app_dir\" && npm install && npm run build)\ndone\n\n# Or use the install script which builds everything\nbash scripts/install.sh\n\nThen restart the service."
      },
      {
        "title": "Built-in Apps",
        "body": "AppShortcodeDescription📊 SystemsysmonCPU, RAM, disk, GPU stats and service health📁 FilesfilesBrowse, preview, and share files"
      },
      {
        "title": "Adding a New App",
        "body": "Create apps/{app-id}/ with:\n\napp.json — metadata (id, name, shortcode, icon, description)\nbackend/routes.py — FastAPI router (mounted at /api/app/{shortcode}/)\nfrontend/ — React SPA (Vite, builds to frontend/dist/)\n\nShortcode must be unique. The app loader auto-discovers on startup.\n\nSee the existing apps for reference patterns. Key conventions:\n\nAll routes async def, return plain dicts\nFrontend uses CSS custom properties for dark mode\nInput font-size ≥ 16px (prevents iOS auto-zoom)\nEvery app has a back button linking to /"
      },
      {
        "title": "Push Notifications",
        "body": "Apps can send push via commons.push_client:\n\nfrom commons.push_client import send_push\nawait send_push(title=\"Alert\", body=\"Something happened\", url=\"/app/my-app/\")"
      },
      {
        "title": "Data",
        "body": "~/.local/share/privateapp/\n├── privateapp.db       # Settings, preferences, push subscriptions\n├── vapid_private.pem   # VAPID signing key\n└── vapid_public.txt    # VAPID public key"
      },
      {
        "title": "Key APIs",
        "body": "GET /api/apps — list installed apps\nGET /api/settings/preferences — get preferences (timezone, language, app_order)\nPOST /api/settings/preferences — save preferences\nPOST /api/push/send — send push notification\nGET /api/push/test — test push"
      }
    ],
    "body": "PrivateApp\n\nPersonal PWA dashboard — FastAPI backend + React/Vite frontend with plugin apps.\n\nScreenshots\n\nSetup\n# Clone and install (creates venv, builds frontends, sets up systemd/launchd)\ngit clone https://github.com/camopel/PrivateApp.git ~/Workspace/PrivateApp\ncd ~/Workspace/PrivateApp\nbash scripts/install.sh [--port 8800]\n\n\nCopy scripts/config.example.json → scripts/config.json and edit:\n\n{\n  \"host\": \"0.0.0.0\",\n  \"port\": 8800,\n  \"data_dir\": \"~/.local/share/privateapp\",\n  \"file_browser\": { \"root\": \"~\" },\n  \"push\": { \"vapid_email\": \"you@example.com\" }\n}\n\nService Management\n# Linux (systemd user service)\nsystemctl --user start privateapp\nsystemctl --user stop privateapp\nsystemctl --user restart privateapp\nsystemctl --user status privateapp\n\n# macOS (launchd)\nlaunchctl load ~/Library/LaunchAgents/com.privateapp.server.plist\nlaunchctl unload ~/Library/LaunchAgents/com.privateapp.server.plist\n\n# Manual\n.venv/bin/python3 scripts/server.py --host 127.0.0.1 --port 8800\n\nBuild Frontends\n\nAfter any frontend change, rebuild:\n\n# Build shell (home screen)\ncd frontend && npm run build\n\n# Build all app frontends\nfor app_dir in apps/*/frontend; do\n  [ -f \"$app_dir/package.json\" ] && (cd \"$app_dir\" && npm install && npm run build)\ndone\n\n# Or use the install script which builds everything\nbash scripts/install.sh\n\n\nThen restart the service.\n\nBuilt-in Apps\nApp\tShortcode\tDescription\n📊 System\tsysmon\tCPU, RAM, disk, GPU stats and service health\n📁 Files\tfiles\tBrowse, preview, and share files\nAdding a New App\n\nCreate apps/{app-id}/ with:\n\napp.json — metadata (id, name, shortcode, icon, description)\nbackend/routes.py — FastAPI router (mounted at /api/app/{shortcode}/)\nfrontend/ — React SPA (Vite, builds to frontend/dist/)\n\nShortcode must be unique. The app loader auto-discovers on startup.\n\nSee the existing apps for reference patterns. Key conventions:\n\nAll routes async def, return plain dicts\nFrontend uses CSS custom properties for dark mode\nInput font-size ≥ 16px (prevents iOS auto-zoom)\nEvery app has a back button linking to /\nPush Notifications\n\nApps can send push via commons.push_client:\n\nfrom commons.push_client import send_push\nawait send_push(title=\"Alert\", body=\"Something happened\", url=\"/app/my-app/\")\n\nData\n~/.local/share/privateapp/\n├── privateapp.db       # Settings, preferences, push subscriptions\n├── vapid_private.pem   # VAPID signing key\n└── vapid_public.txt    # VAPID public key\n\nKey APIs\nGET /api/apps — list installed apps\nGET /api/settings/preferences — get preferences (timezone, language, app_order)\nPOST /api/settings/preferences — save preferences\nPOST /api/push/send — send push notification\nGET /api/push/test — test push"
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/camopel/privateapp",
    "publisherUrl": "https://clawhub.ai/camopel/privateapp",
    "owner": "camopel",
    "version": "1.0.3",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/privateapp",
    "downloadUrl": "https://openagent3.xyz/downloads/privateapp",
    "agentUrl": "https://openagent3.xyz/skills/privateapp/agent",
    "manifestUrl": "https://openagent3.xyz/skills/privateapp/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/privateapp/agent.md"
  }
}