OTA without A/B
A staged update mechanism for storage-constrained Linux devices that survives flaky cellular and partial writes — without doubling up on flash.
I work close to the silicon — Linux on iMX6ULL, ESP32, STM32 L-series — shipping OTA, drivers and Qt apps that have to keep working in the field.
Currently @ Halma India · open to embedded linux work
I'm a firmware engineer with four years of shipping embedded products — from eBike controllers to industrial Linux devices.
I like the layer where physics meets software: writing non-blocking drivers, tuning RTOS schedulers, fighting bandwidth limits to ship an OTA update, tracing weird behaviour with a logic analyzer at 2am.
Right now I'm at Halma India building a Qt/C++ Linux application on NXP iMX6ULL — customising device trees, cutting build times 4× with cross-compilation, and designing OTA mechanisms that work on storage-constrained hardware without A/B partitioning.
Off the clock: smart-home tinkering, finance reading, a long-running D&D campaign, and currently rebuilding a Raspberry Pi Zero 2W into a self-hosted homelab — which, yes, is what's serving this page.
A staged update mechanism for storage-constrained Linux devices that survives flaky cellular and partial writes — without doubling up on flash.
End-to-end firmware for a connected eBike: BMS control, brushless motor driving, BLE pairing, user profiles, and an OTA path through a phone app.
Custom Yocto image, tuned device tree, and a multi-process Qt/C++ application that cut response time in half on an industrial SBC.
This site. A Raspberry Pi Zero 2W running an ARMv8 build of nginx behind Cloudflare Tunnel, fronted by a static site I keep iterating on.
Reusable interrupt-driven state machines for concurrent peripheral I/O on bare-metal — read sensors without stalling the main loop.
cppcheck + flawfinder + clang-tidy wired into CI for an embedded codebase. Caught 30+ classes of bug before flash and made our review process honest.