{
  "schemaVersion": "1.0",
  "item": {
    "slug": "intranet",
    "name": "Intranet",
    "source": "tencent",
    "type": "skill",
    "category": "通讯协作",
    "sourceUrl": "https://clawhub.ai/odrobnik/intranet",
    "canonicalUrl": "https://clawhub.ai/odrobnik/intranet",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/intranet",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=intranet",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "installMethod": "Manual import",
    "extraction": "Extract archive",
    "prerequisites": [
      "OpenClaw"
    ],
    "packageFormat": "ZIP package",
    "includedAssets": [
      "SETUP.md",
      "SKILL.md",
      "scripts/intranet.py",
      "scripts/intranet_web.py"
    ],
    "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-23T16:43:11.935Z",
      "expiresAt": "2026-04-30T16:43:11.935Z",
      "httpStatus": 200,
      "finalUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=4claw-imageboard",
      "contentType": "application/zip",
      "probeMethod": "head",
      "details": {
        "probeUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=4claw-imageboard",
        "contentDisposition": "attachment; filename=\"4claw-imageboard-1.0.1.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/intranet"
    },
    "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/intranet",
    "agentPageUrl": "https://openagent3.xyz/skills/intranet/agent",
    "manifestUrl": "https://openagent3.xyz/skills/intranet/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/intranet/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": "Intranet",
        "body": "Lightweight local HTTP file server — no Apache/nginx needed, no root required. Serves static files, mounts plugin directories, and runs index.py entry points as CGI.\n\nEntry point: {baseDir}/scripts/intranet.py"
      },
      {
        "title": "Setup",
        "body": "See SETUP.md for prerequisites and setup instructions."
      },
      {
        "title": "Commands",
        "body": "python3 {baseDir}/scripts/intranet.py start                          # Start on default port 8080\npython3 {baseDir}/scripts/intranet.py start --port 9000              # Custom port\npython3 {baseDir}/scripts/intranet.py start --host 0.0.0.0            # LAN access (requires token + allowed_hosts)\npython3 {baseDir}/scripts/intranet.py start --token SECRET            # Enable bearer token auth\npython3 {baseDir}/scripts/intranet.py status                         # Check if running\npython3 {baseDir}/scripts/intranet.py stop                           # Stop server"
      },
      {
        "title": "Directory Layout",
        "body": "{workspace}/intranet/\n├── config.json          # Server config (NOT served)\n└── www/                 # Webroot (served files go here)\n    ├── index.html\n    └── ...\n\nConfig lives in {workspace}/intranet/config.json, webroot is {workspace}/intranet/www/. The config file is never exposed to HTTP."
      },
      {
        "title": "Plugins",
        "body": "Plugins mount external directories at URL prefixes. Configure in config.json:\n\n{\n  \"plugins\": {\n    \"banker\": \"{workspace}/skills/banker/web\",\n    \"deliveries\": \"{workspace}/skills/deliveries/web\"\n  }\n}\n\nPlugin config supports simple (static only) or extended (with CGI hash) format:\n\n{\n  \"plugins\": {\n    \"static-only\": \"/path/to/dir\",\n    \"with-cgi\": {\n      \"dir\": \"/path/to/dir\",\n      \"hash\": \"sha256:abc123...\"\n    }\n  }\n}\n\nPlugin paths must be inside the workspace\nIf CGI is enabled and a plugin has a hash, index.py at the plugin root handles all sub-paths — but only if its SHA-256 matches\nPlugins without a hash are static-only (CGI blocked even when globally enabled)\nGenerate a hash: shasum -a 256 /path/to/index.py"
      },
      {
        "title": "CGI Execution",
        "body": "Off by default. Enable in config.json:\n\n{\n  \"cgi\": true\n}\n\nWhen enabled, only files named index.py can execute as CGI:\n\nWebroot: index.py in any subdirectory handles that directory's requests\nPlugins: index.py at the plugin root handles all plugin sub-paths\nAll other .py files → 403 Forbidden (never served, never executed)\nScripts must have the executable bit set (chmod +x)"
      },
      {
        "title": "Security",
        "body": "Webroot isolation — config.json is outside the webroot (www/), never served\nCGI off by default — must be explicitly enabled via \"cgi\": true in config.json\nPath containment — all resolved paths must stay within their base directory. Symlinks are followed but the resolved target is checked for containment.\nPlugin allowlist — only directories explicitly registered in config.json are served; must be inside workspace\nCGI restricted to index.py — no arbitrary script execution; plugin CGI requires SHA-256 hash in config.json. Webroot CGI does not require a hash (webroot files are under your direct control)\nAll .py files blocked except index.py entry points (not served as text, not executed)\nHost allowlist — optional allowed_hosts restricts which Host headers are accepted\nToken auth — optional bearer token via --token flag or config.json. Browser clients visit ?token=SECRET once → session cookie set → all subsequent navigation works. API clients use Authorization: Bearer <token> header.\nPath traversal protection — all paths resolved and validated before serving\nDefault bind: 127.0.0.1 (loopback only). LAN access via --host 0.0.0.0 requires both token auth and allowed_hosts in config.json."
      },
      {
        "title": "Workspace Detection",
        "body": "The server auto-detects the workspace by walking up from $PWD (or the script location) looking for a skills/ directory. The detected path is printed on startup so you can verify it.\n\nTo skip autodiscovery, set INTRANET_WORKSPACE to the workspace root:\n\nINTRANET_WORKSPACE=/path/to/workspace python3 scripts/intranet.py start"
      },
      {
        "title": "Notes",
        "body": "All state files are inside the workspace:\n\nConfig: {workspace}/intranet/config.json\nPID: {workspace}/intranet/.pid\nRuntime: {workspace}/intranet/.conf\nWebroot: {workspace}/intranet/www/\n\n\nNo files are written outside the workspace\n30-second timeout on CGI execution (when enabled)"
      }
    ],
    "body": "Intranet\n\nLightweight local HTTP file server — no Apache/nginx needed, no root required. Serves static files, mounts plugin directories, and runs index.py entry points as CGI.\n\nEntry point: {baseDir}/scripts/intranet.py\n\nSetup\n\nSee SETUP.md for prerequisites and setup instructions.\n\nCommands\npython3 {baseDir}/scripts/intranet.py start                          # Start on default port 8080\npython3 {baseDir}/scripts/intranet.py start --port 9000              # Custom port\npython3 {baseDir}/scripts/intranet.py start --host 0.0.0.0            # LAN access (requires token + allowed_hosts)\npython3 {baseDir}/scripts/intranet.py start --token SECRET            # Enable bearer token auth\npython3 {baseDir}/scripts/intranet.py status                         # Check if running\npython3 {baseDir}/scripts/intranet.py stop                           # Stop server\n\nDirectory Layout\n{workspace}/intranet/\n├── config.json          # Server config (NOT served)\n└── www/                 # Webroot (served files go here)\n    ├── index.html\n    └── ...\n\n\nConfig lives in {workspace}/intranet/config.json, webroot is {workspace}/intranet/www/. The config file is never exposed to HTTP.\n\nPlugins\n\nPlugins mount external directories at URL prefixes. Configure in config.json:\n\n{\n  \"plugins\": {\n    \"banker\": \"{workspace}/skills/banker/web\",\n    \"deliveries\": \"{workspace}/skills/deliveries/web\"\n  }\n}\n\n\nPlugin config supports simple (static only) or extended (with CGI hash) format:\n\n{\n  \"plugins\": {\n    \"static-only\": \"/path/to/dir\",\n    \"with-cgi\": {\n      \"dir\": \"/path/to/dir\",\n      \"hash\": \"sha256:abc123...\"\n    }\n  }\n}\n\nPlugin paths must be inside the workspace\nIf CGI is enabled and a plugin has a hash, index.py at the plugin root handles all sub-paths — but only if its SHA-256 matches\nPlugins without a hash are static-only (CGI blocked even when globally enabled)\nGenerate a hash: shasum -a 256 /path/to/index.py\nCGI Execution\n\nOff by default. Enable in config.json:\n\n{\n  \"cgi\": true\n}\n\n\nWhen enabled, only files named index.py can execute as CGI:\n\nWebroot: index.py in any subdirectory handles that directory's requests\nPlugins: index.py at the plugin root handles all plugin sub-paths\nAll other .py files → 403 Forbidden (never served, never executed)\nScripts must have the executable bit set (chmod +x)\nSecurity\nWebroot isolation — config.json is outside the webroot (www/), never served\nCGI off by default — must be explicitly enabled via \"cgi\": true in config.json\nPath containment — all resolved paths must stay within their base directory. Symlinks are followed but the resolved target is checked for containment.\nPlugin allowlist — only directories explicitly registered in config.json are served; must be inside workspace\nCGI restricted to index.py — no arbitrary script execution; plugin CGI requires SHA-256 hash in config.json. Webroot CGI does not require a hash (webroot files are under your direct control)\nAll .py files blocked except index.py entry points (not served as text, not executed)\nHost allowlist — optional allowed_hosts restricts which Host headers are accepted\nToken auth — optional bearer token via --token flag or config.json. Browser clients visit ?token=SECRET once → session cookie set → all subsequent navigation works. API clients use Authorization: Bearer <token> header.\nPath traversal protection — all paths resolved and validated before serving\nDefault bind: 127.0.0.1 (loopback only). LAN access via --host 0.0.0.0 requires both token auth and allowed_hosts in config.json.\nWorkspace Detection\n\nThe server auto-detects the workspace by walking up from $PWD (or the script location) looking for a skills/ directory. The detected path is printed on startup so you can verify it.\n\nTo skip autodiscovery, set INTRANET_WORKSPACE to the workspace root:\n\nINTRANET_WORKSPACE=/path/to/workspace python3 scripts/intranet.py start\n\nNotes\nAll state files are inside the workspace:\nConfig: {workspace}/intranet/config.json\nPID: {workspace}/intranet/.pid\nRuntime: {workspace}/intranet/.conf\nWebroot: {workspace}/intranet/www/\nNo files are written outside the workspace\n30-second timeout on CGI execution (when enabled)"
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/odrobnik/intranet",
    "publisherUrl": "https://clawhub.ai/odrobnik/intranet",
    "owner": "odrobnik",
    "version": "3.2.7",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/intranet",
    "downloadUrl": "https://openagent3.xyz/downloads/intranet",
    "agentUrl": "https://openagent3.xyz/skills/intranet/agent",
    "manifestUrl": "https://openagent3.xyz/skills/intranet/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/intranet/agent.md"
  }
}