@aalzubidy/pi-signal

Connect pi to Signal Messenger via native signal-cli daemon

Packages

Package details

extensionskill

Install @aalzubidy/pi-signal from npm and Pi will load the resources declared by the package manifest.

$ pi install npm:@aalzubidy/pi-signal
Package
@aalzubidy/pi-signal
Version
1.0.2
Published
Jun 11, 2026
Downloads
not available
Author
aalzubidy
License
MPL-2.0
Types
extension, skill
Size
81.4 KB
Dependencies
0 dependencies · 2 peers
Pi manifest JSON
{
  "extensions": [
    "./extensions"
  ],
  "skills": [
    "./skills"
  ]
}

Security note

Pi packages can execute code and influence agent behavior. Review the source before installing third-party packages.

README

@aalzubidy/pi-signal

Connect pi to Signal Messenger 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.

Only Note-to-Self messages are processed. Messages from other senders are silently ignored for security.

Installation

Prerequisites: signal-cli in PATH, Java 25+, Signal app on your phone.

# 1. Clone the repo and run the setup wizard
git clone https://github.com/aalzubidy/pi-signal.git
cd pi-signal
bash scripts/setup.sh                  # guides you through Java check, device linking, systemd service

# 2. Set your phone number (setup.sh may have auto-configured this)
export PI_SIGNAL_ACCOUNT=+1234567890   # or add to ~/.bashrc

# 3. Install the pi package locally
pi install ./pi-signal

# 4. Ensure one instance of pi is the primary - DO NOT SET IT ON PROFILE LEVEL
# Then restart pi or run /reload
export PI_SIGNAL_PRIMARY=true && pi

Send a Note-to-Self from your phone. pi receives it (👀), processes it, and replies automatically (✅).

How It Works

Phone (Note-to-Self) → signal-cli daemon (SSE in-memory) → pi extension
    → 👀 reaction → LLM processes → auto-reply → ✅ reaction

The extension connects directly to the signal-cli daemon's SSE endpoint over HTTP — no log file on disk (messages are streamed in-memory).

Commands (/model, /abort, /clear, /stats, /ping, /help) are handled locally without LLM. Everything else is forwarded to the LLM.

Environment Variables

Variable Required Default Description
PI_SIGNAL_ACCOUNT Yes Your Signal number in E.164: +1234567890
PI_SIGNAL_PRIMARY No false Set "true" on the ONE instance handling Signal messages
PI_SIGNAL_DAEMON_URL No http://127.0.0.1:8080 Daemon URL for JSON-RPC and SSE
PI_SIGNAL_STATS No short Stats mode: off, short, or full
PI_SIGNAL_QUIET_DAEMON No false Silence daemon stdout in journalctl

Commands (from Signal)

Command Purpose
/model <name> Switch model (fuzzy match)
/abort Stop current generation
/clear New session
/stats [short|full|off] Toggle usage stats
/ping Test connectivity
/help Show available commands

TUI Commands (in pi)

/signal-setup, /signal-start, /signal-stop, /signal-status, /signal-model, /signal-abort, /signal-stats

Tools (LLM-accessible)

  • signal_send — Send a Signal message to a phone number (E.164)
  • signal_status — Check connection status and health

Multiple Instances

Set PI_SIGNAL_PRIMARY=true on one pi instance. Other instances ignore Signal messages.

Troubleshooting

sudo systemctl status signal-receive.service
sudo journalctl -u signal-receive -f
curl -s http://127.0.0.1:8080/api/v1/check
# /signal-status in pi

See skills/signal/SKILL.md for full troubleshooting.

Files

pi-signal/
├── package.json
├── README.md
├── LICENSE
├── extensions/
│   └── signal.ts                # Main extension
├── skills/
│   └── signal/SKILL.md          # Full setup & troubleshooting guide
└── scripts/
    ├── setup.sh                 # Interactive setup wizard
    ├── signal-receive-loop.sh   # Native daemon manager
    └── signal-receive.service   # systemd unit template

License

MPL-2.0 — see LICENSE.