Changelog#

v26.11.1 (11.03.2026)#

Deprecated#

  • Deprecate SubscriberAsync.queue, SubscriberAsync.listen() and SubscriberAsync.stop(). Use SubscriberAsync.get() instead.

Features#

  • Add Parameter Monitoring and Throttling to the System Overview. See the docs for configuration instructions.

  • Add the SubscriberAsync.get() method to retrieve new events without the need for a background task.

  • Add an option to orchestration settings to attach extra config options for singleuser servers.

Fixes#

  • Set filebrowser theme to light and inject custom CSS for readability of SVGs with transparent backgrounds.

Documentation#

  • Add tutorial for parameter monitoring and throttling.

Full release notes#

  • feat(task-manager): parameter monitoring and throttling

  • feat: add extra config option to singleuser servers

  • feat: add a function to simulate sample heatup on the mock cryostat

  • feat(pubsub)!: add get method to async subsciber and deprecate queue

  • feat(orchestration): set filebrowser theme to light by default

  • refactor(dashboard): load dashboard pages from configuration instead of entry points

  • feat(orchestration): enable epel-release add pandoc to default environment

v26.11.0 (09.03.2026)#

Features#

  • Adds buttons to the Jupyterhub Launcher and Juice Dashboard to access the influxdb2 interface.

Fixes#

  • Refresh the dashboard page only when the dashboard process restarts to avoid user confusion.

Documentation#

  • Add tutorial for adding a custom dashboard page.

  • Updates the “Creating an extension” and “Extension development” guides.

Full release notes#

  • docs(extension): add tutorial for adding a dashboard page

  • docs(extension): update creating an extension and development environment

  • fix(dashboard): restart dashboard button will only reload when dashboard ready

  • feat(dashboard): add influxdb2 proxy and add entry to dashboard

v26.10.0 (04.03.2026)#

Features#

  • Add function and client method to interrupt a service (interrupt_service).

  • Add a button to the task manager dashboard to interrupt a service.

  • Add option to load configurations from cache for repeated loading (Configurable.load(cache=True)).

  • Add the pyproject_toml_extra option to environment configuration for adding extra content to the generated pyproject.toml of environments.

  • Add the extra_dockerfile_content option to environment configuration for adding extra content to the generated Containerfile of environments.

Fixes#

  • Auto-scale temperature axis for mK temperatures in the system monitor dashboard.

  • Set container timezone to the system timezone. This ensures that timestamps in the dashboard and other places reflect the correct local time.

Documentation#

  • Add tutorial for installing a package in editable mode.

Full release notes#

  • feat(settings): add option to load config from cache

  • docs(basics): add tutorial for installing a package in editable mode

  • feat(environment): add pyproject_toml_extra option

  • feat: API and button to interrupt services

  • feat(system-monitor): auto-scale temperature axis for mK temperatures

  • fix: set container timezone to system timezone

  • feat(orchestration): allow arbitrary extra dockerfile content for environments

v26.9.0 (23.02.2026)#

Features#

  • Improves System Monitor Widget Performances and UX

  • Improve datatable widgets

  • Adds a tutorial on setting up Gitlab OAuth integration with Juice

Full release notes#

  • docs(admin): add tutorial for setting up gitlab oauth

  • feat(dashboard): use param and tabulator to improve datatable widgets

  • docs: update changelog posting instructions to use community.orangeqs.com instead of Mattermost

  • feat(dashboard): Use ECharts and Param to rewrite the Fridge Monitor

v26.8.0 (18.02.2026)#

Features#

  • Adds fridge automation entry on the homepage

Fixes#

  • Serve built-in pages using panel templates.

Full release notes#

  • feat(dashboard): add fridge automation entry for home page

  • refactor(dashboard): serve built-in pages using panel templates

v26.7.1 (11.02.2026)#

Features#

  • Add a new landing page for the dashboard showing all available pages and tools.

Fixes#

  • Rename “System monitor” to “Fridge monitor”

  • Restructure the navigation bar to reflect the new landing page structure.

Full release notes#

  • feat(dashboard): add landing page with apps

  • refactor(dashboard): rename system monitor tab to fridge monitor

