Skip to content

Instantly share code, notes, and snippets.

Created March 7, 2023 11:26
Show Gist options
  • Save foosel/f67a7a5b697d68f94ecbf4d49647c572 to your computer and use it in GitHub Desktop.
Save foosel/f67a7a5b697d68f94ecbf4d49647c572 to your computer and use it in GitHub Desktop.

⚠️ Important note on release candidates

This is a Release Candidate of OctoPrint. It is not a stable release: severe bugs can occur, and they can be bad enough that they make a manual downgrade to an earlier version necessary - maybe even from the command line.

You should be comfortable with and capable of possibly having to do this before installing an RC.

🔁 Feedback on this RC

Please provide general feedback on this RC in this ticket. An "All is working fine" is valuable feedback as well because it tells me people are actually testing this RC and just not finding problems with it.

If you run into any obvious bugs, please follow "How to file a bug report" - I need logs and reproduction steps to fix issues, not just the information that something doesn't work.


✋💥 Heads-up: OctoPrint's web interface now requires ES9 (EcmaScript 2018) support in your browser

Up until now OctoPrint still supported running its UI on browsers that only supported EcmaScript 5 as released in 2009. However, given that based on data about used browsers from the Anonymous Usage Tracking 98.96% of all browsers used to access OctoPrint support ES9 and being able to use these features allows things like asynchronous GCODE loading in the viewer (see #4559) and in general very much improves development experience and speed, the decision has been made to greenlight the use of these features in OctoPrint's JS code base.

Given that pretty much all common browsers have had the required support for several years now, this change should not affect ~99% of all of you. For those 0.15% of you accessing the OctoPrint web interface with ancient browsers that don't yet have support this means it is time to upgrade. For those 0.89% of you accessing the OctoPrint web interface with browsers for which we do not know about support, it might also be time to upgrade.

In any case, you can check whether your chosen browser supports all the features that OctoPrint uses in core & bundled plugins by going to the new check page at

✋🧩 Heads-up for plugin and third party application developers: Webcam integration has moved to a plugin interface

OctoPrint 1.9.0 has been refactored to extract the webcam integration into a new plugin type WebcamProvider as well as a _webcam template type. You may find the documentation of these here:

A new bundled plugin Classic Webcam has been created that implements the existing webcam integration (mjpg/hls/beta webrtc support as well as snapshotting).

A consequence of this refactoring is that there's no longer a general webcam configuration in the settings but rather now there are WebcamProviderPlugin specific settings per plugin. A backwards compatible compatibility layer has been added so that plugin's accessing any of the formerly available global webcam settings should still be able to access and change the data, however it should be considered deprecated and warnings will be logged. Please check your plugins and adjust as necessary when running on OctoPrint 1.9.0.

✋🧩 Heads-up for plugin developers: octoprint_setuptools has been extracted

In order to support plugin's that want to use pyproject.toml, in which case current pip versions will build their package in isolated mode, leading to the required octoprint_setuptools dependency not being available and thus the install failing, octoprint_setuptools was extracted into its own pypi package to allow pyproject.toml based plugins to depend on it by adding this to pyproject.toml:

requires = ["setuptools>=40.8.0", "wheel", "octoprint-setuptools"]
build-backend = "setuptools.build_meta"

This should not affect plugins that don't use pyproject.toml, however like with every OctoPrint release candidate plugin developers are strongly advised to test installing their plugin under 1.9.0.

🔒 Security fixes

  • When accessed through https, OctoPrint will now set all cookies with the secure flag.

✨ Features & improvements

  • #1868 & #4300: Support multiple file uploads via the Web UI.
  • #2191: Added support for M118 on virtual printer.
  • #3893: Extended GCODE analyser to also calculate non-extruding bounding box and evaluate those in the UI, warning about moves outside of the configured build volume.
  • #4040: Record last_fan_speed for use in GCODE scripts, just like last_position and last_temperature.
  • #4195: Added four new hooks: octoprint.plugin.backup.before_backup, octoprint.plugin.backup.after_backup, octoprint.plugin.backup.before_restore, octoprint.plugin.backup.after_restore. Those will allow plugins to perform additional tasks right before/after backup and right before/after restore, e.g. copying additional files from the file system into the plugin's data folder, and moving it around after.
  • #4373: Support installing plugins from a JSON list of URLs or the plugin manager's export.
  • #4428: Added a plugin management task queue to queue up plugin installs while printing.
  • #4435: Improved memory footprint of GCODE viewer by compressing the individual layer data.
  • #4483: Don't block unused keys apart from Tab when keyboard control is active.
  • #4484: Upgraded to FontAwesome 6.
  • #4450: Improved performance of parser in GCODE viewer's "skipUntilThis" functionality.
  • #4473: If no printer connection is active, OctoPrint will now poll and refresh the serial port list in the background.
  • #4494: Send long filenames to Marlin when the LFN_WRITE capability is set.
  • #4510: Updated black.
  • #4511: Migrated black config to pyproject.toml.
  • #4512: Use lazy logging in octoprint. module.
  • #4518: Added custom name field to events in the event manager. Should improve readability if a lot of event hooks are configured.
  • #4524: The short hand systeminfo overview has now been hidden behind a devmode query parameter in the URL. It sadly happened too often that people only shared the abridged overview instead of a full bundle. This should hopefully help.
  • #4534: Added JavaScript QUnit based tests to build workflow.
  • #4536: Added more unit tests for helpers.js.
  • #4541: Added button to clear the GitHub Access Token from the Software Update plugin again.
  • #4559: Improved memory footprint of GCODE viewer by loading the displayed GCODE file asynchronously and never loading it fully into memory at once.
  • #4562: Dropped restriction to ES5 on the core UI and switched to ES9 compatibility to allow for the use of modern JS language features. This might mean that OctoPrint's UI will refuse to load in really old browsers, but at some point we need to move forward. You can check compatibility of your used browsers on a new browser check page on
  • #4584: Automatically detect available files for octoprint dev css:build.
  • #4588: Improved error reporting when uploading and removing files and folders.
  • #4591: Fire action command hooks on all action commands, not just unhandled ones, to give plugins a chance to react even to handled action commands as well.
  • #4594: Added a warning that using the "skip until" feature of the GCODE viewer to skip past too much GCODE (especially initialization code like G90/G91 or M82/M83) can break the visualization.
  • #4597: Added aria labels and roles for accessibility.
  • #4605: Recognize Repetier Firmware style SD Card initialization messages. Consequentially remove "always present" setting since it is no longer needed.
  • #4610: Support timestamps in SD card file listings. Send M20 L T if EXTENDED_M20 support is reported by the firmware. Also extend file list parser to be able to parse timestamps.
  • #4611: Added a tooltip to the plugin manager install buttons to clarify it is disabled when it is disabled (during printing).
  • #4613: Render all whitespace in file names in the file list in the UI.
  • #4614: Added a hint about octoprint dev css:build to the docs.
  • #4618: Clarified that plugins installed while restoring from OctoPrint backups won't necessarily be the same version as prior.
  • #4625 & #4722: Improved stack traces of StorageErrors by providing __str__ method. Get rid of left-over StorageError.message references.
  • #4628: Moved webcam support to a new webcam focused plugin type. WebcamProviderPlugin mixins provide information about and configuration of available cameras, as well as access to snapshots. A new template type webcam allows plugins to embed webcam streams into OctoPrint's control view through custom HTML. This should allow to quickly add support for new types of webcam servers and streaming protocols. See also #4717.
  • #4635: Support additional No media SD card initialization failure message from Marlin 2.1.x.
  • #4638: Slight refactoring of the timelapse related permissions. TIMELAPSE_{LIST|DOWNLOAD|DELETE} will now only apply to finished timelapses, TIMELAPSE_ADMIN will be only related to configuration access, and a new TIMELAPSE_MANAGE_UNRENDERED permission allows listing, deleting and rendering of unrendered timelapses.
  • #4657: Added a new event ChartMarked that allows to inject custom chart markers into the temperature graph. For an example of how this can be used, the BedCooldown plugin utilizes this starting with version 0.6.0 and uses it to inject an additional "Cooldown" marker into the graph. See also #4738.
  • #4658: Added a new field operation to the FILE_ADDED event to allow event hooks to distinguish whether the event was caused by adding (add), copying (copy) or moving (move) a file.
  • #4682: Added a dependency on wheel to ensure it is installed, since a lack of it might cause issues with certain plugin setups and new pip versions.
  • #4694: UX improvements in the file/folder move dialog.
  • #4695: Support R parameter in temperature commands when applying temperature offsets.
  • #4702: Use block scalars in YAML dumps. Improves readability of config files and such.
  • #4704: Performance improvements on the file list API endpoint.
  • #4708: Added a new removeMessage to the socket client to allow to unsubscribe a handler for messages again.
  • Migrated default settings to pydantic.
  • Added support for Traefik's X-Forwarded-Prefix header.
  • Added codespell to pre-commit to add automatic spell checking.
  • Added a new utility function octoprint.util.files.search_in_file that will search whether a regular expression match is contained in a file, using grep if available and falling back to a pure python implementation if not.
  • Made the Announcements plugin less spammy. Announcements will now no longer trigger a popup (unless from a priority 1 channel like Important) but instead cause an unread counter to be rendered on the notification icon (1-9 and infinity symbol for more). The announcement reader has been extended by a default "Unread" tab that shows all unread news items, and a Mark All Read button has been added to quickly get rid of the unread counter altogether.
  • Added the option for plugins to provide a privacy policy URL via __plugin_privacypolicy__ and modified the Plugin Manager to add a link to that on plugins making use of it. Repository plugins can also report this via a new privacypolicy property which will show the link even in the repository browser without having to install the plugin first.
  • The virtual printer now supports LFN_WRITE.
  • Improved file entries from printer's SD in the UI's file list. The Metadata dropdown button has been replaced with an SD card icon to make clear this file is from the SD card. Also improved the rendering of unknown upload dates.
  • Added various new unit tests.
  • Added flag to CommandlineCaller to not have it log its output.
  • Added two new log files: tornado.log is an access log for the embedded tornado web server and logs all requests (as logged on the tornado.access target). auth.log logs successful and failed logins via credentials, remember me cookie, headers or autologin, as well as logouts. This should allow auditing OctoPrint access, and also make it possible to use something like fail2ban if so desired.
  • Migrated E2E tests to Playwright.
  • Added a log check to the E2E tests. When any exceptions or other ERROR lines are logged in octoprint.log while running the E2E tests, this will now cause a test failure.
  • Added a method Settings.checkBaseFolder(self, type) to check whether a base folder already exists, without creating it.
  • Got rid of a false positive error about a missing default printer profile on the very first server start.
  • Upgraded various dependencies and adjusted codebase as needed for breaking changes. See also #4629

🐛 Bug fixes

  • #4347: Only allow one concurrent backup in parallel.
  • #4445: Fixed support of second level locales.
  • #4470: Fixed wrong mm/s in documentation.
  • #4471: Fixed non-extrusion G2/G3 moves in the GCODE viewer.
  • #4490: Removed use of HTML entity for degree in temperature tooltips, use unicode degree symbol instead.
  • #4493: Defer sending of M20 until first capability report has been received and thus it can be determined whether the printer supports the L parameter or not.
  • #4505: Fixed timelapse getting stuck unrendered if filename includes %.
  • #4525: Fixed double message when trying to skip a mandatory wizard during first run setup.
  • #4539: Fixed blacklist fetch timeout, missing one could cause a server hang in case of broken network connectivity.
  • #4551: Made Settings object thread safe.
  • #4552: Extracted octoprint_setuptools into its own pypi package to allow pyproject.toml based plugins to depend on it by adding this to pyproject.toml:
    requires = ["setuptools>=40.8.0", "wheel", "octoprint-setuptools"]
    build-backend = "setuptools.build_meta"
  • #4554: Fixed ZeroDivisionError due to firmware retraction in GCODE analyser.
  • #4558: Fixed flakey Cypress E2E tests by switching to Playwright.
  • #4574: Fixed improper use of sys.version to check for Python 3+.
  • #4575: Fixed some Python type hints.
  • #4578: Limit configurable build volume to something sensible to avoid crashes in the GCODE viewer when attempting to render billions of grid lines.
  • #4581: Use G2/G3 arc length for estimating print time.
  • #4582: Fixed rendering of G02/G03 (leading 0) in the GCODE viewer.
  • #4607: Fixed lower casing of SD Card file names in virtual printer.
  • #4616: Fixed spinner icon on file delete.
  • #4621: Trim leading/trailing whitespace from user names.
  • #4623: Fix onEventFileDeselected not firing on printer disconnect.
  • #4626: Fix translation of permission descriptions in UI, also added new knockout binding gettext to assist in dynamic translation based on observable values.
  • #4634: Decreased timeouts of various external fetches to reduce likeliness of blocking the main webserver thread.
  • #4636: Fixed a bug in handling the SLICING_STARTED event in the UI.
  • #4640: HLS camera flipping seems to have fixed itself by migrating the webcam integration into its own plugin.
  • #4651: Fixed logout after first run wizard, it was not reloading the login UI. As a consequence of this, deprecated CONFIG_ACCESS_CONTROL_ACTIVE.
  • #4655: Fixed various broken links to flask and jinja2 documentation in the docs.
  • #4665: Explicitly use setup.cfg for flake8 configuration, to avoid issues if the user has a local config in ~/.config/flake8 already.
  • #4670: Fixed permissions of anonymous API access. Also fix error message for wrong permissions on plugins.
  • #4680: Fixed file list scroll position on upload.
  • #4688: Fixed handling of POST requests with chunked transfer encoding.
  • #4690: Include newlines when copy-pasting from software update log or plugin manager log.
  • #4703: Fixed error detection during plugin installs, should now also correctly detect missing/broken dependencies.
  • #4712: Fixed authkey flow redirect when not logged in.
  • #4735: Fixed settings "Send line numbers & checksums for non-GCODE commands" and "Wait for acknowledging ok for non-GCODE commands" not saving from the UI.
  • Fixed an issue with the settings markup of the GCODE viewer plugin.
  • Fixed an issue with saving multiple credentials for the Software Update Plugin, where newly added credentials would overwrite any existing ones.
  • Removed support for tarball language packs, which were never really supported to begin with and made the code more vulnerable to attacks due to issues in the tarfile core library.
  • Fixed a bug in the Action Command Prompt plugin causing a JS error when some data was not set.
  • Fixed the default URL used for redirects, which potentially got any prefix paths attached twice.
  • Fixed various typos and spelling errors. See also #4468, #4492, #4533, #4550, #4599, #4679

🎉 Special thanks to all the contributors!

Special thanks to everyone who contributed to this RC, especially to @040medien, @arekm, @arrdem, @cclauss, @CoReYeDe, @cp2004, @crysxd, @dawidpieper, @FedericoNembrini, @frenck, @j7126, @jneilliii, @Josef-MrBeam, @JoveToo, @kForth, @luzpaz, @max246, @msrasheed, @rfinnie, @richardsondev, @sgsunder, @smartin015, @the-ress, @tommywienert and @vector76 for their PRs!

And an extra shoutout to our 16 first time contributors: @040medien, @arekm, @arrdem, @CoReYeDe, @dawidpieper, @Josef-MrBeam, @kForth, @luzpaz, @max246, @msrasheed, @nmattis, @Patrick-Ames, @sgsunder, @smartin015, @the-ress and @tommywienert! 🎉

🔗 More information

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment