The tools I use, and why.
Notes on the software behind client projects, written for the person paying for the work. Each one ends with the short version: what it means for your costs, your risk and your independence.
n8n or custom code? Where I draw the line on automations
Visual workflow tools are brilliant until the third exception. How I decide, and what it means for your running costs.
Read
n8n or custom code? Where I draw the line on automations
Visual workflow tools are brilliant until the third exception. How I decide, and what it means for your running costs.
n8n lets you wire services together on a canvas: when an email arrives, pull the attachment, post it somewhere, ping a channel. For a simple, linear job it is quicker to build than code, and a curious member of your team can follow what it does by looking at it.
The trouble starts with exceptions. Once a workflow has branches for missing purchase orders, duplicate invoices and suppliers who send three PDFs in one email, the canvas becomes harder to read than the code would have been, and much harder to test. My rule: if I can describe the job in one sentence with no "unless", it goes in n8n. If it needs an approval step or more than a couple of exceptions, it becomes a small Python service with tests.
Local models with Ollama: when they are good enough for client data
Keeping documents on your own hardware is appealing. Here is where a local model holds up and where it does not.
Read
Local models with Ollama: when they are good enough for client data
Keeping documents on your own hardware is appealing. Here is where a local model holds up and where it does not.
Ollama makes it straightforward to run open-weight language models on a machine you own. Nothing leaves the building, there is no per-request bill, and you are not affected by a provider changing its terms.
In my testing on the homelab, local models are dependable for narrow jobs: pulling fields out of an invoice, classifying an enquiry, summarising a document into a fixed template. They are noticeably weaker at long, multi-step reasoning, and they need a reasonably capable machine with a graphics card to be quick. I always test both options against a sample of your real documents before recommending one.
Why your app runs on Docker Compose, not Kubernetes
The boring choice keeps your bill and your dependency on me small. When that stops being true, I will say so.
Read
Why your app runs on Docker Compose, not Kubernetes
The boring choice keeps your bill and your dependency on me small. When that stops being true, I will say so.
Kubernetes is built for organisations running many services across many machines with a team to look after them. A small business app is usually one web service, one database and a background worker on one server.
Docker Compose describes that in a single readable file. Any engineer who has used containers can understand it in minutes, it runs on an ordinary virtual server, and upgrades are one command. If your app genuinely outgrows a single machine, moving on from Compose is a well-trodden path.
Tailscale for small offices: remote access without opening ports
Reaching the office server from home used to mean a VPN appliance or a hole in the firewall. There is a calmer way.
Read
Tailscale for small offices: remote access without opening ports
Reaching the office server from home used to mean a VPN appliance or a hole in the firewall. There is a calmer way.
Tailscale builds a private network between your own devices. Your laptop at home can reach the office server as if it were on the same desk, without the server being visible to the rest of the internet at all.
For a small team it is quick to set up, works on phones, and access can be removed for a leaver in seconds. It does depend on Tailscale's coordination service; for clients who want no outside dependency at all, the open-source Headscale project can stand in, at the cost of a little more upkeep.
Postgres is probably the only database your business needs
Customer records, search, queues and AI document lookups, in one well-understood place.
Read
Postgres is probably the only database your business needs
Customer records, search, queues and AI document lookups, in one well-understood place.
PostgreSQL has been in steady development for decades and is supported by every hosting provider worth using. With the pgvector extension it can also power the "search your own documents" features that AI projects often need, so there is no separate specialist database to pay for and back up.
One database means one backup routine, one thing to monitor and one set of skills for whoever looks after your system next.
Backups you have actually restored: my restic routine
A backup is a hope until you have restored from it. What I set up, and what I check every month.
Read
Backups you have actually restored: my restic routine
A backup is a hope until you have restored from it. What I set up, and what I check every month.
restic takes encrypted, de-duplicated backups to almost any storage you like, including cheap off-site object storage. Encryption happens before anything leaves your server, so the storage provider cannot read your data.
The routine matters more than the tool: nightly backups, an automated integrity check, and a restore to a spare machine once a month, with the result written down. The first restore test is part of every handover.
Fixed price or day rate? How I quote, and why
Why most of my work is fixed price, when it is not, and what a fair change request looks like.
Read
Fixed price or day rate? How I quote, and why
Why most of my work is fixed price, when it is not, and what a fair change request looks like.
Day rates move the risk of a project being underestimated on to you. Fixed prices move it on to me, which is where it belongs, because I am the one estimating. The price is only fixed once the scope is written and agreed, which is why the scope is so specific.
If you want something added mid-project, you get a short written note with the cost and the effect on the date before anything changes. Open-ended work, such as investigating a failing legacy system, is the exception: that is time-boxed and billed by the day, with a cap.
Letting an AI agent near your accounts: the guardrails I insist on
Agents can do real work. Here are the rules that decide what they are allowed to do without asking.
Read
Letting an AI agent near your accounts: the guardrails I insist on
Agents can do real work. Here are the rules that decide what they are allowed to do without asking.
An agent that reads invoices and prepares draft bills saves real time. An agent that can approve payments on its own is a liability, however good the model. The difference is in the permissions, not the AI.
Every agent I build gets read access to what it needs, write access only to drafts, and an approval queue for anything that sends money, emails a customer or deletes data. Every action is logged with the agent's reasoning in a sentence, and before going live it runs in shadow mode against real past cases so we can compare its choices with yours.