kitha calm card

idea e-paper · meshcore · uwb · gnss

find your friends, then put it down.

kith is a card for friend groups at festivals, camps and off-grid gatherings. It shows one friend, an arrow and a distance, over its own LoRa mesh. There is no feed to check and nothing to scroll. When you can see your friend, they leave the screen.

try the device why it is calm the card is live. tap it.

saturday evening, six friends on a festival field. Mo is holding this one.

the object a card, three keys, one port

Four and a bit inches of e-paper with a touch layer, in a bone-coloured card about the size of a passport. Three keys laid out the way a phone lays them out, so a thumb finds them without looking: send on the right edge, up and down on the left. Everything else is a tap on the glass.

Nothing is typed after the first minute. The keys change friend without a hand over the screen, which is most of what this card is asked to do; the glass is for opening a thread, sending one of five lines, or picking someone off a list. A loop at the top takes a lanyard, so it hangs face out and is read like a watch.

After dark the first touch lights the panel for six seconds and does nothing else. It never lights by itself.

The panel answers about a third of a second after your finger, and it cannot show a press. So every control is a whole region rather than a button, and the card never asks for a gesture it cannot acknowledge.

screen4.2″ e-paper, 400 × 300, capacitive touch, front light. Partial refresh ~0.3 s, a full refresh every dozen
keysthree, phone style: send on the right, up and down on the left
radioMeshCore over LoRa, Semtech SX1262, 868 or 915 MHz
rangingUWB two-way ranging, Qorvo DWM3000: in sight, closer or farther, and a distance with no sky
fixu-blox MAX-M10S GNSS, four constellations, duty-cycled to the seconds before each beacon
headingLIS2MDL magnetometer + LIS2DW12 accelerometer, tilt-compensated, calibrated once in a guided sweep. No magnets on the board to fight it
activitythe same LIS2DW12: still, walking, dancing, and which way up it is lying
timeRV-3028 RTC, ±1 ppm, disciplined from GNSS PPS; time only ever moves forward
soundone piezo buzzer: a direct message, and never power
computeESP32-S3-WROOM-1-N8, with firmware ported from posse: Wi-Fi updates, MeshCore underneath
power2000 mAh cell, USB-C; about two and a half days on a charge as the floor, about ten if sleep is proven safe
recoverya watchdog outside the processor that cuts the power rail, because there is no switch to pull
lightone, on the bottom edge beside the port: charge and health, never a message

the screen what it looks like, most of the time

the glance. Sam, that way, 140 m. This is the default and it is nearly always what the card shows. The arrow is also the control: tap it, or thumb the keys on the left, for the next friend.
Sam wrote. One chirp, one line under the distance, gone in a minute or two. There is nothing to clear.
Lev is dancing. Lev's own accelerometer said so, one bit in a beacon carried it, and now you know not to bother them.
everyone within a few metres. The card has done its job and says so, then holds still.
friends. Tap a row to walk toward someone, “talk” to open their thread. Crew and the card's own settings are rows too.
a thread: what they said, a buzz, and five lines to send back. The key on the right opens this for whoever is on the screen, and pressing it again buzzes them. There is no text box.
the crew screen: the last thing anyone said to everyone, and the same five lines for 3 a.m. Crew lines never chirp.
this device: how often the panel has refreshed, what the battery is doing, whether the compass is set, and how the last run ended, in a form you could photograph and send to someone.
no arrow. The compass has not earned one, so none is drawn. Jo is getting closer, is at the food, off to the east, and ranging says how far. Nothing here needed a compass.
the compass, once. Turn the card over and around for about twelve seconds, at setup, and it keeps what it learned. A radio that was left to work it out from a normal day rarely got there.
the last thing the cell pays for. Paper would otherwise hold a friend and a distance on the glass, confidently, for as long as nobody looked.
the only keyboard on the card: on screen, at setup, for a name, a crew phrase and Wi-Fi for updates. Typing on e-paper is exactly as slow as it looks, which is the argument for not doing it again.

