Meta
How This Site Was Built
This page is the receipt. Coding Again Tomorrow sells AWS serverless architecture and AI-assisted engineering — so the site itself is the demo. Everything you're reading was built using Claude Code under senior engineering direction, deployed to AWS via CDK, and runs for roughly a dollar a month.
What's on display here
- Production AWS serverless: CloudFront + S3 + Lambda + API Gateway + SES, all live
- 100% Infrastructure as Code in CDK — the entire account is reproducible from this repo
- GitHub Actions OIDC deploy with no long-lived AWS credentials anywhere
- Static-site hosting with subpath URI resolution via the S3 website endpoint pattern
- Two Lambda functions handling the contact form and inbound mail processing
- Built end-to-end with Claude Code through senior-engineer prompt engineering
Architecture
codingagaintomorrow.com
│
┌───────▼────────┐
│ Route 53 │ hosted zone, alias, MX, DKIM
└───────┬────────┘
│
┌───────▼────────┐
│ CloudFront │ TLS (ACM), HTTPS redirect,
│ distribution │ cache, compression
└─┬───────────┬──┘
│ │
│ (POST /contact)
│ │
┌───────────▼─┐ ┌─────▼────────────────┐
│ S3 (site) │ │ API Gateway HTTP API │
│ website │ │ CORS pinned to site │
│ endpoint │ └─────┬────────────────┘
│ index.html │ │
│ 404.html │ ┌─────▼────────────────┐
└─────────────┘ │ Lambda (Node 22) │
│ contact form handler │
└─────┬────────────────┘
│
┌─────▼──────┐
│ SES │ ─► operator mailbox
│ SendEmail │
└────────────┘
Inbound: ┌────────────┐
domain MX ────────────────────►│ SES Receive│
│ rule set │
└─┬────────┬─┘
│ │
┌─────────▼──┐ ┌───▼──────────────────┐
│ S3 emails │ │ Lambda (Node 22) │
│ raw + │ │ inbound mail handler │
│ 30-day TTL │ │ (event invocation) │
└────────────┘ └───┬──────────────────┘
│
┌─────▼──────┐
│ SES │ ─► operator mailbox
│ SendEmail │
└────────────┘
Components
Route 53
DNS — hosted zone for codingagaintomorrow.com, alias records to CloudFront, MX records for SES inbound, DKIM/SPF for outbound deliverability.
ACM
TLS certificate covering apex + www, validated via Route 53 DNS records.
CloudFront
Global edge distribution — TLS termination, HTTPS redirect, compression, caching with optimized policy. Origin is the S3 website endpoint over http-only inside AWS.
S3 (site bucket)
Static website hosting with index.html / 404.html error document. Public-read bucket policy so the website endpoint serves /subpath/ requests natively. Astro build output synced here from CI.
S3 (email bucket)
Raw inbound email object storage with 30-day lifecycle expiration. Locked down: SES service principal write-only.
API Gateway HTTP API
Public POST /contact endpoint with CORS pinned to the site origin. Routes to the contact-form Lambda via HTTP integration.
Lambda — contact form handler
Node 22 function that validates the contact submission and delivers it to the operator mailbox via SES.
Lambda — inbound mail processor
Node 22 function triggered on SES inbound delivery. Reads the raw email from S3, re-wraps it, and routes it via SES outbound.
SES
Outbound delivery for the contact form and inbound mail processor. Inbound receipt rule set captures mail on the domain, stores raw messages to S3, and invokes the processor Lambda asynchronously.
CDK
TypeScript single-stack IaC for everything above, including the GitHub OIDC deploy role. Source of truth — no manual console changes.
GitHub Actions (OIDC)
CI pipeline assumes a scoped deploy role via OIDC — no long-lived AWS keys. Per-folder change detection: site sync, lambda update, CDK deploy run independently.
AI-Assisted Build
Every line of source on this site — Astro components, CDK stack, two Lambda handlers, the GitHub Actions workflow, even this page you're reading — was produced through prompt engineering with Claude Code under senior engineering direction. That's the model we apply to client work: a principal engineer driving an AI agent through tight, well-scoped iterations rather than handing it open-ended tasks.
It pays off in two places. Speed: greenfield site, infra, and CI in hours instead of weeks. Quality: code review, type checking, and CDK synth happen on every change, so an AI agent can't ship something the human didn't approve. The agent doesn't replace the principal engineer — it makes one principal engineer ship like a small team.
What that looks like in practice on this project: switching the CloudFront origin from OAC to a website endpoint when subpath routing broke; cleaning up bucket policies, ACL settings, and error-response behavior in the same CDK pass; adding a styled 404 page; commit, push, deploy — all completed in a single working session with the agent doing the typing and the engineer doing the judgment calls.
Estimated Monthly AWS Cost
| Service | Notes | Cost / mo |
|---|---|---|
| Route 53 | 1 hosted zone + low query volume | $0.50 |
| ACM | DNS-validated public cert | Free |
| CloudFront | Edge requests + egress at current traffic | < $0.20 |
| S3 (site + email) | Small storage + minimal requests | < $0.05 |
| API Gateway HTTP API | Per-million pricing, well under 1K req/mo | < $0.01 |
| Lambda (2 functions) | Both well inside the perpetual free tier | Free |
| SES | Inbound + outbound, well under 200 emails/mo | < $0.05 |
| GitHub Actions | Free for public repos / personal usage | Free |
| Approximate total at current traffic | ~ $0.75 – $1.00 | |
Figures are observed run-rate at low traffic. Costs scale linearly with request volume and SES email send count; the architecture has no fixed compute or load-balancer charges so an idle month and a busy month differ in pennies, not dollars.
Scales without rearchitecting
Every service in this stack is elastic by design. There's no fixed compute, no provisioned capacity to outgrow, no load balancer to right-size. The same code that handles a quiet month at a dollar will handle a viral spike at closer to a hundred — without a single re-architecture pass.
| Component | Scaling behaviour | To go higher |
|---|---|---|
| CloudFront | Global edge fleet — AWS handles autoscaling across hundreds of POPs. Cache absorbs the vast majority of read traffic before it ever reaches an origin. | No config change |
| S3 static hosting | Object storage with no capacity ceiling and 5,500+ GETs/sec per key prefix by default. The website endpoint is itself horizontally scaled by AWS. | No config change |
| API Gateway HTTP API | 10,000 RPS account default per region. The /contact route is intentionally throttled tight (1 RPS, burst 5) as an abuse cap — not a capacity ceiling. | Relax the route throttle in one line of CDK |
| Lambda | Concurrent execution autoscales — 1,000 concurrent per region by default, soft-limit raises available on request. Cold start is mitigated by short-lived handlers and small bundles. | No config change at typical small-business volume |
| SES | Sending quota grows automatically with reputation; production access lifts the sandbox cap. Inbound receipt rules scale to whatever the MX hands them. | Request production access once, then hands-off |
| Route 53 | Billions of queries handled at the platform level. Nothing to provision; cost scales per million queries. | No config change |
The only deliberate cap on this site is the API Gateway throttle on /contact, set tight to absorb abuse rather than legitimate traffic. Lift it when real demand exists. Nothing else in the architecture needs to change as traffic grows from a handful of visitors to several orders of magnitude more.
Full Stack
We can build this for you
If you want production AWS serverless delivered at this cost profile, with this level of IaC discipline and AI-accelerated turnaround, that's the engagement.
Start a conversation →