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
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
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
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
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
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
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
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
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
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
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.
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
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
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
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
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
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
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
"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
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.
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
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
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
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
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…