Piumy is a distributed, portable WhatsApp assistant for ARM64 boards. A tiny board acts as the switchboard — it receives messages, stores them in SQLite, and exposes them over the Model Context Protocol (MCP). The AI agent — Claude Code, OpenCode, or any other MCP client — lives on a separate machine with RAM and connects to the board over the network. The board routes and stores; the brain is always elsewhere.Documentation Index
Fetch the complete documentation index at: https://mintlify.com/chamilonster/Piumy/llms.txt
Use this file to discover all available pages before exploring further.
What Piumy does
The architecture is intentionally simple. WhatsApp messages arrive at a dedicated number, flow into the Go switchboard, and are stored in SQLite. The switchboard never replies on its own — it waits for an agent to pull the queue via MCP and act. Meanwhile, a Python display adapter reads astatus.json file and draws a pwnagotchi-style kaomoji face on the e-paper screen, reacting in real time to what’s happening.
status.json carries the board’s live state from core to display adapter, and MCP/HTTP carries messages and replies between the board and the external agent.
The stack
Piumy is built from four distinct layers, each with a clean boundary:-
Core (Go binary
pimywa): Built onwhatsmeowfor the WhatsApp Web multidevice protocol,mcp-gofor the MCP server, andmodernc.org/sqlite(pure Go, no CGO) for the message store. A single lightweight binary runs the gateway, router, anti-ban governor, MCP server, REST API, and web dashboard. -
Display adapter (Python): Reads
status.jsonand renders real pwnagotchi-style kaomoji faces via Pillow. Supports three backends:file(writes a PNG — ideal for development on any PC),epaper-waveshare(pushes 1-bit pixels to the physical display over SPI), andnone(disables rendering entirely). -
Power adapter (Python): Reads the CW2015 fuel gauge chip over I2C, runs a self-calibrating discharge curve, and writes a
battery.jsonsidecar that the core merges intostatus.jsonon its heartbeat tick. Backends:cw2015-i2candnone. -
External AI agent (any MCP client): Claude Code, OpenCode, or anything that speaks the Model Context Protocol. This never runs on the board — it connects to
:8081over the LAN (or a tunnel) to read chats, pull the message queue, and send replies.
Key principles
Piumy is designed around a small set of non-negotiable rules: The board does not reply. The switchboard routes and stores — it never initiates a message or generates a reply on its own. Every outbound message originates from whoever connects over MCP. AI never runs on the board. The ARM64 board has no RAM budget for inference. The agent is always external — the MCP interface is the only bridge between the two machines. All configuration is env-driven. There are no hardcoded paths, addresses, or credentials anywhere in the codebase. Every setting — fromPIMYWA_STATUS (the path to status.json) to PIMYWA_MCP_KEY (the bearer token) — is read from environment variables at startup. This makes the same binary run identically on a Raspberry Pi Zero 2 W and a developer’s laptop.
The anti-ban governor is non-negotiable. The governor enforces per-minute and per-day send rate limits, adds human-paced delays between sends, and provides a kill switch (mute). Rate limits can only be loosened to a safe ceiling — the dashboard cannot tighten them past the anti-ban floor. No configuration change can bypass it.
Status
Piumy is MVP feature-complete and running on a Raspberry Pi Zero 2 W. The core switchboard (WhatsApp gateway, router, anti-ban governor, MCP server), the e-paper kaomoji face and eye engine, self-calibrating battery intelligence, the web dashboard, and MCP bearer-token authentication are all deployed.Quickstart
Run the core and render the e-paper face on your PC — no hardware, no WhatsApp needed.
Architecture
Component boundaries, data contracts, ports, and the anti-ban golden rules.
Install on Raspberry Pi
Flash, wire, and deploy Piumy on a Raspberry Pi Zero 2 W with
install.sh.MCP Reference
Every MCP tool the agent can call:
list_chats, get_messages, send_message, and more.