calm by design the rules, and why each one is there

one friend on the screen

An arrow, a name, a distance. Not a map, not a list. You pick who you are walking toward with one key, and that is all the screen holds.

friends in sight leave the screen

When ranging says the person you were walking toward is a few metres away, they drop off and the screen moves to the next friend, or says everyone is here. The device stops mattering the moment it has worked.

a chirp, for a person

One short low chirp from the buzzer for a direct message and for nothing else. A line to the whole crew is silent; you find it when you look. The chirp is public and can be drowned, which is a fact the card is honest about rather than one it hides.

no badges, no counts, no feed

A message is one chirp and one line on the glance screen, once. Nothing accumulates. There is no number to bring to zero.

nothing to type

Press the send key twice and your friend gets a buzz, which is what people actually send. Past that, five canned lines. Sixty characters was still a text box, and a text box is a thing you compose in. The keyboard appears at setup and never again.

an arrow is earned

A wrong arrow is worse than none. The card draws one only while its compass has earned it. Otherwise it shows a ring with the word closer or farther, where your friend is in the crew's own words, and how far. In the last hundred metres that is most of what an arrow was for.

paper does not lie

E-paper keeps its last image with the battery out, so a dead card could show a friend and a distance forever. The clock on every screen moves, an overdue friend shows their age, and a nearly flat cell paints that it is flat as the last thing it pays for.

after dark, the first touch only lights

A festival is mostly dark. The panel has a front light, for six seconds at a time, and it never comes on by itself. Nobody should have to act on a screen they cannot read.

messages go away

An hour. The card does not keep a record of the night.

a dancer is not interrupted

The accelerometer can tell dancing from walking: the same beat, three times the energy, and no ground covered. While you dance the card locks, direct messages wait, and one chirp is paid when the song ends. Friends see “dancing” instead of a distance, which is both a reason not to write and the reason you did not hear it.

paper, not glass

Sunlight-readable, monochrome, and slow enough that it cannot animate. A screen that cannot animate cannot nag.

hangs face out

A lanyard or a clip, so it is glanced at like a watch and never held like a phone. Laid face down on a table it stops refreshing, because nobody is reading it.

the one light never speaks about people

There is a single LED on the bottom edge, beside the port, and it reports the state of the battery and the health of the device. It has no colour for a message and no colour for an unread anything. The rule was never “no lights”; it was that the chirp keeps its monopoly on meaning someone wants you. Its mirror: the buzzer never speaks about power.

The display policy (one friend, never one in sight, a chirp only for a person, a dancer left alone, messages that expire) is small enough to state exactly, so it is written down as a TLA+ model and checked in kith/specs/CalmGlance.tla, published on the hub. Two mutants are checked alongside it: one that forgets to move the screen on when your friend arrives, and one that chirps at a dancer. Both fail, as they should. (The spec still calls the chirp a tap; it was written for the haptic and the property is the same.)

how it finds people three sensors, one arrow

beacons over the mesh

Every card sends its GNSS position to the crew every fifteen seconds, as an ordinary MeshCore packet on a passphrase-keyed channel: once a minute when it has not moved, and flagged with no position when it has no sky, so a crew under a roof still finds each other. That gives a bearing and a rough distance to anyone within a kilometre or so, good to a few metres. It is what the arrow runs on when a friend is far away.

ranging for the last hundred metres

Ultra-wideband two-way ranging measures the actual distance to a friend to about thirty centimetres, without GNSS, so it works under a roof. It is what makes “in sight” a fact rather than a guess, and within a dozen steps it says closer or farther with no compass at all. At 6.5 GHz people get in the way: turned away from a friend, or deep in a crowd, the reach falls and the number reads long, and the card falls back on beacons and says so. How far it falls is the first thing to measure on real people.

a compass, tilt-corrected

