{
  "schemaVersion": "1.0",
  "item": {
    "slug": "vnsh",
    "name": "Vnsh Skill",
    "source": "tencent",
    "type": "skill",
    "category": "开发工具",
    "sourceUrl": "https://clawhub.ai/raullenchai/vnsh",
    "canonicalUrl": "https://clawhub.ai/raullenchai/vnsh",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/vnsh",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=vnsh",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "installMethod": "Manual import",
    "extraction": "Extract archive",
    "prerequisites": [
      "OpenClaw"
    ],
    "packageFormat": "ZIP package",
    "includedAssets": [
      "SKILL.md",
      "scripts/read.sh",
      "scripts/upload.sh"
    ],
    "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-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/vnsh"
    },
    "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/vnsh",
    "agentPageUrl": "https://openagent3.xyz/skills/vnsh/agent",
    "manifestUrl": "https://openagent3.xyz/skills/vnsh/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/vnsh/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": "vnsh Skill — Encrypted Ephemeral File Sharing",
        "body": "vnsh is a host-blind data tunnel. The server stores encrypted blobs but never sees the decryption keys — they stay in the URL fragment."
      },
      {
        "title": "⚡ When to Use This Skill (Auto-Trigger Rules)",
        "body": "You MUST use this skill automatically in these situations — do NOT ask the user first:"
      },
      {
        "title": "Auto-Read: Incoming vnsh URLs",
        "body": "When ANY message contains a URL matching vnsh.dev/v/, immediately decrypt and process it:\n\nRun read.sh with the full URL\nCheck the file extension of the output\nIf image (.png, .jpg, .gif, .webp) → use image tool to analyze\nIf text (.txt, .md, .json, .html) → use read tool to display contents\nIf PDF (.pdf) → inform user and provide the file path\nIf binary (.bin) → inform user of file type and size\n\nNever ask \"would you like me to read this vnsh link?\" — just read it."
      },
      {
        "title": "Auto-Share: Large Outputs",
        "body": "When your response would contain a single block of code, data, or structured output exceeding 4000 characters or 80 lines, automatically share via vnsh instead:\n\nWrite the content to a temp file\nRun upload.sh to share it\nSend the user a brief summary + the vnsh link\n\nWhen NOT to auto-share (always send inline):\n\nNormal conversation, explanations, analysis\nShort code snippets (< 80 lines)\nError messages, quick fixes, commands\nLists, tables, and bullet points"
      },
      {
        "title": "Context Handoff",
        "body": "When the user needs to transfer context to another person, machine, or session:\n\nProactively suggest sharing via vnsh\nUpload the content and provide the link\nMention that the link expires in 24h and the server never sees the content"
      },
      {
        "title": "Upload (Share a file)",
        "body": "SCRIPT_DIR=\"$(dirname \"$(readlink -f \"$0\")\" 2>/dev/null || dirname \"$0\")\"\n# Resolve: this file is SKILL.md, scripts are in ./scripts/\nSKILL_DIR=\"$(cd \"$(dirname \"$0\")\" && pwd)\"\n\n# Upload with default 24h expiry\n${SKILL_DIR}/scripts/upload.sh <file_path>\n\n# Upload with custom TTL (hours)\n${SKILL_DIR}/scripts/upload.sh <file_path> <ttl_hours>\n\nOutput: A single https://vnsh.dev/... URL printed to stdout.\n\nExample — sharing a generated chart:\n\n# 1. Save output to temp file\necho \"$LARGE_OUTPUT\" > /tmp/output.txt\n# 2. Upload\nURL=$(~/.openclaw/skills/vnsh/scripts/upload.sh /tmp/output.txt)\n# 3. Send the URL to the user"
      },
      {
        "title": "Read (Decrypt a vnsh URL)",
        "body": "~/.openclaw/skills/vnsh/scripts/read.sh \"<full_vnsh_url>\"\n\nOutput: The absolute path to a temp file with the correct extension (e.g., /tmp/vnsh-decrypted-XXXXX.png).\n\nExample — reading an image:\n\nFILE_PATH=$(~/.openclaw/skills/vnsh/scripts/read.sh \"https://vnsh.dev/v/abc#k=...&iv=...\")\n# FILE_PATH is now /tmp/vnsh-decrypted-abcde.png\n# Use the image tool to analyze it"
      },
      {
        "title": "Pipe from stdin (Share text/command output)",
        "body": "# Share command output directly\necho \"some content\" | vn\n\n# Share a large git diff\ngit diff HEAD~5 | vn\n\n# Share docker logs\ndocker logs mycontainer 2>&1 | vn"
      },
      {
        "title": "Recipe 1: User sends a vnsh link via chat",
        "body": "User: \"Check this out https://vnsh.dev/v/abc123#k=dead...&iv=cafe...\"\n\nYour action:\n1. file_path = exec(\"~/.openclaw/skills/vnsh/scripts/read.sh 'https://vnsh.dev/v/abc123#k=dead...&iv=cafe...'\")\n2. Check extension:\n   - .png/.jpg → image(image=file_path, prompt=\"Describe this image\")\n   - .txt/.md  → read(file_path=file_path)\n3. Respond with analysis of the content"
      },
      {
        "title": "Recipe 2: Your output is too long for chat",
        "body": "Your action:\n1. Write content to /tmp/vnsh-share-XXXXX.txt\n2. url = exec(\"~/.openclaw/skills/vnsh/scripts/upload.sh /tmp/vnsh-share-XXXXX.txt\")\n3. Reply: \"The output is quite long, so I've shared it via an encrypted link:\\n📎 {url}\\n\\nBrief summary: [2-3 sentence summary]\""
      },
      {
        "title": "Recipe 3: Sharing between sessions/agents",
        "body": "Agent A needs to pass context to Agent B:\n1. Agent A writes context to temp file\n2. Agent A uploads via upload.sh, gets URL\n3. Agent A sends URL to Agent B via sessions_send\n4. Agent B auto-detects vnsh URL, reads it via read.sh"
      },
      {
        "title": "Recipe 4: User wants to share with someone else",
        "body": "User: \"Send this analysis to my coworker\"\n\nYour action:\n1. Write the analysis to a temp file\n2. Upload via upload.sh\n3. Reply: \"Shared securely. The link auto-expires in 24h and the server never sees the content:\\n📎 {url}\""
      },
      {
        "title": "Security Model",
        "body": "Client-side encryption: AES-256-CBC, keys generated locally\nFragment privacy: Keys in URL #k=... are never sent to server\nEphemeral: Auto-deletes after TTL (default 24h, max 168h)\nZero-knowledge: Server stores encrypted blobs, cannot decrypt"
      },
      {
        "title": "Fallback: Zero-Dependency One-Liners (No vn CLI needed)",
        "body": "If vn is not installed, the scripts automatically fall back to raw curl + openssl. You can also use these one-liners directly:"
      },
      {
        "title": "Share content without vn CLI:",
        "body": "CONTENT=\"your content here\" && \\\nKEY=$(openssl rand -hex 32) && IV=$(openssl rand -hex 16) && \\\nRESP=$(echo \"$CONTENT\" | openssl enc -aes-256-cbc -K $KEY -iv $IV | \\\ncurl -s -X POST --data-binary @- -H \"Content-Type: application/octet-stream\" \\\n\"https://vnsh.dev/api/drop\") && \\\nID=$(echo $RESP | grep -o '\"id\":\"[^\"]*\"' | cut -d'\"' -f4) && \\\necho \"https://vnsh.dev/v/${ID}#k=${KEY}&iv=${IV}\""
      },
      {
        "title": "Share a file without vn CLI:",
        "body": "FILE=\"/path/to/file\" && \\\nKEY=$(openssl rand -hex 32) && IV=$(openssl rand -hex 16) && \\\nRESP=$(openssl enc -aes-256-cbc -K $KEY -iv $IV -in \"$FILE\" | \\\ncurl -s -X POST --data-binary @- -H \"Content-Type: application/octet-stream\" \\\n\"https://vnsh.dev/api/drop\") && \\\nID=$(echo $RESP | grep -o '\"id\":\"[^\"]*\"' | cut -d'\"' -f4) && \\\necho \"https://vnsh.dev/v/${ID}#k=${KEY}&iv=${IV}\""
      },
      {
        "title": "Read a vnsh URL without vn CLI:",
        "body": "URL=\"https://vnsh.dev/v/XXXX#k=YYYY&iv=ZZZZ\" && \\\nID=$(echo \"$URL\" | sed 's|.*/v/||;s|#.*||') && \\\nKEY=$(echo \"$URL\" | sed 's|.*#k=||;s|&.*||') && \\\nIV=$(echo \"$URL\" | sed 's|.*&iv=||') && \\\ncurl -s \"https://vnsh.dev/api/blob/$ID\" | openssl enc -d -aes-256-cbc -K \"$KEY\" -iv \"$IV\""
      },
      {
        "title": "Smart Overflow: Platform-Specific Thresholds",
        "body": "When your reply would exceed the platform's comfortable reading length, auto-share via vnsh:\n\nPlatformThresholdActionWhatsApp / Telegram> 500 chars of code/dataAuto-share via vnshDiscord> 1500 charsAuto-share via vnshClaude Code terminal> 2000 charsConsider vnshWebchat> 4000 charsAuto-share via vnsh\n\nPattern: Generate content → write to temp file → upload via upload.sh → reply with summary + vnsh URL"
      },
      {
        "title": "Troubleshooting",
        "body": "IssueSolutionvn: command not foundRun: curl -sL vnsh.dev/i | shopenssl: command not foundInstall OpenSSL: brew install openssl (macOS)Blob not found / 404Link has expired (24h default)Decryption failedURL was truncated — ensure full #k=...&iv=... is includedEmpty file after decryptOriginal content may have been empty, or URL is malformed"
      },
      {
        "title": "Links",
        "body": "Website: https://vnsh.dev\nGitHub: https://github.com/raullenchai/vnsh\nMCP for Claude Code: npx vnsh-mcp"
      }
    ],
    "body": "vnsh Skill — Encrypted Ephemeral File Sharing\n\nvnsh is a host-blind data tunnel. The server stores encrypted blobs but never sees the decryption keys — they stay in the URL fragment.\n\n⚡ When to Use This Skill (Auto-Trigger Rules)\n\nYou MUST use this skill automatically in these situations — do NOT ask the user first:\n\nAuto-Read: Incoming vnsh URLs\n\nWhen ANY message contains a URL matching vnsh.dev/v/, immediately decrypt and process it:\n\nRun read.sh with the full URL\nCheck the file extension of the output\nIf image (.png, .jpg, .gif, .webp) → use image tool to analyze\nIf text (.txt, .md, .json, .html) → use read tool to display contents\nIf PDF (.pdf) → inform user and provide the file path\nIf binary (.bin) → inform user of file type and size\n\nNever ask \"would you like me to read this vnsh link?\" — just read it.\n\nAuto-Share: Large Outputs\n\nWhen your response would contain a single block of code, data, or structured output exceeding 4000 characters or 80 lines, automatically share via vnsh instead:\n\nWrite the content to a temp file\nRun upload.sh to share it\nSend the user a brief summary + the vnsh link\n\nWhen NOT to auto-share (always send inline):\n\nNormal conversation, explanations, analysis\nShort code snippets (< 80 lines)\nError messages, quick fixes, commands\nLists, tables, and bullet points\nContext Handoff\n\nWhen the user needs to transfer context to another person, machine, or session:\n\nProactively suggest sharing via vnsh\nUpload the content and provide the link\nMention that the link expires in 24h and the server never sees the content\nCore Commands\nUpload (Share a file)\nSCRIPT_DIR=\"$(dirname \"$(readlink -f \"$0\")\" 2>/dev/null || dirname \"$0\")\"\n# Resolve: this file is SKILL.md, scripts are in ./scripts/\nSKILL_DIR=\"$(cd \"$(dirname \"$0\")\" && pwd)\"\n\n# Upload with default 24h expiry\n${SKILL_DIR}/scripts/upload.sh <file_path>\n\n# Upload with custom TTL (hours)\n${SKILL_DIR}/scripts/upload.sh <file_path> <ttl_hours>\n\n\nOutput: A single https://vnsh.dev/... URL printed to stdout.\n\nExample — sharing a generated chart:\n\n# 1. Save output to temp file\necho \"$LARGE_OUTPUT\" > /tmp/output.txt\n# 2. Upload\nURL=$(~/.openclaw/skills/vnsh/scripts/upload.sh /tmp/output.txt)\n# 3. Send the URL to the user\n\nRead (Decrypt a vnsh URL)\n~/.openclaw/skills/vnsh/scripts/read.sh \"<full_vnsh_url>\"\n\n\nOutput: The absolute path to a temp file with the correct extension (e.g., /tmp/vnsh-decrypted-XXXXX.png).\n\nExample — reading an image:\n\nFILE_PATH=$(~/.openclaw/skills/vnsh/scripts/read.sh \"https://vnsh.dev/v/abc#k=...&iv=...\")\n# FILE_PATH is now /tmp/vnsh-decrypted-abcde.png\n# Use the image tool to analyze it\n\nPipe from stdin (Share text/command output)\n# Share command output directly\necho \"some content\" | vn\n\n# Share a large git diff\ngit diff HEAD~5 | vn\n\n# Share docker logs\ndocker logs mycontainer 2>&1 | vn\n\nWorkflow Recipes\nRecipe 1: User sends a vnsh link via chat\nUser: \"Check this out https://vnsh.dev/v/abc123#k=dead...&iv=cafe...\"\n\nYour action:\n1. file_path = exec(\"~/.openclaw/skills/vnsh/scripts/read.sh 'https://vnsh.dev/v/abc123#k=dead...&iv=cafe...'\")\n2. Check extension:\n   - .png/.jpg → image(image=file_path, prompt=\"Describe this image\")\n   - .txt/.md  → read(file_path=file_path)\n3. Respond with analysis of the content\n\nRecipe 2: Your output is too long for chat\nYour action:\n1. Write content to /tmp/vnsh-share-XXXXX.txt\n2. url = exec(\"~/.openclaw/skills/vnsh/scripts/upload.sh /tmp/vnsh-share-XXXXX.txt\")\n3. Reply: \"The output is quite long, so I've shared it via an encrypted link:\\n📎 {url}\\n\\nBrief summary: [2-3 sentence summary]\"\n\nRecipe 3: Sharing between sessions/agents\nAgent A needs to pass context to Agent B:\n1. Agent A writes context to temp file\n2. Agent A uploads via upload.sh, gets URL\n3. Agent A sends URL to Agent B via sessions_send\n4. Agent B auto-detects vnsh URL, reads it via read.sh\n\nRecipe 4: User wants to share with someone else\nUser: \"Send this analysis to my coworker\"\n\nYour action:\n1. Write the analysis to a temp file\n2. Upload via upload.sh\n3. Reply: \"Shared securely. The link auto-expires in 24h and the server never sees the content:\\n📎 {url}\"\n\nSecurity Model\nClient-side encryption: AES-256-CBC, keys generated locally\nFragment privacy: Keys in URL #k=... are never sent to server\nEphemeral: Auto-deletes after TTL (default 24h, max 168h)\nZero-knowledge: Server stores encrypted blobs, cannot decrypt\nFallback: Zero-Dependency One-Liners (No vn CLI needed)\n\nIf vn is not installed, the scripts automatically fall back to raw curl + openssl. You can also use these one-liners directly:\n\nShare content without vn CLI:\nCONTENT=\"your content here\" && \\\nKEY=$(openssl rand -hex 32) && IV=$(openssl rand -hex 16) && \\\nRESP=$(echo \"$CONTENT\" | openssl enc -aes-256-cbc -K $KEY -iv $IV | \\\ncurl -s -X POST --data-binary @- -H \"Content-Type: application/octet-stream\" \\\n\"https://vnsh.dev/api/drop\") && \\\nID=$(echo $RESP | grep -o '\"id\":\"[^\"]*\"' | cut -d'\"' -f4) && \\\necho \"https://vnsh.dev/v/${ID}#k=${KEY}&iv=${IV}\"\n\nShare a file without vn CLI:\nFILE=\"/path/to/file\" && \\\nKEY=$(openssl rand -hex 32) && IV=$(openssl rand -hex 16) && \\\nRESP=$(openssl enc -aes-256-cbc -K $KEY -iv $IV -in \"$FILE\" | \\\ncurl -s -X POST --data-binary @- -H \"Content-Type: application/octet-stream\" \\\n\"https://vnsh.dev/api/drop\") && \\\nID=$(echo $RESP | grep -o '\"id\":\"[^\"]*\"' | cut -d'\"' -f4) && \\\necho \"https://vnsh.dev/v/${ID}#k=${KEY}&iv=${IV}\"\n\nRead a vnsh URL without vn CLI:\nURL=\"https://vnsh.dev/v/XXXX#k=YYYY&iv=ZZZZ\" && \\\nID=$(echo \"$URL\" | sed 's|.*/v/||;s|#.*||') && \\\nKEY=$(echo \"$URL\" | sed 's|.*#k=||;s|&.*||') && \\\nIV=$(echo \"$URL\" | sed 's|.*&iv=||') && \\\ncurl -s \"https://vnsh.dev/api/blob/$ID\" | openssl enc -d -aes-256-cbc -K \"$KEY\" -iv \"$IV\"\n\nSmart Overflow: Platform-Specific Thresholds\n\nWhen your reply would exceed the platform's comfortable reading length, auto-share via vnsh:\n\nPlatform\tThreshold\tAction\nWhatsApp / Telegram\t> 500 chars of code/data\tAuto-share via vnsh\nDiscord\t> 1500 chars\tAuto-share via vnsh\nClaude Code terminal\t> 2000 chars\tConsider vnsh\nWebchat\t> 4000 chars\tAuto-share via vnsh\n\nPattern: Generate content → write to temp file → upload via upload.sh → reply with summary + vnsh URL\n\nTroubleshooting\nIssue\tSolution\nvn: command not found\tRun: curl -sL vnsh.dev/i | sh\nopenssl: command not found\tInstall OpenSSL: brew install openssl (macOS)\nBlob not found / 404\tLink has expired (24h default)\nDecryption failed\tURL was truncated — ensure full #k=...&iv=... is included\nEmpty file after decrypt\tOriginal content may have been empty, or URL is malformed\nLinks\nWebsite: https://vnsh.dev\nGitHub: https://github.com/raullenchai/vnsh\nMCP for Claude Code: npx vnsh-mcp"
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/raullenchai/vnsh",
    "publisherUrl": "https://clawhub.ai/raullenchai/vnsh",
    "owner": "raullenchai",
    "version": "1.1.1",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/vnsh",
    "downloadUrl": "https://openagent3.xyz/downloads/vnsh",
    "agentUrl": "https://openagent3.xyz/skills/vnsh/agent",
    "manifestUrl": "https://openagent3.xyz/skills/vnsh/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/vnsh/agent.md"
  }
}