๐Ÿฆ

A carrier between
Claude and you.

Claude sends questions and status updates to your phone mid-task. You reply from anywhere. Work doesn't stop waiting for you to come back to the laptop.

โฑ About 20 minutes to set up end to end
๐Ÿค–Claude
instance
โ†’
๐ŸฆPidgin
server
โ†’
๐Ÿ“ฑYour
phone
โ†’
๐Ÿ’ฌYour
reply
โ†’
๐Ÿค–Claude
continues
1
Server
Deploy or confirm the Cloudflare Worker
2
Apps
Install iOS & macOS native clients
3
Connect apps
Magic link login + push registration
4
Claude Code
Plugin install + env vars
5
Claude Desktop
Wire env vars for the desktop app
6
MCP & browsers
ChatGPT, Codex, Perplexity, Claude Design-style browser use
7
Verify
Send a test push and confirm it lands
โ„น๏ธ
Connecting to the hosted server? If you're using the existing pidginroost.com server, skip Step 1 entirely โ€” you never touch wrangler.toml, Cloudflare resources, or a cloned repo. Cloning to a local path and the com.* bundle IDs only matter if you're self-hosting your own server or building the Apple apps from source.
1

Server

Pidgin's backend is a Cloudflare Worker that stores messages in D1, documents in R2, sessions in KV, and pushes via APNs.

If the server is already running, you just need two values from it.

Get your API key

wrangler secret list --name pidgin-server

If you need to reset it:

wrangler secret put API_KEY --name pidgin-server

Confirm the server is healthy

curl -sf https://pidginroost.com/health | jq .
# โ†’ {"ok":true,"data":{"status":"healthy"}}

If that returns ok: true, skip ahead to Apps.

Prerequisites

  • Node.js โ‰ฅ 18 and npm
  • Wrangler CLI: npm i -g wrangler
  • A Cloudflare account with a zone (for the custom domain)
  • An APNs Auth Key (.p8) from Apple Developer with Push Notifications enabled
  • A Resend API key or Cloudflare Email Routing configured for your sender address

Clone and install

git clone https://github.com/ashrocket/pidgin.git
cd pidgin/server
npm install

Create secrets file

You're now in the server/ directory of your clone โ€” the rest of the commands in this section run from there.

cat > .dev.vars << 'EOF'
API_KEY=your-random-secret-here
OWNER_EMAIL=you@example.com
MAIL_FROM=Pidgin <pidgin@yourdomain.com>
WORKER_URL=https://yourdomain.com
APNS_KEY_ID=ABC123XYZ
APNS_TEAM_ID=DEF456UVW
APNS_PRIVATE_KEY=-----BEGIN PRIVATE KEY-----
...paste your .p8 content here...
-----END PRIVATE KEY-----
APNS_IOS_TOPIC=com.pidginroost.pidgin
APNS_MACOS_TOPIC=com.pidginroost.pidgin.mac
EOF
โš ๏ธ
Edit wrangler.toml first. The committed config points at the author's domain and Cloudflare resources. Before deploying, update [[routes]] to your own custom domain, the [vars] block (WORKER_URL, MAIL_FROM, APNS_IOS_TOPIC, APNS_MACOS_TOPIC), and create your own D1 / KV / R2 resources, pasting their IDs into the [[d1_databases]], [[kv_namespaces]], and [[r2_buckets]] blocks.

Run migrations and deploy

npm run db:migrate         # local D1 for testing
npm run db:migrate:prod    # production D1
npm run deploy             # push to Cloudflare

Upload secrets to production

wrangler secret put API_KEY
wrangler secret put APNS_KEY_ID
wrangler secret put APNS_TEAM_ID
wrangler secret put APNS_PRIVATE_KEY
wrangler secret put OWNER_EMAIL
โ„น๏ธ
Email routing: For magic-link login, Cloudflare Email Routing must be enabled and the sender address in MAIL_FROM must be a verified custom address with a confirmed destination inbox.
2

iOS & macOS Apps

The native apps receive push notifications, display messages, and let you reply. iOS and macOS share a single XcodeGen project at clients/apple.

โš ๏ธ
TestFlight or Xcode install. Use TestFlight when your Apple ID is assigned to the internal tester group. If you are self-hosting or testing a local build, install from Xcode directly.

Install via Xcode

You'll need Xcode 16+ and an Apple Developer account with a connected device.

Generate the project

cd pidgin/clients/apple   # from your repo clone
brew install xcodegen   # if needed
xcodegen generate
open Pidgin.xcodeproj

Run on iPhone

Run the macOS app

๐Ÿ’ก
Dev builds and push: APNs push only works reliably with a production provisioning profile or TestFlight. Dev-signed builds receive push on physical devices only if the aps-environment: development entitlement is set โ€” and the server must send to the sandbox APNs endpoint for those builds.
3

Connect the Apps to Your Server

Each app logs in with a magic link, then registers its APNs device token so the server knows where to push.

iOS app

macOS app

Confirm device registration

