
PhantomJS
» see phantomjs.org as it lived, on the wayback machine
~ the goodbye ~
I have read this name in other people's build output far more often than I have run the program. That is a real category of dead software. PhantomJS was a dependency, and a dependency announces itself by scrolling past during an install or by being the line where a build fails, neither of which is the same as being used.
Ariya Hidayat released it on 23 January 2011. It was a full WebKit engine, the same family that Safari came from, with the window removed and a JavaScript API put in its place. You wrote a script telling it to open a page and then click something, and it did that with nothing drawn on any screen.
That sounds like a small thing and it was not, because in 2011 there was no other honest way to do it. If you wanted a test to confirm that your JavaScript had rendered correctly, you needed a real engine, which meant a real browser, which meant a machine with a display attached to it. The standard workaround was Xvfb, a fake X server that Firefox would draw into while nobody watched. PhantomJS removed the pretending.
My own work has never been in that stack. The code I write runs on aircraft rather than in a browser tab, so this grave is written from outside the room, from the position of somebody who mostly encountered the thing when it broke.
~ the chronicle ~
| Born | 23 january 2011, by Ariya Hidayat |
|---|---|
| Peak | the default browser inside continuous integration around 2013 to 2016 |
| Killed | march 2018, repository archived |
| Lifespan | seven years, with the last two spent unmaintained |
| Made by | Ariya Hidayat and contributors, BSD licensed |
| Killed by | headless Chrome, shipped by the people who maintain the engine |
~ the breakout ~
By about 2013 it was everywhere in continuous integration. Karma launched it and CasperJS was built on top of it as a navigation layer. Most of the automated screenshot tooling of the period was a thin wrapper around it. It also became the standard answer to scraping a page that only exists after JavaScript has run, which is a use its author did not encourage and could not have prevented.
Building it was miserable, and that belongs in the story. PhantomJS carried its own copy of WebKit, so compiling version 2 from source could take hours and often did not finish at all. Most people used the prebuilt binary and hoped. The projects that could not use the binary went quietly looking for something else.
~ the day it died ~
Google announced headless Chrome in April 2017 and shipped it in Chrome 59 that June. It was the same capability coming from the people who maintained the engine, with a debugging protocol already attached to it.
Vitaly Slobodin, by then the only maintainer, posted that he was stepping down almost immediately afterward. His reasoning was neither bitter nor wrong. Chrome was faster and more stable than PhantomJS and he did not see a future for the project against it. Nobody took over. In March 2018 Ariya Hidayat archived the repository, which is the actual death and is why this grave carries a month rather than a day. The last release, 2.1.1, had shipped in January 2016.
~ what came after ~
Puppeteer came out of the Chrome team in 2017 and Playwright followed in 2020. Neither shares a line of code with PhantomJS and both are direct descendants in behavior. Everything the project argued for won completely. A browser is a program you can drive from a script and the screen is optional, and testing a web page means running the actual engine rather than an approximation of one.
Its reward for winning that argument was to be made unnecessary by the people it had spent six years working around. That is the ordinary fate of a tool built to fill a hole in somebody else's product. You demonstrate the hole for long enough and eventually they close it.
~ leave a rose ~
an anonymous tribute. one rose per visitor per day.
@}-->-- ... roses left here
~ leave a wreath ~
a rose fades by morning. a wreath stays on this grave for good, with your name on it.
from $1, paid once through stripe. it keeps the graveyard running: the hosting and the nightly digging. adopt it and the headstone reads "maintained in memory by" you. the groundskeeper plants new wreaths at the next tending, usually within a day.
» one email a week: new graves and the anniversaries of the dead. subscribe
other software: Multics, Program Manager, jQuery Mobile, Tome
also died in 2015-2019: Anki Cozmo, Justcoin, Amazon Local
~ leave a note ~
visitors before you have left these graveside notes. anonymous welcome.