Writing
Notes on decisions that were not obvious at the time — architecture, trade-offs, and the things that only show up in production.
- 6 min read
A provider-agnostic AI layer: put the model behind an interface
An assistant that calls one vendor’s SDK from its conversation code is tied to that vendor. The seam I put between the two, what belongs on each side of it, and what it makes cheap later.
AILLMOpenAINode.jsArchitecture - 5 min read
Verifying WhatsApp webhooks: why the raw body matters
Meta signs the exact bytes it sent. Verify the signature after your framework has parsed the request and you are checking a different message. Where the check belongs, and why it got its own service.
WhatsApp Cloud APIWebhooksNode.jsFastifyHMACLaravel - 5 min read
Flutter BLE with Pigeon instead of method channels
A Bluetooth mesh app has native radio code on two platforms and a wide border into Dart. Hand-written method channels made that border a runtime gamble; generating it with Pigeon made it a compile error.
FlutterDartPigeonBluetooth Low EnergyKotlinSwift - 6 min read
A stateful flow engine for WhatsApp, in Laravel
Parsing the chat log to work out where a customer is looks flexible and is a trap. Here is the state machine I used instead, and what it bought.
LaravelWhatsApp Cloud APIState machinesArchitecture
