Skip to content

Thinking

Technical articles on AI, development tools, cloud architecture, and software engineering.

Thirteen Adobe and Office clones written with Claude: we built and ran all of them
Artificial Intelligence

Thirteen Adobe and Office clones written with Claude: we built and ran all of them

PhotoCraft and its 12 siblings went viral in October 2026. We cloned the repositories, built every app on a Mac, tested PSD files, memory and the MCP servers. What works, what the parity numbers really say, and where the legal and security questions are.

EU AI Act Article 50 for a small team: what to do if you have a chatbot
Artificial Intelligence

EU AI Act Article 50 for a small team: what to do if you have a chatbot

Article 50 of the EU AI Act has applied since 2 August 2026. What it means for a small company with a chatbot or AI-generated content: provider or deployer, disclosure, marking, deadlines and fines.

Your agent doesn't need the whole internet: egress control and permissions on AWS
Cloud

Your agent doesn't need the whole internet: egress control and permissions on AWS

How to limit what an AI agent can reach and do on AWS: Network Firewall domain allowlists, why DNS filtering alone fails, one IAM role per agent with session policies, approval gates and a kill switch.

Opus 5.5 vs Fable 5.1: what you get for 60% less per token
Artificial Intelligence

Opus 5.5 vs Fable 5.1: what you get for 60% less per token

Claude Opus 5.5 costs $4 / $20 per million tokens, Fable 5.1 costs $10 / $50. A session-level cost comparison, the breaking changes from Opus 5, and when Fable 5.1 is still worth the price.

Claude Haiku 5.5 in production: when the cheap model is enough
Artificial Intelligence

Claude Haiku 5.5 in production: when the cheap model is enough

Claude Haiku 5.5 costs $0.10 / $0.50 per million tokens with a 1M context. What it is good for, the 100K price cliff, the breaking changes from Haiku 4.5, and a real cost comparison with Sonnet and Opus 5.5.

Fargate vs App Runner cost: the same app, priced both ways
Cloud

Fargate vs App Runner cost: the same app, priced both ways

Fargate vs App Runner cost, calculated for the same Next.js app: list prices, ALB, public IPv4 and NAT included, and the break-even point where Fargate wins.

How we rescue and refactor: a platform migrated off a low-code tool, one year later
Development

How we rescue and refactor: a platform migrated off a low-code tool, one year later

In 2025 a US client handed us a business platform that runs their partner programme: onboarding, product listings, monthly earnings, payouts in several…

How we build cloud and DevOps: three accounts, one CDK codebase, and no cluster
Cloud

How we build cloud and DevOps: three accounts, one CDK codebase, and no cluster

We operate AWS for our own products and for a client platform with real users and real money flowing through it.

How we build AI integration: a two-week spike, a golden dataset, and a bill you can predict
Artificial Intelligence

How we build AI integration: a two-week spike, a golden dataset, and a bill you can predict

Three AI systems we built are in production today. A research assistant for a US client, running on AWS Bedrock with an orchestrator and ten specialised…

How we build web applications: the first three weeks, and the year after
Development

How we build web applications: the first three weeks, and the year after

This year we shipped two very different web platforms with the same method.

I pay $200 a month for Claude. Here is what it would cost at API prices.
Artificial Intelligence

I pay $200 a month for Claude. Here is what it would cost at API prices.

Claude Max vs API pricing, measured: 38 days of Claude Code on the $200 plan would have cost $3,203 at API list prices. The method, the numbers, the subsidy.

Infrastructure as code does not mean Terraform. CDK, Pulumi, and the question that actually decides it
Cloud

Infrastructure as code does not mean Terraform. CDK, Pulumi, and the question that actually decides it

Somewhere around 2019, "infrastructure as code" became a synonym for Terraform in most conversations, the way "search" means Google. It is a reasonable default.

What Claude Code wrote of our infrastructure, and what we refused to merge
Artificial Intelligence

What Claude Code wrote of our infrastructure, and what we refused to merge

We use Claude Code for infrastructure work daily, on a platform we run for a US client: CDK stacks, deploy scripts, IAM policies, alarms, runbooks.

Queues without Kafka: SQS, EventBridge, and the one place we actually needed a stream
Cloud

Queues without Kafka: SQS, EventBridge, and the one place we actually needed a stream

Every platform reaches the moment where a request does too much. The checkout handler sends an email, updates the search index, notifies the warehouse, records…

DynamoDB single-table or Postgres? How we chose, per workload, and where we got it wrong
Development

DynamoDB single-table or Postgres? How we chose, per workload, and where we got it wrong

The DynamoDB versus Postgres debate is usually argued as a religion. One side says relational data belongs in a relational database and single-table design is…

Docker images for Node in 2026: multi-stage, distroless, and the 1.1 GB image that became 140 MB
Development

Docker images for Node in 2026: multi-stage, distroless, and the 1.1 GB image that became 140 MB

How a multi-stage, distroless Dockerfile took our Node/Next.js image from 1.1 GB to 140 MB: the full Dockerfile, what broke, and the before/after numbers.

A monorepo with three apps: how we build only what changed, and got the pipeline from eight minutes to three
Development

A monorepo with three apps: how we build only what changed, and got the pipeline from eight minutes to three

Three Next.js applications, four shared packages, one repository. That's the shape of the platform we run for a US client, and it's the right shape: shared…

Rate limiting: at the edge, in the gateway, or in the app? Three layers, three jobs
Cloud

Rate limiting: at the edge, in the gateway, or in the app? Three layers, three jobs

"Add rate limiting" is a one-line ticket that hides three different problems.

Health checks that lie: six ways your service says "ready" when it isn't
Cloud

Health checks that lie: six ways your service says "ready" when it isn't

A health check is a contract between your application and the thing that routes traffic to it.

Backups you've never restored aren't backups. A restore drill, timed.
Cloud

Backups you've never restored aren't backups. A restore drill, timed.

Every AWS data store has backups turned on by default or by a checkbox. Aurora keeps automated backups. DynamoDB has point-in-time recovery. S3 has versioning.

An incident runbook for a team without on-call
Cloud

An incident runbook for a team without on-call

Big companies have on-call rotations, incident commanders, severity matrices and a tooling budget to match.

Rotating the database password without downtime: the thing you've been putting off
Cloud

Rotating the database password without downtime: the thing you've been putting off

Everyone agrees the database password should rotate. Almost nobody's does, and the reason isn't laziness.

WAF for a Next.js app: the managed rules that block legitimate traffic, and what we did about them
Cloud

WAF for a Next.js app: the managed rules that block legitimate traffic, and what we did about them

Turning on AWS WAF in front of a web application is one CDK construct and a checkbox's worth of managed rule groups.

Secrets in CDK: Secrets Manager, Parameter Store, and never anything in the template
Cloud

Secrets in CDK: Secrets Manager, Parameter Store, and never anything in the template

A CloudFormation template is a text file. It's stored by CloudFormation, it's in cdk.out on every developer's disk, it's in the CI logs from the last synth…