The idea

The switchboard doesn't reply โ€” it routes and stores.

WhatsApp comes in through a minimal ARM board that never thinks. It receives, stores every message, and exposes a control surface over MCP. Replies come from whoever connects โ€” your own AI agent on a machine with real RAM, or an API. The board just routes and draws a face.

   WhatsApp (dedicated number)
          โ”‚
          โ–ผ
    SWITCHBOARD (Go, tiny board) โ”€โ”€โ–บ e-paper face (Python)
     ยท receives / stores  (SQLite)         reads status.json
     ยท per-chat mode: auto | advanced
     ยท anti-ban governor ยท whitelist
     ยท exposes MCP โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
          โ”‚ auto                    โ”‚ advanced (queue, pull)
          โ–ผ                         โ–ผ
     cheap API                 AGENT over MCP  (your machine)
     (optional)                 Claude / Opus / OpenCode + tools
How it treats WhatsApp

Every chat has its own rules. New ones arrive ignored.

Piumy never guesses. A brand-new chat lands as ignored — nothing gets answered until you say how. You write the rule for that chat — how to greet, what it may share, when to escalate, the tone, the language — and the connected AI reads it and treats every message there exactly that way. Rules are living: tweak them per chat, anytime.

  new chat   +56 9 ····         → ignored   (nothing is sent)
        │
        │   you set a rule — from the dashboard, or just by
        │   texting your Piumy number, in plain words:
        │   "answer sales questions, share the catalog, escalate to me if they want to buy"
        ▼
  same chat  +56 9 ····         → advanced ✓   (the AI handles it your way)

Set the rules two ways: from the terminal / dashboard, or straight over WhatsApp — message your dedicated Piumy number and tell it, in plain words, how to handle a contact. Whitelist by default; you're always in control.

Your history is yours

It quietly backs up your WhatsApp.

Every message — text, photos, videos, voice notes, stickers — is stored in Piumy's own database as it arrives. If a contact deletes their chat, or you lose your phone, the history is still here: self-hosted, on your board, not locked inside a cloud you don't control. The memory belongs to the system, not to any one app.

Real hardware

It runs on a board you can hold in your hand.

A Raspberry Pi Zero 2 W with a 2.13" e-paper display, always on, sipping power. The face is glanceable across the room โ€” you can tell it's alive without touching it.

The Piumy device: a Raspberry Pi Zero 2 W in a blue case with a 2.13-inch e-paper display showing the kaomoji face and status panel
Raspberry Pi Zero 2 W
512 MB ยท the whole switchboard fits here
E-paper display
Always-on face ยท zero burn-in ยท sunlight-readable
UPS battery
Uninterrupted power ยท safe shutdown on low
The face

Real pwnagotchi kaomoji โ€” eyes that look around.

Not vectors โ€” actual kaomoji, rendered 1-bit. Three eye styles cycle through a gaze loop and blink, and the face reacts to what's happening: a new message, the agent connecting, the battery draining. It settles into a calm, low-power idle when things are quiet. (The face up top is live โ€” that's the real loop.)

โ—•

Quarter eyes

The kawaii favorite โ€” a 45ยฐ window that rotates to look around.

โ—

Half-moon

Fifty-fifty fill, gazing up / down / left / right.

โš†

Point

A tiny focused dot โ€” then a two-dash blink, and the loop repeats.

Battery intelligence

A fuel gauge that learns your cell.

Voltage alone is famously jumpy. Piumy reads the raw cell over IยฒC, learns this pack's real fullโ†’empty span from actual discharges, and reports an even, linear level with an adaptive time-remaining. A per-minute log keeps the whole curve traceable.

Battery discharge chart: raw voltage curve versus the linearized state-of-charge with charging bands
raw voltage vs. linearized charge ยท charging bands
Dashboard

Everything, on your LAN โ€” no cloud.

A lightweight dashboard served by the same Go binary (LAN-only, login): the live face, the battery chart, WhatsApp link/QR, the anti-ban kill switch, per-chat rules, rate limits and the router whitelist.

The Piumy web dashboard showing device status, the live kaomoji face, and controls
Connect the brain

Point your agent at it over MCP.

Piumy exposes its chats, queue and tools over MCP. Drop this into your MCP client (Claude Code, OpenCode) and your agent can triage the queue, read context and reply โ€” at a human pace the governor enforces.

~/.mcp.json
{
  "mcpServers": {
    "piumy": {
      "url": "http://piumy.local:8081/mcp",
      "headers": { "Authorization": "Bearer <token>" }
    }
  }
}
Fail-closed by default. The MCP endpoint rejects every request until a token is set โ€” an open endpoint has no trust boundary. Run piumy auth setup once; the installer prints the token a single time.
Try it now

No hardware. No WhatsApp. One command.

The core writes status.json; the file adapter draws it as a face. Run it on your laptop today.

bash
# 1) the core (Go) writes a state
cd core && go run . responding

# 2) render the face
cd ../adapters/display/file
pip install -r requirements.txt
python render.py            # -> display.png
Where it's going

Today, WhatsApp. Tomorrow, your gateway.

Piumy is built to grow. The same little board can carry a microphone, a speaker, buttons, a screen — and reach out to APIs and services on other platforms. The goal is a personal gateway that connects to almost anything, over robust encrypted tunnels — WireGuard-style, braiding hashes instead of trusting the open internet.

I'm a network engineer, so security isn't an add-on here — it's the starting point. And under the wiring there's a simpler why: to make life lighter for people who are stretched thin, and for anyone the everyday is harder on — and to find out how far AI can go, as real help and as company, in a world that keeps getting more chaotic and complex.

Keep it alive

Donations are the cornerstone.

I'll be straight with you: without support, this stops here. Piumy is an MVP I've built on my own — and this is the exact point where it freezes for lack of funding. If the idea moves you, pay what you want (even $0 gets you everything — it's open-source and always will be). What you give is literally what lets the next piece exist.