WhatsApp notifications + human-in-the-loop for AI agents and scripts — curl to WhatsApp in 60s, no app, no dashboard.
Project description
pingwa (client)
WhatsApp notifications + human-in-the-loop for AI agents and scripts — from your
terminal or an MCP client. curl → WhatsApp in 60s, no app, no dashboard.
This is the open-source (MIT) pingwa client: a CLI, a tiny HTTP client, and an
MCP server. It talks to a pingwa backend (the hosted service at
https://pingwa.dev, or your own). The backend is separate and private;
this client is not.
Install & use
No install needed with uv:
export PINGWA_KEY=pw_your_key # get one: send "join" on WhatsApp to the service number
uvx pingwa send "build finished ✅" # notify your own phone
echo "deploy done" | uvx pingwa send - # from stdin
uvx pingwa ask "Deploy to prod?" --button yes --button no # wait for a reply from your phone
uvx pingwa replies # pull messages your phone sent back (out-of-band steering)
uvx pingwa me # plan / quota / reply-window
uvx pingwa keys # list active API keys (up to 10 named keys per number)
uvx pingwa keys revoke ci # revoke one by name (or reply 'revoke ci' on WhatsApp)
uvx pingwa upgrade # get a Stripe link to go Pro (no password needed)
uvx pingwa send "x" --json # raw JSON response
AI agents: don't ask your human to copy-paste a key — drive the registration
yourself (POST /v1/registrations; full recipe in
llms.txt). The human only taps one WhatsApp link;
the key is claimed by you and never travels through the chat. Works for existing
accounts too — it mints an additional named key.
Exit codes: 0 ok · 2 missing key · 3 quota exceeded · 1 other.
Override the backend with PINGWA_BASE_URL or --base-url.
MCP server
Same tools on stdio and remote: notify(text), ask(text, buttons?, timeout?),
check_replies(since?, wait?), check_status(), upgrade().
Local (stdio) — for Claude Desktop / Claude Code:
{"mcpServers":{"pingwa":{"command":"uvx","args":["pingwa","mcp"],
"env":{"PINGWA_KEY":"pw_your_key"}}}}
Remote (Streamable HTTP, no install):
{"mcpServers":{"pingwa":{"url":"https://pingwa.dev/mcp",
"headers":{"Authorization":"Bearer pw_your_key"}}}}
Every error carries an action hint, so an agent knows what to do next.
What it sends
Only your message text and your key, to the pingwa backend you point it at — over HTTPS. Nothing else. The recipient is always your own phone (there is no "to" field). See the service's /privacy.
Repository
The client is developed in a private monorepo next to the (proprietary) backend;
grzgrzgrz3/pingwa-client is its
public read-only mirror — the full source of every published pingwa release,
synced on release. Issues and PRs are welcome there.
License
MIT — see the LICENSE in the repository root. Covers this client package only.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file pingwa-0.3.0.tar.gz.
File metadata
- Download URL: pingwa-0.3.0.tar.gz
- Upload date:
- Size: 11.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.28 {"installer":{"name":"uv","version":"0.11.28","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"26.04","id":"resolute","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6d2b177cbdb88bae8bd97275e0acd7f6daa710a232c5ca37b92cbffcc41080a1
|
|
| MD5 |
fc98db0aad997154bf31d3a953deb017
|
|
| BLAKE2b-256 |
8bf1dcdb7d1c24bf0cbe05d75fad2bcbf483d75b9020de12930adcc37aff46f7
|
File details
Details for the file pingwa-0.3.0-py3-none-any.whl.
File metadata
- Download URL: pingwa-0.3.0-py3-none-any.whl
- Upload date:
- Size: 16.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.28 {"installer":{"name":"uv","version":"0.11.28","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"26.04","id":"resolute","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
34542bc0aead5b10b4c2320a056674cc06278a80000c5a0ba99bca1596b509b7
|
|
| MD5 |
47773e0a635e82e9348afc6afe8d24fb
|
|
| BLAKE2b-256 |
745a542dfd63d8fd1e4e3681b3bc9446ef1e1fe565dba7d1a8b2e1ddeb205d88
|