← Build Log

All in a Day's Work

hardware firmware prototype

The everything day

There’s a particular kind of day where you look up from your desk and realize you’ve used seven completely unrelated skill sets in the past four hours. Today was one of those days.

I started the morning bridging jumper pads on an Adafruit Feather. By 10 AM I was writing C++ for a Bluetooth service. By noon I was in Xcode fighting Flutter. By 2 PM I was designing a QR code for a thermal printer. By 3 PM I was back in C++, watching a microcontroller save WiFi credentials to flash memory and reboot itself.

None of these things share a language, a toolchain, or a mental model. This is just what building an IoT product looks like on a Thursday.

I am having the time of my life.

Going off-script

The build plan has a nice tidy progression from proof-of-concept through full sensor validation to custom PCB. Sensible. Methodical. Each prototype validates the next thing on the list.

I skipped ahead.

Askew Auk wasn’t on the roadmap. It’s a Feather ESP32-C6 with a soil sensor and UV/light sensor, running ESP-IDF and C++ instead of CircuitPython. The reason it exists is that I woke up and thought: “I don’t actually know how device provisioning works end-to-end, and I should probably figure that out before I have ten boards on a table.”

So I built one to find out. Also the Feather was sitting on my desk looking at me.

Askew Auk prototype on a soldering mat with helping hands, flux paste, and scattered components
The Askew Auk build. Helping hands, flux paste, and a pile of components that will eventually be a bird.

The BLE part

I have never had to think about Bluetooth before. Not hard, just completely new territory.

I needed to set up a GATT service with a single write-only characteristic, which sounds like a sentence from a Star Trek episode but is actually just “make a Bluetooth endpoint that accepts a blob of JSON.”

Phoebe ships blank. No credentials, no WiFi, no idea who you are. Power her on and she starts advertising over Bluetooth as “Phoebe Sensor,” waiting for your phone to show up with instructions. Your phone writes a JSON payload with the WiFi credentials and a device key. She saves it, reboots, and wakes up knowing where she lives. A day of reading about MTU sizes and prepared writes and I had it working.

Terminal output showing Askew Auk booting into BLE provisioning mode, advertising as Phoebe Sensor
The moment it worked. “BLE advertising as ‘Phoebe Sensor’ - waiting for provisioning…” I may have fist-pumped.

Twenty-four hours earlier this was a bag of parts. Now it was sitting on my desk, alive and looking for friends.

The iOS side

Building for iOS means Xcode, and Xcode means an entire parallel universe of concepts I have never fully understood and may never fully understand. I still don’t know what a CocoaPod actually is. I don’t know why there are separate debug, release, and profile build modes, or why switching between them sometimes means watching an M-series chip peg all its cores for 20 minutes recompiling things I didn’t change. I just know that periodically Xcode demands I accept a license agreement, update a provisioning profile, or restart it entirely before it will do anything.

The best part is when you finally get the app onto your phone and iOS asks if you trust this developer. The developer is me. I built this. And honestly? Fair question.

iOS Untrusted Developer dialog asking whether to trust ben@intrafocal.com, with Phoebe listed as Verified below
”Apps from developer ben@intrafocal.com are not trusted.” I am the developer. I don’t blame you, phone.

The whole flow

Askew Auk exists to test the provisioning path before the real boards arrive. No enclosure, no polish. Just a bare Feather, a soil sensor, some wires, and a thermal-printed receipt with a QR code. Scan it, and the app takes over.

Phoebe app scanning a QR code on a thermal-printed receipt, with the Askew Auk prototype board visible on the desk
The app scanning the receipt-paper QR code. Glamorous, this is not.

The app picks up the QR code, registers the device, connects over Bluetooth, hands it the WiFi credentials, and Phoebe starts watching your plant.

Phoebe app welcome screen showing Meet askew-auk-001 with bird icon
Meet askew-auk-001. She’s ready to work.
Phoebe app success screen reading askew-auk-001 is watching your Bedroom Testing
”askew-auk-001 is watching your Bedroom Testing.” Uh.
Sterling Archer saying PHRASING!

Are we still doing phrasing? I’ll fix that before anyone else sees it.

One of the hardest parts of the whole flow was getting NTP working so the device knows what time it is. Without it, every reading arrives timestamped January 1, 1970. Phoebe really wants to go back to the 70s. Groovy, baby.

Still to come: the full sensor package and a PETG enclosure that, hopefully, resembles a bird. For now it’s a pile of components on a desk that successfully provisioned itself over Bluetooth. I’ll take it.

The nerd heart

I’ve been a generalist my whole career and it’s never felt more useful than right now. Data science, self-taught programming from Allegro.cc game jams to Cloud Functions, a recent electronics habit, and a garden that got out of hand. None of it was a plan. All of it is in this project.

On a day like today, switching between a soldering iron and a BLE spec and a Flutter state machine, they stop feeling like separate skills. They’re one thing. And using all of them at once to get a sensor reading from a plant pot to a phone screen is absurd. And absurdly satisfying.

— Ben