Blog

Our thoughts on technology and design

Data Engineering
Distributed systems often struggle with data consistency. In this post, I explore how the Transactional Outbox pattern helped us solve this challenge in a client project, and how it compares to CDC and Event Sourcing.
Delivery
Increasingly, I’m seeing that government procurement is not giving suppliers the chance to demonstrate their ability to deliver meaningful social value. In this blog, I explore what government procurement sets out to achieve, what is actually happening, and how things could be improved if the government simply heeded its own guidance.
Tech
For junior developers just starting with CSS, the vast array of available length units can feel overwhelming. This post offers a clear breakdown of the main categories - absolute units; relative units, which adapt better to different screen sizes and accessibility settings; viewport units and niche units.
Tech
When I wanted to learn a new programming language and a new programming paradigm, I decided to cut my teeth on a practical problem.
Testing
AI is reshaping the testing landscape, but it can’t replace the value of human judgement. In this post, I explore how experience, intuition and healthy scepticism remain essential to building better software.
Testing
Automating Playwright visual test maintenance with GitHub Actions simplifies updating baseline screenshots across platforms. By running tests on both Windows and Linux via a workflow, developers avoid manual setup and ensure consistent UI validation, even when third-party libraries like CO2.js change underlying data.
Tech
Learn how to build a custom, user-friendly search language using ANTLR and Elasticsearch. We'll cover grammar design, query parsing, and indexing techniques to turn plain user input into powerful search results.
Delivery
Messaging-based communication tools such as Slack and Microsoft Teams are commonplace in development teams, often being the main platform for textual communication. “Channels” are a key concept in these tools for organising communication. How these are organised and used makes a big difference to their effectiveness and in turn the overall effectiveness of the team communication. In this post, I’ll share my thoughts on what makes a good approach, and provide some example channels based on what I’ve seen work well in projects of various natures and sizes.
Testing
Switching testing teams in the middle of a live project can feel like changing pilots mid-flight — risky if you’re unprepared, smooth if you’ve planned it right. In this post, we’ll look at how to hand over testing between vendors without letting quality or deadlines slip.
Tech
In this post, I describe how your business can assess whether a system is ready for modernisation and, if so, how to set your project up for success. I then explain why, in most cases, you’ll probably want to take an incremental approach rather than replacing the old system in one fell swoop. I end by providing an example of one of the ways your business can do this – by using Event-Driven Architecture.
Tech
In the course of building a new system for a client over the past year, we evaluated and selected a couple of commercial software products to use as components of that system. In this post, I’ll share some observations and thoughts which may be of interest or help you with your next selection.
Cloud
A quick guide to implementing a test framework for IAM permissions using the AWS IAM Policy Simulator API and a tiny hack.
Artificial Intelligence
Poor AI implementation can reduce motivation and identity—hindering business performance and employee wellbeing. Here’s why your AI strategy needs a human touch.
Delivery
When it comes to legacy modernisation projects, there’s a kind of rework – let’s call it ‘cultural rework’ – that organisations often seem to accept as an inevitable part of their investment. In this blog post, I look at some of the main cultural, team and human challenges that arise on legacy modernisation projects, and how they can be tackled.
Tech
I have recently come off my first client project, which I was part of for 9 months, and so I wanted to reflect on everything that I learnt during that time.
Testing
Testing an event ingestion service is critical for ensuring reliable, scalable event-driven architectures. This blog dives into our approach to testing an ingestion service integrated with Azure Event Hubs, covering the testing strategy, tools, and process flow, with a detailed diagram to illustrate the pipeline.
Artificial Intelligence
After building a React application with three AI assistants, our developer discovered that extracting your conversation history afterwards is like trying to collect debts in a frontier town: ChatGPT eventually pays up after some serious negotiation, Claude charms you while keeping the vault locked, and Copilot confidently hands you a treasure map to gold buried on someone else's land. The lesson? These AI partners can help you build impressive applications but somehow can't easily tell you what you discussed last Tuesday, so document as you go or risk spending more time archaeological than architectural.
Tech
After two decades of working with highly regulated organisations, we've developed some strong opinions about legacy systems some of which run counter to prevailing industry narratives. Whilst other consultancies and vendors push their "proven frameworks" and "transformational roadmaps," we've watched well-intentioned modernisation initiatives stumble over the same fundamental misunderstandings about what legacy systems actually are and why they persist. This blog covers what we've learned about the uncomfortable realities that these frameworks rarely address.
Artificial Intelligence
In this instalment, I discovered that Cursor IDE transformed my chaotic multi-AI orchestra of wayward soloists into something rather more like a proper piano duet, successfully refactoring my 847-line monolith into modular components without the usual algorithmic amnesia. I found that when your IDE becomes your coding partner, you stop waving the baton at three separate musicians who occasionally abandon the sheet music for their own creative interpretations and start playing chamber music, even when you accidentally set fire to the entire score and your duet partner rescues the concert from almost certain disaster by magically producing a fresh copy from the archives.
Artificial Intelligence
A non-React developer built a trade lifecycle simulation using three AI assistants as his coding team, discovering that managing AI agents is rather like conducting an orchestra where each musician excels at different parts of the piece but occasionally abandons the score for a spot of impromptu improvisation. The project demonstrated that whilst AI collaboration can be very useful, someone still needs to wave the baton when your string section decides to have a go at bebop when they should be playing Beethoven.

Authors