• Why the AI Tool Stack Often Fails Small Estate Agencies

    Why the AI Tool Stack Often Fails Small Estate Agencies

    A few months ago I sat in on a conversation with the owner of a small letting and sales agency – eight staff, three branches, the kind of business that’s been quietly profitable for fifteen years without anyone in it particularly caring about software. She’d just come back from an industry conference with a list.

    An AI receptionist to answer out-of-hours calls. An AI tool to write listing descriptions. Virtual staging for the vacant flats that never photograph well. A “predictive” lead-scoring platform that promised to flag sellers before they knew they wanted to sell.

    (more…)
  • The App Your Nephew Built With AI Is a Liability, Not an Asset

    The App Your Nephew Built With AI Is a Liability, Not an Asset

    There is a conversation happening in businesses everywhere at the moment.

    Why should we pay a developer for this? I built something similar with Claude over the weekend.

    And, increasingly, that statement isn’t ridiculous.

    Claude, Codex, Replit, Lovable and the growing army of AI coding tools can produce remarkably good software remarkably quickly. Someone with limited programming experience can describe what they want and, a few hours later, have something that looks and behaves like a real application.

    It logs users in. It stores data. It sends emails. It talks to an API. It has a nice dashboard.

    It works.

    And that’s precisely where the problem starts.

    Because “it works” and “it is safe to run a business on” are two very different things.

    (more…)
  • Stop Abusing Queues: System.Threading.Channels in .NET

    Stop Abusing Queues: System.Threading.Channels in .NET

    Every .NET codebase I’ve worked on eventually grows a “background work” problem. A request comes in, something slow needs to happen as a result, and nobody wants the user staring at a spinner while it does. So someone reaches for Task.Run and forgets about it. Then someone else wraps a ConcurrentQueue<T> in a while (true) loop with a Thread.Sleep(100). Then a third person adds a lock because two consumers started fighting.

    None of that is necessary. .NET has had a purpose-built answer since Core 3.0, and it lives in a namespace most people have never opened: System.Threading.Channels.

    (more…)
  • Laravel’s Pipeline Class Is the Feature You Keep Reinventing

    Laravel’s Pipeline Class Is the Feature You Keep Reinventing

    If you’ve ever written a service method that looks like a staircase of if statements, each one nudging the same array along before handing it to the next, you’ve written a pipeline. You just did it by hand.

    Laravel ships with a proper one. It’s been in the framework for years, it’s what the middleware stack is built on, and hardly anyone reaches for it directly. Which is a shame, because it solves a very specific, very common problem: you have a thing, you want to run it through a series of steps, and each step should be its own small, testable class.

    (more…)