You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
-**MCP Server** (`internal/mcp/server`): Runs inside Claude Code as a channel server. Connects to the daemon's SSE endpoint and delivers messages as channel notifications.
68
68
69
-
-**Outbox** (`internal/outbox`): Queues outgoing messages from Claude for human review. `pigeon review` opens a Bubble Tea TUI for approve/reject.
69
+
-**Outbox** (`internal/outbox`): Queues outgoing messages from Claude for human review. By default, review happens as command-and-control in Slack — the daemon posts a message to the owner's DM with approve/dismiss/send-mode/feedback actions (`internal/platform/slack/interactive.go`). `pigeon review`(hidden from help, still functional) opens a Bubble Tea TUI for the same approve/reject flow.
Copy file name to clipboardExpand all lines: README.md
+28-9Lines changed: 28 additions & 9 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1,30 +1,38 @@
1
1
# Pigeon
2
2
3
-
Pigeon is a local-first messaging bridge for AI agents. It mirrors your messaging history as plain text files and lets AI agents read, search, and reply to messages through a CLI, or receive them in real time through Claude Code.
3
+
Pigeon is a local-first bridge between AI agents and your messaging and workspace tools. It mirrors Slack and WhatsApp conversations, Gmail, Calendar, and Drive activity, and Linear and Jira issues as plain text files, and lets AI agents read, search, and reply through a CLI — with Slack and WhatsApp messages also delivered in real time through Claude Code.
4
4
5
5
## The Idea
6
6
7
-
Messaging platforms generate a constant stream of context that AI agents could act on, but these platforms are designed for humans, not programmatic access. Pigeon solves this by maintaining a local mirror of your messaging history and providing a CLI that agents can use to navigate and search that history.
7
+
Messaging and workspace platforms generate a constant stream of context that AI agents could act on, but these platforms are designed for humans, not programmatic access. Pigeon solves this by maintaining a local mirror of that history — Slack and WhatsApp conversations, Gmail/Calendar/Drive activity, Linear and Jira issues — and providing a CLI that agents can use to navigate and search across all of it.
8
8
9
-
When connected to Claude Code, pigeon delivers messages in real time via channel notifications. Claude can then react to incoming messages, gather context from other tools, and draft replies, all while keeping a human in the loop for anything outgoing.
9
+
When connected to Claude Code, pigeon delivers Slack and WhatsApp messages in real time via channel notifications. Claude can then react to an incoming message, pull context from a related Linear ticket, Jira issue, or Google Doc, draft a reply, and queue it for your approval, all while keeping a human in the loop for anything outgoing.
10
10
11
-
This becomes powerful when combined with other agent-facing CLIs like [linear-cli](https://github.com/schpet/linear-cli) for issue tracking or [Google Workspace CLI](https://github.com/googleworkspace/cli) for docs and email. The agent can correlate a Slack question with a Linear ticket, pull context from a Google Doc, draft a reply, and queue it for your approval. Pigeon provides the messaging layer; the agent orchestrates across all of them.
11
+
Pigeon builds on top of [linear-cli](https://github.com/schpet/linear-cli), [jira-cli](https://github.com/ankitpokhrel/jira-cli), and the [Google Workspace CLI](https://github.com/googleworkspace/cli): you authenticate through those tools, and pigeon uses that same auth to poll and mirror your issues and workspace activity locally.
12
12
13
13
## How It Works
14
14
15
15
**Listeners** connect to messaging platforms (Slack, WhatsApp) and append incoming messages to local text files, organized by date. They run as a background daemon.
16
16
17
+
**Pollers** sync Google Workspace (Gmail, Calendar, Drive), Linear, and Jira on a schedule, mirroring issues and workspace activity to local files the same way listeners mirror messages.
18
+
17
19
**The CLI** lets agents (or humans) list conversations, read history, search across platforms, and send replies. `pigeon help` describes everything.
18
20
19
-
**Channels** deliver messages to Claude Code in real time via MCP channel notifications. When a new message arrives, Claude gets pinged and can react immediately.
21
+
**Channels** deliver Slack and WhatsApp messages to Claude Code in real time via MCP channel notifications. When a new message arrives, Claude gets pinged and can react immediately. Workspace and issue data from pollers is searched on demand rather than pushed live.
20
22
21
-
**The Outbox** holds outgoing messages from Claude for human review. `pigeon review` opens a terminal UI to approve, reject, or provide feedback before anything is sent.
23
+
**The Outbox** holds outgoing messages from Claude for human review. By default, review happens right in Slack: the daemon DMs you the pending message with buttons to approve, dismiss, or leave feedback. `pigeon review` opens a terminal UI for the same flow.
22
24
23
25
## Prerequisites
24
26
25
27
-**[ripgrep](https://github.com/BurntSushi/ripgrep#installation)** (`rg`) — required for search, read, and file discovery. Install via `brew install ripgrep`, `apt install ripgrep`, or see the [ripgrep installation guide](https://github.com/BurntSushi/ripgrep#installation).
26
28
-**[uv](https://docs.astral.sh/uv/getting-started/installation/)** — required for the embedding sidecar used by workstream routing. Install via `curl -LsSf https://astral.sh/uv/install.sh | sh`.
27
29
30
+
Optional, only needed for the integrations you use:
31
+
32
+
-**[Google Workspace CLI](https://github.com/googleworkspace/cli)** (`gws`) — for `pigeon setup-gws` (Gmail, Calendar, Drive). Run `gws auth login` first.
33
+
-**[linear-cli](https://github.com/schpet/linear-cli)** — for `pigeon setup-linear`. Run `linear auth login` first.
34
+
-**[jira-cli](https://github.com/ankitpokhrel/jira-cli)** — for `pigeon setup-jira`. Run `jira init` and export `JIRA_API_TOKEN` first.
35
+
28
36
## Installation
29
37
30
38
Download the latest release for your platform:
@@ -67,11 +75,20 @@ pigeon daemon start
67
75
pigeon claude
68
76
```
69
77
78
+
Set up Google Workspace, Linear, or Jira to mirror them for search (no live Claude Code delivery):
79
+
80
+
```bash
81
+
pigeon setup-gws # after `gws auth login`
82
+
pigeon setup-linear # after `linear auth login`
83
+
pigeon setup-jira # after `jira init` + JIRA_API_TOKEN
84
+
pigeon daemon start
85
+
```
86
+
70
87
Run `pigeon help` for the full list of commands.
71
88
72
89
## Multi-Account
73
90
74
-
Pigeon supports multiple Slack workspaces and WhatsApp numberssimultaneously. Each account gets its own listener, message store, and session binding. The daemon manages all of them, and `pigeon claude` lets you pick which account to connect.
91
+
Pigeon supports multiple accounts per platform — several Slack workspaces, WhatsApp numbers, Google Workspace accounts, Linear workspaces, and Jira configurations simultaneously. Each gets its own store under the data root, and the `--workspace` flag scopes CLI operations to a subset of accounts. Slack and WhatsApp accounts additionally get a session binding: the daemon manages all of them, and `pigeon claude` lets you pick which one to connect.
75
92
76
93
## Architecture
77
94
@@ -91,8 +108,10 @@ Pigeon supports multiple Slack workspaces and WhatsApp numbers simultaneously. E
91
108
(storage) (via MCP channel)
92
109
```
93
110
94
-
The **daemon** runs all platform listeners, serves a Unix socket API, routes messages to connected Claude Code sessions, and manages the outbox.
111
+
The **daemon** runs all platform listeners and pollers, serves a Unix socket API, routes Slack/WhatsApp messages to connected Claude Code sessions, and manages the outbox.
95
112
96
-
The **hub** routes incoming messages to the right Claude Code session. One session per account. Handles session lifecycle: connect, disconnect, and handoff when a new session replaces an old one.
113
+
The **hub** routes incoming Slack and WhatsApp messages to the right Claude Code session. One session per account. Handles session lifecycle: connect, disconnect, and handoff when a new session replaces an old one.
97
114
98
115
The **MCP server** runs inside Claude Code as a channel server. It receives messages from the daemon via SSE and delivers them as channel notifications that Claude can act on.
116
+
117
+
Google Workspace, Linear, and Jira pollers run inside the same daemon and write to the same text-file storage on a schedule, but they don't go through the hub — that real-time push to Claude Code is Slack/WhatsApp only. Their history is searched on demand via the CLI instead.
0 commit comments