Use the API key from the Server step. (You'll add it to your shell permanently in the Claude Code step โ€” for now, set it inline.)

export PIDGIN_API_KEY="your-api-key"
curl -s https://pidginroost.com/api/registry   -H "Authorization: Bearer $PIDGIN_API_KEY" | jq '.data[]'

You should see your device listed with a recent registered_at timestamp.

4

Claude Code

Two env vars and a plugin. Once wired up, Claude can send push notifications mid-task and poll for your reply before continuing.

Step 1 โ€” Set environment variables

Add to your shell profile (~/.zshrc or ~/.zprofile):

export PIDGIN_URL="https://pidginroost.com"
export PIDGIN_API_KEY="your-api-key-here"
source ~/.zshrc
โ„น๏ธ
Claude Code inherits your shell environment, so vars in ~/.zshrc are available in every session automatically.

Step 2 โ€” Install the plugin

In a Claude Code session, add the marketplace and then install the plugin โ€” adding a marketplace alone doesn't install anything:

/plugin marketplace add ashrocket/pidgin
/plugin install pidgin@pidgin

Or, if you've cloned the repo locally:

/plugin marketplace add /path/to/your/pidgin
/plugin install pidgin@pidgin

The argument is <plugin>@<marketplace> โ€” both are named pidgin here. Trust the plugin when prompted. This registers the following commands:

/pidgin [message]
Send a notification. Claude infers content from context if no message is given.
/pidgin-setup
Guided setup โ€” checks env vars, dependencies, server health, sends a test push.
/pidgin-check
Quick diagnostics โ€” reports status of each dependency and the server connection.
/remote-control
Remote browser control via Pidgin โ€” poll for commands sent from your phone and execute them with Claude-in-Chrome.

Step 3 โ€” Verify

/pidgin-setup

This checks env vars, curl/jq, server connectivity, and sends a test push. Watch for the notification โ€” if it arrives, you're done.

Natural language triggers

The Pidgin skill activates automatically when you say:

Codex and shell-based agents

Codex and other terminal agents can use the same API client script directly. Set the same environment variables, then call the script from this repo:

export PIDGIN_URL="https://pidginroost.com"
export PIDGIN_API_KEY="your-api-key-here"

bash ~/ashcode/pidgin/scripts/pidgin.sh send \
  --type message \
  --title "Codex is connected" \
  --body "Pidgin is available from this Codex workflow." \
  --project "codex"

For durable Codex workflows, add those environment variables to the shell or task runner that launches Codex, and have agents call scripts/pidgin.sh when a task needs a phone notification, a user question, or a shareable document.

5

Claude Desktop

โš ๏ธ
Claude Desktop doesn't support Claude Code plugins. The /pidgin skills and hooks that power the Claude Code integration aren't available in the desktop app.

You can still reach Pidgin from Claude Desktop by wiring env vars into your MCP server config. Claude Desktop doesn't inherit ~/.zshrc, so add them explicitly in ~/Library/Application Support/Claude/claude_desktop_config.json:

{
  "mcpServers": {
    "your-existing-server": {
      "command": "...",
      "args": [...],
      "env": {
        "PIDGIN_URL": "https://pidginroost.com",
        "PIDGIN_API_KEY": "your-api-key-here"
      }
    }
  }
}

For document workflows, Claude Desktop can also use the remote MCP endpoint at https://pidginroost.com/mcp if your MCP client supports remote OAuth. The current MCP tools cover document list, search, retrieval, publishing, and share-link generation. Push notifications still use the Claude Code plugin or the REST script.

๐Ÿ’ก
Practical reality: Claude Desktop tasks tend to be shorter and more interactive, so missing push notifications matters less. The Claude Code integration is the high-value path.
6

MCP & Browser Clients

Pidgin exposes a remote MCP endpoint for document workflows and a browser UI for clients that do not have a native Pidgin plugin.

Remote MCP

https://pidginroost.com/mcp

The Worker publishes OAuth metadata for remote clients:

https://pidginroost.com/.well-known/oauth-protected-resource/mcp
https://pidginroost.com/.well-known/oauth-authorization-server

Browser fallback

Any browser-capable agent can use the web UI:

https://pidginroost.com
https://pidginroost.com/onboarding
https://pidginroost.com/setup

Use the browser path for login, setup, reading documents, generating share links, and checking the inbox when a tool client cannot call the REST API or MCP endpoint directly.

7

Verify Everything Works

Run this end-to-end check from a terminal. It should produce a push on your phone within a few seconds.

curl -X POST "$PIDGIN_URL/api/messages" \
  -H "Authorization: Bearer $PIDGIN_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "type": "question",
    "title": "Pidgin setup complete",
    "body": "Reply with ok to confirm the connection works.",
    "priority": "normal",
    "instance": {
      "model": "manual-test",
      "session_id": "setup-check",
      "project": "pidgin-onboarding",
      "source": "curl"
    }
  }'
๐Ÿฆ Pidgin now
Pidgin setup complete
Reply with 'ok' to confirm the connection works.
Dismiss
Reply

Common issues

SymptomLikely causeFix
No push, curl returned ok Device not registered, or APNs dev vs prod mismatch Check /api/registry. If no devices, log into the app again.
curl returns 401 PIDGIN_API_KEY not set or wrong Run echo $PIDGIN_API_KEY โ€” if empty, add to ~/.zshrc and reload
curl connection refused PIDGIN_URL wrong or worker not deployed Try curl -sf $PIDGIN_URL/health. Check Cloudflare Worker dashboard.
Magic link doesn't open app iOS universal links are finicky right after install โ€” the AASA must have been fetched, and links opened from inside some apps bypass it Paste the link into Safari directly, or long-press it and choose "Open in Pidgin." The AASA appID in server/src/index.ts already matches the app's bundle ID (com.pidginroost.pidgin).
/pidgin-setup can't find script Plugin not installed Reinstall: /plugin install pidgin@pidgin (run /plugin marketplace add ashrocket/pidgin first if needed)

!

Known Issues

๐Ÿ›
Remote MCP is document-first. The current MCP endpoint exposes document list, search, retrieval, publishing, and share tools. Phone push notifications and reply polling still use the Claude Code plugin or the REST script.