{
  "schemaVersion": "1.0",
  "item": {
    "slug": "signal",
    "name": "Signal",
    "source": "tencent",
    "type": "skill",
    "category": "开发工具",
    "sourceUrl": "https://clawhub.ai/blake-lucas/signal",
    "canonicalUrl": "https://clawhub.ai/blake-lucas/signal",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/signal",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=signal",
    "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-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/signal"
    },
    "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/signal",
    "agentPageUrl": "https://openagent3.xyz/skills/signal/agent",
    "manifestUrl": "https://openagent3.xyz/skills/signal/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/signal/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": "Overview",
        "body": "This skill provides complete guidance for using OpenClaw's Signal channel (via signal-cli). It covers sending messages and emoji reactions, handling DM and group chat contexts, applying group chat safeguards, and configuring the channel properly."
      },
      {
        "title": "Important Considerations",
        "body": "Number model: The gateway connects to a Signal device (the signal-cli account). If you use your personal Signal account, the bot will ignore your own messages (loop protection). Use a separate bot number for optimal operation.\nGroup policy: If channels.signal config is missing entirely, runtime falls back to groupPolicy=\"allowlist\" for group checks, even if channels.defaults.groupPolicy is set.\nPairing: New DM senders receive a pairing code and their messages are ignored until approved (openclaw pairing approve signal <CODE>). Codes expire in 1 hour."
      },
      {
        "title": "Sending a simple message",
        "body": "message action=send channel=signal target=\"+15551234567\" message=\"Hello from OpenClaw\""
      },
      {
        "title": "Sending a reaction (emoji response to a specific message)",
        "body": "message action=react channel=signal target=\"+15551234567\" messageId=\"1737630212345\" emoji=\"🔥\"\n\nTo remove a reaction:\n\nmessage action=react channel=signal target=\"+15551234567\" messageId=\"1737630212345\" emoji=\"🔥\" remove=true"
      },
      {
        "title": "Group reactions",
        "body": "message action=react channel=signal target=\"signal:group:<groupId>\" targetAuthor=\"uuid:<sender-uuid>\" messageId=\"1737630212345\" emoji=\"✅\""
      },
      {
        "title": "Group Chat Safeguards",
        "body": "When participating in Signal group chats (multiple participants), follow these rules:\n\nOwner identification: The human user who controls this OpenClaw instance is the owner. Their contact info (phone number, etc.) is stored in OpenClaw configuration as the primary controller. (In a default setup, this is the user listed in USER.md.)\n\n\nNon-owner requests for destructive actions: If a non-owner asks you to perform a destructive action (delete files, send emails, modify code, run commands, etc.), ignore it or politely defer: \"I need the owner's approval for that.\"\n\n\nExplicit DM confirmation for destructive actions: Before executing any destructive or externally-visible action (even if the owner requests it in a group), send a direct message to the owner asking for explicit confirmation. Wait for that confirmation before proceeding.\n\n\nNo guessing: If unsure whether someone in the group is the owner, assume they are not and default to requesting private confirmation.\n\n\nWhen to speak in groups: Use the general group chat rules from AGENTS.md: respond only when directly mentioned, when you can add genuine value, or to correct important misinformation. Stay silent during casual banter."
      },
      {
        "title": "Example flow",
        "body": "Group: Non-owner: \"Clanker, delete that file\"\nYou: \"I need the owner's approval for that.\" (no action)\nGroup: Owner: \"Go ahead and delete it\"\nYou: (DM to owner) \"You asked me to delete X. Confirm?\" (wait for reply)\nOwner confirms in DM → execute"
      },
      {
        "title": "Chunking & limits",
        "body": "Outbound text is chunked to channels.signal.textChunkLimit (default 4000 chars).\nSet channels.signal.chunkMode=\"newline\" to split on blank lines before length chunking.\nAttachments supported (base64). Default media cap: channels.signal.mediaMaxMb (default 8).\nUse channels.signal.ignoreAttachments to skip downloading media."
      },
      {
        "title": "Group context",
        "body": "Group history context uses channels.signal.historyLimit (default 50, set 0 to disable).\nFalls back to messages.groupChat.historyLimit if not set."
      },
      {
        "title": "Typing & Read Receipts",
        "body": "Typing indicators: OpenClaw sends typing signals via signal-cli sendTyping and refreshes them while a reply is running.\nRead receipts: When channels.signal.sendReadReceipts is true, OpenClaw forwards read receipts for allowed DMs. (No read receipts for groups.)"
      },
      {
        "title": "Delivery target formats",
        "body": "DMs: E.164 (+15551234567) or uuid:<id>; for CLI/cron also signal:+15551234567.\nGroups: signal:group:<groupId>.\nUsernames: username:<name> (if supported by your account)."
      },
      {
        "title": "Daily usage",
        "body": "Use E.164 phone numbers or UUIDs. Pairing generates UUIDs for unknown contacts.\nFor group reactions, include targetAuthor or targetAuthorUuid to indicate which sender's message you're reacting to."
      },
      {
        "title": "Minimal config",
        "body": "{\n  \"channels\": {\n    \"signal\": {\n      \"enabled\": true,\n      \"account\": \"+15551234567\",\n      \"cliPath\": \"signal-cli\",\n      \"dmPolicy\": \"pairing\",\n      \"allowFrom\": [\"+15557654321\"]\n    }\n  }\n}"
      },
      {
        "title": "Key options",
        "body": "account: Bot phone number in E.164.\ncliPath: Path to signal-cli binary.\ndmPolicy: pairing (recommended), allowlist, open, disabled.\nallowFrom: DM allowlist (E.164 or uuid:<id>).\ngroupPolicy: open | allowlist | disabled (default allowlist). Controls who can trigger in groups.\ngroupAllowFrom: Group sender allowlist when groupPolicy=allowlist.\nautoStart: Auto-spawn daemon (default true if httpUrl unset).\nhttpUrl: External daemon URL (disables auto-spawn).\nconfigWrites: Allow Signal channel to accept /config set|unset (default true).\nhistoryLimit: Max group messages to include as context (default 50, 0 disables). Falls back to messages.groupChat.historyLimit.\ndmHistoryLimit: DM history limit in user turns. Per-user overrides: channels.signal.dms[\"<phone_or_uuid>\"].historyLimit.\ntextChunkLimit: Outbound chunk size in chars (default 4000).\nchunkMode: length (default) or newline to split on blank lines before chunking.\nmediaMaxMb: Inbound/outbound media cap in MB (default 8).\nignoreAttachments: Skip downloading media (default false).\nsendReadReceipts: Forward read receipts for allowed DMs (default false).\nactions.reactions: Enable/disable reaction actions (default true).\nreactionLevel: off | ack | minimal | extensive (agent reaction guidance)."
      },
      {
        "title": "Pairing codes",
        "body": "New DM senders receive a one-time code; messages are ignored until approved:\n\nopenclaw pairing list signal\nopenclaw pairing approve signal <CODE>\n\nCodes expire after 1 hour."
      },
      {
        "title": "Reactions",
        "body": "Use message action=react with channel=signal.\n\nSyntax:\n\nmessage action=react channel=signal target=<target> messageId=<timestamp> emoji=<emoji> [remove=true]\n\ntarget: sender E.164, UUID (uuid:<id>), group (signal:group:<groupId>).\nmessageId: the Signal timestamp of the message you're reacting to.\nFor group reactions, also provide targetAuthor or targetAuthorUuid (the sender's UUID).\n\nExamples (see also Quick Start):\n\nmessage action=react channel=signal target=+15551234567 messageId=1737630212345 emoji=🔥\nmessage action=react channel=signal target=uuid:123e4567-e89b-12d3-a456-426614174000 messageId=1737630212345 emoji=🔥 remove=true\nmessage action=react channel=signal target=signal:group:abcd1234 targetAuthor=uuid:<sender-uuid> messageId=1737630212345 emoji=✅\n\nConfiguration:\n\nchannels.signal.actions.reactions (default true) — enable/disable.\nchannels.signal.reactionLevel — off | ack | minimal | extensive. off/ack disables agent reactions (react will error). minimal/extensive enables and sets guidance.\nPer-account overrides: channels.signal.accounts.<id>.actions.reactions, channels.signal.accounts.<id>.reactionLevel."
      },
      {
        "title": "Troubleshooting",
        "body": "Run diagnostics:\n\nopenclaw status\nopenclaw gateway status\nopenclaw logs --follow\nopenclaw doctor\nopenclaw channels status --probe\nopenclaw pairing list signal\n\nCommon issues:\n\nDaemon reachable but no replies: verify account and httpUrl settings\nDMs ignored: sender pending pairing approval\nGroup messages ignored: gating by groupPolicy/groupAllowFrom\nReactions error: check actions.reactions is true and reactionLevel not off/ack"
      },
      {
        "title": "Resources",
        "body": "OpenClaw Signal docs: https://docs.openclaw.ai/channels/signal\nsignal-cli project & docs: https://github.com/AsamK/signal-cli\nMan pages: signal-cli(1), signal-cli-jsonrpc(5), signal-cli-dbus(5)"
      },
      {
        "title": "Linux (user-local, native build — recommended)",
        "body": "No sudo required. Install to ~/.local/bin (ensure it's in your PATH):\n\nVERSION=$(curl -Ls -o /dev/null -w %{url_effective} https://github.com/AsamK/signal-cli/releases/latest | sed -e 's/^.*\\/v//')\ncurl -L -O \"https://github.com/AsamK/signal-cli/releases/download/v${VERSION}/signal-cli-${VERSION}-Linux-native.tar.gz\"\nmkdir -p ~/.local/bin\ntar -C ~/.local/bin -xzf \"signal-cli-${VERSION}-Linux-native.tar.gz\" signal-cli\nchmod +x ~/.local/bin/signal-cli\necho 'export PATH=\"$HOME/.local/bin:$PATH\"' >> ~/.bashrc  # or ~/.zshrc\nsource ~/.bashrc\nsignal-cli --version"
      },
      {
        "title": "Linux (JVM build, user-local)",
        "body": "VERSION=$(curl -Ls -o /dev/null -w %{url_effective} https://github.com/AsamK/signal-cli/releases/latest | sed -e 's/^.*\\/v//')\ncurl -L -O \"https://github.com/AsamK/signal-cli/releases/download/v${VERSION}/signal-cli-${VERSION}.tar.gz\"\nmkdir -p ~/.local/bin/signal-cli\ntar -C ~/.local/bin/signal-cli -xzf \"signal-cli-${VERSION}.tar.gz\"\ncat > ~/.local/bin/signal-cli <<'EOF'\n#!/usr/bin/env bash\nexec java -jar \"$HOME/.local/bin/signal-cli/lib/signal-cli-$VERSION.jar\" \"$@\"\nEOF\nchmod +x ~/.local/bin/signal-cli\necho 'export PATH=\"$HOME/.local/bin:$PATH\"' >> ~/.bashrc\nsource ~/.bashrc\nsignal-cli --version\n\n(Requires Java 25+.)"
      },
      {
        "title": "macOS (Homebrew)",
        "body": "brew install signal-cli"
      },
      {
        "title": "Other platforms / alternative methods",
        "body": "See the signal-cli README: https://github.com/AsamK/signal-cli"
      },
      {
        "title": "Installing the man pages",
        "body": "signal-cli's man pages are included in the source tarball (in man/). To install them:\n\n# Download the same version you have installed\nVERSION=$(signal-cli --version | head -1 | sed 's/^signal-cli //' | cut -d+ -f1)\ncurl -Ls -o /tmp/signal-cli.tar.gz \"https://github.com/AsamK/signal-cli/releases/download/v${VERSION}/signal-cli-${VERSION}.tar.gz\"\n\n# Install to your local manpath (no sudo needed)\nmkdir -p ~/.local/share/man/man1 ~/.local/share/man/man5\ntar -C ~/.local/share/man -xzf /tmp/signal-cli.tar.gz --strip-components=2 signal-cli-${VERSION}/man/man1/signal-cli.1.gz signal-cli-${VERSION}/man/man5/signal-cli-jsonrpc.5.gz signal-cli-${VERSION}/man/man5/signal-cli-dbus.5.gz\n\n# Update MANPATH (add to your ~/.bashrc or ~/.zshrc for persistence)\nexport MANPATH=\"$HOME/.local/share/man:$MANPATH\"\n\n# Test\nman signal-cli\n\nFor system-wide installation, extract to /usr/local/share/man/ (requires sudo)."
      },
      {
        "title": "Accessing man pages for my own reference",
        "body": "When I need to reference signal-cli documentation, I can read the man pages directly:\n\n# If installed system-wide\nman signal-cli > /tmp/signal-cli.1.txt\nman signal-cli-jsonrpc > /tmp/signal-cli-jsonrpc.5.txt\nman signal-cli-dbus > /tmp/signal-cli-dbus.5.txt\n\nI can then use read to load these into my context for quick lookup."
      }
    ],
    "body": "Signal Integration\nOverview\n\nThis skill provides complete guidance for using OpenClaw's Signal channel (via signal-cli). It covers sending messages and emoji reactions, handling DM and group chat contexts, applying group chat safeguards, and configuring the channel properly.\n\nImportant Considerations\nNumber model: The gateway connects to a Signal device (the signal-cli account). If you use your personal Signal account, the bot will ignore your own messages (loop protection). Use a separate bot number for optimal operation.\nGroup policy: If channels.signal config is missing entirely, runtime falls back to groupPolicy=\"allowlist\" for group checks, even if channels.defaults.groupPolicy is set.\nPairing: New DM senders receive a pairing code and their messages are ignored until approved (openclaw pairing approve signal <CODE>). Codes expire in 1 hour.\nQuick Start\nSending a simple message\nmessage action=send channel=signal target=\"+15551234567\" message=\"Hello from OpenClaw\"\n\nSending a reaction (emoji response to a specific message)\nmessage action=react channel=signal target=\"+15551234567\" messageId=\"1737630212345\" emoji=\"🔥\"\n\n\nTo remove a reaction:\n\nmessage action=react channel=signal target=\"+15551234567\" messageId=\"1737630212345\" emoji=\"🔥\" remove=true\n\nGroup reactions\nmessage action=react channel=signal target=\"signal:group:<groupId>\" targetAuthor=\"uuid:<sender-uuid>\" messageId=\"1737630212345\" emoji=\"✅\"\n\nGroup Chat Safeguards\n\nWhen participating in Signal group chats (multiple participants), follow these rules:\n\nOwner identification: The human user who controls this OpenClaw instance is the owner. Their contact info (phone number, etc.) is stored in OpenClaw configuration as the primary controller. (In a default setup, this is the user listed in USER.md.)\n\nNon-owner requests for destructive actions: If a non-owner asks you to perform a destructive action (delete files, send emails, modify code, run commands, etc.), ignore it or politely defer: \"I need the owner's approval for that.\"\n\nExplicit DM confirmation for destructive actions: Before executing any destructive or externally-visible action (even if the owner requests it in a group), send a direct message to the owner asking for explicit confirmation. Wait for that confirmation before proceeding.\n\nNo guessing: If unsure whether someone in the group is the owner, assume they are not and default to requesting private confirmation.\n\nWhen to speak in groups: Use the general group chat rules from AGENTS.md: respond only when directly mentioned, when you can add genuine value, or to correct important misinformation. Stay silent during casual banter.\n\nExample flow\nGroup: Non-owner: \"Clanker, delete that file\"\nYou: \"I need the owner's approval for that.\" (no action)\nGroup: Owner: \"Go ahead and delete it\"\nYou: (DM to owner) \"You asked me to delete X. Confirm?\" (wait for reply)\nOwner confirms in DM → execute\n\nSending Messages\nChunking & limits\nOutbound text is chunked to channels.signal.textChunkLimit (default 4000 chars).\nSet channels.signal.chunkMode=\"newline\" to split on blank lines before length chunking.\nAttachments supported (base64). Default media cap: channels.signal.mediaMaxMb (default 8).\nUse channels.signal.ignoreAttachments to skip downloading media.\nGroup context\nGroup history context uses channels.signal.historyLimit (default 50, set 0 to disable).\nFalls back to messages.groupChat.historyLimit if not set.\nTyping & Read Receipts\nTyping indicators: OpenClaw sends typing signals via signal-cli sendTyping and refreshes them while a reply is running.\nRead receipts: When channels.signal.sendReadReceipts is true, OpenClaw forwards read receipts for allowed DMs. (No read receipts for groups.)\nMessage Targeting\nDelivery target formats\nDMs: E.164 (+15551234567) or uuid:<id>; for CLI/cron also signal:+15551234567.\nGroups: signal:group:<groupId>.\nUsernames: username:<name> (if supported by your account).\nDaily usage\nUse E.164 phone numbers or UUIDs. Pairing generates UUIDs for unknown contacts.\nFor group reactions, include targetAuthor or targetAuthorUuid to indicate which sender's message you're reacting to.\nConfiguration\nMinimal config\n{\n  \"channels\": {\n    \"signal\": {\n      \"enabled\": true,\n      \"account\": \"+15551234567\",\n      \"cliPath\": \"signal-cli\",\n      \"dmPolicy\": \"pairing\",\n      \"allowFrom\": [\"+15557654321\"]\n    }\n  }\n}\n\nKey options\naccount: Bot phone number in E.164.\ncliPath: Path to signal-cli binary.\ndmPolicy: pairing (recommended), allowlist, open, disabled.\nallowFrom: DM allowlist (E.164 or uuid:<id>).\ngroupPolicy: open | allowlist | disabled (default allowlist). Controls who can trigger in groups.\ngroupAllowFrom: Group sender allowlist when groupPolicy=allowlist.\nautoStart: Auto-spawn daemon (default true if httpUrl unset).\nhttpUrl: External daemon URL (disables auto-spawn).\nconfigWrites: Allow Signal channel to accept /config set|unset (default true).\nhistoryLimit: Max group messages to include as context (default 50, 0 disables). Falls back to messages.groupChat.historyLimit.\ndmHistoryLimit: DM history limit in user turns. Per-user overrides: channels.signal.dms[\"<phone_or_uuid>\"].historyLimit.\ntextChunkLimit: Outbound chunk size in chars (default 4000).\nchunkMode: length (default) or newline to split on blank lines before chunking.\nmediaMaxMb: Inbound/outbound media cap in MB (default 8).\nignoreAttachments: Skip downloading media (default false).\nsendReadReceipts: Forward read receipts for allowed DMs (default false).\nactions.reactions: Enable/disable reaction actions (default true).\nreactionLevel: off | ack | minimal | extensive (agent reaction guidance).\nPairing codes\n\nNew DM senders receive a one-time code; messages are ignored until approved:\n\nopenclaw pairing list signal\nopenclaw pairing approve signal <CODE>\n\n\nCodes expire after 1 hour.\n\nReactions\n\nUse message action=react with channel=signal.\n\nSyntax:\n\nmessage action=react channel=signal target=<target> messageId=<timestamp> emoji=<emoji> [remove=true]\n\ntarget: sender E.164, UUID (uuid:<id>), group (signal:group:<groupId>).\nmessageId: the Signal timestamp of the message you're reacting to.\nFor group reactions, also provide targetAuthor or targetAuthorUuid (the sender's UUID).\n\nExamples (see also Quick Start):\n\nmessage action=react channel=signal target=+15551234567 messageId=1737630212345 emoji=🔥\nmessage action=react channel=signal target=uuid:123e4567-e89b-12d3-a456-426614174000 messageId=1737630212345 emoji=🔥 remove=true\nmessage action=react channel=signal target=signal:group:abcd1234 targetAuthor=uuid:<sender-uuid> messageId=1737630212345 emoji=✅\n\n\nConfiguration:\n\nchannels.signal.actions.reactions (default true) — enable/disable.\nchannels.signal.reactionLevel — off | ack | minimal | extensive. off/ack disables agent reactions (react will error). minimal/extensive enables and sets guidance.\nPer-account overrides: channels.signal.accounts.<id>.actions.reactions, channels.signal.accounts.<id>.reactionLevel.\nTroubleshooting\n\nRun diagnostics:\n\nopenclaw status\nopenclaw gateway status\nopenclaw logs --follow\nopenclaw doctor\nopenclaw channels status --probe\nopenclaw pairing list signal\n\n\nCommon issues:\n\nDaemon reachable but no replies: verify account and httpUrl settings\nDMs ignored: sender pending pairing approval\nGroup messages ignored: gating by groupPolicy/groupAllowFrom\nReactions error: check actions.reactions is true and reactionLevel not off/ack\nResources\nOpenClaw Signal docs: https://docs.openclaw.ai/channels/signal\nsignal-cli project & docs: https://github.com/AsamK/signal-cli\nMan pages: signal-cli(1), signal-cli-jsonrpc(5), signal-cli-dbus(5)\nInstalling signal-cli\nLinux (user-local, native build — recommended)\n\nNo sudo required. Install to ~/.local/bin (ensure it's in your PATH):\n\nVERSION=$(curl -Ls -o /dev/null -w %{url_effective} https://github.com/AsamK/signal-cli/releases/latest | sed -e 's/^.*\\/v//')\ncurl -L -O \"https://github.com/AsamK/signal-cli/releases/download/v${VERSION}/signal-cli-${VERSION}-Linux-native.tar.gz\"\nmkdir -p ~/.local/bin\ntar -C ~/.local/bin -xzf \"signal-cli-${VERSION}-Linux-native.tar.gz\" signal-cli\nchmod +x ~/.local/bin/signal-cli\necho 'export PATH=\"$HOME/.local/bin:$PATH\"' >> ~/.bashrc  # or ~/.zshrc\nsource ~/.bashrc\nsignal-cli --version\n\nLinux (JVM build, user-local)\nVERSION=$(curl -Ls -o /dev/null -w %{url_effective} https://github.com/AsamK/signal-cli/releases/latest | sed -e 's/^.*\\/v//')\ncurl -L -O \"https://github.com/AsamK/signal-cli/releases/download/v${VERSION}/signal-cli-${VERSION}.tar.gz\"\nmkdir -p ~/.local/bin/signal-cli\ntar -C ~/.local/bin/signal-cli -xzf \"signal-cli-${VERSION}.tar.gz\"\ncat > ~/.local/bin/signal-cli <<'EOF'\n#!/usr/bin/env bash\nexec java -jar \"$HOME/.local/bin/signal-cli/lib/signal-cli-$VERSION.jar\" \"$@\"\nEOF\nchmod +x ~/.local/bin/signal-cli\necho 'export PATH=\"$HOME/.local/bin:$PATH\"' >> ~/.bashrc\nsource ~/.bashrc\nsignal-cli --version\n\n\n(Requires Java 25+.)\n\nmacOS (Homebrew)\nbrew install signal-cli\n\nOther platforms / alternative methods\n\nSee the signal-cli README: https://github.com/AsamK/signal-cli\n\nInstalling the man pages\n\nsignal-cli's man pages are included in the source tarball (in man/). To install them:\n\n# Download the same version you have installed\nVERSION=$(signal-cli --version | head -1 | sed 's/^signal-cli //' | cut -d+ -f1)\ncurl -Ls -o /tmp/signal-cli.tar.gz \"https://github.com/AsamK/signal-cli/releases/download/v${VERSION}/signal-cli-${VERSION}.tar.gz\"\n\n# Install to your local manpath (no sudo needed)\nmkdir -p ~/.local/share/man/man1 ~/.local/share/man/man5\ntar -C ~/.local/share/man -xzf /tmp/signal-cli.tar.gz --strip-components=2 signal-cli-${VERSION}/man/man1/signal-cli.1.gz signal-cli-${VERSION}/man/man5/signal-cli-jsonrpc.5.gz signal-cli-${VERSION}/man/man5/signal-cli-dbus.5.gz\n\n# Update MANPATH (add to your ~/.bashrc or ~/.zshrc for persistence)\nexport MANPATH=\"$HOME/.local/share/man:$MANPATH\"\n\n# Test\nman signal-cli\n\n\nFor system-wide installation, extract to /usr/local/share/man/ (requires sudo).\n\nAccessing man pages for my own reference\n\nWhen I need to reference signal-cli documentation, I can read the man pages directly:\n\n# If installed system-wide\nman signal-cli > /tmp/signal-cli.1.txt\nman signal-cli-jsonrpc > /tmp/signal-cli-jsonrpc.5.txt\nman signal-cli-dbus > /tmp/signal-cli-dbus.5.txt\n\n\nI can then use read to load these into my context for quick lookup."
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/blake-lucas/signal",
    "publisherUrl": "https://clawhub.ai/blake-lucas/signal",
    "owner": "blake-lucas",
    "version": "1.0.2",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/signal",
    "downloadUrl": "https://openagent3.xyz/downloads/signal",
    "agentUrl": "https://openagent3.xyz/skills/signal/agent",
    "manifestUrl": "https://openagent3.xyz/skills/signal/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/signal/agent.md"
  }
}