A magnetometer and an accelerometer give the direction the top of the card is pointing, so the arrow is relative to you, not to north. There is no speaker and no motor on the board, so there is no magnet for the compass to fight. It is calibrated once in a guided sweep and kept. posse tried learning it from everyday motion, and on real radios that rarely reached the point of drawing an arrow.

with ranging: Sam at 20 m, solid arrow, “uwb”.
without: the same Sam from beacons alone. The arrow is drawn light because it is honest about ±5 m at 20 m. Try the toggle.

power one cell, one port

One internal cell and one USB-C port: a wall charger and a power bank both arrive through the same port. About two and a half days on a charge is what this card can promise. It draws about 120 mW with the processor idling, which is the configuration real radios have proven. About ten days is possible if the processor can sleep, and that same sleep hung every radio it ran on, so it is the first thing a prototype has to settle. This page used to say two weeks. A festival is three or four days, and a power bank closes the gap.

Sixty times real speed. Plug it in and the light on the bottom edge goes amber; it is the only time it does.

the card draws≈120 mW: the processor idling (73), the LoRa receiver (22), transmitting (4), GNSS for the seconds before each beacon (7), ranging (1), and the rest, through a regulator. The screen adds under a milliwatt. From datasheets, not yet a bench.
if sleep works≈30 mW, about ten days. The processor drops to 3 and the receiver to 11. It cannot go lower without leaving the shared mesh, because the preamble is only 66 ms long.
2000 mAh, 5.0 mm pouchabout 2.5 days. A card about 9 mm thick. A thinner cell waits until sleep is proven.
after darkthe front light is about 130 mW for six seconds a touch, so it hardly shows.
usb-cempty to full in a bit over two hours from anything. A thermistor against the cell stops the charger at 45 °C, which a hot tent can reach.
a year in a drawerthe charger's ship mode disconnects the cell, and the clock and the satellite almanac keep running on about 30 µA. A key or the port wakes it.
the lightamber while charging, green when full, two blinks when it is too warm, red once every twenty seconds when it is nearly empty. Under 15 µW averaged when nothing is charging, and while it is lit something else is paying for it. The charger drives the amber channel in hardware, so a flat card says so with no firmware running.

The numbers come from bun tools/power-check.ts, which runs the same model as the card above with no browser.

what it costs roughly

100 units, nearly all parts sourced≈ $82
5 boards, a prototype run≈ $120 each, before PCB and assembly
1k+ units, bare radios, injection-moulded case$55 – 60

where the money goes

These are sourced numbers now, not guesses: 106 of the 125 parts on the schematic have a JLCPCB part number. Everything on the board comes to about $40. The rest is the 4.2″ touch and front-lit panel from Good Display at about $24, the ranging module at about $12, the cell at $4, and a case, a lanyard and a light pipe at a few dollars.

The surprises: the GNSS receiver is $10.60, not $3, and is now the biggest single line on the board; the LoRa module is $6.92 against the $3 a bare SX1262 costs, which is the price of a pre-certified radio; the ESP32-S3 module is $3.43; and the magnetometer we could source is $4, which argues for the $1 alternative once someone checks its symbol. The earlier $41–48 was an estimate that undercounted the panel and the radios. Bare radios and volume get it back toward $55.

set aside the versions that are not this one

Four things were built far enough to judge, then dropped. The reasoning is worth keeping, because it is most of the argument for the card.

A BlackBerry-shaped slab with 35 keys. It could say anything, in sixty characters, and that turned out to be the problem: a text box is a thing you compose in, and composing is the opposite of glancing. The keys also type on their own on a lanyard, and they cost a matrix, domes and a lock nobody wanted to design. Five lines and a send key cover the night.
A Sharp memory LCD, the Pebble and Beepy panel: instant updates, no ghosting, no flash, still reflective, about 50 µW to hold an image. It is the better screen by every measure except the one that matters here. It can animate, so the calm stops being physics and becomes a promise the firmware has to keep. It also costs $15 more and is greyer in the sun.
Hats: a magnetic back with pogo pins, so the card could take a battery pack, a bigger panel, or a six-bay mains dock at camp. It is a good system and the wrong one here. USB-C already accepts a wall charger and a power bank, and every magnet near a magnetometer is a calibration the compass has to learn. One object, one port, one cell.
A solar panel on the back. 68 cm² of mono-Si that only collected face down, worth about two days of use from an hour at noon. It also put a conductive sheet a few millimetres behind every antenna and a 270 mA loop beside the compass, and it needed a thermal story of its own. A power bank through the one port does the same job, and a card with nothing on its back is a simpler thing to build.

