{"_id":"@aalzubidy/pi-signal","_rev":"7-9d9d11dcd787d4e8a69ad5d8633dba60","name":"@aalzubidy/pi-signal","dist-tags":{"latest":"1.1.1"},"versions":{"1.0.0":{"name":"@aalzubidy/pi-signal","version":"1.0.0","keywords":["pi-package"],"author":{"name":"aasystemsllc-aalzubidy"},"license":"MPL-2.0","_id":"@aalzubidy/pi-signal@1.0.0","maintainers":[{"name":"aalzubidy","email":"aaz1111@protonmail.com"}],"homepage":"https://github.com/aalzubidy/pi-signal#readme","bugs":{"url":"https://github.com/aalzubidy/pi-signal/issues"},"pi":{"skills":["./skills"],"extensions":["./extensions"]},"dist":{"shasum":"ac5c13daf422972ce31d4a105d52be59afd5aa1b","tarball":"https://registry.npmjs.org/@aalzubidy/pi-signal/-/pi-signal-1.0.0.tgz","fileCount":8,"integrity":"sha512-R6WYVLPmLu75lvhoU1PgP8Ynd3VkqtE2gVKsKF9mHaE6WKKBNS0PhuhNsSITtoc1b9fRN/xa2MDNLFzKyiHdTA==","signatures":[{"sig":"MEUCIDqLjCZVrltM0lIUbnW2tWXVQ8QK1JbiN+tEpN1pB7o3AiEApZZcv2shCSN5bZ2taOdMbtaA3nn04Ae0leonnil/JAE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":83244},"gitHead":"909d123f6d7bab34726f8c2a616623741a2e9ddb","scripts":{},"_npmUser":{"name":"aalzubidy","email":"aaz1111@protonmail.com"},"repository":{"url":"git+https://github.com/aalzubidy/pi-signal.git","type":"git"},"_npmVersion":"11.12.1","description":"Connect pi to Signal Messenger via native signal-cli daemon","directories":{},"_nodeVersion":"24.15.0","dependencies":{},"_hasShrinkwrap":false,"peerDependencies":{"typebox":"*","@earendil-works/pi-coding-agent":"*"},"bundleDependencies":[],"_npmOperationalInternal":{"tmp":"tmp/pi-signal_1.0.0_1781185719878_0.8192741235300127","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@aalzubidy/pi-signal","version":"1.0.1","keywords":["pi-package"],"author":{"name":"aasystemsllc-aalzubidy"},"license":"MPL-2.0","_id":"@aalzubidy/pi-signal@1.0.1","maintainers":[{"name":"aalzubidy","email":"aaz1111@protonmail.com"}],"homepage":"https://github.com/aalzubidy/pi-signal#readme","bugs":{"url":"https://github.com/aalzubidy/pi-signal/issues"},"pi":{"skills":["./skills"],"extensions":["./extensions"]},"dist":{"shasum":"c2992af9c048b2cd9636903f7807b0f64bb24940","tarball":"https://registry.npmjs.org/@aalzubidy/pi-signal/-/pi-signal-1.0.1.tgz","fileCount":8,"integrity":"sha512-/zFOlLga92qkcFayR6plGOSMe2EqmPGFKf+bgQo4GDoPEDWGqkLLFejVJRbFT8dkqBCd/dFU0Q98NMWsQhr1DA==","signatures":[{"sig":"MEUCIQCS2ldodpWezBMVOdpvcEedymXbHSizTqtIbralJFMElgIgHC5vT2LLIDInGoN+ddv5ae+CTJ3cLUDwhF/ZBGIZVPk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":83256},"gitHead":"909d123f6d7bab34726f8c2a616623741a2e9ddb","scripts":{},"_npmUser":{"name":"aalzubidy","email":"aaz1111@protonmail.com"},"repository":{"url":"git+https://github.com/aalzubidy/pi-signal.git","type":"git"},"_npmVersion":"11.12.1","description":"Connect pi to Signal Messenger via native signal-cli daemon","directories":{},"_nodeVersion":"24.15.0","dependencies":{},"_hasShrinkwrap":false,"peerDependencies":{"typebox":"*","@earendil-works/pi-coding-agent":"*"},"bundleDependencies":[],"_npmOperationalInternal":{"tmp":"tmp/pi-signal_1.0.1_1781189814042_0.4304687792528141","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"@aalzubidy/pi-signal","version":"1.0.2","keywords":["pi-package"],"author":{"name":"aasystemsllc-aalzubidy"},"license":"MPL-2.0","_id":"@aalzubidy/pi-signal@1.0.2","maintainers":[{"name":"aalzubidy","email":"aaz1111@protonmail.com"}],"homepage":"https://github.com/aalzubidy/pi-signal#readme","bugs":{"url":"https://github.com/aalzubidy/pi-signal/issues"},"pi":{"skills":["./skills"],"extensions":["./extensions"]},"dist":{"shasum":"460f4b7e691642523c741446aa40a987552bc307","tarball":"https://registry.npmjs.org/@aalzubidy/pi-signal/-/pi-signal-1.0.2.tgz","fileCount":8,"integrity":"sha512-FE0cKCQ1oE5pbINWCDMKCnyBqrqePFFZ042055qJAoSUYDQJk3u7TNcueyZYdLujGTSOwyQQyhb7Ahjbd+hb1Q==","signatures":[{"sig":"MEQCICVOVnC23iIcXtj0h0rCqJA/cTcQh+4pSu4CwmR1fRkeAiBSLDxFcfg690O+kax0o+syMgxByXwxEY1hBLWlvO4zSA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":83326},"gitHead":"827508ce69cd2518693d25d2bf4517669a1816af","scripts":{},"_npmUser":{"name":"aalzubidy","email":"aaz1111@protonmail.com"},"repository":{"url":"git+https://github.com/aalzubidy/pi-signal.git","type":"git"},"_npmVersion":"11.12.1","description":"Connect pi to Signal Messenger via native signal-cli daemon","directories":{},"_nodeVersion":"24.15.0","dependencies":{},"_hasShrinkwrap":false,"peerDependencies":{"typebox":"*","@earendil-works/pi-coding-agent":"*"},"bundleDependencies":[],"_npmOperationalInternal":{"tmp":"tmp/pi-signal_1.0.2_1781190395676_0.9263210710858221","host":"s3://npm-registry-packages-npm-production"}},"1.0.3":{"name":"@aalzubidy/pi-signal","version":"1.0.3","keywords":["pi-package"],"author":{"name":"aasystemsllc-aalzubidy"},"license":"MPL-2.0","_id":"@aalzubidy/pi-signal@1.0.3","maintainers":[{"name":"aalzubidy","email":"aaz1111@protonmail.com"}],"homepage":"https://github.com/aalzubidy/pi-signal#readme","bugs":{"url":"https://github.com/aalzubidy/pi-signal/issues"},"pi":{"skills":["./skills"],"extensions":["./extensions"]},"dist":{"shasum":"7f8ac7a578831e3b84c7d03f41ddd43ec96cbdf9","tarball":"https://registry.npmjs.org/@aalzubidy/pi-signal/-/pi-signal-1.0.3.tgz","fileCount":8,"integrity":"sha512-VCTef4UwzozbUxmnx5YmwBdk/6YrbV1tKWiAuubTD891i9RUJ+ur/D1RNUxgWotDe+gHxc3hbyno2EA/cVfCPQ==","signatures":[{"sig":"MEUCIDq6I9UqM+HtEVu8ynmE53pJ4t6McfmK2MvwAG0FGs/4AiEA0UuKuIk8l6BmAxUwn2lwDZTMLatPRCg9LrsOLHr/xYY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":85604},"gitHead":"b58ee321766d63489d00f3fbd2f6b27d20e371c2","scripts":{},"_npmUser":{"name":"aalzubidy","email":"aaz1111@protonmail.com"},"repository":{"url":"git+https://github.com/aalzubidy/pi-signal.git","type":"git"},"_npmVersion":"11.12.1","description":"Connect pi to Signal Messenger via native signal-cli daemon","directories":{},"_nodeVersion":"24.15.0","dependencies":{},"_hasShrinkwrap":false,"peerDependencies":{"typebox":"*","@earendil-works/pi-coding-agent":"*"},"bundleDependencies":[],"_npmOperationalInternal":{"tmp":"tmp/pi-signal_1.0.3_1782951373603_0.28924180266200383","host":"s3://npm-registry-packages-npm-production"}},"1.1.1":{"name":"@aalzubidy/pi-signal","version":"1.1.1","description":"Connect pi to Signal Messenger via native signal-cli daemon","keywords":["pi-package"],"repository":{"type":"git","url":"git+https://github.com/aalzubidy/pi-signal.git"},"homepage":"https://github.com/aalzubidy/pi-signal#readme","bugs":{"url":"https://github.com/aalzubidy/pi-signal/issues"},"author":{"name":"aasystemsllc-aalzubidy"},"license":"MPL-2.0","pi":{"extensions":["./extensions"],"skills":["./skills"]},"dependencies":{},"peerDependencies":{"@earendil-works/pi-coding-agent":"*","typebox":"*"},"scripts":{},"gitHead":"d11d00dd637e74c11fae113e5f99d782bb1fdfb1","_id":"@aalzubidy/pi-signal@1.1.1","bundleDependencies":[],"_nodeVersion":"24.15.0","_npmVersion":"11.12.1","dist":{"integrity":"sha512-jQIAP2AFhVmQuHurLCVNrnj3eDQ5Q2NrqC24TpmKk9Y7Qc4Qj5sx1h5INt1WdBctulklLeu1hyccancTX2GSDg==","shasum":"f01ad7dee48dba7882e51b09f3b32067afa1a7d7","tarball":"https://registry.npmjs.org/@aalzubidy/pi-signal/-/pi-signal-1.1.1.tgz","fileCount":8,"unpackedSize":102884,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCICMh0dpYvz2upp4qUxLnLDwRG2ZEVns8w8IYDroZGZQKAiEAw5oyc7zFV+vLyw5ziiBIxWYW32jOrOtfMk/5JnXNOD8="}]},"_npmUser":{"name":"aalzubidy","email":"aaz1111@protonmail.com"},"directories":{},"maintainers":[{"name":"aalzubidy","email":"aaz1111@protonmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/pi-signal_1.1.1_1783440574853_0.6179204085856391"},"_hasShrinkwrap":false}},"time":{"created":"2026-06-11T13:48:39.697Z","modified":"2026-07-07T16:09:35.113Z","1.0.0":"2026-06-11T13:48:40.019Z","1.0.1":"2026-06-11T14:56:54.173Z","1.0.2":"2026-06-11T15:06:35.922Z","1.0.3":"2026-07-02T00:16:13.734Z","1.1.0":"2026-07-07T15:04:25.093Z","1.1.1":"2026-07-07T16:09:35.008Z"},"bugs":{"url":"https://github.com/aalzubidy/pi-signal/issues"},"author":{"name":"aasystemsllc-aalzubidy"},"license":"MPL-2.0","homepage":"https://github.com/aalzubidy/pi-signal#readme","keywords":["pi-package"],"repository":{"type":"git","url":"git+https://github.com/aalzubidy/pi-signal.git"},"description":"Connect pi to Signal Messenger via native signal-cli daemon","maintainers":[{"name":"aalzubidy","email":"aaz1111@protonmail.com"}],"readme":"# @aalzubidy/pi-signal\n\nConnect [pi](https://pi.dev) to [Signal Messenger](https://signal.org/) for two-way messaging. Send a **Note-to-Self** message from your phone → pi receives it, the LLM processes it, and pi replies back automatically.\n\n> **Only Note-to-Self messages are processed.** Messages from other senders are silently ignored for security.\n\n## How It Works\n\n```\nPhone (Note-to-Self) → signal-cli daemon (SSE in-memory) → pi extension\n    → 👀 reaction → LLM processes → auto-reply → ✅ reaction\n```\n\nThe extension connects directly to the signal-cli daemon's SSE endpoint over HTTP — **no log file on disk** (messages are streamed in-memory).\n\nCommands (`/model`, `/abort`, `/clear`, `/stats`, `/status`, `/whoami`, `/resend`, `/pause`, `/resume`, `/help`) are handled locally without LLM. Everything else is forwarded to the LLM.\n\n![Note-to-Self message](docs/img/note-to-self-img.png)\n\n![pi agent response](docs/img/pi-agent-response-img.png)\n\nYou can also send the response to someone else in your contacts using their name or phone number.\n\n![Note-to-Self-Send-to message](docs/img/note-to-self-send-to-img.png)\n\n![pi agent response](docs/img/pi-agent-response-send-to-img.png)\n\n## Installation\n\n**Prerequisites:** [signal-cli](https://github.com/AsamK/signal-cli/) in PATH, Java 25+, Signal app on your phone.\n\nInstallation has two separate layers — install the pi package from npm, then provision the\nsystem daemon that receives Signal messages:\n\n```bash\n# 1. Install the pi package (no clone needed)\npi install @aalzubidy/pi-signal\n\n# 2. In pi, run the setup wizard command. It checks Java/signal-cli, then prints the\n#    exact `bash .../setup.sh` command to run in a terminal (needs sudo + a phone QR\n#    scan, which pi's command can't do for you — it just locates the script for you).\n/signal-setup\n\n# 3. Run the command it prints, in a terminal:\nbash /path/it/printed/scripts/setup.sh   # guides you through device linking, systemd service - **you might need to run it as sudo since it creates systemd service file**\n\n# 4. setup.sh prints these two exports at the end — add them to your shell\n#    config (~/.bashrc, ~/.zshrc, ~/.profile), then restart your shell:\nexport PI_SIGNAL_ACCOUNT=+1234567890   # your Signal number (E.164)\nexport PI_SIGNAL_PRIMARY=true          # marks this instance as the one handling Signal\n\n# 5. Start pi (restart it or run /reload if already running)\npi\n```\n\nSend a Note-to-Self from your phone. pi receives it (👀), processes it, and replies automatically (✅).\n\n\n## Environment Variables\n\n| Variable | Required | Default | Description |\n|---|---|---|---|\n| `PI_SIGNAL_ACCOUNT` | Yes | — | Your Signal number in E.164: `+1234567890` |\n| `PI_SIGNAL_PRIMARY` | No | `false` | Set `\"true\"` on the ONE instance handling Signal messages |\n| `PI_SIGNAL_DAEMON_URL` | No | `http://127.0.0.1:8080` | Daemon URL for JSON-RPC and SSE |\n| `PI_SIGNAL_STATS` | No | `short` | Stats mode: `off`, `short`, or `full` |\n| `PI_SIGNAL_QUIET_DAEMON` | No | `true` | Keep message content out of journalctl (secure default). Set `\"false\"` to surface daemon output for debugging |\n\n## Commands (from Signal)\n\n| Command | Purpose |\n|---|---|\n| `/model <name>` | Switch model (fuzzy match) |\n| `/abort` | Stop current generation |\n| `/clear` | New session |\n| `/stats [short\\|full\\|off]` | Toggle usage stats |\n| `/status` | Live connection & model info (in-memory, never hangs — only answers when pi is up) |\n| `/whoami` | Show model, working directory, and session |\n| `/resend` | Re-send the last reply (recover a dropped message) |\n| `/pause` | Stop processing incoming messages (commands still work) |\n| `/resume` | Resume processing |\n| `/help` | Show available commands |\n\n> **Send to another number:** just ask the LLM naturally — e.g. *\"summarize this and text it to +1555…\"*, or by name: *\"send this to Mike\"*. For a name, the agent resolves it via `signal_list_contacts` first (names only resolve if signal-cli knows them — a synced contact or Signal profile name). The message goes to that number, and the agent's confirmation reply comes back to your Note-to-Self so you can see who it was sent to.\n\n## TUI Commands (in pi)\n\n`/signal-setup`, `/signal-start`, `/signal-stop`, `/signal-restart`, `/signal-status`, `/signal-logs [n]`, `/signal-send <+E164> <msg>`, `/signal-model`, `/signal-abort`, `/signal-stats`\n\n## Tools (LLM-accessible)\n\n- **`signal_send`** — Send a Signal message to a phone number (E.164)\n- **`signal_status`** — Check connection status and health\n- **`signal_list_contacts`** — List contacts (name → number) so the agent can resolve a name before sending\n\n## Multiple Instances\n\nSet `PI_SIGNAL_PRIMARY=true` on one pi instance. Other instances ignore Signal messages.\n\n## Security\n\n- Only **Note-to-Self** messages drive the agent; messages from other senders are ignored.\n- Message content is streamed in-memory (no log file), and by default (`PI_SIGNAL_QUIET_DAEMON=true`) daemon output is kept out of `journalctl`.\n- Third-party contact names from `signal_list_contacts` are sanitized before reaching the agent.\n- The signal-cli daemon on `127.0.0.1:8080` is **unauthenticated** (a signal-cli limitation). It is bound to loopback, but any local process can reach it — so run pi-signal only on a **single-trusted-user host** and don't expose port 8080. See [SKILL.md](skills/signal/SKILL.md#security-model) for details.\n\n## Troubleshooting\n\n```bash\nsudo systemctl status signal-receive.service\nsudo journalctl -u signal-receive -f\ncurl -s http://127.0.0.1:8080/api/v1/check\n# /signal-status in pi\n```\n\nSee [skills/signal/SKILL.md](skills/signal/SKILL.md) for full troubleshooting.\n\n## Files\n\n```\npi-signal/\n├── package.json\n├── README.md\n├── LICENSE\n├── extensions/\n│   └── signal.ts                # Main extension\n├── skills/\n│   └── signal/SKILL.md          # Full setup & troubleshooting guide\n└── scripts/\n    ├── setup.sh                 # Interactive setup wizard\n    ├── signal-receive-loop.sh   # Native daemon manager\n    └── signal-receive.service   # systemd unit template\n```\n\n## License\n\nMPL-2.0 — see [LICENSE](LICENSE).","readmeFilename":"README.md"}