一键导入
add-signal
Add Signal channel integration via signal-cli TCP daemon. Native adapter — no Chat SDK bridge.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
Add Signal channel integration via signal-cli TCP daemon. Native adapter — no Chat SDK bridge.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
Access comprehensive financial data - stocks, crypto, SEC filings, financial statements, and news via Financial Datasets API. Use for market research, fundamental analysis, and financial insights.
NanoClawd Wallet: self-custodial Solana wallet built into this agent. Every agent gets a unique keypair at birth, stored in its private workspace. Supports SOL transfers, SPL token balances, and token swaps via Jupiter v6. Use for on-chain payments, DeFi swaps, balance checks, and Solana interactions.
Add Bux browser agent to NanoClawd — gives a Clawd agent a real persistent Chromium session via Browser Use Cloud, plus agency Telegram action cards. Use when the user wants their agent to browse the web with a real browser (cookies persist, logins stick) or handle 2FA/CAPTCHA hand-off.
Integrate the OpenClawd Framework (sovereign lobster agents on Solana) into NanoClawd. Wires the Framework's pulse loop, identity, survival mechanics, and $CLAWD token payments into NanoClawd agent groups. Use when setting up a fully sovereign Clawd agent with on-chain identity, self-funding, and autonomous operation.
Launch an Upstash Box pre-packaged with NanoClawd and a Solana wallet at birth. Provisions a cloud box, clones NanoClawd, generates a Solana keypair, configures credentials, and starts the agent — wallet-at-birth, ready to be sovereign. Use when the user wants a one-command cloud NanoClawd deploy with on-chain identity from spawn.
Dark Ralph OODA Loop v0 — paper-trading, devnet-only, stdlib-Python agent that runs a safety-contract OODA cycle (Observe→Orient→Decide→Act) for Pump.fun bonding curves. Zero external deps, kill-switch on consecutive losses.
| name | add-signal |
| description | Add Signal channel integration via signal-cli TCP daemon. Native adapter — no Chat SDK bridge. |
Adds Signal messaging support via a native adapter that speaks JSON-RPC to a signal-cli TCP daemon. No Chat SDK bridge — only Node.js builtins (node:net, node:child_process, node:fs).
Unlike Telegram or Discord, Signal has no bot API. NanoClawd registers as a full Signal account on a dedicated phone number (recommended) or links as a secondary device on your existing number.
signal-cli requires Java 17+:
java -version
If missing:
brew install --cask temurin@17sudo apt-get install -y default-jresudo dnf install -y java-17-openjdkJava 17–25 all work.
brew install signal-cliSIGNAL_CLI_VERSION=$(curl -fsSL https://api.github.com/repos/AsamK/signal-cli/releases/latest | python3 -c "import sys,json; print(json.load(sys.stdin)['tag_name'][1:])")
curl -fsSL "https://github.com/AsamK/signal-cli/releases/download/v${SIGNAL_CLI_VERSION}/signal-cli-${SIGNAL_CLI_VERSION}-Linux-native.tar.gz" \
| tar -xz -C ~/.local
ln -sf ~/.local/signal-cli ~/.local/bin/signal-cli
signal-cli --version
The Linux native tarball extracts a single binary directly to
~/.local/signal-cli(not into a subdirectory). The symlink above puts it on PATH.
Two paths. The new-number path is recommended and battle-tested.
Use a dedicated SIM or VoIP number. NanoClawd owns it entirely.
VoIP numbers: Signal requires SMS verification before voice. Some VoIP providers are blocked even for voice calls. If registration fails with an auth error, try a different provider or a physical SIM.
Step 1: Solve the CAPTCHA
Signal requires a CAPTCHA on first registration:
https://signalcaptchas.org/registration/generate.html in a browsersignalcaptcha:// — the token is everything after that prefixStep 2: Request SMS verification
signal-cli -a +1YOURNUMBER register --captcha "PASTE_TOKEN_HERE"
Step 3: Voice call fallback (if your number can't receive SMS)
Wait ~60 seconds after the SMS request, then:
signal-cli -a +1YOURNUMBER register --voice --captcha "SAME_TOKEN"
Signal calls your number and reads a 6-digit code. The same captcha token is reusable — no need to solve a new one.
You must request SMS first. Requesting voice immediately fails with
Invalid verification method: Before requesting voice verification…
Step 4: Verify
signal-cli -a +1YOURNUMBER verify CODE
No output = success.
Step 5: Set profile name (optional)
⚠ Stop NanoClawd before running signal-cli commands — the daemon holds an exclusive lock on its data directory while running.
# macOS
launchctl unload ~/Library/LaunchAgents/com.nanoclawd.plist
signal-cli -a +1YOURNUMBER updateProfile --name "YourBotName"
# optionally: --avatar /path/to/avatar.jpg
launchctl load ~/Library/LaunchAgents/com.nanoclawd.plist
# Linux
systemctl --user stop nanoclawd
signal-cli -a +1YOURNUMBER updateProfile --name "YourBotName"
systemctl --user start nanoclawd
Joins an existing Signal account as a secondary device. Simpler, but NanoClawd shares your personal number.
signal-cli -a +1YOURNUMBER link --name "NanoClawd"
This prints a tsdevice: URI. Scan it as a QR code on your phone: Settings → Linked Devices → Link New Device. QR codes expire in ~30 seconds — re-run if it expires.
Skip to Credentials if all of these are already in place:
src/channels/signal.ts and src/channels/signal.test.ts both existsrc/channels/index.ts contains import './signal.js';Otherwise continue. Every step below is safe to re-run.
git fetch origin channels
git show origin/channels:src/channels/signal.ts > src/channels/signal.ts
git show origin/channels:src/channels/signal.test.ts > src/channels/signal.test.ts
Append to src/channels/index.ts (skip if the line is already present):
import './signal.js';
pnpm run build
No npm packages to install — the adapter uses only Node.js builtins.
Add to .env:
SIGNAL_ACCOUNT=+1YOURNUMBER
# TCP daemon host and port (default: 127.0.0.1:7583)
SIGNAL_TCP_HOST=127.0.0.1
SIGNAL_TCP_PORT=7583
# Path to the signal-cli binary (default: resolved on PATH)
SIGNAL_CLI_PATH=/usr/local/bin/signal-cli
# Whether NanoClawd manages the daemon lifecycle (default: true).
# Set to false if you run signal-cli daemon externally.
SIGNAL_MANAGE_DAEMON=true
# signal-cli data directory (default: ~/.local/share/signal-cli)
SIGNAL_DATA_DIR=~/.local/share/signal-cli
Security note: keep the TCP host on 127.0.0.1. The daemon has no auth — binding it to a public interface would expose your full Signal account to the network.
Sync to container: mkdir -p data/env && cp .env data/env/env
# macOS
launchctl kickstart -k gui/$(id -u)/com.nanoclawd
# Linux
systemctl --user restart nanoclawd
After the service starts, send any message to the Signal number from your personal Signal app. The router auto-creates a messaging_groups row. Then:
pnpm exec tsx scripts/q.ts data/v2.db \
"SELECT id, platform_id FROM messaging_groups WHERE channel_type='signal' ORDER BY created_at DESC LIMIT 5"
Pass the id to /init-first-agent or /manage-channels to wire it to an agent group.
Add the Signal number to a group from your phone, send any message, then wire the resulting row the same way. For isolated per-group sessions:
NOW=$(date -u +"%Y-%m-%dT%H:%M:%S.000Z")
pnpm exec tsx scripts/q.ts data/v2.db "
INSERT OR IGNORE INTO messaging_group_agents
(id, messaging_group_id, agent_group_id, session_mode, priority, created_at)
VALUES
('mga-'||hex(randomblob(8)), 'mg-GROUPID', 'ag-AGENTID', 'isolated', 0, '$NOW');
"
New Signal users (including the owner's Signal identity) are silently dropped with not_member until granted access. After the user's first message appears in messaging_groups:
NOW=$(date -u +"%Y-%m-%dT%H:%M:%S.000Z")
pnpm exec tsx scripts/q.ts data/v2.db "
INSERT OR REPLACE INTO user_roles (user_id, role, agent_group_id, granted_by, granted_at)
VALUES ('signal:UUID', 'owner', NULL, 'system', '$NOW');
INSERT OR IGNORE INTO agent_group_members (user_id, agent_group_id, added_by, added_at)
VALUES ('signal:UUID', 'ag-AGENTID', 'system', '$NOW');
"
Find the UUID from messaging_groups.platform_id or the users table.
If you're in the middle of /setup, return to the setup flow now.
Otherwise, run /init-first-agent to create an agent and wire it to your Signal DM, or /manage-channels to wire this channel to an existing agent group.
signalsignal:{UUID} — sender's Signal UUID (ACI), not their phone numbersignal:{base64GroupId} — base64-encoded GroupV2 IDmessaging_groups as shown aboveisolated session mode**bold**, *italic* / _italic_, `code`, ```code fence```, ~~strike~~, ||spoiler|| (converted to Signal's offset-based text styles)replyTo* fields populated from Signal quotes(platformId, text) within a 10 s TTL to avoid syncMessage loopsisFromMe: true[Voice Message] placeholder text. Run /add-voice-transcription for local transcription via parakeet-mlxNot supported yet: outbound file attachments (logged and dropped), edit/delete messages, reactions.
grep "Signal" logs/nanoclawd.log | tail
If you see Signal daemon failed to start. Is signal-cli installed and your account linked?:
signal-cli is on PATH (or set SIGNAL_CLI_PATH)signal-cli -a +1YOURNUMBER listIdentities should succeed without promptingIf you see Signal daemon not reachable at 127.0.0.1:7583 and SIGNAL_MANAGE_DAEMON=false, start the daemon yourself: signal-cli -a +1YOURNUMBER daemon --tcp 127.0.0.1:7583.
grep "Signal channel connected" logs/nanoclawd.log | tail -1pnpm exec tsx scripts/q.ts data/v2.db "SELECT mg.platform_id, mg.name FROM messaging_groups mg JOIN messaging_group_agents mga ON mg.id = mga.messaging_group_id WHERE mg.channel_type='signal'"launchctl print gui/$(id -u)/com.nanoclawd (macOS) / systemctl --user status nanoclawd (Linux)logs/nanoclawd.error.log shows No adapter for channel type channelType="signal" despite the adapter starting, two NanoClawd processes are racing. See the /debug skill section "No adapter for channel type / Messages silently lost" for the full fix.Signal responses show platformMsgId=undefined in the main log. This means the delivery poll ran but found no adapter — likely a duplicate service instance issue (see above). Affected messages cannot be retried; the user must resend.
If you see Signal channel lost TCP connection to signal-cli daemon in the logs, the daemon dropped the connection. Restart the service to re-establish.
not_memberThe Signal user hasn't been granted membership. See "Grant user access" above. This affects every new Signal user, including the owner's Signal identity — which is a separate user record from their identity on other channels even if it's the same person.
Signal requires a captcha for new registrations. Go to https://signalcaptchas.org/registration/generate.html, solve it, right-click "Open Signal", copy the link, extract the token after signalcaptcha://.
Invalid verification method: Before requesting voice verification…You must request SMS first, wait ~60 seconds, then request voice. Both steps can use the same captcha token.
signal-cli holds an exclusive lock on its data directory while the daemon is running. Stop NanoClawd before running any signal-cli commands directly, then restart afterward.
Modern Signal groups use GroupV2. The adapter must extract the group ID from envelope?.dataMessage?.groupV2?.id — not groupInfo?.groupId, which is GroupV1/legacy. If group messages are routing as DMs, check src/channels/signal.ts and confirm the groupId extraction falls through to groupV2.id.
Install Java 17+ — see the Prerequisites section above.
QR codes expire in ~30 seconds. Re-run the link command to generate a new one.