Nine Times PHP — an ode to PHP in blue ballpoint

2026

An ode to PHP in blue ballpoint: nine versions from 1995 to 2026, four swearing programmers and charts that move on their own.

Nine Times PHP is one long page in a ruled spiral notebook, drawn and written in blue ballpoint. It is an ode to PHP in nine chapters: the PHP Tools of 1995, PHP/FI 2.0, PHP 3, PHP 4 with the Zend Engine, PHP 5, the never released PHP 6, PHP 7, PHP 8 and PHP 8.6, which is planned for 19 November 2026. The years and facts come from php.net.

Behind the text, very faint, real PHP code from all those years drifts upwards, from PHP/FI comment tags to the pipe operator. Each line is written letter by letter as it enters at the bottom, with a pen nib at its end. It is a canvas with columns at different depths, each moving with the scroll in its own way.

The drawings are a little elephant in five poses, a 1990s computer and four programmers. They were made with gpt-image-2 as ballpoint sketches; the poses are edits of the same drawing, so a character keeps its face and desk. A script removes the white paper, so only the ink lies on the notebook. An SVG filter makes the lines shift slightly eight times a second, as in hand-drawn animation.

In the intermission, Ruud, Sanne, Joep and Ria are at work. They type code, get a real error message on their screen, swear, fix it and laugh about it. Each has three such errors, from a forgotten semicolon and headers already sent to unexpected T_PAAMAYIM_NEKUDOTAYIM. Sometimes a colleague responds. A swear-o-meter, a scoreboard and a pie chart of a working day keep up. The four do not exist; their error messages do.

All charts and tables move by themselves. They are drawn with rough.js and redrawn again and again. In the table of search functions, needle and haystack swap places until the red pen puts them back. A form fills itself in, once with the name of Little Bobby Tables. The recursive acronym PHP: Hypertext Preprocessor grows until an error message appears, composer update gets stuck at 99 percent, and in a line chart PHP is declared dead now and then. Where the numbers are made up, the page says so.

It is TypeScript with Vite, without a framework, about 30 kB of JavaScript gzip. One requestAnimationFrame loop draws only what is on screen. The page is in Dutch and English. Unit tests in Vitest check, among other things, the real order of needle and haystack; end-to-end tests run in Chromium, Firefox and WebKit.

Technologies

TypeScript Canvas 2D SVG rough.js gpt-image-2 Vite Vitest Playwright

More of my work

Browse the full portfolio or read the blog.

More work