---------------------------------------------------------------------------
RuntimeError Traceback (most recent call last)
Cell In[1], line 8
5 jd.loaders['astroquery'].open_in_tray()
6 jd.loaders['astroquery'].viewer = 'Image'
----> 8 jd.plugins['Orientation'].align_by = 'WCS'
File [~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/jdaviz/core/user_api.py:113](http://localhost:8890/lab/tree/notebooks/~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/jdaviz/core/user_api.py#line=112), in UserApiWrapper.__setattr__(self, attr, value)
110 else:
111 # allow setting by single index or name
112 value = to_choice_single(value)
--> 113 exp_obj.selected = value
114 return
116 elif isinstance(exp_obj, AddResults):
File [~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/jdaviz/core/template_mixin.py:1009](http://localhost:8890/lab/tree/notebooks/~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/jdaviz/core/template_mixin.py#line=1008), in BasePluginComponent.__setattr__(self, attr, value, force_super)
1007 return super().__setattr__(attr, value)
1008 value = self.map_value(attr, value)
-> 1009 return setattr(self._plugin, self._plugin_traitlets.get(attr), value)
File [~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/traitlets/traitlets.py:716](http://localhost:8890/lab/tree/notebooks/~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/traitlets/traitlets.py#line=715), in TraitType.__set__(self, obj, value)
714 if self.read_only:
715 raise TraitError('The "%s" trait is read-only.' % self.name)
--> 716 self.set(obj, value)
File [~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/traitlets/traitlets.py:706](http://localhost:8890/lab/tree/notebooks/~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/traitlets/traitlets.py#line=705), in TraitType.set(self, obj, value)
702 silent = False
703 if silent is not True:
704 # we explicitly compare silent to True just in case the equality
705 # comparison above returns something other than True[/False](http://localhost:8890/False)
--> 706 obj._notify_trait(self.name, old_value, new_value)
File [~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/traitlets/traitlets.py:1513](http://localhost:8890/lab/tree/notebooks/~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/traitlets/traitlets.py#line=1512), in HasTraits._notify_trait(self, name, old_value, new_value)
1512 def _notify_trait(self, name: str, old_value: t.Any, new_value: t.Any) -> None:
-> 1513 self.notify_change(
1514 Bunch(
1515 name=name,
1516 old=old_value,
1517 new=new_value,
1518 owner=self,
1519 type="change",
1520 )
1521 )
File [~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/ipywidgets/widgets/widget.py:701](http://localhost:8890/lab/tree/notebooks/~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/ipywidgets/widgets/widget.py#line=700), in Widget.notify_change(self, change)
698 if name in self.keys and self._should_send_property(name, getattr(self, name)):
699 # Send new state to front-end
700 self.send_state(key=name)
--> 701 super().notify_change(change)
File [~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/traitlets/traitlets.py:1525](http://localhost:8890/lab/tree/notebooks/~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/traitlets/traitlets.py#line=1524), in HasTraits.notify_change(self, change)
1523 def notify_change(self, change: Bunch) -> None:
1524 """Notify observers of a change event"""
-> 1525 return self._notify_observers(change)
File [~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/traitlets/traitlets.py:1568](http://localhost:8890/lab/tree/notebooks/~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/traitlets/traitlets.py#line=1567), in HasTraits._notify_observers(self, event)
1565 elif isinstance(c, EventHandler) and c.name is not None:
1566 c = getattr(self, c.name)
-> 1568 c(event)
File [~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/jdaviz/configs/imviz/plugins/orientation/orientation.py:256](http://localhost:8890/lab/tree/notebooks/~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/jdaviz/configs/imviz/plugins/orientation/orientation.py#line=255), in Orientation._update_link(self, msg)
253 if self.align_by.selected == 'Pixels':
254 self.wcs_fast_approximation = True
--> 256 self._link_image_data()
257 # NOTE: _link_image_data will reset linking_in_progress to False
258
259 # load data into the viewer that are now compatible with the
260 # new link type, remove data from the viewer that are now
261 # incompatible:
262 wcs_linked = self.align_by.selected == 'WCS'
File [~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/jdaviz/configs/imviz/plugins/orientation/orientation.py:178](http://localhost:8890/lab/tree/notebooks/~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/jdaviz/configs/imviz/plugins/orientation/orientation.py#line=177), in Orientation._link_image_data(self)
176 try:
177 align_by = self.align_by.selected.lower()
--> 178 link_image_data(
179 self.app,
180 align_by=align_by,
181 wcs_fallback_scheme='pixels' if self.wcs_use_fallback else None,
182 wcs_fast_approximation=self.wcs_fast_approximation,
183 error_on_fail=False)
184 except Exception: # pragma: no cover
185 raise
File [~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/jdaviz/configs/imviz/plugins/orientation/orientation.py:775](http://localhost:8890/lab/tree/notebooks/~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/jdaviz/configs/imviz/plugins/orientation/orientation.py#line=774), in link_image_data(app, align_by, wcs_fallback_scheme, wcs_fast_approximation, error_on_fail)
773 rotation_angle = -degn * u.deg
774 ndd = _get_rotated_nddata_from_label(app, default_reference_layer.label, rotation_angle)
--> 775 add_wcs_data_to_app(app, ndd, data_label=base_wcs_layer_label)
777 # set default layer to reference data in all viewers:
778 for viewer_id in app.get_viewer_ids():
File [~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/jdaviz/configs/imviz/plugins/orientation/orientation.py:639](http://localhost:8890/lab/tree/notebooks/~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/jdaviz/configs/imviz/plugins/orientation/orientation.py#line=638), in add_wcs_data_to_app(app, data, data_label)
638 def add_wcs_data_to_app(app, data, data_label=None):
--> 639 app._jdaviz_helper.load(data, format='Image',
640 data_label=data_label, viewer=[])
641 # TODO: refactor logic to avoid having to send an AddDataMessage just to update icons
642 # ensure that icons are updated by forcing a call to app._on_layers_changed
643 image_viewer = app.get_viewers_of_cls(ImvizImageView)[0]
File [~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/jdaviz/core/helpers.py:218](http://localhost:8890/lab/tree/notebooks/~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/jdaviz/core/helpers.py#line=217), in ConfigHelper._load(self, inp, loader, format, target, **kwargs)
216 importer = resolver.importer
217 importer._obj._apply_kwargs(kwargs)
--> 218 out = resolver.load()
219 # force cleanup before returning
220 resolver._obj._cleanup()
File [~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/jdaviz/core/loaders/resolvers/resolver.py:886](http://localhost:8890/lab/tree/notebooks/~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/jdaviz/core/loaders/resolvers/resolver.py#line=885), in BaseResolver.load(self)
882 def load(self):
883 """
884 Import into jdaviz with all selected options.
885 """
--> 886 return self.importer()
File [~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/jdaviz/core/loaders/importers/image/image.py:353](http://localhost:8890/lab/tree/notebooks/~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/jdaviz/core/loaders/importers/image/image.py#line=352), in ImageImporter.__call__(self)
350 if self.gwcs_to_fits_sip:
351 output = self._glue_data_wcs_to_fits(output)
--> 353 self.add_to_data_collection(output, data_label, data_hash=ext_item.get('data_hash'),
354 parent=parent_data_label if parent_data_label != data_label else None, # noqa
355 cls=CCDData)
357 align_plg = self.app._jdaviz_helper.plugins.get('Orientation', None)
358 if align_plg is not None:
File [~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/jdaviz/core/loaders/importers/importer.py:285](http://localhost:8890/lab/tree/notebooks/~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/jdaviz/core/loaders/importers/importer.py#line=284), in BaseImporterToDataCollection.add_to_data_collection(self, data, data_label, data_hash, parent, viewer_select, cls)
282 # Create a hashed representation of the data if not already present
283 data.meta['_data_hash'] = data_hash if data_hash is not None else create_data_hash(data)
--> 285 self.app.add_data(data, data_label=data_label)
286 if parent is not None:
287 self.app._set_assoc_data_as_child(data_label, parent)
File [~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/jdaviz/app.py:1731](http://localhost:8890/lab/tree/notebooks/~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/jdaviz/app.py#line=1730), in Application.add_data(self, data, data_label, notify_done, parent)
1728 if data_label in self.data_collection.labels:
1729 warnings.warn(f"Overwriting existing data entry with label '{data_label}'")
-> 1731 self.data_collection[data_label] = data
1733 # manage associated Data entries:
1734 self._add_assoc_data_as_parent(data_label)
File [~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/glue/core/data_collection.py:444](http://localhost:8890/lab/tree/notebooks/~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/glue/core/data_collection.py#line=443), in DataCollection.__setitem__(self, key, data)
441 if existing_data.label == key:
442 self.remove(existing_data)
--> 444 self.append(data)
File [~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/glue/core/data_collection.py:90](http://localhost:8890/lab/tree/notebooks/~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/glue/core/data_collection.py#line=89), in DataCollection.append(self, data)
88 s.register()
89 msg = DataCollectionAddMessage(self, data)
---> 90 self.hub.broadcast(msg)
92 self._sync_link_manager()
File [~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/glue/core/hub.py:225](http://localhost:8890/lab/tree/notebooks/~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/glue/core/hub.py#line=224), in Hub.broadcast(self, message)
223 logging.getLogger(__name__).info("Broadcasting %s", message)
224 for subscriber, handler in self._find_handlers(message):
--> 225 handler(message)
File [~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/jdaviz/configs/imviz/plugins/orientation/orientation.py:215](http://localhost:8890/lab/tree/notebooks/~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/jdaviz/configs/imviz/plugins/orientation/orientation.py#line=214), in Orientation._on_new_app_data(self, msg)
207 if "ra" in components or "Lon" in components:
208 # linking currently removes any markers, so we want to skip
209 # linking immediately after new markers are added. Check if
(...) 212 # want to support linking WITH markers, # at which point this
213 # if-statement should be removed.
214 return
--> 215 self._link_image_data()
216 self._check_if_data_with_wcs_exists()
File [~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/jdaviz/configs/imviz/plugins/orientation/orientation.py:178](http://localhost:8890/lab/tree/notebooks/~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/jdaviz/configs/imviz/plugins/orientation/orientation.py#line=177), in Orientation._link_image_data(self)
176 try:
177 align_by = self.align_by.selected.lower()
--> 178 link_image_data(
179 self.app,
180 align_by=align_by,
181 wcs_fallback_scheme='pixels' if self.wcs_use_fallback else None,
182 wcs_fast_approximation=self.wcs_fast_approximation,
183 error_on_fail=False)
184 except Exception: # pragma: no cover
185 raise
File [~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/jdaviz/configs/imviz/plugins/orientation/orientation.py:910](http://localhost:8890/lab/tree/notebooks/~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/jdaviz/configs/imviz/plugins/orientation/orientation.py#line=909), in link_image_data(app, align_by, wcs_fallback_scheme, wcs_fast_approximation, error_on_fail)
907 links_list += new_links
909 if len(links_list) > 0:
--> 910 with app.data_collection.delay_link_manager_update():
911 if len(data_already_linked):
912 app.data_collection.add_link(links_list) # Add to existing
File [~/miniconda3/envs/jdaviz-12/lib/python3.12/contextlib.py:144](http://localhost:8890/lab/tree/notebooks/~/miniconda3/envs/jdaviz-12/lib/python3.12/contextlib.py#line=143), in _GeneratorContextManager.__exit__(self, typ, value, traceback)
142 if typ is None:
143 try:
--> 144 next(self.gen)
145 except StopIteration:
146 return False
File [~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/glue/core/data_collection.py:166](http://localhost:8890/lab/tree/notebooks/~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/glue/core/data_collection.py#line=165), in DataCollection.delay_link_manager_update(self)
164 yield
165 self._disable_sync_link_manager -= 1
--> 166 self._sync_link_manager()
File [~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/glue/core/data_collection.py:144](http://localhost:8890/lab/tree/notebooks/~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/glue/core/data_collection.py#line=143), in DataCollection._sync_link_manager(self)
142 # Avoid circular calls
143 with self._ignore_link_manager_update():
--> 144 self._link_manager.update_externally_derivable_components()
File [~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/glue/core/link_manager.py:255](http://localhost:8890/lab/tree/notebooks/~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/glue/core/link_manager.py#line=254), in LinkManager.update_externally_derivable_components(self, data)
253 d = DerivedComponent(data, link)
254 comps[cid] = d
--> 255 data._set_externally_derivable_components(comps)
257 # Now update information about pixel-aligned data
258 for data1 in data_collection:
File [~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/glue/core/data.py:662](http://localhost:8890/lab/tree/notebooks/~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/glue/core/data.py#line=661), in BaseCartesianData._set_externally_derivable_components(self, derivable_components)
660 if self.hub:
661 msg = ExternallyDerivableComponentsChangedMessage(self)
--> 662 self.hub.broadcast(msg)
File [~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/glue/core/hub.py:225](http://localhost:8890/lab/tree/notebooks/~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/glue/core/hub.py#line=224), in Hub.broadcast(self, message)
223 logging.getLogger(__name__).info("Broadcasting %s", message)
224 for subscriber, handler in self._find_handlers(message):
--> 225 handler(message)
File [~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/glue/viewers/common/viewer.py:302](http://localhost:8890/lab/tree/notebooks/~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/glue/viewers/common/viewer.py#line=301), in Viewer._update_data(self, message)
300 else:
301 if layer_artist.layer is message.data:
--> 302 layer_artist.update()
303 try:
304 components_changed = message.components_changed
File [~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/glue/utils/matplotlib.py:172](http://localhost:8890/lab/tree/notebooks/~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/glue/utils/matplotlib.py#line=171), in defer_draw.<locals>.wrapper(*args, **kwargs)
168 @wraps(func)
169 def wrapper(*args, **kwargs):
171 if len(DEFER_DRAW_BACKENDS) == 0:
--> 172 return func(*args, **kwargs)
174 # Don't recursively defer draws. We just check the first draw_idle
175 # method since all should be modified in sync.
176 if isinstance(DEFER_DRAW_BACKENDS[0].draw_idle, DeferredMethod):
File [~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/glue/viewers/image/layer_artist.py:215](http://localhost:8890/lab/tree/notebooks/~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/glue/viewers/image/layer_artist.py#line=214), in ImageLayerArtist.update(self, *event)
213 ARRAY_CACHE.pop(self.state.uuid, None)
214 PIXEL_CACHE.pop(self.state.uuid, None)
--> 215 self._update_image(force=True)
216 self.redraw()
File [~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/glue_jupyter/bqplot/image/layer_artist.py:125](http://localhost:8890/lab/tree/notebooks/~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/glue_jupyter/bqplot/image/layer_artist.py#line=124), in BqplotImageLayerArtist._update_image(self, force, **kwargs)
121 changed = self.pop_changed_properties()
123 if force or any(prop in changed for prop in ('layer', 'attribute',
124 'slices', 'x_att', 'y_att')):
--> 125 self._update_image_data()
126 force = True # make sure scaling and visual attributes are updated
128 if force or any(prop in changed for prop in ('v_min', 'v_max', 'contrast',
129 'bias', 'alpha', 'color_mode',
130 'cmap', 'color', 'zorder',
131 'visible', 'stretch', 'stretch_parameters',
132 'bitmap_visible', 'contour_visible')):
File [~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/glue_jupyter/bqplot/image/layer_artist.py:138](http://localhost:8890/lab/tree/notebooks/~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/glue_jupyter/bqplot/image/layer_artist.py#line=137), in BqplotImageLayerArtist._update_image_data(self, *args, **kwargs)
137 def _update_image_data(self, *args, **kwargs):
--> 138 self.composite_image.invalidate_cache()
139 # if the image data change, the contour lines are invalid
140 self._contour_line_cache.clear()
File [~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/glue_jupyter/bqplot/image/frb_mark.py:116](http://localhost:8890/lab/tree/notebooks/~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/glue_jupyter/bqplot/image/frb_mark.py#line=115), in FRBImage.invalidate_cache(self)
115 def invalidate_cache(self):
--> 116 self.update(force=True)
File [~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/glue_jupyter/bqplot/image/frb_mark.py:106](http://localhost:8890/lab/tree/notebooks/~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/glue_jupyter/bqplot/image/frb_mark.py#line=105), in FRBImage.update(self, force, *args, **kwargs)
104 if image.dtype == np.dtype("float64"):
105 image = image.astype(np.float32)
--> 106 with self.hold_sync():
107 self.image = image
108 self.x = (xmin, xmax)
File [~/miniconda3/envs/jdaviz-12/lib/python3.12/contextlib.py:144](http://localhost:8890/lab/tree/notebooks/~/miniconda3/envs/jdaviz-12/lib/python3.12/contextlib.py#line=143), in _GeneratorContextManager.__exit__(self, typ, value, traceback)
142 if typ is None:
143 try:
--> 144 next(self.gen)
145 except StopIteration:
146 return False
File [~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/ipywidgets/widgets/widget.py:736](http://localhost:8890/lab/tree/notebooks/~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/ipywidgets/widgets/widget.py#line=735), in Widget.hold_sync(self)
734 finally:
735 self._holding_sync = False
--> 736 self.send_state(self._states_to_send)
737 self._states_to_send.clear()
File [~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/ipywidgets/widgets/widget.py:578](http://localhost:8890/lab/tree/notebooks/~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/ipywidgets/widgets/widget.py#line=577), in Widget.send_state(self, key)
570 def send_state(self, key=None):
571 """Sends the widget state, or a piece of it, to the front-end, if it exists.
572
573 Parameters
(...) 576 A single property's name or iterable of property names to sync with the front-end.
577 """
--> 578 state = self.get_state(key=key)
579 if len(state) > 0:
580 if self._property_lock: # we need to keep this dict up to date with the front-end values
File [~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/ipywidgets/widgets/widget.py:613](http://localhost:8890/lab/tree/notebooks/~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/ipywidgets/widgets/widget.py#line=612), in Widget.get_state(self, key, drop_defaults)
611 state = {}
612 traits = self.traits()
--> 613 for k in keys:
614 to_json = self.trait_metadata(k, 'to_json', self._trait_to_json)
615 value = to_json(getattr(self, k), self)
RuntimeError: Set changed size during iteration
Jdaviz component
Imviz
Description
While testing #4002, I was running this snippet:
That worked fine. However, you put both of these lines in the same cell, you get a big traceback, collapsed below:
Traceback
The traceback goes down into glue-jupyter, glue, bqplot, and ipywidgets, leaving jdaviz at
jdaviz/configs/imviz/plugins/orientation/orientation.py:910:How to Reproduce
Expected behavior
The WCS linking should be completed and bqplot shouldn't raise an error.
Browser
No response
Jupyter
jupyter --version
Software versions
macOS-26.2-arm64-arm-64bit
Python 3.12.12 | packaged by Anaconda, Inc. | (main, Oct 21 2025, 20:07:49) [Clang 20.1.8 ]
Numpy 2.3.5
astropy 7.2.0
matplotlib 3.10.8
scipy 1.16.3
scikit-image 0.25.2
asdf 5.1.0
stdatamodels 4.1.0
gwcs 0.26.1
regions 0.11
specutils 2.2.0
specreduce 1.7.0
photutils 2.3.0
astroquery 0.4.11
pyyaml 6.0.3
asteval 1.0.8
idna 3.11
traitlets 5.14.3
bqplot 0.12.45
bqplot-image-gl 1.8.0
glue-core 1.24.1
glue-jupyter 0.25.0
glue-astronomy 0.14.0
echo 0.11.1
ipyvue 1.11.3
ipyvuetify 1.11.3
ipysplitpanes 0.2.0
ipygoldenlayout 0.4.0
ipypopout 2.0.1
Jinja2 3.1.6
solara 1.55.1
vispy 0.16.0
sidecar 0.8.0
Jdaviz 4.6.dev33+g1f55b5389.d20260203