I’ve wanted to build a badge for the Unsupervised Learning crew at DEF CON for a couple of years now. The original thought was just that we needed a better way to find each other. We scatter as soon as we arrive, phones are not a hundred percent reliable in that building, and finding people by radio sounded like more fun than texting them anyway. What I wanted was something hanging off a lanyard, next to the con badge already there, that tells me roughly how far away the rest of the crew is without needing an app or a network.

I bought parts for it before the previous DEF CON and never made the time. That year I ended up talking the idea over with some of the UL folks, they were interested, and I came home with a renewed plan to build it. Then another year went by, and by the time DEF CON was a week out I was fairly sure it wasn’t happening again.

What got this moving at the last minute was spinning up an instance of my assistant on Fable and dictating the whole thing at it the way I usually do, the dream version, the ideal state. It had a software plan back to me in well under an hour. From there we talked through how the boards would find each other, spun up a dedicated VM on my Proxmox host for the project, and had the agent set up the dev environment there. I plugged the boards into that box so it could build and flash them directly. By that night it was running on real hardware with a web page that mirrored the whole interface.

The dev preview page in a browser, showing one board’s screen cutting from the group mark to the beating heart, with buttons for wake, mute, focus and list

The page drew what the screen was drawing and let me work the joystick from the browser, so we could iterate on the interface together before the screen and the controls were wired up.

I gave myself the rest of the week and got three of them built and working before I left. The plan had been five, and I had been hoping for eight.

A finished badge in a dark room, screen lit, the grille and the USB port glowing

What the thing actually is

An ESP32 with a small OLED screen, a joystick, and a battery, in a printed case. The badges talk to each other over ESP-NOW, which is a little Espressif radio protocol that skips wifi and pairing entirely. Boards just shout at each other and listen, and the signal strength gives you a rough distance that turns into bars on the screen.

The thinking on skipping wifi and bluetooth was that both would be less available to us in that environment, and both give the badge more of an inbound interface somebody can talk to. What I wanted was mostly outward, beaconing and listening, with as little facing back at it as I could manage, because you wear this thing into a building full of people who poke at whatever is broadcasting.

The heart came first, and for a while it was the whole idea. I wanted something on the screen that showed the badge was beaconing to the other badges, and a heart beating at a rate set by how close your nearest person is does that without anyone having to read anything. Walk toward someone and it speeds up.

The heart face beating on the badge screen

The list came next, and it is the part that answers the question I started with. Your own name sits at the top and everyone the badge can hear is underneath it, sorted by who is nearest, with bars for signal strength. Then focus, so you can hold on one person or a few of them if there is somebody specific you are trying to find.

The crew list on the badge screen, names sorted by who is nearest with signal bars

Once the list existed it was obvious that some people would want to not be on it, at DEF CON of all places, so there is an invisible mode that takes you off the air entirely.

That turned the heart into what the badge shows while it is just sitting there working, and a flip or a wake takes you to the list. Then the UL mark started alternating with the heart on the same clock, and having two of them made it easy to add a third.

The UL mark on the badge screen

The rest of the faces came from asking what the badge should be if the RF environment in that hall did not let any of it work. If the radio was useless in there I still wanted the thing to be worth wearing. So the menu ended up with ten faces you can turn on and off, and it cuts between whichever ones you leave on, partly as a hedge and partly because they are fun. Conway’s Life seeded with a glider, stars where your crew are points scattered around you, and a retrowave sun over a grid. There is a sparkline of how close your nearest person has been over the last twenty minutes, and a twenty character conversation opener you type on the badge itself, plus a few others.

Conway's Life running on the badge screen, seeded with a glider
Glider
A retrowave sun and grid scrolling on the badge screen
Retrowave
Crew members drifting as points of light on the badge screen
Stars
The screen reading ASK ME ABOUT UL, a conversation opener typed on the badge
Ask me about

A finished badge on a lanyard, the retrowave sun and grid running on its screen

Turn on the heart and the UL mark together and they beat as a pair. That is the closest thing to a secret in there, and it is what the badges ship with for the UL community.

Names changed more than anything else. My first version had the crew’s names compiled into the firmware. That works for five badges and falls apart past that, and I wanted the firmware to be something I could hand to anyone with the same hardware so the network gets bigger than us. So no name is baked in and no name is tied to a board. They generate themselves out of a pool at first boot, and you can reroll one if you do not like what you got. The names in that list above are what that looks like.

The last piece was that these get worn into a hall where somebody will send your badge something it never asked for, just to see what happens. There is a shared key so the badges only listen to each other, which handles casual noise and nothing beyond that.

How the week went

I started on the Wednesday night, a week before I left. That first evening got the firmware skeleton, the radio, and the live preview running against real boards.

The badge on a breadboard, ESP32 and OLED wired up with jumpers, a cutting mat and a spare breakout board on the desk

Thursday was the biggest day of the week by some distance. The case went from a first parametric draft to v6.5 inside that one day, mostly because the first several versions were wrong. It is the same describe-it-and-let-the-AI-write-the-OpenSCAD loop I wrote about in AI-Assisted 3D Printing.

The weekend was software, and I only had about one full day of it. What I needed by the end of it was case tests printing and a bill of materials I believed in, because everything after that depended on parts already being in the house. The test prints started Saturday.

The A1 running a case test print, a green tray on the bed

The case went through enough versions that the last one just fits.

The 3D viewer could not start in this browser.
Body Face 72 x 92 x 25 mm

The case as it ended up, front plate lifted off the tray.

Drag to spin · Scroll to zoom · It opens and closes on its own

