Writing
Notes from the work. Mostly about running software rather than writing it.
When many small databases beat one big one
A tenant column on every table is the obvious design and the hardest one to walk back. What a pool of separate databases buys, and what moving a live tenant costs.
Getting a domain to p=reject without losing mail
Most domains publish a DMARC record that protects nothing. Here is the sequence from monitoring to enforcement, with the check that has to pass before each step.
Why three person companies abandon their CRM
Small teams do not abandon a CRM because it lacks features. They abandon it because keeping it truthful costs more than the answers it gives back.
Four visibility levels beat a page of toggles
Privacy settings built from independent switches produce thousands of states nobody has tested and users cannot picture. An ordered ladder of four is easier to build and to trust.
Which parts of a social timeline actually cost money
A timeline looks like one product and bills like twelve. Most of the features people worry about are cheap, and the two expensive ones are barely features at all.
What a Postgres, Redis, broker and search stack costs at rest
The interesting number for a conventional backend is not what it costs at scale. It is what it costs at zero, with four stateful services that cannot be switched off.
What breaks first when you stop maintaining a side project
One of our projects still loads perfectly. The sign-in form appears, you type an email, and nothing happens, because the hostname behind it no longer exists.
Launching an empty community site without faking it
A community platform with nothing in it looks broken rather than new. So you seed it, and months later your own statistics page is quoting a fixture file back at you.
A chat link beats a contact form for buyers on a phone
A contact form is infrastructure you have to run and a queue your buyer never agreed to join. Swap it for a chat link and most of the site can be a folder of files.
Rebuild the site, keep the URLs
Rebuilds lose traffic through addresses, not design. An inventory, three fates for every old URL, legacy identifiers kept in the new database, and what to check afterwards.
What to vary by country, and what to keep identical
Localisation is four separate jobs with four different costs. Which parts of a multi-country website earn their keep, and which just leave you sixteen pages to maintain.