Ten years on

Ten years ago today, on the blog for Project Dirigible, we announced that we’d recently launched a new site called PythonAnywhere. It almost didn’t happen! The project we were working on was something completely different, and it was only when we looked at how it was being used that we realised that it held the seed of a much better idea.

Project Dirigible was an online spreadsheet, based on Python. Unlike a traditional spreadsheet, where cells can hold only numbers, dates and text, it supported any Python type, so a cell could contain a list, an object, a numpy array, or even a function (so, if you don’t value your sanity very highly, you could write a formula like this: =A1(A2.value, A3[6], A4(A5))).

We’d been hoping that Dirigible would be the breakout success that Resolver One, our desktop Pythonic spreadsheet, had never been, and would help us free the world from the tyranny of Excel. It was getting some interest, with a reasonable number of people signing up and using it, but we’d discovered something odd:

When we asked Dirigible’s beta testers what they were using it for, a surprising number said that it was for general Python development online. They weren’t using the spreadsheet grid at all!

In retrospect, perhaps it shouldn’t have been so surprising. People want to write Python code, and sometimes they don’t have a computer with it installed to hand – and it’s always useful to have your code accessible so that you can work from anywhere. Programmers have flexibility in the tools they use and can relatively easily move to a new system. By contrast, spreadsheet users have a lot of existing documents that they want to keep, and many of them are far from being technical people. They really don’t want to move to something new.

So, we started PythonAnywhere. Here’s a potted history of what happened next.

Read more…

Glastonbury: a new system image, with Python 3.9 and Ubuntu 20.04

If you signed up for an account on PythonAnywhere after 21 June 2021, you’ll have Python 3.9 available – you can use it just like any other Python version. Additionally, the underlying operating system for your account will be Ubuntu 20.04, rather than the 16.04 used by older accounts.

If you signed up before that date, you’ll be on an older “system image” – essentially the version of the operating system and the set of installed packages that you have access to. You can switch to the new system image from the “Account” page, but you may need to make changes to your code and/or virtualenvs to make everything work – there’s more information on the linked page.

This post has more details on what’s new in the glastonbury system image. There’s a lot!

Read more…

June system update brings easier task management

The most recent system upgrade brings a new way to organize scheduled and always-on tasks. A new optional description field, combined with sorting, allows you to manage big herds of multiple tasks.

Under the hood there were some more, larger changes, but we’ll be announcing the details of those later.

Read more…

System updates on 10 February and 11 March

It’s been a year since PythonAnywhere went all-remote, but it has not slowed us down, and today was the time to deploy an exciting set of changes to our system.

Read more…

Brexit update

PythonAnywhere is a UK-based company, and the transition period for the UK’s exit from the European Union on will end on 31 December 2020. This will not have any visible effect for people who use our free service. For our paying customers outside the EU, including in the UK, there will also be no changes.

For paying customers inside the EU, the only effect should be that you’ll receive two billing reminders for January, a “pro-forma” one that will come at the usual time, just before your monthly payment is made, and another one later on in the month, which will be the formal “VAT invoice” required by EU tax law.

You will, of course, only be charged once; the second billing reminder will just provide some extra tax information. The remainder of this post is the details of why those two billing reminders will be sent, and we’re posting it here for those who like reading about tax laws…

Read more…

A Tale of Two Deployments

It was the best of times, it was the worst of times, it was the age of remote work, it was the age of pyjamas, it was the epoch of bread baking, it was the epoch of pineapple pizza, it was the season of Light, it was the season of Darkness… This is a short but exciting story about two system updates. Spoiler alert: no one has been guillotined.

Read more…

How to use Ansible to update your Django web app

Now, as you have overcome or evaded the reefs, shoals and swirls of initial development and deployment and your appetite grows, you ask “How do I automate the update and restart of my web app when I change the code?” There is already one simple and elegant method on our blog, that uses one of the possible push to publish methods, but this time we will dip our toes into vast waters of Ansible automation.

Read more…

Introduction to scheduled tasks helper scripts

For all PythonAnywhere users who like to automate their workflow using scripts there’s already the pythonanywhere package which provides an interface for some PythonAnywhere API features. If you’re one of them, you might be interested in some recent additions for programmatic management of Scheduled Tasks.

Read more…

Outage report 7 July 2020

tl; dr

We had an unplanned outage the day before yesterday; it was our first big one since July 2017. It was caused by an extremely unlikely storage system failure, but despite that it should not have led to such a lengthy downtime, and should not have affected so many people. We have some plans on what our next steps should be, and will be implementing at least some of them over the coming months.

The details

At 16:06 UTC on 7 July 2020, a storage volume failure on one of our storage servers caused a number of outages, starting with our own site and also with our users’ programs (including websites) that were dependent on that volume, and later spreading to other hosted sites. Because all of the data that we store on behalf of our users is backed up and mirrored, no data was lost or at risk, but the outage was significantly longer than we would like.

The effects were:

  • Our own site was unavailable or generating an excessive number of errors from 16:06 to 18:53 UTC.
  • For accounts that were stored on the affected file storage:
    • Websites were unavailable in general from 16:06 to 19:46 UTC, with some taking until 21:24 UTC to be fully available.
    • Scheduled tasks did not run between 16:06 and 18:53-19:46 UTC (the precise end time depending on the account)
    • Always-on tasks did not run between 16:06 and 18:53-19:46 UTC (the precise end time depending on the account)
  • For accounts that were not using the affected file storage
    • Scheduled tasks, and always-on tasks were unaffected apart from a short window of about five minutes between 18:53 and 19:46 UTC.
    • Websites were also unaffected apart from that window if they were already up and running when the problems started at 16:06 UTC. However, they could not be started up or reloaded between 16:06 and 18:53, and would have had a brief outage sometime between 18:53 and 19:46 UTC.
    • However, of course, the problems on our own site would also have affected the owners of these accounts if they needed to log in to run or change things.

This post gives a more detailed timeline of what happened, and describes what steps we are taking to prevent a recurrence.

Read more…

COVID-19 update: PythonAnywhere is now all-remote

Scary times. We hope everyone reading this is well and keeping safe!

We thought it would be a good idea to tell you how we’re managing the current crisis at PythonAnywhere. We switched over to remote working last Thursday, 12 March; there are obviously private and public health reasons why that was a good idea, but there’s a reason specific to us, which we thought would be worth sharing.

Read more…