{
  "schemaVersion": "1.0",
  "item": {
    "slug": "sendme-skill",
    "name": "Sendme",
    "source": "tencent",
    "type": "skill",
    "category": "通讯协作",
    "sourceUrl": "https://clawhub.ai/muninn-huginn/sendme-skill",
    "canonicalUrl": "https://clawhub.ai/muninn-huginn/sendme-skill",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/sendme-skill",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=sendme-skill",
    "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/sendme-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/sendme-skill",
    "agentPageUrl": "https://openagent3.xyz/skills/sendme-skill/agent",
    "manifestUrl": "https://openagent3.xyz/skills/sendme-skill/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/sendme-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. 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": "Sendme",
        "body": "Peer-to-peer file transfer using iroh. No server uploads — files stream directly between machines via encrypted connections with automatic NAT traversal."
      },
      {
        "title": "Installation",
        "body": "If sendme is not installed:\n\nbrew install sendme\n\nAlternatively, install via Cargo: cargo install sendme"
      },
      {
        "title": "Sending Files",
        "body": "sendme send <path>\n\nAccepts a file or directory path\nOutputs a ticket — a long base32-encoded string the recipient needs\nThe process stays running until interrupted with Ctrl+C — the sender must remain online for the recipient to download\nPresent the ticket to the user and instruct them to share it with their recipient\n\nExample:\n\nsendme send ~/Documents/report.pdf\n# Outputs: sendme receive blobaa...  (the ticket)\n\nFor directories, sendme bundles the entire folder recursively."
      },
      {
        "title": "Non-Interactive / Headless Environments",
        "body": "sendme requires a TTY — it enables raw terminal mode for interactive features. In non-interactive environments (scripts, Docker, CI, agents), it will fail with:\n\nFailed to enable raw mode: No such device or address\n\nUse the Python PTY wrapper to provide a PTY and extract the ticket programmatically. This uses os.execvp() to invoke sendme directly without shell interpretation, avoiding shell injection risks:\n\nimport os, pty, select, signal, sys\n\ndef sendme_send(path):\n    pid, fd = pty.fork()\n    if pid == 0:\n        os.execvp(\"sendme\", [\"sendme\", \"send\", path])\n    output = b\"\"\n    ticket = None\n    while True:\n        ready, _, _ = select.select([fd], [], [], 0.5)\n        if ready:\n            try:\n                chunk = os.read(fd, 4096)\n                if not chunk:\n                    break\n                output += chunk\n                for line in output.decode(errors=\"replace\").split(\"\\n\"):\n                    if \"sendme receive blob\" in line:\n                        ticket = line.strip().replace(\"sendme receive \", \"\")\n                        print(ticket)\n                        sys.stdout.flush()\n            except OSError:\n                break\n        elif ticket:\n            try:\n                os.waitpid(pid, os.WNOHANG)\n            except ChildProcessError:\n                break\n    try:\n        os.kill(pid, signal.SIGTERM)\n        os.waitpid(pid, 0)\n    except (ProcessLookupError, ChildProcessError):\n        pass\n    return ticket"
      },
      {
        "title": "Receiving Files",
        "body": "sendme receive <ticket>\n\nDownloads the file/folder to the current directory\nUses temporary .sendme-* directories during download, then moves atomically\nAutomatically verifies integrity via blake3 hashing\nResumes interrupted downloads automatically\n\nExample:\n\nsendme receive blobaafy..."
      },
      {
        "title": "Key Details",
        "body": "Connection: Direct peer-to-peer with TLS encryption. Falls back to relay servers if direct connection fails.\nResumable: Interrupted downloads continue from where they left off.\nIntegrity: All data is blake3-verified during streaming.\nSpeed: Saturates connections up to 4Gbps.\nNo size limit: Works with files and folders of any size.\nSender must stay online: The sendme send process must keep running until the recipient completes the download."
      }
    ],
    "body": "Sendme\n\nPeer-to-peer file transfer using iroh. No server uploads — files stream directly between machines via encrypted connections with automatic NAT traversal.\n\nInstallation\n\nIf sendme is not installed:\n\nbrew install sendme\n\n\nAlternatively, install via Cargo: cargo install sendme\n\nSending Files\nsendme send <path>\n\nAccepts a file or directory path\nOutputs a ticket — a long base32-encoded string the recipient needs\nThe process stays running until interrupted with Ctrl+C — the sender must remain online for the recipient to download\nPresent the ticket to the user and instruct them to share it with their recipient\n\nExample:\n\nsendme send ~/Documents/report.pdf\n# Outputs: sendme receive blobaa...  (the ticket)\n\n\nFor directories, sendme bundles the entire folder recursively.\n\nNon-Interactive / Headless Environments\n\nsendme requires a TTY — it enables raw terminal mode for interactive features. In non-interactive environments (scripts, Docker, CI, agents), it will fail with:\n\nFailed to enable raw mode: No such device or address\n\n\nUse the Python PTY wrapper to provide a PTY and extract the ticket programmatically. This uses os.execvp() to invoke sendme directly without shell interpretation, avoiding shell injection risks:\n\nimport os, pty, select, signal, sys\n\ndef sendme_send(path):\n    pid, fd = pty.fork()\n    if pid == 0:\n        os.execvp(\"sendme\", [\"sendme\", \"send\", path])\n    output = b\"\"\n    ticket = None\n    while True:\n        ready, _, _ = select.select([fd], [], [], 0.5)\n        if ready:\n            try:\n                chunk = os.read(fd, 4096)\n                if not chunk:\n                    break\n                output += chunk\n                for line in output.decode(errors=\"replace\").split(\"\\n\"):\n                    if \"sendme receive blob\" in line:\n                        ticket = line.strip().replace(\"sendme receive \", \"\")\n                        print(ticket)\n                        sys.stdout.flush()\n            except OSError:\n                break\n        elif ticket:\n            try:\n                os.waitpid(pid, os.WNOHANG)\n            except ChildProcessError:\n                break\n    try:\n        os.kill(pid, signal.SIGTERM)\n        os.waitpid(pid, 0)\n    except (ProcessLookupError, ChildProcessError):\n        pass\n    return ticket\n\nReceiving Files\nsendme receive <ticket>\n\nDownloads the file/folder to the current directory\nUses temporary .sendme-* directories during download, then moves atomically\nAutomatically verifies integrity via blake3 hashing\nResumes interrupted downloads automatically\n\nExample:\n\nsendme receive blobaafy...\n\nKey Details\nConnection: Direct peer-to-peer with TLS encryption. Falls back to relay servers if direct connection fails.\nResumable: Interrupted downloads continue from where they left off.\nIntegrity: All data is blake3-verified during streaming.\nSpeed: Saturates connections up to 4Gbps.\nNo size limit: Works with files and folders of any size.\nSender must stay online: The sendme send process must keep running until the recipient completes the download."
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/muninn-huginn/sendme-skill",
    "publisherUrl": "https://clawhub.ai/muninn-huginn/sendme-skill",
    "owner": "muninn-huginn",
    "version": "0.1.4",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/sendme-skill",
    "downloadUrl": "https://openagent3.xyz/downloads/sendme-skill",
    "agentUrl": "https://openagent3.xyz/skills/sendme-skill/agent",
    "manifestUrl": "https://openagent3.xyz/skills/sendme-skill/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/sendme-skill/agent.md"
  }
}