Start with the constraint
Cost, risk, delivery pace and organisational capability shape the useful design space.
reference architectures
how I approach decisions
Cost, risk, delivery pace and organisational capability shape the useful design space.
A decision is more credible when its rejected alternatives and residual risks are visible.
Ownership, observability, failure recovery and change paths belong in the architecture.
reference architectures
Live · AWS serverless
A static Next.js site on CloudFront and S3 with serverless integrations, least-privilege delivery roles and recorded trade-offs.
Full case study below ↓Open source · reference architecture
An autonomous nightly agent that audits an AWS account against the Well-Architected Framework, pairing deterministic scanners with an LLM.
Overview below ↓Live product
Architecture write-up in preparation.
Visit site ↗Live product
Architecture write-up in preparation.
Visit site ↗reference architecture · this site
The main constraint is irregular portfolio traffic. Static delivery keeps the common path fast and inexpensive, while managed AWS services handle the few operations that require compute. The trade-off is greater reliance on cloud service configuration and careful IAM boundaries.

component architecture
Static-generated Next.js, delivered from a private S3 bucket through CloudFront with Origin Access Control. No public bucket read; environment-scoped key prefixes keep dev and prod isolated.
Three Lambdas behind API Gateway: github-sync (daily EventBridge schedule), cv-download (a privacy-safe event, then a short-lived signed URL), and contact-form (validate, rate-limit, send via SES).
DynamoDB for projects, CV-download events and contact submissions — one table set per environment. A single S3 bucket holds static assets and the CV binary, prefix-isolated per environment (ADR-010).
Structured YAML and Markdown under content/, decoupled from the build so narrative, achievement and project edits need no code change.
how requests flow
deployment and delivery
Terraform across two environments (dev, prod) with remote state and locking. Terraform is the source of truth; pull requests expose the plan before merge.
CI authenticates to AWS via OIDC — no stored access keys. Production deploys are gated behind branch protection and explicit approval.
Build artefacts sync to S3 and CloudFront is invalidated on deploy. The common path is a cache hit, not a compute call.
trust boundaries
graceful degradation
implementation status
| Component | Status | Meaning |
|---|---|---|
| Static Next.js site | Live | CloudFront and S3 deliver the production portfolio. |
| API Gateway and Lambda | Live | Contact, CV and project integrations are deployed serverlessly. |
| DynamoDB, SES and S3 | Live | Managed persistence, email delivery and private CV storage. |
| GitHub project sync | Under review | Deployed, but the production token still needs to be populated. |
| API Gateway access logging | Planned | Disabled pending resolution of the account-level logging role. |
architecture decision records
Review the recorded context, alternatives and consequences in the source decision.
Review the recorded context, alternatives and consequences in the source decision.
Review the recorded context, alternatives and consequences in the source decision.
Review the recorded context, alternatives and consequences in the source decision.
Review the recorded context, alternatives and consequences in the source decision.
Review the recorded context, alternatives and consequences in the source decision.
Review the recorded context, alternatives and consequences in the source decision.
Review the recorded context, alternatives and consequences in the source decision.
Review the recorded context, alternatives and consequences in the source decision.
Review the recorded context, alternatives and consequences in the source decision.
Review the recorded context, alternatives and consequences in the source decision.
reference architecture · open source
An autonomous agent that runs on a nightly schedule against an AWS account, evaluating it against the six Well-Architected pillars. It compares live infrastructure with the declared Terraform, classifies drift, and pairs deterministic scanners with an LLM so findings stay evidence-backed rather than model guesswork — then writes them into the AWS Well-Architected Tool for human-in-the-loop remediation.

Prowler, Checkov, Steampipe/Powerpipe, Infracost, Compute Optimizer and Cloud Carbon Footprint produce evidence across the pillars — security, cost and sustainability findings are measured, not inferred.
A Claude model correlates scanner output with the declared IaC and prior findings from the RAG store. The LLM explains and prioritises; it never fabricates a control result.
Least-privilege per-stage IAM, cross-account AssumeRole with an ExternalId, and human-in-the-loop remediation — mapped to ISO/IEC 42010 and 25010, TOGAF ADM and the AWS Well-Architected and Cloud Adoption frameworks.
key decisions
my role
Architecture and decision records. I designed the runtime, detection strategy, LLM-portability model, IAM boundaries and governance mapping, and published the full ADR set, high-level design and business case.
stack
governance and review
ADRs capture material choices before implementation. Terraform remains the infrastructure source of truth, pull requests expose plans before merge, and operational follow-up stays visible rather than being presented as completed work.
Explore the architecture write-ups