What we build, with the bill attached.
Each case shows the architecture, the decisions we took and what we left out on purpose, with the monthly cost line by line. We start with our own platform, because it is the one we can publish without asking anyone. Client cases follow as they authorise them.
Two cases so far.
Three apps with database, backend and frontend for 12 USD a month
One Graviton instance, MySQL and three backend containers behind Caddy, frontends on S3 and CloudFront, no public IPv4. Less than a managed database on its own.
Read the case Cloud · AWS · WebA bilingual website and a React app served for cents
One bucket, one CloudFront distribution and a 40-line function for clean URLs. Fonts self-hosted, TLS from ACM, one deploy script for both.
Read the caseHosting three apps with database, backend and frontend for as low as 12 USD a month.
Our own platform: three web applications, each with a frontend, an API and a MySQL database, running in production on AWS. The whole thing costs less than a single managed database instance, with no trick we would not recommend to a client.
| Line item | What it covers | USD / month |
|---|---|---|
| EC2 t4g.small, one-year Compute Savings Plan | MySQL 8, three backend containers and Caddy, 730 hours. No upfront payment; 13.4 USD on demand | 8.5 |
| EBS gp3, 20 GB | Operating system, images, database volume and certificates | 1.8 |
| Route 53 | One hosted zone and DNS queries for all subdomains | 0.6 |
| EBS snapshots | Daily incremental backup of the volume, three days retained | 0.4 |
| S3 and CloudFront | Three static frontends and one distribution per app, also in front of the APIs; TLS certificates from ACM | < 0.1 |
| Public IPv4 address | None. The instance is IPv6-only and CloudFront reaches it over IPv6. Would be 3.7 USD | 0 |
| Data transfer out | CloudFront covered by its free tier; first 100 GB a month from EC2 free | 0 |
| Total | One-year commitment on the instance only | ≈ 11.5 |
How it is built
A single Docker Compose stack for shared infrastructure: MySQL with a 128 MB buffer pool, phpMyAdmin reachable only from the instance, and Caddy as reverse proxy. Each app adds its own compose file with a 512 MB backend container on the shared network. CloudFront sits in front of everything, terminates TLS and talks to the origin over IPv6, so the instance needs no public IPv4. Administration goes through Session Manager, which is free.
What it does not give you
No high availability: one instance in one zone, so a maintenance event means minutes of downtime. Restore is from the daily snapshot. It fits internal tools, early-stage products and demos. When one app needs more, move only that one to Fargate or RDS and keep the rest where it is. We stop here on purpose: a t4g.micro or a three-year reservation would shave a few more dollars at the expense of headroom or flexibility.
Prices for eu-west-1 (Ireland) in September 2026, before taxes. The same stack on demand, with a public IPv4 and seven days of snapshots, comes to about 20.5 USD a month.
A bilingual website and a React app served for cents.
This site and Skyline's web app share one S3 bucket and one CloudFront distribution. English at the root, Spanish under /es/, the app under /app/. No server, no framework on the public pages and nothing loaded from third parties.
| Piece | Decision | Why |
|---|---|---|
| Storage | One private S3 bucket, read only by CloudFront through origin access control | No public bucket, one place to sync |
| URLs | CloudFront Function rewrites /cloud to /cloud.html and /es/ to /es/index.html; .html and /index.html URLs redirect to the clean form | One canonical URL per page |
| Languages | English by default, Spanish in /es/ with hreflang in every page and in the sitemap; the language switch points at the same page in the other language | Right page in each market |
| Cache | HTML five minutes; fonts and the app's hashed assets one year and immutable; the app's index.html never cached | Instant publishes, cheap repeats |
| Errors | S3 returns a real 404 and CloudFront serves a custom 404 page with the site navigation | No blank error screens |
| TLS and DNS | Certificate from ACM on the custom domain, zone in Route 53 | Free certificate, automatic renewal |
| Edge locations | Price class 100: CloudFront edges in Europe and North America only, where the audience is | Lowest per-GB rate |
| Deploy | One script builds the app, syncs the site and the app with their cache policies and invalidates the distribution | One command, under two minutes |
How it is built
The public pages are plain HTML files with a shared stylesheet, written to load in one round trip: fonts preloaded, critical layout in a single CSS file and SVG diagrams inline. The React app is built with Vite and lands under /app/ with hashed file names, so only its entry document needs a short cache. The whole thing is described in Terraform next to the rest of the platform, and the same distribution fronts the APIs of the hosting case above.
What it does not give you
No server-side rendering and no content management system: editing a page means editing HTML and running the deploy script. That is fine for a site of a dozen pages maintained by engineers. If marketing needs to publish daily, we would put a static site generator in front and keep the same bucket and distribution.
Prices for eu-west-1 (Ireland) in September 2026, before taxes. CloudFront's always-free tier covers 1 TB of transfer and 10 million requests a month. The hosted zone is already counted in the hosting case.
Want your case to look like this?
A ten-day, read-only assessment gives you the numbers first.