By 2010, I was using Pyjamas to build a client application for Google App Engine. Pyjamas brought Google Web Toolkit’s approach to Python: a compiler, a widget set, and a desktop runtime. James Tauber created it, and Luke Leighton carried it for years, mostly alone. I had a lot of respect for him and for what he had built.
In May 2012 the project split. I organized the infrastructure changeover at pyjs.org. The python-list thread “Open Source: you’re doing it wrong - the Pyjamas hijack” criticizes that decision and how we carried it out.
The immediate disagreement was about www.pyjs.org, which failed while pyjs.org worked. A user reported it; I replied that I had already implemented and tested a redirect. Luke needed to update DNS; I lacked access to do that part. He declined.
Luke argued that omitting www saved traffic and typing, and that letting the address fail would discourage people from adding it. In March another broken link brought the issue back, with the same refusal.1 I found that difficult to understand. People were trying to reach the project, and we had a small fix that would let them.
I tell the www story because it is the smallest example I can point to. It was the tip of something much larger, and the hardest thing about this account is conveying what working with Luke was like day to day. This piece is my attempt to explain what was going through everyone’s head, mine included, as best I understood it.
There was a larger disagreement about infrastructure. Luke opposed GitHub because its service was not free software. He wanted to self-host the development tools, ultimately built in Pyjamas: website, repository browser, wiki, and mailing-list interface.2 I understood wanting tools we could control, and had helped build them. But maintaining that system competed with work on the toolkit, while newcomers encountered unfinished tools. Other contributors were raising the same concerns before the split.
Some of those exchanges became personal and openly insulting. I had spent a couple of years trying to work through them, hoping we could find a way to work together. My patience had run out before I had worked out a good way to proceed.
Other contributors had been discussing a fork since January. Lex Berezhny was the most direct about it. In February he wrote to ask about the forking plans. He had been stuck for days on a merge that broke output under pyv8, and with it the unit tests, and had ended up paying Luke to fix it; he did not feel he could put production systems on the project as it stood. He said that if I held off much longer he would fork on his own, and he registered a domain and started a repository that week.3 After the DNS disagreement, I approached Erik Westra, who owned pyjs.org, about buying the domain. He responded positively, though a transfer was not yet agreed.
By the time I wrote to a small group on February 8, I had archived the project’s material and preserved server access so I could make a final sync if needed. I was already talking with Erik about the domain. I wrote that doing this behind the scenes looked, and felt, a bit shady, and that I had no wish to oust Luke; I wanted him to keep working. The archive was preparation; the public changeover was still months away.4
I asked the group whether taking over pyjs.org was too aggressive, or right at all. Daniel Popowich did not favor a forceful DNS takeover. He thought the better course was a direct letter to Luke, asking him to hand over the project or see a fork compete with it, and he was open to a new name. After his and Jeff Kunce’s replies I leaned toward a separate project at uxpy.net. Jeff supported a change but asked whether we could sustain it and give Luke a graceful way to step aside. Kees Bos favored keeping pyjs.org together: a fork might leave Luke with an abandoned project, while a change of leadership could leave him a place in it. He also expected Luke to be angry and knew he might leave anyway.5
I found the chance of keeping the project together persuasive and chose to go ahead. Erik agreed to transfer the domain to me. The transfer was complete in March, weeks before the public changeover.
At the changeover, the repository was on GitHub under pyjs/pyjs. I announced the new infrastructure with documentation still missing, and the mailing-list migration caused more trouble. Some people who had disabled mail delivery received messages again; the list was subsequently disbanded and subscribers invited to a new one. The contemporary criticism records that disruption. I was responsible for the migration, and users had good reason to be upset.
I meant it when I said I wanted Luke to stay involved. I was also asking him to remain in a project whose direction he would no longer determine. I underestimated what I was asking of someone who had put so much of himself into the work.
When I wrote that the migration “was sanctioned by everyone necessary,” I meant the owner’s consent and the support of other contributors. I put too much weight on that support and too little on giving people time to understand and prepare for what was changing.
Luke answered with legal threats and public criticism. Discussions about neutral stewardship followed, but I was also uncertain whether I would still have a place in the project. I felt isolated and became defensive; some of my replies made a difficult situation worse.
Afterward I looked after the domain, package publishing, and moderation while we kept working on the code. We later merged giwebkit, a desktop backend using WebKitGTK through GObject introspection. I remember it as fast and promising. It could run substantial applications, but never made it into an official release.6
Lex worked through the changeover with me and gave a talk on the project that April. Later he carried the project: he moderated the list, merged pull requests, and kept pyjs.org running after I had stopped.7
If I did it again, I would probably still acquire the domain. I would fix the missing www record and make the redirect work, then give people time to decide what should come next. I don’t know whether that would have kept us together.
Years later, I considered offering the domain back to Luke. A researcher asking about the old PyPI package name brought us onto the same email thread. I offered to talk, but our replies returned to the old dispute. We never reached a discussion about returning the domain.8
In 2024 Lex reached out about returning to Python-to-JavaScript work and offered to take over the domain. I accepted in 2025 and transferred it and the GitHub organization to him. I am glad the work is still there, and grateful that he wanted to take it on.
Footnotes
My saved copies of “promoting pyjamas,” February 1–5, 2012, and “Fundraising, donation buttons, monetising pyjs.org,” March 7, 2012, on the Pyjamas development list.↩︎
Luke’s reply to “what is the preferred way to send patches?”, July 29, 2011, in my saved Pyjamas mail, explains both the GitHub objection and the goal of a complete self-hosted tool suite.↩︎
“fork,” February 14–15, 2012, and my chat logs with Lex from February through May 2012, in my saved mail; his pyjs-users posts from 2013 to 2015, including “The Grand Schism,” October 15, 2013, and the pyjs.org DNS repair of February 2015.↩︎
The January fork discussion, my February correspondence with Erik, the February 8–11 “OFFLIST” discussion, and Kees’s February 9 reply to “promoting pyjamas,” in my saved mail. My February 8 opening reports the archive, retained access, and the domain conversation; the follow-up records my second thoughts. The messages do not establish exactly when I made the copy relative to every conversation.↩︎
The January fork discussion, my February correspondence with Erik, the February 8–11 “OFFLIST” discussion, and Kees’s February 9 reply to “promoting pyjamas,” in my saved mail. My February 8 opening reports the archive, retained access, and the domain conversation; the follow-up records my second thoughts. The messages do not establish exactly when I made the copy relative to every conversation.↩︎
The August 2012 “GiWebKit backend (gobject-introspection)” thread records an application running and my enthusiasm about its speed. In October 2013 I confirmed that the backend was merged but still required manual selection and further work. The surviving release tags in
original-pyjsprecede the merge.↩︎“fork,” February 14–15, 2012, and my chat logs with Lex from February through May 2012, in my saved mail; his pyjs-users posts from 2013 to 2015, including “The Grand Schism,” October 15, 2013, and the pyjs.org DNS repair of February 2015.↩︎
“pyjamas pypi package,” July 13–14, 2021, and “Re: pyjs.org,” June 27, 2025, in my saved mail. Lex’s June message followed up on his original request of October 10, 2024.↩︎