Skip to content

wifi-p2p meetup

three phones, one picnic table, no cloud — the hum spreads by proximity

Cast

devicerolewhat it runs
Alice’s Pixel 9Group Owner + workerhumd (Termux), wifi-p2p bee, claude-cli worker
Bob’s Galaxy S25Client + workerhumd (Termux), wifi-p2p bee, claude-cli worker
Carla’s iPhone 17Client + foragerhumd (iSH or relay), wifi-p2p bee, openai-server forager
the picnic tablethe placea cardboard sign that says “FREE HUMS” in sharpie

The scene

Sunday afternoon. A park in Bushwick. Three humans who have never met, each nursing a phone and a half-empty thermos, sit at the same weathered picnic table. No router. No cellular plan that matters. No intention to cooperate — just three people who showed up for the sun.

Alice’s phone buzzes. She has a humd running in Termux — a side effect of being the kind of person who reads install scripts before running them. Her wifi-p2p bee has been scanning for thirty seconds and found two peers: galaxy-s25 and iphone-17. The bee forms a group. Alice is the Group Owner because her phone has the better battery.

Bob’s phone joins. Carla’s phone joins. Three phones on a P2P TCP mesh under a single tree, no packets leaving the park.

Alice doesn’t notice any of this. She’s reading a zine about fermentation.

The first bloom

Bob has been stuck on a recipe for sourdough starter that calls for “one cup of chaos agent.” He opens his hum CLI and types:

hum ask alice-phone "what does 'one cup of chaos agent' mean in a
sourdough context? also the starter is runny, should i add flour"

The prompt leaves Bob’s phone as a thrum tone, hits his local humd, which checks the mesh: Bob’s phone has no worker that serves sourdough expertise. But Alice’s phone advertised claude-cli as a worker hive in its hello. The ensemble routes the prompt to Alice’s humd over the P2P TCP link.

Alice’s humd spawns a cell. The cell runs Claude. Claude replies:

"Chaos agent" in sourdough means the wild yeast you're cultivating —
it's unpredictable by design. If your starter is runny, add 10% more
flour by weight. You're fine.

Chunks stream back across the picnic table, over the P2P link, into Bob’s phone. The finish tone lands. Bob adds flour. His starter thickens. He smiles.

Alice never knew any of this happened. Her phone thought it was idle.

Carla needs a lift

Carla’s iPhone runs humd via iSH (iOS terminal emulator) with a wifi-p2p bee that connects as a client. Her phone has no local LLM — she’s using the openai-server forager pointed at her OpenAI API key. But the API key is rate-limited and she’s already hit the tier-1 cap.

Her forager advertises ["openai-server"] in its provides. Bob’s humd sees this and marks Carla as a route for OpenAI-shaped prompts. When Alice’s phone needs an embedding for a retrieval task, the prompt routes: Alice’s humd → P2P TCP → Carla’s phone → OpenAI API → reply bundle → P2P TCP → Alice. Carla’s phone acts as a paid-oracle relay without Carla noticing. Her battery drains 2% faster. She thinks it’s the TikTok tab.

The table becomes a nest

By hour two, the three phones have gossiped enough state that the mesh acts as a single distributed humd. A prompt typed on any phone finds compute on any other phone, or reaches OpenAI through Carla’s forager, or forks a tool-call to Bob’s phone for filesystem access.

The picnic table has no power and no internet. It is a wooden surface with birdshit on it. But the hum on top of it is a three-node ensemble with routing, capability discovery, and session continuity.

When a fourth person sits down — a girl with a Nokia 3310 and no humd at all — Alice’s phone scans, finds nothing, and keeps scanning. The mesh doesn’t extend to her. She eats her sandwich and leaves. The hum doesn’t notice.

Dispersal

At 4pm, Carla stands up and walks toward the subway. Her phone exits the P2P group gracefully — the GO detects the link drop, emits chi:"error" with lost reason, and the remaining two phones re-form the group without her. Bob’s starter question is already finished; no session is orphaned.

Alice’s phone has been the GO for two hours. Its battery is at 18%. When she finally gets up and walks home, the P2P group dissolves. No state is lost — each humd has its own nest, and the ensemble gossip washed every tone across all three phones. Alice’s phone holds a complete copy of Bob’s sourdough conversation, Bob’s phone holds a copy of Carla’s OpenAI relay logs, and none of them ever talked to a server.

What this setup looks like

On each phone, the hum setup is:

{
"hum": {
"hives": ["claude-cli", "wifi-p2p"],
"ensemble": {
"discovery": "wifi-p2p",
"transport": "p2p-tcp"
}
}
}

Three binaries running:

Termux:
humd — the daemon, one per phone
claude-cli-worker — local inference (Alice, Bob)
openai-server — cloud relay (Carla)
Android foreground service:
wifi-p2p-bee — P2P discovery + group + TCP bridge
— connects to local humd via Unix socket
— translates P2P NDJSON ⇄ thrum NDJSON

No config. No peers.json. No DNS. The phones find each other by WiFi Direct service scan, form a group, and the ensemble layer discovers capabilities by gossip. The bee is the radio bridge; the rest is stock hum.

Enjoyment

Bob’s starter works. Alice’s battery is low but her zine is good. Carla’s API key survives the afternoon. None of them configured anything. The hum found the mesh by walking around.

This is the use case: three strangers at one table, no cloud, no setup, no intentional cooperation, and the conversation still routes through the best compute the mesh can find. The bees do the foraging; the humans just sit in the sun.