RoostOS turns a $20 ESP32 into a captive-portal appliance — its own Wi-Fi, its own DNS, a real HTTPS padlock, and an SSH shell. Build and test it on your laptop, then flash it in one command.
brew install stevenssparks/tap/roost ⧉One tool, roost, does everything — from your laptop to the board. No hand-entered flash offsets, no separate firmware step.
Run the whole appliance on your Mac/Windows/Linux and test in a browser. roost run
Compile the firmware + pack your site into one flashable image. roost build-image
Write it to a $20 ESP32 over USB — it auto-detects the port. roost flash-board
Everything a little private network needs — served offline from a thumb-sized board, or emulated on your laptop.
Join the Wi-Fi and a page pops up — your site, your rules, no internet behind it.
Every name resolves to the box, so your domain works with zero upstream.
Serves a genuine Let's Encrypt padlock — trusted, and it works fully offline.
Log in for a cozy little unix-ish prompt: top, tail, ls, dns.
A dashboard streams every web hit and DNS lookup as it happens.
Emulator, builder, and flasher in a single Go tool. It's just a folder → a device.
RoostOS runs on a Seeed XIAO ESP32-S3 — small enough to hide in your pocket, powerful enough to serve a whole site with a real padlock over its own Wi-Fi. Plug it into USB power and it just works.
Above: RoostOS running on the XIAO ESP32-S3.


The built-in console streams every request and DNS query in real time — captive-portal probes, page loads, the works. It's the easiest way to see how the box funnels a whole network to itself.
# install brew install stevenssparks/tap/roost # try it on your laptop — browse http://localhost:8080, ssh in, watch :9090 roost run # make your own: copy the demo, edit data/, test again cp -R examples/friendlyportal my-portal roost run my-portal # put it on a $20 board (installs the toolchain if needed) roost doctor --install roost build-image my-portal roost flash-board my-portal --image my-portal/build/*.bin --confirm