Moving from Fabric3 to Fabric

Posted on 15 June 2025 in Python, Linux |

I decided to see how long I could go without coding anything after starting my sabbatical -- I was thinking I could manage a month or so, but it turns out that the answer was one week. Ah well. But it's a little less deep-tech than normal -- just the story of some cruft removal I've wanted to do for some time, and I'm posting it because I'm pretty sure I know some people who are planning to do the same upgrade -- hopefully it will be useful for them :-)

I have a new laptop on the way, and wanted to polish up the script I have to install the OS. I like all of my machines to have a pretty consistent Arch install, with a few per-machine tweaks for different screen sizes and whatnot. The process is:

This works pretty well, and I've been using it since 2017. The way it interacts with the machine is by using Fabric. I've never taken to declarative machine setup systems like Ansible -- I always find you wind up re-inventing procedural logic in them eventually, and it winds up being a mess -- so a tool like Fabric is ideal. You can just run commands over the network, upload and download files, and so on.

The problem was that I was using Fabric3. When I started writing these scripts in 2017, it was a bit of a weird time for Fabric. It didn't support Python 3 yet, so the only way to work in a modern Python was to use Fabric3, a fork that just added that.

I think the reason behind the delay in Python 3 support for the main project was that the team behind it were in the process of redesigning it with a new API, and wanted to batch the changes together; when Fabric 2.0.0 came out in 2018, with a completely different usage model, it was Python 3 compatible. (It does look like they backported the Python 3 stuff to the 1.x series later -- at least on PyPI there is a release of 1.15.0 in 2022 that added it.)

So, I was locked in to an old dependency, Fabric3, which hadn't been updated since 2018. This felt like something I should fix, just to keep things reasonably tidy. But that meant completely changing the model of how my scripts ran -- this blog post is a summary of what I had to do. The good news is: it was actually really simple, and the new API is definitely an improvement.

[ Read more ]


Leaving PythonAnywhere

Posted on 5 June 2025 in PythonAnywhere, Personal |

Today was my last day at PythonAnywhere, the platform I co-founded back in 2011. We sold the business to Anaconda in 2022, and I'm confident that it's in good hands -- in particular, Glenn, Filip and Piotr from the original team are all staying on, and with the help of Nina, Lee and Alex who joined after the acquisition, plus the support of the larger Anaconda organisation, there's a fantastic future ahead for the platform and the community we've built around it.

It's been quite the ride! Back in late 2005, Robert, Patrick and I founded a company called Resolver Systems. Our goal was to free the world from messy Excel spreadsheets, and we built an amazing team1 that created an amazing tool, called Resolver One -- a spreadsheet designed to integrate Python from the ground up. Unfortunately we made all of the textbook startup mistakes -- in particular, building in secret for more than a year and only getting it in front of potential users when that was done. Added to that, we had the bad luck of releasing a product targeting financial users in 2008, just in time for many of our potential customers to start going bust. Ooops.

We pushed ahead for a while, but eventually in 2010 we pivoted to Dirigible, a cloud-based version of Resolver One -- a Pythonic spreadsheet, but web-based. And we'd learned our lession: we got it from idea to first release in less than a month, and started building up a group of active users.

Within six months or so, we realised that our users were using Dirigible differently to how we imagined. They were ignoring the spreadsheet grid entirely and just using it as a Python cloud IDE. "It would be great if I could host a website through this thing", they told us. "Any chance of adding on a MySQL database so that I can store stuff there?"

We had a direction to take it -- one that people really seemed keen on! So in early 2011, it was time to pivot again, and Dirigible-with-the-spreadsheet-grid-removed became PythonAnywhere.

From there, things started taking off; I posted about the first ten years on the company blog with the details, but I remember the milestones: cocktails under Smithfield Market when we hit 1,000 customers; the day our revenue covered our AWS bill; the day it covered everything except salaries, then everyone’s salaries except mine -- and then, the day we broke even, independent and sustainable.

A few years after that, towards the end of 2021, a mutual friend put me in touch with Peter Wang at Anaconda. We talked about possibilities for working together; after a while, the idea of an acquisition came up, and it was obviously the right move. We had a popular and growing platform with technology that allowed us to host hundreds of thousands of users efficiently enough to offer free accounts; with Anaconda's leading position in the Python market -- especially in data science -- and its resources, not only could PythonAnywhere grow faster and better, but we could also help Anaconda build new products to cement its position. So, after some negotiations, in June 2022 we became part of the Anaconda family.

There were sad moments too, of course; of the original team, only Glenn and I remained (both from the Resolver days). Jonathan had moved on not long after we pivoted to PythonAnywhere, then Hansel after we'd been running for a few years, then Harry 2, and then Conrad.

Now, finally, it's time for me to move on too. It's hard to leave -- I feel like I've been finding excuses to delay it for months!

But fourteen years is a long time to work on something, and the pressure of running a startup, followed by the stress of due diligence and everything else that goes into an acquisition, has all built up. I stayed on at Anaconda as PythonAnywhere team lead for three years after the sale to help with the transition and make sure everything was in good shape. And -- as far as one can be in a changing world -- I'm confident that it is now.

It's been an amazing fourteen years, and I'd like to thank everyone who was involved -- the team, of course, but also the community around the platform. To everyone who's ever signed up, subscribed, filed a bug, made a suggestion, or told a friend -- to all of our paying customers, and everyone who's supported us in other ways -- thank you! PythonAnywhere exists thanks to you.

So, what next? My plan is to take a year off to clear my head, reset, and relax. Sara, my wife, is betting that I'll last less than six months before I get bored and start something else.

She may be right.

In the meantime, you can expect posting to continue here as normal -- maybe even more than in the past, what with all the extra time :-)

And finally -- if you have any PythonAnywhere stories to share, please do leave a comment below. I'd love to hear from you!


  1. Including the inimitable Michael Foord, who was sadly taken from us before his time earlier this year. 

  2. Not only an awesome developer, but also a gonzo marketer par excellence, and the author of what is either the best or the worst company newsletter ever written