Pricing Install

The codebase, measured

Everything below is counted out of this repository's git history at the moment the running image was built. No number here was typed by hand, none of it is rounded in our favour, and a week of writing code without tests would show up on the second chart the day it happened.

145,977

lines of application code

1,248 files under app/src

203,023

lines of tests

882 PHPUnit classes, 55 Playwright specs

8,824

test cases

8,697 unit and functional, 127 browser flows

1.39×

test code per line of code

was 0.90× on day one

96 days, 1,505 commits on main, 87 of those days with a commit on them. That is about 1,494 lines of application code and 2,091 lines of test a day, every day, including the ones nobody worked.

Code, and the tests that hold it

The PHPUnit suite has been larger than the application it tests since the second week, and the gap has widened since.

  • PHPUnit tests 196,232 lines
  • Application code 145,977 lines
  • Playwright suite 6,791 lines
  • as at 23 Oct
A line chart of lines of code per day. Application code rises from 2,591 lines to 145,977; the PHPUnit suite from 2,330 to 196,232; the Playwright suite from 0 to 6,791. 0 50k 100k 150k 200k 20 Jul 7 Aug 22 Aug 9 Sep 25 Sep 10 Oct 23 Oct

Test code per line of application code

The one chart here that can go down. Shipping a feature with its tests barely moves it; shipping one without them bends it, and it does not recover on its own.

  • Test lines per line of code 1.39×
  • as at 23 Oct
A line chart of the ratio of test code to application code per day, from 0.90× to 1.39×. 0.0× 0.5× 1.0× 1.5× 20 Jul 7 Aug 22 Aug 9 Sep 25 Sep 10 Oct 23 Oct

Unit and functional tests

Counted as PHPUnit counts them, before data providers multiply them.

  • Test methods 8,697
  • Test classes 882
  • as at 23 Oct
A line chart of PHPUnit test methods and classes per day, reaching 8,697 methods across 882 classes. 0 2.5k 5k 7.5k 10k 20 Jul 7 Aug 22 Aug 9 Sep 25 Sep 10 Oct 23 Oct

Browser flows

Playwright, driving a real browser against a real stack in CI on every pull request.

  • Browser flows 127
  • Spec files 55
  • as at 23 Oct
A line chart of Playwright flows and spec files per day, reaching 127 flows across 55 specs. 0 50 100 150 20 Jul 7 Aug 22 Aug 9 Sep 25 Sep 10 Oct 23 Oct

Everything else

The templates a page is drawn from, the migrations the database is built by, and the prose explaining why any of it is shaped as it is.

  • Twig templates 26,536 lines
  • Documentation 27,496 lines
  • Build & ops scripts 19,942 lines
  • Migrations 9,665 lines
  • Frontend assets 3,748 lines
  • Configuration 3,483 lines
  • as at 23 Oct
A line chart of the remaining parts of the repository per day: templates, documentation, scripts, migrations, frontend assets and configuration. 0 10k 20k 30k 20 Jul 7 Aug 22 Aug 9 Sep 25 Sep 10 Oct 23 Oct

Where the 439,870 lines are

Today's tree, by the same buckets the charts use. Vendored dependencies are not counted, and neither are the four sibling repositories — the CLI, the tray app, the Terraform provider and the shared Go client are checked out here but released on their own cadence, and folding them in would make the curve mean nothing.

Bucket Files Lines Share Since day one
PHPUnit tests 935 196,232 44.6% +193,902
Application code (PHP) 1,248 145,977 33.2% +143,386
Documentation 88 27,496 6.3% +27,117
Twig templates 331 26,536 6.0% +26,341
Build & ops scripts 162 19,942 4.5% +19,872
Doctrine migrations 164 9,665 2.2% +9,195
Playwright suite 71 6,791 1.5% +6,791
Frontend assets 36 3,748 0.9% +3,635
Configuration 43 3,483 0.8% +3,196

How this is counted

One sample per day.
Taken from the last commit on main that day, walking first-parent — the state a merge shipped, not the intermediate states inside somebody's branch. Days nobody committed on are absent rather than carried forward, so a flat segment is a real quiet fortnight and not an invented point.
Lines are lines.
Blank lines and comments included, because deciding which comments count is a judgement and this page is trying not to make any. Binary files and vendored dependencies are excluded; so are the four sibling repositories checked out alongside this one.
Tests are counted the way the suite runs them.
public function test* under tests/ and test( in a .spec.ts — the same three patterns App\Service\Testing\TestSuiteMetrics uses for the lozenges on the front page, so the two cannot drift. The executed count is higher: data providers multiply methods, and projections multiply flows.
Coverage is a gate, not a measurement.
There is no coverage report inside a running container, and there could not be one describing this exact build. What there is instead is a promise CI keeps on every push: the suite runs under coverage and the build fails below 100% of app/src. Lower that gate and the boast lowers with it, in the same commit.

Measured at build from commit f5d0cdc6, . The whole series is available as /codebase.json.