Privacy
The short version: there is no account, this site's own code sets no cookies, and nothing you type here is uploaded. Your answers, your code and your progress are kept in this browser and nowhere else. With every optional feature off, your browser talks to one third party, the CDN that serves the Python runtime, and only once you run code or lock in the course's first prediction, which starts that download early.
The rest of this page is the long version. The list of third parties further down is written by the program that builds the site, from the same settings that switch those features on, so it names what is on today and nothing else.
Stored in your browser only
The site keeps its state in this browser's localStorage, under keys that start
with hfp:. There is no server behind the site to send them to: it is a folder of
static files.
| Key | What it holds |
|---|---|
hfp:progress | What you typed into questions and recaps, the predictions you locked in, how you rated your own answers, which hints you opened, which labs passed, and when. |
hfp:code:… | Your code in each lab and cell, saved a second after you stop typing and whenever you press Run or Check. |
hfp:theme | Light or dark, if you chose one. |
hfp:supporter | Whether you ticked the honour-system box on the support page. |
hfp:py-seen | That Python has loaded here once, so the note about the first download is not shown again. |
Your code runs in your browser too. Python here is Pyodide, a build of CPython that runs inside the page, on your machine. The "model" your harness talks to in the labs is a scripted stand-in that ships with the page. No language model is called, and the site never asks for an API key. The last part of the capstone uses a real key, on your own computer, read from an environment variable. It never comes near this site.
Export, import, erase
The footer of every page has three controls. They need JavaScript.
- Export builds a file,
harness-progress.json, inside your browser and saves it to your machine. It contains everything in the table above except the Python note. It is not uploaded. - Import reads such a file from your machine into this browser. That is the only way to move progress to another browser or device.
- Reset erases your answers, code, progress and supporter flag from this browser, after asking once. It keeps your theme. Clearing this site's data in your browser settings erases everything, theme included.
The price of keeping nothing on a server is that there is no backup. A different browser starts blank, and so does this one after its site data is cleared. If your browser blocks storage, as some private windows do, the site still works and forgets everything when the tab closes.
What your browser requests, and from whom
This site's own host. Pages, styles, scripts, fonts and the lab files all come from the domain in your address bar. Like any web server, the host receives your IP address, your browser's user-agent string and the address of each file you ask for, and may keep them in its logs. The course's own code adds nothing to that: no cookies, no fingerprinting, no identifier.
Third parties. This is the generated list.
- The Python runtime. When you first press Run, your browser downloads Pyodide 0.27.7 from
cdn.jsdelivr.net. That CDN sees your IP address, as any CDN does. Nothing you type is sent to it. Fonts and every other file come from this site.
About the Python runtime, precisely: the download starts the first time you press Run, Check or "Run it and see". There is one exception. Locking in the first prediction on the home page or in lesson 1 starts it a little early, so that Python is ready when you reach the first Run. A page you only read never triggers it. The CDN can see your IP address, your user-agent and that the request came from this site. It receives none of your code or answers. Your browser caches the files afterwards. If you block that host, every lesson is still readable and nothing will run.
Links out. Lessons link to source files on GitHub, and a few pages link to other sites. Nothing is loaded from a linked site until you follow the link.
What changes when an optional feature is switched on
The owner can switch on the features below. Each one that is on appears in the generated list above. One that is not listed is off, and this site makes no request for it.
- Analytics. A cookieless page-view counter, loaded as one script on every page. It sees what any web request shows: the page address, the referring page, your IP address and user-agent. The site sends it no custom events. Your answers, code and progress are never part of it.
- Email updates. A plain HTML form on
/subscribe/and at the end of a few lessons and checkpoints. Submitting it sends your address straight from your browser to the email service. It does not pass through this site. If you never submit the form, nothing is sent. - Checkout. A link to a payment page run by a checkout provider. Card details go to
the provider and never to this site. The owner sees what the provider shows a seller,
typically your name, email address and what you bought. After a purchase the provider sends
you to
/thanks/, which sets the supporter flag in your browser and sends nothing anywhere. - A direct sponsor. A static link, with at most a logo image served from this site. Nothing is requested from the sponsor until you click. The link may carry a campaign tag so the sponsor can count arrivals on its own side.
- An ad network, as an alternative to a direct sponsor. Its script loads on pages that have a sponsor slot, after the page is idle and never while Python is downloading. The network sees your IP address, user-agent and the page address, and its own privacy policy is linked in the list above. Ticking the supporter box stops the script from loading at all, and so do most ad blockers. The site works the same either way.
Your data, your rights
Laws such as the GDPR give you the right to see, correct and delete data held about you. For everything on this site that right is a button: the data is in your browser, and Export and Reset are in the footer. The owner holds nothing of yours to look up or delete, unless you subscribed by email or bought something. Every email has an unsubscribe link, and the owner will delete your address from the list if you ask. Purchase records are kept by the checkout provider under its own policy.
Questions
There is no data-protection department here, only the person who runs the site. A contact address, when one is published, appears below and on the licences page.