v26.7.0 (10.02.2026)#

Features#

  • Add the --no-parallel-build option for the juice install command for better performance on hard-drives.

  • Add a direct link to the file browser from the dashboard.

Fixes#

  • Fix unresponsive restart and rebuild buttons on the dashboard.

  • Optimize calls to chown to speed up juice install.

Full release notes#

  • feat(system-monitor): set ghs as first page and fix button text alignment

  • feat(dashboard): add file browser menu item

  • fix(dashboard): fix initialization signature of dashboard handlers

  • perf(installation): reduce number of chown calls

  • feat(installation): add option to build images sequentially

v26.6.0 (05.02.2026)#

Features#

  • Integrate VS Code in the Jupyterlab environment, available from the launcher.

Fixes#

  • Display all services in the filter by service dropdown in the task manager dashboard.

  • Use timezone-aware timestamps in the dashboard (for now still in UTC).

  • Update link to the documentation from the dashboard.

  • Add a warning to the docs about how orchestration.toml is loaded.

Full release notes#

  • feat: vs code integration into jupyterlab environment

  • fix(docs): update remaining links to new docs

  • docs(configuration): warning for orchestration loading paths

  • docs(orchestration): examples of jupyterhub secrets file

  • feat(dashboard): add panel core infrastructure

  • fix(task-manager): display all services in the filter by service dropdown

  • feat(dashboard): make dashboard aware of container timezone

  • test: no parallel workers in ci and add small client reconnect delay

v26.5.1 (28.01.2026)#

Features#

  • Add a table with the current tasks to the task manager dashboard.

Fixes#

  • Fix access to the filebrowser for deployments using OAuth.

  • Fix querying empty string values from the database due to a change in pandas 3.0.

Full release notes#

  • chore: update changelog for v26.5.1 release

  • docs(readme): add landscape logo and polish project urls

  • docs(index): reduce emphasis on under development warning

  • fix(task-manager): removed uninformative columns from task list

  • feat(dashboard): task display widget

  • fix(orchestration): filebrowser not visible when using oauth

  • fix(database): convert missing string values for pandas 3.0 compatibility

  • docs(migration): instruct to log in as root

v26.5.0 (26.01.2026)#

OrangeQS Juice is now an open-source project! This release marks the first open-source release of OrangeQS Juice. The closed-source repository has been archived and will no longer receive updates. All future development will take place in the open-source repository. To migrate from the closed-source to the open-source repository, please follow the migration guide.

Full release notes:#

  • chore: update link to migration guide

  • chore: update changelog and release instructions for v26.5.0 release

  • feat: installation instructions and migration guide for open-source version

  • docs(release): switch to calendar versioning

  • docs: update repository url to gitlab.com

  • ci: refactor for open-source repo

  • docs(contribute): add release instructions

v0.2.8 (19.01.2026)#

Minor release that adds a filebrowser to the JupyterLab environment. The filebrowser is accessible from the launcher tab in JupyterLab.

Full release notes#

  • feat(orchestration): added filebrowser to singleuser container

  • docs: include changelog

  • fix(packaging): pin virtualenv < 20.36.0 due to virtualenv-tools3 compatibility

v0.2.7 (19.12.2025)#

This release marks the restructuring and release of documentation for orangeqs-juice-core to the open-access site at https://docs.orangeqs.com/juice/core/.

Full release notes:#

  • chore: update changelog for release

  • ci: publish docs to docs.orangeqs.com

  • docs: restructure full documentation into tutorials, concepts and reference

v0.2.6 (16.12.2025)#

Minor release for documentation and bugfixes.

Full release notes:#

  • chore: update changelog for release

  • docs: task manager config schema

  • docs: introduction page

  • docs(database): guide for using the database

  • docs: differences with legacy juice

  • docs: first steps after installation

  • feat(system-monitor): add random noise to mock thermometers

  • fix(identifiers): order latest id by suffix instead of full identifier

  • fix(database): concatenate result if it contains multiple tables

v0.2.5 (08.12.2025)#

Minor release, adds some qol changes on exception handling and bugfixes on the container network. Also adds service restart and rebuild buttons to the task manager GUI.

