Software with a purpose.

AI, integration and development in the context of real work. Articles for people making decisions about business systems.

20 articles

An open laptop on a wooden desk beside plants

Website accessibility starts with a real task

Finding a document, completing a form and receiving a response. Accessibility needs to work throughout the journey, across different ways of using the site.

Two developers working with source code on monitors

An AI agent inside a business system: who permits its actions?

When AI reads documents and calls tools, source content cannot define its permissions. Design narrow operations, specific approvals and prompt injection tests.

A person using a website on a laptop at a wooden desk

Core Web Vitals: a fast website matters after loading too

LCP, INP and CLS in actual use. Distinguish a lab test from visitor experience and choose changes that improve reading and interaction.

A laptop displaying source code on a work desk

An older system: what to keep and what to change first

A complete replacement may be the right approach. The decision needs an understanding of dependencies, critical processes and the options for gradual change.

Testing a mobile interface beside a laptop

A new mobile version and an older API: preparing a safe release

Users do not update a mobile app simultaneously. Plan API compatibility, gradual distribution, error monitoring and a response to release problems.

Server drive bays with green status indicators

Database migration during operation: compatibility, locks and rollback

Expanding a PostgreSQL schema in stages, backfilling data in batches and checking locks. What must be true before you remove the old column.

A mobile phone beside a laptop keyboard

Mobile sign-in: OAuth, PKCE and session renewal

Sign users in through the system browser, protect the return to the app and handle expired tokens without repeated or concurrent login attempts.

A laptop and printed material on a wooden desk

Enterprise RAG: permissions and tests before polished answers

Preserving document permissions in retrieval, handling prompt injection and measuring retrieval separately from the quality of generated answers.

Paper, a pen and a keyboard on a white work desk

Secure file uploads: from the form to storage

A PDF extension and a successful upload are not enough. Design quarantine, content checks, private links and permissions for business portal attachments.

Close-up of a mobile phone displaying app icons

Push notifications: sent, delivered and read are different events

Why a successful FCM or APNs response is not enough. Designing a notification history, message expiry, device registrations and delivery measurements for iOS and Android.

A laptop displaying source code on a desk by a window

Monitoring with OpenTelemetry: where did the order go?

The API reports success but the order is missing from the ERP. Connect metrics, logs and traces across a queue to find the failed processing step.

A person using a mobile phone at a desk

An app without a signal: designing offline data and synchronisation

Local data, pending operations, retries and conflicts. A practical design for a mobile app that preserves a user's work when the connection fails.

Open server hardware with cooling fans

MySQL backups: what a restore exercise must verify

A green backup job does not prove the service can be recovered. RPO, RTO, binary logs and a practical check of the database, files and application.

Server cabinets in a data centre

Production webhooks: signatures, duplicates and recovery

Separating event receipt from processing, controlling duplicate deliveries and repairing a transfer without repeating its business effects.

Close-up of a laptop screen displaying source code

A slow order list: EXPLAIN, indexes and pagination

Query count, unsuitable indexes and a large OFFSET can slow a list down. Measure the bottleneck and design predictable PostgreSQL pagination.

Network cables connected to server equipment

API idempotency: retrying a request without a second order

A timeout does not confirm failure. Designing an idempotent operation, protecting concurrent requests in the database and testing duplicate writes.

A network cable connected to Ethernet ports

Transactional outbox: when the database commits but the message fails

An order can exist while the warehouse never receives its event. Outbox design, message identity, acknowledgement boundaries and recovery after worker failure.

Two people reviewing printed documents

ERP and CRM: agree on data rules before connecting them

An API is one part of an integration. You also need to know which system decides, what is transferred and how a failed transfer is fixed.

A keyboard in front of monitors displaying source code

API security: keeping each customer's data separate

A valid login does not decide which order a user may open. Object checks, verified tenant context and tests for APIs, exports and background jobs.

A team working together with laptops at a table

Your first AI pilot: choose a task you can evaluate

A useful starting point has available source material, a person responsible for the process and a clear way to tell whether the result helped.

Have a process
that needs to change?

Let’s start with how you work today. We’ll choose the technology around it.

Discuss your project