Changelog

What's new

Everything we've shipped to RunPy since launch, new features, improvements and fixes, in the order they went live.

  1. HTML Projects: multi-file sites with images, CSS and a live preview

    • Creating an HTML file is now creating a project. One click on + New Project sets up a folder, drops a starter index.html inside, and opens the IDE on it. The student dashboard and the teacher Files page both swap the HTML + File button for the new project flow.
    • Inside a project the sidebar is locked to that project only, so other sites stay out of the way. It has three fixed sections, HTML, styles and images, each with its own + HTML, + CSS or + Image action. New files have their extension chip locked so a student can't accidentally save page instead of page.html.
    • CSS is now a first-class language in RunPy with proper CodeMirror syntax highlighting and its own file icon. Add a <link rel="stylesheet" href="styles/main.css"> in your HTML and the preview applies it instantly. Editing the CSS file live-updates the preview too, even when the HTML editor isn't open.
    • Images can be added two ways. Paste a public image URL and give it a local name like cat.jpg, no storage used, or Upload a file straight from the device, which gets resized to a max width of 1600px and re-encoded as JPEG quality 80 so a 5 MB phone photo turns into a 200 KB upload. Each project is capped at 10 images to keep things lean.
    • Intra-project <a href="about.html"> links work in the live preview and in the ↗ Open in new tab view: the new tab embeds every project page and routes clicks between them, so a student can share a working multi-page site without us hosting it.
    • Autosave runs continuously and the HTML/CSS preview re-renders live as you type, with no Run button needed. Hit Run any time to force a refresh.
  2. Text files in the Python IDE: open, read, write and append

    • A new Text files section now sits alongside Python Files and HTML Files on both the student dashboard and the teacher Files page. Every text file is global to the account, so any Python file you own can open it by name regardless of which folder the script lives in.
    • Python code can now use open('foo.txt') with the standard 'r', 'w', 'a' and 'r+'/'w+' modes, plus context managers, readline/readlines/writelines, iteration over lines, and a 256 KB per-file cap. Works identically in Simple mode (Skulpt) and Full mode (Pyodide). Writes round-trip back to your account so the next run sees the updated contents.
    • Opening a .txt file in the IDE shows a clean full-width editor with no Run, Stop or terminal pane. The toolbar gains a Refresh button so you can pull in changes a Python script just wrote, and a Save button (also added next to Stop on Python/HTML files) that complements autosave with an immediate flush.
    • The IDE sidebar now lists text files in a dedicated section below your Python folders. The active section title Python Files / HTML Files shows inline + File and + Folder shortcuts, and the Text files section has its own + New link, so creating a file or folder is one click from anywhere in the tree. Switching between a Python file and a text file keeps the same Python folders expanded.
    • Teachers can use the feature for their own work and also see student text files in the class workspace under a new Text group in the sidebar (read-only when viewing the student).
  3. Safeguarding dashboard for schools, free, opt-in and built around UK GDPR and KCSIE

    • Schools can now set up a free safeguarding account at /safeguarding. A designated safeguarding lead signs up with their work email (personal providers are blocked), receives an 8-character join code, and shares it with teachers.
    • Teachers join from a new Monitoring and safeguarding section on their account page. Once joined, a persistent panel explains what is recorded; on the student side, a top-of-page notice flashes once per browser session telling the pupil their school is reviewing activity in their account.
    • Every comment a joined teacher creates, edits or deletes on a pupil's file is logged with its body preserved, and every direct code edit to a pupil's file is logged with the lines added, the lines removed, and one full pre-edit file snapshot per editing session. Nothing is logged for teachers who haven't joined a school.
    • The leader dashboard lists every teacher in the school with comment and edit counts, last activity and a one-click view into a per-pupil timeline. Each timeline row shows the pupil's name, the file name and the change, with search across comments, code, file names and pupil names. Comment and edit rows expand to show the diff in green and red on click.
    • Removing a teacher archives their record for 30 days, during which their logs stay reviewable, then a daily cron job permanently deletes them. This stops a bad-actor leader from using "remove" as a way to wipe evidence the moment a concern is raised.
    • Privacy Policy and Terms of Service have been rewritten to cover the new flow in detail, including the controller/processor split (the school is the controller, RunPy is the processor) and the fact that the entire Supabase project, comment events, edit events, pupil files and accounts, is hosted on AWS in the London region (eu-west-2) with AES-256 at rest, TLS 1.2+ in transit and Row-Level Security on every user table.
    • A new "Safeguarding Account" page in the footer summarises the whole programme with screenshots in the same scroll-driven laptop layout the homepage uses.
  4. Distribute picker now lets you choose students, recreates folders and numbers duplicates

    • Every Distribute dialog, from the Class Content Library, from your personal Files, the Debugging Tasks picker and the Blank file/folder picker, now has a Send to panel listing every student in the class with a checkbox each, plus a Select all toggle. The default state is "everyone selected" so the one-click flow is preserved, but you can now deselect anyone you don't want a file to land for.
    • When you distribute a file from a folder in your Class Content Library or personal Files, that folder name is now recreated for each student. If the student already has a folder of that name, the file goes inside it; otherwise the folder is created first. Language is respected, a Python "Lesson 3" folder and an HTML "Lesson 3" folder don't collide.
    • Filename collisions inside the destination folder now add a number instead of the old "(Teacher)" suffix. lesson1.py becomes lesson1 2.py on the second send, lesson1 3.py on the third, and so on. The counter inserts before the file extension so names stay tidy.
    • Files and folders are now sorted strictly A-Z everywhere they appear: the student dashboard's My Files, the teacher Files page, the IDE sidebar, the teacher class workspace, the Class Content Library and every Distribute picker. Sorting is case-insensitive so "Apple" and "apple" group together regardless of database collation.
  5. File-tree polish across the IDE, teacher class view and debugging tasks

    • The teacher Debugging task page now has a left file panel listing every task in the library, grouped by topic and styled to match the IDE, same glass panel, same drag handle in the gap, same hide/show icon. Jump straight from one debugging task to the next without going back to the topic list.
    • On the teacher class view, the Files column has been restyled to match the IDE's file panel: rounded rows with the file icon next to the filename, folders open with a chevron and reveal their children in an indented, left-bordered list, and the active file gets the same ocean-tinted highlight.
    • The 'last edited' relative time has moved off the file rows in the IDE sidebar, teacher class workspace and shared Files panel. On the teacher class workspace it now sits next to the Run button as a tidy 'Last edited X' indicator (with the absolute date in the tooltip), so the file list itself stays clean. The relative time still appears on the right of each row on the My Files page.
    • The file tree spacing used by the Debugging page has been adopted everywhere, tighter row padding (px-2 py-1.5 / pl-3 pr-2 py-1), no bullet-style space between sibling rows, and a single thin left border for nested folders instead of an indented inset.
    • The Files column on the teacher class view is now about 15% wider (219 px instead of 190 px) so longer filenames don't have to truncate.
  6. Unified Distribute button, Class Content Library rename and a resizable IDE sidebar

    • All four separate distribute buttons on the teacher class page have been merged into a single Distribute action. Opening it shows three source cards, From Class Content Library, From Files and From Debugging Tasks, plus a Blank file or folder option underneath. Each picker now uses the same tree UX as Debugging Tasks: select a whole folder, or expand it and pick individual files.
    • "Snippets" / "Teachers Code" has been renamed everywhere a teacher or student sees it to Class Content Library, the section header, the student-side panel, the new-file dialogs, the Copy-to menu on personal files and folders, the Distribute source card and the help guide. The underlying database tables and types are unchanged.
    • The IDE file panel is now a distinct glass panel sitting next to the editor (matching the teacher class view), with a visible drag handle in the gap so you can resize it anywhere between 200 and 800 px. The width is remembered between sessions.
    • The sidebar hide/show button is now a small icon button to the left of "+ New Python file", and a matching icon button appears in the IDE top bar when the sidebar is hidden, so it can be brought back without searching.
    • Opening a file from the sidebar no longer scrolls the file list back to the top, the scroll position is preserved across navigations.
    • The example runs in debugging task instructions are now collapsed by default and expanded with a chevron, and the arrow prompts (>>>) only appear on the first line of each example so the rest reads as plain output.
  7. Infinite-loop detection and a debugging task library overhaul

    • The Check answer button on debugging tasks now detects infinite loops. If your code is still running after four seconds it's interrupted at the Python level (via a SharedArrayBuffer interrupt buffer wired into the Pyodide worker) and reported as a Logic error with a hint to look for a loop that never ends, previously it would hang the page.
    • Sixteen debugging tasks across Variables, If statements, Logical operators, Nested selection, While loops, For loops, Procedures, String handling and Random/libraries have been rewritten with new bugs and tighter wording. Two if-statement tasks have been renamed (Comparing with == not = → Password check, Indenting too much → Name check) and several lessons now layer multiple bug types (type, name, syntax and logic) in one file.
    • Topic folder names in the debugging library have been cleaned up, "Logical operators (AND / OR / NOT)", "Nested selection (elif)", "Arrays (lists)", "Functions (return a value)", "Procedures (subroutines)" and "Random and libraries (imports)" all dropped the parenthetical.
    • The random.randint task's example output no longer shows the underlying regex, it now shows three sample runs (Random number: 7 / 1 / 10) so students can see what a correct answer actually looks like.
  8. Collapsible columns and a ready-to-go workspace on the teacher class view

    • The teacher class view now loads with a blank editor and terminal already in place, instead of an empty hint. Clicking a student file swaps in the real code and output.
    • Both the Students and Files columns now have a chevron in their header to collapse them. When a column collapses, the editor and terminal stretch to fill the new space; a thin rail with a chevron and a vertical label remains so you can expand again with one click.
    • The Files column header now reads as the selected student's first name followed by "files" (e.g. "Kasim files") so it's clearer whose files you're looking at.
    • Removed the per-student Remove button that appeared next to each name in the class view. The only place to remove a student is now the Manage Class page, which prevents accidental deletions while you're working through the class.
    • A small reminder pill now slides down from the top of the screen when you open a class, "Zoom out in your browser to get a better view", and disappears after a few seconds, so the three-column layout has room to breathe.
  9. Greener Run button, new Stop button, and every run starts fresh

    • The Run button is now green across every IDE, the logged-in editor, the homepage demo, the snippet viewer, the shared-file viewer and the teacher class workspace.
    • A red Stop button sits next to Run. It's always visible while you're in the full Python terminal, greyed out when nothing is running, and active the moment your code starts. Pressing it kills the running program, tears down the Python interpreter and brings the terminal back ready for the next run, useful when you've written an infinite loop or want to abandon a long-running script.
    • Each press of Run now wipes the terminal and resets the Python REPL state before the code executes, so output and stale variables from the previous run no longer bleed into the new one. The Python and Pyodide version banner stays pinned at the top.
    • The separate Clear and Reset buttons in the terminal toolbar have been retired, Run now does both jobs, and Stop handles a full interpreter teardown when you need one.
  10. Homepage redesign with a scrolling laptop tour of every feature

    • The homepage is now one continuous product tour. A MacBook on the right stays pinned to the centre of the screen as you scroll; the screen content swaps to match whichever feature you're reading on the left.
    • The first stop is the live IDE, a working editor and Python terminal you can type into and run, right inside the laptop, before you've signed up.
    • Eight feature stops follow: file organisation, the full IDE, class view, running student code, marking and comments, distributing folders and files, dark mode, student notifications, and teacher snippets.
    • Dark mode now demos itself: when you scroll onto the Dark mode section, the whole page fades to dark, then fades back to light as you scroll past.
    • The standalone Features page has been retired, everything lives on the homepage now. Help guides moved to a dedicated page in the footer.
  11. Live homepage demo and shareable file links

    • The homepage now embeds a real, working editor and Python terminal in the hero, anyone landing on RunPy can try the IDE before signing up. A sample program auto-runs as soon as Pyodide is ready.
    • Logged-in students and teachers get a new Share button on every file. Generate a public link that opens a viewer where anyone can read your code and run it. Stop sharing whenever you like, the previous link stops working.
    • Copy-as-image now lives inside the same Share menu, with a short description of each option so it's clear what each one does.
    • In the IDE toolbar, the Run button has moved next to the filename so it's easier to find while you're typing.
    • Every public page now shares one navigation bar, the Features, About and Changelog pages no longer drift behind the rest of the site when the menu changes.
  12. Notifications, clearer IDE sidebar, and a tidier mobile teacher view

    • New notification bell in the navbar for students. A red badge appears when a teacher checks one of your files or leaves a comment you haven't seen yet. Click an entry to jump straight to the file, opening it clears the notification automatically.
    • IDE file sidebar is more obvious: the toggle is now a labelled "Files" pill (highlighted when the panel is open), and there's a × close button inside the sidebar to hide it again.
    • When a teacher is editing a file, the "Not yet checked" badge no longer shows, it only applies to student-owned files.
    • Teachers viewing student code on mobile now get a hamburger menu for Refresh / Mark as checked / Add comment, while Run stays as its own button.
    • Mobile teacher view defaults to code-only; pressing Run swaps to the output pane with a small "Back to code" button to return to the editor.
  13. RunPy on a phone

    • The whole site now works on a phone. Public pages, dashboard, account, teacher class workspace, and the IDE all reflow for narrow screens. Desktop is unchanged.
    • Navbars collapse to a hamburger menu under 768px.
    • In the IDE, the file panel slides in as a drawer and the editor / output stack vertically with a Code | Output tab toggle.
    • In the teacher class view, Students / Files / Code become tabs that auto-advance when you pick a student or file.
    • Pressing Run in the IDE on mobile now jumps straight to the Output pane so you see results without an extra tap.
    • Long tables (Manage class students) scroll inside their card instead of pushing the page wide.
  14. Delete from the IDE sidebar, plus a brand favicon

    • Hover any file or folder in the IDE's left sidebar to reveal a trash button. Deleting a non-empty folder confirms first and removes the files inside.
    • Browser tabs now show the RunPy logo as a favicon instead of the default blank icon.
  15. Smarter code editor and theme that follows you

    • Tab now indents in the code editor. Press Tab in leading whitespace or with a selection to bump the indent up; press it mid-line and it just inserts four spaces at the caret. Shift+Tab de-indents.
    • Brackets and quotes auto-close. Typing ( [ { ' " wraps the cursor; typing the matching closer right after skips over it; Backspace deletes the pair.
    • Enter now keeps Python indented properly, copies the previous line's indent, and adds an extra level when the line ends in a colon.
    • Your light/dark mode choice now follows your account, not the device, log in anywhere and the right theme loads.
    • Public pages always render light, regardless of preference.
  16. Help guides on Account, plus a lighter dark mode

    • New Help guides section on the Account page (left nav), collapsible step-by-step walkthroughs for creating files, running code, managing folders, joining a class, and the full teacher workflow (class setup, distributing folders/files, feedback, and snippets). Student/teacher specific guides only show for the right role.
    • Dark mode lifted, page background, glass panels, nav, and form inputs are all a touch lighter, and the brand glow behind everything is more visible. Easier on the eyes without changing the overall look.
  17. Distribute buttons moved up, plus dummy classes

    • Distribute folder and Distribute file are now in the class header next to Manage class, so you don't have to dive into Manage class to push work out.
    • New + Dummy Class button on the teacher home, spins up a class with 15 pre-named students for testing and demos. One per teacher; deleting the class also tears down those test accounts and their files.
    • Creating a new file no longer jumps you into the IDE. The file list refreshes and you can click the file when you're ready to open it.
    • Internal: enabled RLS on the Stripe webhook idempotency table.
  18. Instructions on files, and distribute a single file

    • Teachers can attach instructions to a snippet or personal file. Students see them in a blue panel above the editor.
    • Instructions follow the file when students Make a Copy, and when teachers distribute a file or folder.
    • New Distribute file action on Manage class, push a new file, a snippet, or one of your personal files to every student.
    • Folder and file pickers now show a proper tree, split into Python and HTML.
    • Distributing a folder with files in it now asks you to confirm first.
  19. Python terminal in snippets and class workspaces

    • The full Python terminal now powers ▶ Run on snippets and inside the teacher's class workspace, not just the file IDE.
    • Fixed: input() prompts now appear before the cursor, not after.
  20. input() prompts inside the terminal

    • input() now prompts inside the terminal, no more browser pop-up. Works anywhere it works in CPython.
    • Python now runs in a background worker, so the page stays responsive while your code is running or waiting on input.
  21. Real Python terminal and easier file management

    • The output panel is now a full Python terminal (CPython 3.12 in the browser). Run your file, then keep typing at the prompt with its variables and functions in scope. Install packages with micropip.
    • Collapsible file panel in the IDE for more code space.
    • Drag-and-drop files into folders on the dashboard and the teacher's personal files page.
    • New Duplicate option in the 3-dot menu for files and folders.
    • Fixed: teachers opening their own personal files now see the teacher navbar.
  22. Free student file limit

    • Free-plan students can keep up to 5 files. The dashboard shows your usage.
    • Joining a class with a Paid teacher removes the cap.
  23. Teacher comments and personal files

    • Teachers can now edit a student's code directly from the IDE or the class page.
    • Redesigned comments: an inline panel above the code instead of a modal, with a Show/Hide toggle for students and a New badge for unread comments.
    • New Personal files area for teachers (My files in the navbar), private folders and files, separate from any class.
    • Copy a personal file or folder into a class as snippets, straight from the 3-dot menu.
    • Distribute now supports From personal files as a third source.
  24. Distribute folders to your whole class

    • New Distribute section on Manage class, push a folder into every student's tree in one click.
    • Pick New folder (with optional starter files) or From snippet folder to clone an existing one.
    • Name collisions get a “(Teacher)” suffix so student work is never overwritten.
    • Students can Make a Copy of any snippet into their own editable files.
  25. One-click student signup and live payments

    • Students go straight into the dashboard after signup, no email verification step.
    • Stripe payments are live. Subscribing to Paid Teacher unlocks the full feature set immediately.
  26. Better signals for school content filters

    • RunPy now identifies itself site-wide as a UK educational service so school filters and search engines classify it correctly.
    • Changelog also available as an RSS feed at /changelog.rss.
  27. Paid Teacher plan with self-serve checkout

    • New Paid Teacher plan: £9.99 / month or £99.99 / year. Up to 15 classes and 35 students per class, plus marking and feedback.
    • Stripe checkout is embedded inside RunPy, you never leave runpy.co.uk while paying.
    • Manage your subscription from /account/manage: cancel, resume, or switch between monthly and yearly.
    • Pricing page rewritten with what's included in each plan.
    • Updated Terms of Service and Privacy Policy to cover billing.
  28. Simplified to two plans

    • Plans are now just Free Teacher and Paid Teacher. The School Licence product has been retired.
    • Existing School Licence holders were migrated automatically.
  29. Manage Class and a big polish pass

    • New Manage Class page: rename, remove a student, reset a student's password, or delete the class.
    • Refresh button on a student's file to pull their latest version without leaving the page.
    • Files now show their last-edited time everywhere.
    • New About and Schools pages, plus live Privacy Policy and Terms of Service.
    • Tidied navigation and a shared footer across the site.
  30. Folders and a fresh files panel

    • Folders for organising Python and HTML files.
    • Redesigned files panel with quicker folder navigation.
    • Fresh Python and HTML file icons.
  31. Sign-in polish

    • Consistent navigation across the home, sign-up and login pages.
    • Smoother account-creation flow.
    • Improved input fields and light-mode contrast.
  32. Accounts and team management

    • Email verification on sign-up and account deletion from the account page.
    • New Manage Team page for Heads of Department to invite teachers onto a shared licence.
  33. RunPy launches

    • Browser-based Python and HTML IDE built for UK secondary school classrooms.
    • Teacher class dashboard for tracking pupils, files, and shared snippets.
    • Free, paid and school-licence plans.

Got a request?

Something you'd like to see on RunPy? Spotted a bug? We'd love to hear from you.

Get in touch