Full release notes:#

  • fix(task-manager): use hostname instead of ip to allow reconnect after restart

  • feat(tasks): set websocket max message size from config option

  • feat(task-manager): service restart and rebuild GUI

  • fix(orchestration): remove port forwarding option from build settings

  • feat(ipython): log uncaught exceptions

v0.2.4 (01.12.2025)#

This release introduces the Task Manager GUI for monitoring services and includes bugfixes of the system monitoring stack. It also includes many improvements on environment handling, configuration and interfaces.

Full release notes:#

  • feat(task-manager): GUI and backend for monitoring service status

  • feat(environment): clean up images after environment build

  • fix(orchestration): do not rebuild environments on reboot

  • fix: hardcode telegraf url

  • feat(service-logs): allow visible message overflow on hover

  • fix(system-monitor): handle units correctly on heater dashboard widgets

  • feat(task-manager): configuration for full connection info of tasks and pubsub

  • feat(influxdb2): configuration for client connection url

  • fix(system-monitor): remove redundant filter and allow multiple warnings in one tick

  • refactor(dashboard): use JUPYTERHUB_SERVICE_PREFIX to determine dashboard url

  • fix(proxies): do not resolve hostname to ip

  • fix(jupyterhub): do not install proxy kernel for task-manager

  • docs(orchestration): add note on uppercase unit for memory limit

  • fix(orchestration): handle empty memory setting for singleuser container

  • feat(orchestration): configuration options for memory limit and group add of containers

  • feat(sytem-monitor): GHS Widget update format and add recovery/condensation buttons

  • feat(client): synchronous blocking execute task interface

v0.2.3 (20.11.2025)#

This release includes various bugfixes an UI/UX improvements. Some manual migration maybe required

Deprecations and migrations required:#

  • mock-system-monitor.toml need no longer be included in lab configs. If you have them on your development setups, please remove them, as it overrides the default config which is guaranteed to work with the default dashboard configuration.

  • There is a slight change in how system monitor mock handles heater component_ids, specifically regarding the prefix “heater_”. You may need to manually add the prefix to your system monitor config to ensure your dashboard still works, depending on the backend you use.

Full release notes:#

  • chore: update changelog for release

  • feat(system-monitor): organize ghs button layout cleanly

  • fix(dashboard): navbar stretch on height

  • feat(environment): configuration option for system packages

  • feat(system-monitor)!: added selector to choose start date of graphs

  • perf(system-monitor): trigger publish messages on all state changes

  • refactor(system-monitor): configure defaults for MockSystemMonitorConfig and validate against dashboard config

  • fix(dashboard): notify user that we are restarting

  • fix(system-monitor): enable subscriber after temperature widget is initialized

v0.2.2 (19.11.2025)#

This release includes support for Gas Handling Systems via the GUI. It also includes assorted QOL improvements.

Full release notes:#

  • chore: update changelog for release

  • feat(orchestration): added logs for system rebuilding

  • feat(system-monitor): GHS dashboard

  • fix(dashboard): incorrect api url

  • feat(dashboard): restart dashboard button

  • feat(task_manager): Store tasks in database

v0.2.1 (14.11.2025)#

This release fixes a criticaL BREAKING issue with packaging. It requires a manual upgrade step for the system package from prior releases! Follow the steps here to migrate:

  • Remove the old version using sudo dnf remove orangeqs-juice-core

  • Remove the /opt/orangeqs/juice directory using sudo rm -rf /opt/orangeqs/juice

  • Install the new version as normal, e.g. sudo dnf install $(juice-download-latest)

Full release notes:#

  • fix: mock compressor messaging errors

  • feat: read-only mode for system monitor dashboard

  • refactor: remove legacy task manager

  • feat(tasks): use class name in display name of ipython task

  • feat(dashboard): apply orangeqs styling to internal widgets

  • fix(packaging)!: mark parent directories part of rpm package and handle bytecode cache

v0.2.0 (14.11.2025)#

This release includes the following key features:

  • Dashboards and data structures for system monitoring frontend: This is a breaking change, make sure to update your mock-system-monitor.toml within your lab repos and configs to match the default provided by juice.

  • The first release of the orangeqs.juice.identifiers module which provides utilities for tracking experiment and cycle runs within the Juice framework

  • Assorted bugfixes and documentation imrpovements