toward a board what a schematic has to honour

The board is drawn and routed, and posse has now said what to worry about. Three things are worth a prototype before anyone orders one. The firmware is a port of posse's, and most of the interaction can run on one of its radios this month.

Touch on e-paper. The capacitive layer sits over a panel whose drive waveforms are ±15 V, and a phantom touch during a refresh is the standard failure. Sampling is gated on the panel's busy line, and the touch layer's 0.4 mm and its haze are in the optical stack. It wants a coupon, not an argument.
Whether the processor can sleep. It is the difference between two and a half days and ten. Light sleep hung posse's radios so hard that only cutting the power helped, and the likeliest cause is fixed in a newer SDK. The board can now survive the experiment, because a watchdog outside the processor cuts the rail. If it cannot be made safe there is another chip to use, and the board redraws.
Ranging on real people. Published numbers for a card on a chest disagree, and nobody has measured this one. Two cards on two lanyards, facing and turned away, in the open and in a crowd, decide what “in sight” can mean and how far closer and farther can be trusted.

The rest (the power tree, the pin map with no GPIO to spare, an I²C map with no collisions, a clock that cannot go backwards) is in HARDWARE.md alongside the mock, and the KiCad project is in kith/hardware/. The power path is model-checked in kith/specs/PowerPath.tla: reading the board against posse's record found that ship mode as first drawn never latched, and that any restart on battery would have switched the card off.

open questions what the mock is for

  1. Can the processor sleep? Two and a half days or ten, and the one answer that could redraw the board.
  2. How far does ranging reach on people? Turned away, in a crowd, on a lanyard. The mock's factors are assumptions until two cards have been out on two people. Turn someone around in the mock to feel what they imply.
  3. A true short-range arrow. Single-antenna UWB gives a distance, not a bearing. A second antenna would give an arrow that needs no compass at all, which is exactly what posse's record says is worth wanting, but nothing purchasable does it plainly yet. Cooperative ranging among three or more friends would give the group's shape to centimetres, and is not modelled.
  4. Antenna. A connector for the first board; a PCB antenna in the top strip after that. The lanyard loop could hide a whip.
  5. Pockets and rain. Two presses for a buzz and a dance lock cover the worst of it. A card against a thigh, and a capacitive layer in the rain, have not been tested.
  6. Games. They were most of what posse's kids did with it, together, in person. Most do not fit paper, but tag at a metre by ranging, or hide and seek with closer and farther and no arrow, could only be played on this card. They might also be what turns a card you put down into one you hold.
  7. The lanyard swings. A card hanging face out has its own pendulum at about 1 Hz, under every activity signal. The dance detector excludes that band, but the thresholds want tuning on the real object, on a real person, with real music.
  8. A chirp is public. The haptic tap was private; the buzzer can be heard by the tent and drowned by the stage. The mock treats a chirp as arriving; the real card will sometimes chirp into noise, and the “dancing” rule is doing double duty as the explanation. Whether that is enough wants a night out.
  9. How thick a card is allowed to be. The stack comes to about 9 mm and the cell is 5 of it. A 4 mm pouch buys a millimetre and costs a quarter of the battery, which waits on the first question.

a cousin posse

posse is the same wish on hardware you can buy today, and since October 2026 it has been running on real radios in real hands, which is where almost everything in this revision of kith came from. It is also where kith's firmware comes from. kith is the other answer to the same question: its own object, one friend at a time, on paper. Same packets, same crew key, so they share a mesh.