Skip to content

Technology

How we build, and why it is built that way

This page is about engineering decisions rather than a list of frameworks. The tools change per project; these principles do not.

Engineering principles

Five things we hold to

Each of these has a cost. We accept that cost because the alternative usually surfaces later, in production, at a worse time.

Reliable by Design

Error handling, input validation, monitoring and recovery are designed with the feature, not retrofitted after the first incident. A system that fails should fail visibly and predictably.

API-first

Anything another system needs to reach is exposed through an explicit interface with a defined contract, so integrations do not depend on internal implementation details.

Security-conscious

Secrets, authentication, authorisation and validation belong on the server. Client code is treated as public, and permissions are granted at the narrowest scope that works.

Maintainable

Fewer moving parts, conventional patterns and readable code. Complexity is added only when the problem requires it, because someone else will maintain this later.

Measurable

Systems that matter operationally carry logging, analytics and health checks, so questions about behaviour and cost can be answered with data instead of assumptions.

Architecture

Architecture principles

Defaults we start from. Deviating is fine when there is a reason, and the reason gets written down.

  1. 01 Static where possible
  2. 02 Serverless where practical
  3. 03 Clear API boundaries
  4. 04 Least-privilege secrets
  5. 05 Structured data
  6. 06 Observable services

Applied to this website

The site you are reading follows the same rules. Pages are pre-rendered static HTML served from Cloudflare's edge network, so a page view involves no server-side rendering and no database query. The only code that runs on request is the small set of API functions under /api: a health check, the service catalogue, the contact endpoint and the payment endpoints reserved for future use.

  • Frontend Static HTML and CSS, with JavaScript only where an interaction requires it
  • API Serverless functions with server-side validation and consistent JSON shapes
  • Storage Contact submissions in a managed SQL database, no third-party form service
  • Secrets Environment-scoped, never present in the client bundle or the repository

You can check the health endpoint yourself: /api/health.

Capability areas

Technical scope

The areas we work in day to day. Where something falls outside this scope, we say so rather than learning it at your expense.

AI / LLM Integration

Task-specific model use with validation, fallbacks and cost visibility.

APIs

Versioned HTTP interfaces, webhooks and authenticated service boundaries.

Automation

Scheduled and event-driven jobs with retries, logging and exception queues.

Data Processing

Normalisation, validation and transformation across structured and text data.

Cloud Infrastructure

Serverless and edge deployment, environment separation, managed secrets.

Web Applications

Accessible, responsive interfaces with server-side validation throughout.

System Integration

Connections between operational systems with explicit ownership of each field.

Analytics

Operational reporting and measurement built on the same data the system uses.

Tools we use

Languages
TypeScript, Python, SQL
Interfaces
REST APIs, Webhooks, Server-side rendering
Data
Relational databases, Object storage, Structured logging
Platform
Cloudflare, Serverless runtimes, CI-based deployment
AI
Hosted AI APIs, Prompt versioning, Output validation

Have an existing system to review?

If you already have software in place, an assessment is usually more useful than a rebuild. We can review the current implementation and tell you what is worth keeping.