Every cover on this blog is a cyberpunk neon infographic made with OpenAI's gpt-image-1. This is what happened when I tried to reproduce that exact style locally on a MacBook Pro M5 Max, with no API: which open models match the aesthetic, why none of them can render small legible text, and the composite workflow that closes the gap.
Blog
Technical articles on engineering, research, and leadership.
Fine-Tuning an Open-Weight Large Language Model for Kubernetes Troubleshooting on Apple Silicon
A reproducible, end-to-end pipeline that turns Qwen2.5-Coder-14B into a focused Kubernetes troubleshooting assistant, trained with MLX on a single MacBook Pro M5 Max and deployed through llama.cpp. The twist: every training example is authored by Claude Opus, making this a worked example of distilling a strong closed model into a specialized open-weight one.
Part two of fine-tuning Qwen2.5-Coder-14B into a Kubernetes troubleshooting assistant. The first run proved the pipeline on 47 examples and overfit instantly; the obvious fix was more data. This is what happened when I scaled the synthetic dataset from 65 to 2,053 examples, generated it with Claude Code subagents instead of a paid API, and watched the validation loss actually fall.
What I learned getting A/B OTA updates working on real hardware with RAUC and systemd-boot. Covers EFI boot entry failures, custom bootloader handlers, per-slot kernels, atomic ESP writes, and automatic rollback.
What I learned applying CIS Benchmark controls to an embedded Linux device. Covers kernel hardening, SSH configuration, firewall rules, AppArmor, filesystem restrictions, and CVE management — which controls were worth it and which were not.
Notes from figuring out containerized Yocto builds with KAS. Covers the YAML layering model, commit pinning, sstate-cache economics, and the failures I ran into when builds stopped working.