Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
54 changes: 53 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -308,7 +308,7 @@ That's it! You have a working AI assistant in 2 minutes.

## πŸ’¬ Chat Apps

Talk to your picoclaw through Telegram, Discord, WhatsApp, Matrix, QQ, DingTalk, LINE, or WeCom
Talk to your picoclaw through Telegram, Discord, WhatsApp, Signal, Matrix, QQ, DingTalk, LINE, or WeCom

> **Note**: All webhook-based channels (LINE, WeCom, etc.) are served on a single shared Gateway HTTP server (`gateway.host`:`gateway.port`, default `127.0.0.1:18790`). There are no per-channel ports to configure. Note: Feishu uses WebSocket/SDK mode and does not use the shared HTTP webhook server.

Expand All @@ -317,6 +317,7 @@ Talk to your picoclaw through Telegram, Discord, WhatsApp, Matrix, QQ, DingTalk,
| **Telegram** | Easy (just a token) |
| **Discord** | Easy (bot token + intents) |
| **WhatsApp** | Easy (native: QR scan; or bridge URL) |
| **Signal** | Easy (signal-cli daemon + phone) |
| **Matrix** | Medium (homeserver + bot access token) |
| **QQ** | Easy (AppID + AppSecret) |
| **DingTalk** | Medium (app credentials) |
Expand Down Expand Up @@ -463,6 +464,57 @@ If `session_store_path` is empty, the session is stored in `<workspace>/wh

</details>

<details>
<summary><b>Signal</b> (via signal-cli)</summary>

PicoClaw connects to Signal through [signal-cli](https://github.com/AsamK/signal-cli) running in JSON-RPC daemon mode. signal-cli handles Signal protocol registration and encryption; PicoClaw connects to its HTTP API.

**1. Set up signal-cli**

Run signal-cli as a daemon (Docker recommended):

```bash
docker run -d --name signal-cli \
-p 8080:8080 \
-v signal-data:/home/.local/share/signal-cli \
bbernhard/signal-cli-rest-api
```

Register or link a phone number following the [signal-cli docs](https://github.com/AsamK/signal-cli/wiki).

**2. Configure**

```json
{
"channels": {
"signal": {
"enabled": true,
"account": "+1234567890",
"signal_cli_url": "http://localhost:8080",
"allow_from": ["+1987654321"],
"group_trigger": {
"mention_only": true
}
}
}
}
```

- `account`: The phone number registered with signal-cli
- `signal_cli_url`: URL of the signal-cli REST API (default: `http://localhost:8080`)
- `allow_from`: Phone numbers allowed to interact (empty = allow all)
- `group_trigger`: Group chat trigger config β€” `mention_only` requires @mention, `prefixes` triggers on message prefixes (omit for respond-to-all)

**3. Run**

```bash
picoclaw gateway
```

> Signal supports markdown-to-styled-text conversion (bold, italic, strikethrough, monospace) and typing indicators.

</details>

<details>
<summary><b>QQ</b></summary>

Expand Down
1 change: 1 addition & 0 deletions cmd/picoclaw/internal/gateway/helpers.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ import (
_ "github.com/sipeed/picoclaw/pkg/channels/onebot"
_ "github.com/sipeed/picoclaw/pkg/channels/pico"
_ "github.com/sipeed/picoclaw/pkg/channels/qq"
_ "github.com/sipeed/picoclaw/pkg/channels/signal"
_ "github.com/sipeed/picoclaw/pkg/channels/slack"
_ "github.com/sipeed/picoclaw/pkg/channels/telegram"
_ "github.com/sipeed/picoclaw/pkg/channels/wecom"
Expand Down
4 changes: 4 additions & 0 deletions pkg/channels/manager.go
Original file line number Diff line number Diff line change
Expand Up @@ -280,6 +280,10 @@ func (m *Manager) initChannels() error {
m.initChannel("irc", "IRC")
}

if m.config.Channels.Signal.Enabled && m.config.Channels.Signal.Account != "" {
m.initChannel("signal", "Signal")
}

logger.InfoCF("channels", "Channel initialization completed", map[string]any{
"enabled_channels": len(m.channels),
})
Expand Down
13 changes: 13 additions & 0 deletions pkg/channels/signal/init.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package signal

import (
"github.com/sipeed/picoclaw/pkg/bus"
"github.com/sipeed/picoclaw/pkg/channels"
"github.com/sipeed/picoclaw/pkg/config"
)

func init() {
channels.RegisterFactory("signal", func(cfg *config.Config, b *bus.MessageBus) (channels.Channel, error) {
return NewSignalChannel(cfg, b)
})
}
Loading
Loading