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.
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.
More work

Interactive 3D WebGL Experience
A 3D WebGL piece with animated chrome letters, a neon grid and warp-speed stars. Move your mouse to pan the camera.

Interactive World Globe
A 3D globe of 2,000 points of light, built with Three.js. Pick the Netherlands, Suriname or England and the globe turns to that country, with a short text.

Interactive DOS Experience
An MS-DOS simulation with CRT effects and commands such as DIR, CD and TYPE. CAROUSEL.EXE sends ASCII blocks flying across the screen and opens a 3D carousel.
