diff --git a/monitor/buildkite_status.py b/monitor/buildkite_status.py
index 0dbaa10..3f9924b 100755
--- a/monitor/buildkite_status.py
+++ b/monitor/buildkite_status.py
@@ -4,9 +4,11 @@
 import logging
 from datetime import timedelta
 from functools import lru_cache
+
 # Base dict order not guaranteed until 3.7+
 from collections import OrderedDict
 from datetime import datetime
+
 # To convert time stamps
 # (use datetime.datetime.fromisoformat in Python3.7+)
 import dateutil.parser
@@ -37,12 +39,10 @@
             # strip to remove ending newline
             token = f.readline().strip()
         if not token:
-            logging.debug(err_msg.format(
-                "Buildkite API token file was empty"))
+            logging.debug(err_msg.format("Buildkite API token file was empty"))
             token = None
     except FileNotFoundError:
-        logging.debug(err_msg.format(
-            "Couldn't read Buildkite API token file"))
+        logging.debug(err_msg.format("Couldn't read Buildkite API token file"))
 
     return token
 
@@ -50,13 +50,14 @@
 @lru_cache(maxsize=None)
 def get_pipeline_builds(organisation, pipeline):
     return buildkite.builds().list_all_for_pipeline(
-        organisation, pipeline,
+        organisation,
+        pipeline,
         # Finished means passed, failed, blocked or cancelled
-        states=[BuildState.FINISHED])
+        states=[BuildState.FINISHED],
+    )
 
 
-def get_last_finished_build_status(organisation, job_name,
-                                   pipeline):
+def get_last_finished_build_status(organisation, job_name, pipeline):
     """
     Get information about the last finished build of a particular
     job. (where a job is one of the pipeline steps)
@@ -69,55 +70,53 @@
         # branches.
         # For the status page we ignore pre-commit and release builds.
         # ph_buildable_revision is set if Phabricator triggered this build.
-        if 'ph_buildable_revision' in build['env'] or \
-           build['branch'] != 'main':
+        if "ph_buildable_revision" in build["env"] or build["branch"] != "main":
             continue
 
         # Where each "job" is a config e.g. AArch64, MacOS, C++20 etc.
-        for job in build['jobs']:
+        for job in build["jobs"]:
             # Some jobs won't have a name. I think these are the wait steps
             # between jobs or groups of jobs.
-            if job.get('name') != job_name:
+            if job.get("name") != job_name:
                 continue
 
             # Some jobs were never started due to failures earlier in the pipeline.
             # This isn't our fault so ignore these.
-            started_time = job.get('started_at')
+            started_time = job.get("started_at")
             if started_time is None:
                 continue
 
             # We use started because that's when it starts to
             # run on the agent (don't want to include waiting time)
             started = dateutil.parser.isoparse(started_time)
-            finished = dateutil.parser.isoparse(job['finished_at'])
+            finished = dateutil.parser.isoparse(job["finished_at"])
             # Buildkite gives us mS resoloution but we don't need that
-            duration = timedelta(seconds=int(
-                (finished - started).total_seconds()))
+            duration = timedelta(seconds=int((finished - started).total_seconds()))
             # Time from buildkite ends up as UTC but now has no
             # timezone info by default
             now = datetime.now(finished.tzinfo)
-            time_since = timedelta(
-                seconds=int((now - finished).total_seconds()))
+            time_since = timedelta(seconds=int((now - finished).total_seconds()))
 
-            state = job['state']
-            failed = state != 'passed'
+            state = job["state"]
+            failed = state != "passed"
             status = {
                 # 'url' is the API url, we want a clickable link
-                'builder_url': job['agent']['web_url'],
+                "builder_url": job["agent"]["web_url"],
                 # We use the job's url because it takes you to the
                 # specific agent, instead of the build's url
-                'build_url': job['web_url'],
-                'number': build['number'],
-                'state': state,
-                'duration': duration,
-                'time_since': time_since,
-                'fail': failed,
+                "build_url": job["web_url"],
+                "number": build["number"],
+                "state": state,
+                "duration": duration,
+                "time_since": time_since,
+                "fail": failed,
             }
             return status
 
     logging.debug(
-        "Found no finished builds for job \"{}\" "
-        "on pipeline \"{}\"".format(job_name, pipeline))
+        'Found no finished builds for job "{}" '
+        'on pipeline "{}"'.format(job_name, pipeline)
+    )
     return dict(valid=False)
 
 
@@ -134,31 +133,29 @@
     buildkite.set_access_token(token)
 
     for server in config:
-        if server['name'] != "Buildkite":
+        if server["name"] != "Buildkite":
             continue
 
         if token is None:
             # We cannot query buildkite but we don't want to mark these
             # bots as offline because we don't know that.
-            for builder in server['builders']:
-                for job in builder['bots']:
-                    status[bot_key(job['name'])] = {'valid': False}
+            for builder in server["builders"]:
+                for job in builder["bots"]:
+                    status[bot_key(job["name"])] = {"valid": False}
             continue
 
         # If we have a valid token then we can get the real status
-        organisation = server.get('buildkite_org')
+        organisation = server.get("buildkite_org")
         if organisation is None:
-            raise RuntimeError(
-                "Buildkite servers must also have a 'buildkite_org'")
+            raise RuntimeError("Buildkite servers must also have a 'buildkite_org'")
 
-        for builder in server['builders']:
-            for job in builder['bots']:
-                job_name = job['name']
-                logging.debug("Getting status for buildkite job \"{}\"".format(
-                    job_name))
+        for builder in server["builders"]:
+            for job in builder["bots"]:
+                job_name = job["name"]
+                logging.debug('Getting status for buildkite job "{}"'.format(job_name))
 
                 status[bot_key(job_name)] = get_last_finished_build_status(
-                    organisation, job_name,
-                    job['buildkite_pipeline'])
+                    organisation, job_name, job["buildkite_pipeline"]
+                )
 
     return status
