Custom Software.
Building, buying, and instrumenting the systems your business actually runs on.
40 articles · See the Custom Software service →
Rewrite or refactor: telling the difference honestly
Engineers reach for the rewrite when the code is unpleasant. The honest test is whether the problem is the code or your understanding of it.
How to run an agency build without losing control
Written by an agency, about the client behaviours that make projects go well. The good ones want you to read this.
How to remove a feature nobody uses
Every unused feature costs you on every future change. Removing one is easier than teams fear and harder than they expect.
The backup you have never restored
An untested backup is a belief, not a control. The restore drill takes an afternoon and is the only thing that turns one into the other.
Multi-tenancy: the decision that shapes everything else
How you separate one customer’s data from another’s determines your security posture, your migrations, and your pricing. Decide it deliberately.
Designing an API other teams can build on
An API is a promise you have to keep for years. The design decisions that make that survivable, made at the start.
Where the time actually goes in a slow web app
Almost never the language, almost always the database and the network. Measure before optimising anything.
Choosing a database, without the religion
For most business software the answer is a relational database. The interesting questions are the ones after that.
Data migrations: how to move without losing a week
The migration is never the hard part. Reconciling what arrived against what left is where the week goes.
Internal tools are the highest-leverage software you’re not building
Nobody gets promoted for shipping the admin panel. It’s often the highest-return thing on the roadmap anyway.
How to write a spec an agency can quote accurately
Vague briefs don’t get cheaper quotes, they get padded ones. What to include so the number you’re given is the number you pay.
Working with a legacy system you can’t replace
Sometimes the old system stays, for reasons that are entirely valid. How to build around it without inheriting all of its constraints.
Shipping safely: flags, staged rollouts and the off switch
The ability to turn something off in ten seconds changes how much risk a release carries. It is cheap to build and rarely built.
Configuration and secrets, done simply
Most environment-specific outages are a setting, and most credential leaks are a file that should never have been committed. Both are cheap to prevent.
Choosing a stack you can still hire for
The technology decision is also a recruitment decision, made years before you notice. How to weigh novelty against the labour market.
Writing documentation developers will actually read
Nobody reads the wiki. They read the four things they need at the moment something is broken or new.
Dates, times and the bugs they cause
The most under-estimated source of quiet data corruption in business software. A short list of rules that prevent most of it.
Logging: what to record and what to leave out
Too little and you’re blind. Too much and you’re paying to store noise you’ll never read — and possibly data you shouldn’t hold.
Do you need a mobile app or a good mobile site?
An app costs several times more to build and far more to keep alive. Three conditions justify it; nothing else does.
The technical debt you should keep
Not all debt accrues interest. Paying down the wrong kind is how teams spend a quarter and change nothing a customer notices.
Search is the feature everyone underestimates
It looks like a text box and a query. It is ranking, tolerance for error, and knowing what people actually meant.
How to instrument software so you can add AI later
The reason AI features are hard to add to existing systems is almost never the model. It’s that nothing was ever written down.
The admin user problem
Every system starts with two roles: normal and everything. The gap between them is where most access problems live.
The integration nobody owns
Every company has one: the script connecting two systems that one person wrote and nobody has looked at since. Here’s what it costs you.
Scheduled jobs: the code nobody watches
Nightly tasks fail silently for months because nothing complains. The fix is alerting on absence, not on errors.
Questions to ask a software vendor before you buy
The demo answers none of them. Eight questions whose answers determine what the next three years cost.
Receiving webhooks without losing events
Someone else’s system calls yours, once, possibly twice, possibly while you’re deploying. Four rules that make it survivable.
Why your dashboard doesn’t get used
It answers questions nobody asked, at a moment nobody is looking. Four fixes, none of which is another chart.
When to add a queue
Queues fix slow requests and unreliable dependencies, and they introduce a whole new category of failure. Three signals that it’s time.
Making sure your product’s email actually arrives
Password resets and receipts that land in spam are indistinguishable from a broken product. The setup is mostly DNS and restraint.
What “production ready” actually means
It works on the demo is not the same as it works on a Tuesday when the person who built it is on holiday. A checklist.
Six signs your software needs attention
None of them is that the code is old. All of them are things the business can observe without reading a line of it.
Protecting a public endpoint from abuse
Anything reachable from the internet will be probed, scraped and spammed. Four controls that handle most of it cheaply.
What you should receive at the end of a build
The working software is the smallest part of it. Seven things to have agreed before the final invoice.
How many dependencies is too many?
Every package saves a day now and costs a little forever. A test for whether the trade is worth making.
Why software estimates are wrong, and what to do instead
Not because engineers are optimistic. Because an estimate is a forecast of work nobody has fully specified yet.
Notifications: the feature that annoys everyone
Every stakeholder wants their event to notify. The result is a system users mute, which then fails to reach them when it matters.
Build vs buy in the AI era: the questions that decide it
Building got cheaper, which changed the maths but not the principle. Five questions that settle the argument faster than a spreadsheet.
What to automate in testing, and what to check by hand
Chasing total coverage produces a slow suite nobody trusts. A small, fast, meaningful set plus deliberate manual checks beats it.
Environments: how many do you actually need?
A staging environment nobody trusts is worse than none. What each one is for, and the property that makes it useful.