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.
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.
| screen | 4.2″ e-paper, 400 × 300, capacitive touch, front light. Partial refresh ~0.3 s, a full refresh every dozen |
|---|---|
| keys | three, phone style: send on the right, up and down on the left |
| radio | MeshCore over LoRa, Semtech SX1262, 868 or 915 MHz |
| ranging | UWB two-way ranging, Qorvo DWM3000: in sight, closer or farther, and a distance with no sky |
| fix | u-blox MAX-M10S GNSS, four constellations, duty-cycled to the seconds before each beacon |
| heading | LIS2MDL magnetometer + LIS2DW12 accelerometer, tilt-compensated, calibrated once in a guided sweep. No magnets on the board to fight it |
| activity | the same LIS2DW12: still, walking, dancing, and which way up it is lying |
| time | RV-3028 RTC, ±1 ppm, disciplined from GNSS PPS; time only ever moves forward |
| sound | one piezo buzzer: a direct message, and never power |
| compute | ESP32-S3-WROOM-1-N8, with firmware ported from posse: Wi-Fi updates, MeshCore underneath |
| power | 2000 mAh cell, USB-C; about two and a half days on a charge as the floor, about ten if sleep is proven safe |
| recovery | a watchdog outside the processor that cuts the power rail, because there is no switch to pull |
| light | one, on the bottom edge beside the port: charge and health, never a message |
the screen what it looks like, most of the time
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.
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 pouch | about 2.5 days. A card about 9 mm thick. A thinner cell waits until sleep is proven. |
| after dark | the front light is about 130 mW for six seconds a touch, so it hardly shows. |
| usb-c | empty 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 drawer | the 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 light | amber 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.
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.
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
- Can the processor sleep? Two and a half days or ten, and the one answer that could redraw the board.
- 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.
- 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.
- Antenna. A connector for the first board; a PCB antenna in the top strip after that. The lanyard loop could hide a whip.
- 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.
- 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.
- 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.
- 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.
- 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.