Articles

Default Settings Are Production: Lessons from a Relay Rollout

Posted on Oct 6, 2026 · 5 min read · reliability

We tested a new WebSocket relay by changing the default settings, and customers behind strict firewalls lost live sessions. What I learned from it.

Telling someone don't do it - considered harmful

Posted on Jan 22, 2024 · 3 min read · engineering-practices

What I learned when a code-review comment of mine was taken as an order: explain the why, and treat review comments as discussion.

The Devil's Advocate Technique

Posted on Apr 3, 2023 · 2 min read · engineering-practices

Before presenting a design, list the questions your CTO, teammates and other teams will ask, and answer them first.

How Not to Get Stuck When Solving a Problem

Posted on Mar 30, 2023 · 3 min read · engineering-practices

Stuck on a bug or feature? Timebox it, take breaks, rubber-duck it or ask a teammate, instead of sitting at your desk until it's solved.

When Is a Feature Really Done?

Posted on Mar 27, 2023 · 5 min read · engineering-practices

Implemented, reviewed, tested, deployed: the levels of "done" I've seen, and why your team needs a shared definition of done.

Don't Build One-Off Solutions — Build Reusable Patterns

Posted on Mar 23, 2023 · 3 min read · architecture

Spot classes that solve the same problem differently, extract the common part into a generic pattern, and replace old code step by step.

How to Break Your App on Purpose: A Short Guide

Posted on Mar 21, 2023 · 8 min read · testing

A tongue-in-cheek guide to making your app buggy: skip unit tests and more, plus answers to the usual excuses for not testing.

How Making Coffee Helped Me Find a Bug

Posted on Mar 17, 2023 · 2 min read · debugging

A breakpoint that only fired while I was making coffee, and how the browser's idle API turned out to be the culprit.

Improve Your Workflow with Custom TODO Labels

Posted on Mar 14, 2023 · 2 min read · engineering-practices

Go beyond TODO and FIXME: set up custom IDE labels like IMPROVE or QUESTION to keep your code notes organised.

Designing for Graceful Failure by Separating Failure Domains

Posted on Mar 6, 2023 · 2 min read · architecture

How 150k emails a day exhausted a shared quota for all our apps, and why splitting quotas per service lets your system fail gradually.

Using the Blocking webRequest API with Manifest V3

Posted on Mar 3, 2023 · 2 min read · browser-extensions

Manifest V3 removed blocking webRequest, but enterprise and self-hosted extensions can still use it. Here's how, and the catches.

How to Choose Better Class Names

Posted on Feb 25, 2023 · 2 min read · engineering-practices

Stop agonising over class names: start with a temporary name like Foo, implement the logic, then name it by what it actually does.

Using Conditional Breakpoints

Posted on Jan 21, 2023 · 1 min read · debugging

How conditional breakpoints stop code only when it matters, with a browser-API listener example and tips for multithreaded code.

Debugging Manifest V3 Browser Extensions

Posted on Jan 19, 2023 · 2 min read · browser-extensions

A simple trick to catch what your Manifest V3 service worker does right after start: delay the code so you can open DevTools in time.

Understanding Common Software Development Errors

Posted on Jan 18, 2023 · 5 min read · engineering-practices

A subjective list of the most common causes of errors