Basic Layout

Uses two MicroUSB Cables, One for the rPi 3B+ and one for the Mikrotik mAP 2nD Wireless Access Point

Another MicroUSB connected to another battery is used for the LED ring on the brim of the pith helmet.

There is a Ethernet cable between the Mikrotik and the rPi. I have added two uFL connectors to the Mikrotik to break out the Wifi 2.4Ghz signal to the antennas that are mounted in the breather holes using a set of bolts, washers and a binder clip to hold them.

There is a simple LCD Shield on the rPi that displays status info like number of posts, CPU Usage, Disk Usage and a little spinner to make sure the rPi hasn't hard locked.

HostAPd is running on the rPi for the 5Ghz AP as well. All interfaces are bridged together

The Image Board

The imageboard is using TinyIB in static database mode hosted on nginx/php/alpine stack.

DNSMasq is used to rewrite all DNS requests back to the main webserver at, it also acts as the DHCP server as well. I also send out Option 160 in the DHCP request to save there is a captive portal

The Support Scripts

There is a master python script that is a gluing a dozen examples together from Adafuit to handle the LCD and the LED strip. Nothing too crazy, just using python to handle the LED Animations and some logic to check the number of posts and other stats on the Image Board


Uses a offbrand UBLOX 8 GPS Receiever over USB to provide time to GPSd and ntpd. There is a cronjob that runs once a minute to update the current position and save it to disk if there is a 3DFIX being reported by gpsd. These are used to tag posts and survive reboots.

LoRA Broadcast

There is a in alpha protocol being setup to broadcast basic details about HatChan to other Hard Hats using LoRA, See:

Human Cooling Units

At Defcon, I have two 80mm 5v Fans that I attach to the LED Power line with some stiff wire to hang both fans off the edge of the hat to cool me during Las Vegas heat.


I use off the self Anker USB Batteries (26,000mAH) that have three ports, I tend to bring about 8 of them so I can charge the dead ones while still having good runtimes.

Right now runtime is about 15 hours per battery