How this site runs

The Java service behind these pages, and how it is built, tested and paid for. Every number here is either read from the running JVM or carries the date it was measured.

The JVM, right now

Java
—
Framework
—
Garbage collector
—
AOT cache
—
Object headers
—
CPUs
—
Memory it sees
—
Heap ceiling
—
Up for
—
Revision
—

Started with

  • —

The JVM’s own arguments, from api/jvm.args and the image’s entry point; only its -XX options are shown, never system properties.

Read from the running service when the page runs its script.

How a request travels

Your browserprerendered HTML first, then React
HTTPS load balancerone address, a managed certificate, Cloud CDN
/*
Cloud Storagethe site’s files, cached at the edge
/api/*
Cloud RunSpring Boot 4 on Java 25: one vCPU, 512 MiB, scales to zero
The site and its API share one origin, so there is no CORS and server-sent events pass straight through (ADR 0002). Nothing runs while nobody visits: the first request after a quiet spell starts a JVM, which in the benchmark on one vCPU is ready in about 3.5 s with the AOT cache, where the Java 21 image took 4.2 s (ADR 0009). The database, PostgreSQL on Neon, is optional: the API starts without it, connects on the first query that needs it, and migrates it before a deploy, never during a cold start (ADR 0012).

Startup, measured

ImageJVM readyFirst response after startMemory at idleAllocation-heavy requestCollections per request
Java 21 with a CDS archive, before4.23 s4,891 ms123 MiB341 ms731
Java 25 with an AOT cache, as shipped3.53 s4,245 ms170 MiB342 ms256

Median of ten cold starts each, in a container limited to one vCPU and 512 MiB, on 3 October 2026: docs/measurements/startup-2026-10-03-0224.md. The full table, the method and why the memory went up are in ADR 0009.

Tests and gates

  • 877API testsJUnit 6, in 141 classes
  • 537web testsVitest, in 65 files
  • 95%of mutants killedPIT on the pure logic: 1301 small faults planted, and the build fails below 90%
  • 32 of 32packages null-checkedNullAway in JSpecify mode, with Error Prone, warnings as errors
  • 19architecture rulesArchUnit: no cycles, experiments independent of each other, no field injection
  • 30API operationsin the public reference, generated from the code, each with a recorded response
  • 19,321lines of Javaand 14,391 of tests
  • 29,667lines of TypeScript9,758 of CSS, 6,611 of tests

On every push to main and every pull request, CI runs the unit tests on Java 25, a start that fails if the AOT cache does not match, a scan of the image for known vulnerabilities and a scan of the history for secrets. The tests that need a database and the mutation tests run locally, not in CI. The bill of materials is public: /api/sbom/application (ADR 0010).

Counted from the build reports on 8 November 2026 by web/scripts/engineering-facts.mjs.

What it costs

PartA monthWhy
HTTPS load balancer$18–20the forwarding rule: the only fixed cost
Cloud Run$0within the free tier at this traffic; nothing runs while nobody visits
Cloud Storage and CDNcentsa few megabytes of files and their egress

In all about $18–20 a month, from October 2026 list prices before the first bill: infra/gcp/README.md.