That left Monday and Tuesday to assemble, and I was leaving for Vegas on Wednesday. What held me up from there was my own soldering, and everything I put together before Tuesday was really me learning how to build one of these. The three badges that came to Vegas all got assembled on Tuesday night.

I’ve soldered off and on for most of the last couple of decades, but always small projects. Home Assistant sensors, custom switches, that kind of thing. It is a long way down from the size of thing I was used to, and the number of connections was only part of it. What made it hard was that many connections, with that many wires, packed into a box that small. That is where I went from understanding why people have PCBs made to actually feeling it. The LayerOne Hardware Hacking Village is what pushed me toward this kind of soldering in the first place, a couple of years ago. Before that, a soldering project to me meant something like an audio patch panel.

The accelerometer did not make it either, which took flip-to-wake with it. The code for it was fine and it was not hard, it just was not worth the extra time. I was already having trouble fitting all the wires and pieces into that box, and every part I added cost me soldering time I did not have. Cutting it was what let me spend that time on another badge instead.

Four agents, one repo

All of that ran across four assistant sessions instead of one. I have been running my assistant on a lot of projects, but generally as one thread doing one thing at a time. This time I split it into four, and each one owned a different part of the badge.

One arm had the firmware, the screen faces, and the dev preview, and another had the wiring, the pinout, the power path, and the electronics parts list. The third had the case, both the 3D model and the printing, and the fourth had the documentation and the project pages.

Each arm had its own spec file, its own history, and its own definition of done. They shared one working tree and one contract file that held everything more than one arm needed to agree on, things like pin assignments, part numbers, and dimensions. If it crossed a boundary it lived in the contract, and an arm could read the contract but only its owner could change it.

Four lanes, firmware, wiring, case and docs, all meeting one shared spec file

That sounds like process overhead for a hobby project, and I would have said the same thing two weeks earlier. What it bought me was running three or four of them at once without holding all the work in my head, so every part of the badge could move forward on the same day. With only a week, I needed all of it moving at once.

Why the split helped

A change to one part of the badge rarely stays in that part. Swap a hardware component and that one decision turns into work in three places. The firmware needs different pin assignments and the case needs its layout recalculated around a new footprint.

With four arms, the decision goes into the contract and each arm picks up only the piece that belongs to it, in its own session, with its own history behind it. When one of them runs long it compacts and comes back carrying just its own direction.

One session doing all of it has to change direction every time instead, and it ends up holding pin assignments and print tolerances and a parts list in the same window.

How they did at the con

Three badges came with me. I had plenty of parts for five, I just ran out of time, and I needed to get on the road. Three seemed better than missing the con arguing with a soldering iron.

Three badges on a table at the con, one showing the crew roster with signal bars, one showing the heart screensaver

We tested them on registration day and they reached from nearly one end of the conference building to the other. That was a long straight hall on a less crowded day, before the villages switched on, so it was the best case rather than a normal one.

Once the con was actually running they were good for about thirty to fifty feet. The bigger problem was time. The badge cycles through its RF neighbors slowly enough that the screen lags behind where people are, so it tells you where someone was a little while ago.

One thing I did not account for is that the talks all ran on headphones this year. I never got a chance to check which part of the spectrum those were using, but my guess is we were sharing it.

We still found each other with them more than a few times, which is the thing I wanted two years ago, and it worked! And they started a lot of conversations, most of which turned into ideas about what to do next.

Projects like this one are how I get into hardware work I would never have a reason to learn otherwise. I’ve wanted to be better at this kind of thing for a while, and a deadline with five badges attached to it turned out to be what actually made me sit down and do it.

What I would do differently

I’d get a custom PCB made. I lost a lot of time to wiring by hand, three times over, and I can’t say the third one came out better than the first. There is an argument the other way, which is that I learned more about this kind of soldering in those few nights than I had in years of doing it occasionally, and more practice might be the honest fix rather than a board. I would like both, and a board would at least let the practice go somewhere other than building the same harness a third time.

There is an honest amount of soldering in these that I would not describe as good work, so I’d use harnesses and breakouts instead of soldering directly to the boards, and I’d put a USB programming port on the case. There is a port on there now, but it is power only, so flashing still means opening the thing up. That one would have been worth a lot to me around day five.

I’d also give myself longer lead time on the parts and wire I actually wanted, instead of building with the ones I could get in time.

Was the four-agent thing worth it

For this, yes. The badge had four parts that came apart cleanly and one place where they had to agree. Firmware, electrical, physical, and documentation are different kinds of work with different failure modes, and none of them needed to know much about the others as long as the contract held. I don’t think it would help on a project where everything touches everything.

All three badges live with UL folks now, so I need to build myself another one before too much time passes, just so I have a souvenir from this year 🙂

There is a real list for next year. The PCB, obviously. And a serious look at other radios, because ESP-NOW on 2.4GHz in that hall is asking a lot of it. LoRa is the one I am most curious about, since I already run Meshtastic devices across town and have some feel for what it does. BLE is on the list too, and so is dropping to something more raw.

What I would like is to get this rolling before the end of the year, so there is time for other people to contribute, time to have boards made, and maybe time for folks to build their own. We will see how that timeline holds up.

The firmware, the case model, and the build notes are up at github.com/chriscantey/dc34-ul-badge. It is what ran at the con, without the group key, which you generate yourself so your badges only see your people. There is a link in the README that flashes a board from the browser if you have an ESP32 lying around and want to see it run.

If you end up building something like this, or running a project across a few assistants at once, I’d love to hear what you’re learning.