All blog posts
List of all tags
Message Queues: When to Use Kafka, RabbitMQ, or SQS
A direct comparison of three message queue systems — Kafka, RabbitMQ, and Amazon SQS. What each one actually does, where each one breaks, and how to pick without second-guessing yourself six months later.
Securing My Ubuntu Server — Part 3: Zero Trust with Cloudflare Tunnel
Closing port 22 for good. Using Cloudflare Tunnel to route SSH and web traffic through Cloudflare's network with zero publicly exposed ports, then locking it down further with Cloudflare Access.
Securing My Ubuntu Server — Part 2: Firewalls, Fail2Ban, and Zero Open Ports
Defense in depth for your VPS: configuring UFW, layering DigitalOcean's cloud firewall on top, and using Fail2Ban to automatically ban malicious IPs before they get a second chance.
Securing My Ubuntu Server — Part 1: Initial Setup, User Management, and System Hardening
The absolute must-have steps I personally took to lock down a brand-new DigitalOcean Droplet: sudo users, SSH key auth, application-specific users, sudoers, and a basic firewall.
VIPER Was a Cage. Now It Is a Ruin.
VIPER promised clean iOS architecture. What it delivered was bureaucracy. SwiftUI made the case worse: the pattern is now structurally incompatible with how Apple wants you to build apps.
Tools, Not Religions
The endless debates about which framework is best, which language wins, and which library is the GOAT all share one thing: they're asking the wrong question.
Is TCA Really That Good?
An honest look at The Composable Architecture. What it solves, what it costs, and when you actually need it.
MVVM in SwiftUI
The debate over MVVM in SwiftUI misses the point. We should be asking what a ViewModel is actually supposed to do inside a framework like SwiftUI.
Certificates in Apple Development
Every signed app carries a chain of trust back to Apple. This is what certificates are, what the different types authorize, and what the signing infrastructure actually looks like.
The Speech Framework in iOS 26
Apple completely overhauled the Speech framework. SpeechAnalyzer replaces the old recognizer with a modular pipeline.
Metal Shading Language, Part 7: The Standard Library and Writing Real Shaders
The Metal standard library is where the language becomes practical. Math functions, geometric operations, atomics, synchronization. Everything you reach for when writing shaders that do real work.
Metal Shading Language, Part 6: Textures, Samplers, and Reading Image Data
Textures carry spatial layout information that flat arrays do not, and samplers do more than interpolate. Together they form a specialized memory access system with filtering, mipmapping, and coordinate wrapping built into the hardware.
Metal Shading Language, Part 5: Threads, Threadgroups, and the Dispatch Model
How a kernel goes from a function definition to ten thousand simultaneous executions. The thread ID system, threadgroup sizing, and the rules that connect your Swift dispatch to the Metal code that runs.
Metal Shading Language, Part 4: Address Spaces and Where Data Lives
GPU memory is divided into four address spaces, each with different performance characteristics, access rules, and lifetime semantics. MSL makes them explicit: every pointer carries one.
Metal Shading Language, Part 3: Vectors, Matrices, and the Art of Swizzling
MSL's type system is built around the math of graphics. Vectors and matrices are first class primitive types with dedicated syntax and hardware instructions. Here is how they work.