Full release notes:#

  • chore: update changelog for release

  • feat(system-monitor)!: compressor widget panel

  • docs: add backup and restore guide

  • feat(system-monitor)!: thermometry dashboard

  • feat(system-monitor): heater dashboard

  • fix(dashboard): allow all websocket origins and use bundled static resources

  • docs: remove redundant restart in install instructions

  • fix(messaging): handle special float values like nan

  • refactor(identifiers)!: consistent use of latest prefix for context-agnostic functions

  • feat(identifiers): standard interface for parsing identifiers

  • feat(system-monitor)!: data structures, tasks and mock pulse tubes compressors

  • perf(environment): compile bytecode on build to improve import time

  • feat(identifiers): api for managing multiple identifiers

  • feat(messaging): add synchronous blocking publisher and subscriber

  • docs: recommend SSDs for OS partition

  • docs: document logging config schema configurable

  • feat(docs): sphinx directives for configurables and config schema reference

  • chore: update changelog for release

v0.1.0 (29.10.2025)#

This is the initial development pre-release of the orangeqs-juice-core package. While the maintainers aim to keep the existing API stable, please note that breaking changes may occur at any time prior to the v1.0.0 release.

Full release notes:#

  • fix(dashboard): scrolling for content covered by navbar

  • fix(ci): disable versioned docs for stable release pipeline

  • fix(changelog): formatting

  • chore: add CHANGELOG.md

  • feat(environment): add host orchestrator and rebuild service client api

  • feat(jupyterhub): support gitlab authenticator and extra configuration options

  • refactor: spawn system monitoring service by default only for devcontainers

  • refactor: set default authenticator as pam and configure shared password for devcontainers

  • feat(orchestration): support different user ids and add default juice-data user

  • feat(environment): run uv sync on environment build

  • fix(jupyterhub): use singleuser env name instead of full env

  • feat: client API for restarting services

  • fix: add missing runtime dependency specifier

  • feat(environment)!: bind one environment to each service

  • feat(docs): directive for listing configuration schema

  • feat: singleuser dashboard restart API

  • refactor(dashboard): move widgets and pages into separate modules

  • fix(orchestration): service to create runtime data on system boot

  • docs: update note on user creation with man page link and explicit server restart

  • chore: apply apache license

  • feat(dashboard): refactor page collection from entry points

  • feat(ipython): support init module argument and async modules

  • chore(ci): update and pin ruff to v0.14.0

  • feat(service): add config option for specifying init args and kwargs

  • fix(ci): pin node v24 for pyright job

  • fix(dashboard): ensure no duplicate services and sort by name

  • fix(orchestration): escape environment variables for systemd units

  • fix: hardcode mesa libgl into containers

  • feat(task): add display names to tasks

  • feat(task): public client api for request and execute

  • feat(dashboard): service log pane

  • fix(dashboard): event listener for singleuser delayed spawn and improved error handling

  • feat(orchestration): add devices option to container

  • docs: improve clarity on installation

  • feat(dashboard): add service status widget to the overview page

  • fix: path to static resources for dashboard

  • fix: pin ipykernel <7

  • feat(task): route tasks through task manager

  • docs: minor updates to documentation for clarity on installation

  • feat: use container settings for singleuser container

  • fix: add py.typed marker to support typing

  • feat: add nano to default environment

  • chore(docs): added not to getting started to redirect for dev env

  • fix: navbar height and css cleanup

  • fix: broken docs link on README.md

  • feat: support loggers argument for display_dashboard_logs()

  • feat!: configurable mount points for overview page

  • fix(rpm): set rpm architecture and target distro

  • fix: remove all argument from telegraf command

  • feat(rpm): always run latest version of rpm download script

  • feat(packaging): download script for rpm packages

  • fix(packaging): use valid filename with dynamic version for bundled wheel

  • feat(task): handle task client disconnect and reconnect

  • fix(packaging): pin fpm to 1.16.0

  • ci: release rpm artifacts into generic package registry

  • feat(orchestration): support jupyterhubs pluggable authentication module

  • fix(dashboard): use consistent path for bokeh applications

  • feat: configure rpc interface for user containers supervisor

  • feat(task): add ipython task and handler

  • feat(task): run task server on each service

  • fix(dashboard): Adding dashboard components to juice entrypoints

  • refactor!: change install name to orangeqs-juice-core

  • docs: fix subscriber tutorial

  • feat(system-monitor): thermometry unit abstraction layer

  • refactor!: add mock system monitor configuration to default lab configuration

  • docs(task): design for request reply interfaces

  • fix(orchestration): configure containers to always restart

  • fix(util): configure spawn_thread to use daemon true

  • feat: publish heater messages to database

  • feat: support for python 3.13

  • feat(dashboard): Add a way to easily view dashboard log messages

  • test(cli): catch raw config warning

  • fix(orchestration): provide correct permissions for telegraf command to output resource usage

  • feat(cli): command for listing config contents

  • feat: unified API for pubsub/database message

  • test: remove duplicate influxdb2 tests

  • feat(dashboard): Adding ControlPC monitoring to Overview page

  • fix(util): support parameters for rerun_on_exception

  • feat(orchestration): override container settings per environment

  • feat: minimal system monitor service

  • fix!: use synchronous service logging

  • feat: public interface to retrieve influxdb2 token

  • fix: use fixed password only for jupyterhub shared password in devcontainer

  • feat(orchestration): support released version as install source

  • feat(devcontainer): use a default password for jupyterhub

  • feat(ci): release job

  • feat(logging)!: Client.display_service_logs() for pretty printing logs

  • feat(pubsub): port pub/sub communication

  • fix(orchestrator): add dist mounts to runtime environment

  • refactor: retrieve influxdb tokens based on identity

  • feat: api for determining current identity

  • feat(logging): configure services to log to influxdb and stdout

  • fix(influxdb2): mount correct path to persist data

  • feat: port task manager service

  • fix(database): use mapping for filter type

  • feat(database): support async query and write

  • feat(database): simple orm for influxdb based on pydantic

  • fix(ipython): do not parse ipython command line arguments

  • docs(user): tutorial on proxy kernels

  • feat: proxy kernels in jupyperhub

  • feat(client): migrate influxDB client from prototype Juice

  • feat(orchestration): create influxdb tokens and buckets for users and services

  • fix(devcontainer): install optional dev dependencies

  • fix(test): use tomllib import on python 3.12

  • ci: enforce commit message standards

  • feat: initial dashboard application with placeholders for applications

  • feat: cached ipyclient methods for client

  • fix: detect methods vs functions for client injection

  • feat: ipyclient for services

  • Add dashboard and dashboard components

  • feat: store service info in shared runtime data

  • feat: define and create default lab repository and package

  • feat(devcontainer): use volume for container storage and switch to uv

  • feat: store shared runtime data

  • feat: load configs from drop-in directories and without priority

  • feat: add supervisord for single user containers

  • feat: github copilot instructions

  • fix: polish client api extensions

  • feat: use wants instead of requires for depending on build services

  • chore: restructure modules into files and use all

  • feat: standardized configuration management

  • fix: install uv environment on container start

  • fix: correctly mount system and user shared library dependencies

  • chore: move orchestration settings to orchestration module

  • feat: start jupyterhub singleuser containers with docker spawner

  • feat: service entrypoint and ipython implementation

  • docs: creating an extension package and extension dev environment

  • chore: support and test python 3.10 3.11 3.12

  • feat: support client extensions via Python entry point system

  • feat: configuration and installation for jupyterhub server

  • feat: manage service environments using uv

  • feat: Configure and start influxdb2 and telegraf on Installation

  • docs: packaging instructions

  • docs: restructure and dev environment instructions

  • feat: create and start dummy service containers

  • fix: set correct redirects for pages

  • chore: remove unneeded variables and packages

  • feat: Add Pipeline Job to Release Documentation

  • chore: specify package dependencies in pyproject.toml

  • feat(packaging): support python version argument for system package build

  • chore(lint): pyright strict mode and build exclusion

  • feat: configure devcontainer

  • Initial commit