Writing
Deep dives into the systems from the homepage: how they actually work, what went wrong along the way, and why.
A marketing site is only as good as its ability to represent the truth of the product. Cityroam does that by making the route, the city, and the rider experience the center of the story.
The Cityroam brand system turns a GPS ride tracker into a crisp product identity: a route glyph, a skyline, and a restrained dark palette designed for night riding and urban movement.
Adding NAVEE scooter support meant reverse-engineering an encrypted challenge-response handshake with no SDK and no documentation, and a real device abstraction underneath it. Here is what the protocol turned out to be, and the one inverted assumption that made an early draft loop forever.
How Cityroam went from wrapping Tuya's Direct BLE SDK to a from-scratch Kotlin GATT client with no SDK, no cloud dependency, and no ongoing Tuya requirement at all, and what it actually took to get the frame format, encryption, and handshake right.
Why the Cityroam landing page is a hand-built Astro site instead of a template, and the small interaction details, phone-frame galleries, a shared lightbox, scroll-snap on touch, that make a one-page site feel considered instead of thrown together.
How the Cityroam backend goes from a textbook power equation sourced from real engineering references to a per-rider, per-mode regression fit, why descent gets no regen credit, and what happens to the model below 20% battery.
Why this site is a static Astro build with a dark-first engineering-notebook aesthetic, how the content is structured to prove how I work rather than just claim it, and the small design rules that keep it coherent.
Why some stacks in my home lab are Ansible and some are GitOps, what 82 written ADRs have actually caught, and two real incidents from a self-hosted voice assistant.
How Cityroam talks directly to the board over BLE, why a linear battery-percent range estimate was not good enough, and what a self-hosted OSRM instance is doing in a personal project.