Remote-first teams: the async discipline that actually works
As a freelancer I've worked with a lot of remote teams. Some had async figured out, others wanted everything synchronous. Here's what…
JavaScript bundle splitting: when dynamic import actually pays off
Splitting the bundle is the universal advice, but it doesn't help in every situation. With real measurements, when it's actually worth it.
Multi-currency WooCommerce: skip the plugin, write the code
Instead of paying $70 for a plugin and inheriting messy behaviour, I wrote a tight implementation for the requirement. What I built…
Server-Sent Events vs WebSocket: when SSE is the smarter pick
WebSocket gets the hype but it's overkill for a lot of real-time scenarios. When SSE is the better fit, with examples from…
iOS Camera and Photos: the permission flow that ships
Asking for camera and photo permissions the wrong way gets your app rejected or chases users away. The flow that works, and…
Retry and idempotency for long-running jobs: the strategy that holds up
One email went out twice. One payment was charged twice. What happens when retry design skips idempotency, and how I fixed it.
CI/CD pipeline from 20 minutes to 4: the exact moves
I brought a team's build time down from 20 minutes to 4. Which optimisation bought which minutes, in detail.
Third-party script performance: what Tag Manager actually costs you
Google Tag Manager, ads pixels, chat widgets. All of them arrive with a "we're fast" pitch. The performance metrics tell a different…
ACF Pro done right: flexible content and clone fields without wrecking the editor
Flexible content and clone fields are two of ACF Pro's strongest features, and two of the easiest to misuse. Here is how…
Batch vs streaming API endpoints: picking the right one for the client
Send one giant batch or stream the chunks? I've shipped both in production. Here are the factors that decide it.
MapKit, Google Maps, Mapbox on iOS: which one and when
I've shipped all three map SDKs on separate projects. Here is where each one earns its keep and where each one falls…
Stateless backends don’t remove state, they move it somewhere more expensive
Stateless design doesn't solve every problem, and it invents a few new ones. Here is what I've actually hit in production, and…