Panel 1.0 Release

The Panel 1.0 release is finally here and it brings a huge number of improvements. The largest improvements in this release come from an upgrade from Bokeh 2.x to Bokeh 3.x. Bokeh overhauled its internal layout engine and stylesheet handling, making applications significantly more performant and customizable going forward.

This release marks a huge step forward in the usability of Panel but is also just a first step in leveraging many of the new capabilities that the updated layout engine and design system affords. In the coming months we will continue to improve and polish the UI and UX and make it easier for you to extend Panel as needed.

For now we want to thank the many people that contributed to this release either by contributing directly or by testing and providing feedback. Many thanks to the core contributors @MarcSkovMadsen, @Hoxbro, @maximlt, @jbednar, @droumis and @philippjfr and the outside contributors @ahuang11, @cdeil, @MridulS, @AndrewMaged814, @midnighter and @wendrul.


To see an overview of the most exciting features in Panel 1.0 check out this interactive slideshow we have prepared.


To install panel 1.0 simply get it with pip:

pip install panel==1.0.2

or with conda:

conda install -c conda-forge panel==1.0.2


Some of the changes related to the new layout engine and design system will require small updates to your existing applications. To make this transition as smooth as possible we have provided an upgrade/migration guide.

Major Features

The three main features we want to highlight as part of this release are:

New Components

This release also adds a number of exciting new components you can leverage in your applications:

Major enhancements

There are also a number of major enhancements in this release that we are very excited about:


The last major change we want to highlight is a complete overhaul of the documentation, moving from long and difficult-to-navigate user guides to distinct easily applied how-to guides along with separate, longer explanation sections. We also put in significant effort to ensure that most of our documentation can be run interactively in Pyodide or JupyterLite.

Deprecations & API changes



API changes & Backward Compatibility

Other Enhancements


  • Allow to set the log level of the Admin logger (#3495)
  • Add pn.state.served to simplify determining whether script is executed as an application or in an interactive session (#4252)
  • Add pn.config.loading_indicator to determine whether to show loading indicator by default (#4259)


  • Improve startup, error handling and shutdown of Jupyter kernels (#4364)
  • Log errors in JupyterLab preview to server logs (#4773)
  • Support binary JS → Python communication in notebooks (#4635)
  • Modify sys.path when running inside Jupyter Kernel (#4489)


  • IPython display compatibility in pyodide builds (#4270)
  • Ensure panel convert respects pn.config (#4359)
  • Fix notification support in Pyodide (#4387)


  • Handle cancelling and empty value edit events on Tabulator (#4343)
  • Add favicon to base template (#4626)
  • Ensure CrossSelector filters apply on each keystroke (#4339)
  • Do not re-create Vega.selections object unless selections changed (#4497)
  • Standardize parameter mapping APIs (#4386)
  • Add Plotly.link_figure parameter (#4333)
  • Add support for .JPEG file extension in the JPG pane (#4532)
  • Make periodic callback counter a parameter (#4134)
  • Add Echarts events (#2174)
  • Additional cache support (#4663, #4667)

Bug fixes

  • Fix caching on undecorated Parameterized method (#4332)
  • Ensure that global notification object can be used inside notebook callbacks (#4331)
  • Ensure hash_funcs are applied recursively in cache (#4334)
  • Fix cache FIFO policy bug (#4789)
  • Fix specifying custom index with relative path (#4288)
  • Fix issue reusing FileDownload model (#4328)
  • Fix DeckGL tooltip handling (#4628)
  • Fix NumPy integer/floating checks on Perspective (#4366)
  • Ensure memray profiler temporary file is flushed (#4666)
  • Fix mimetype issue on windows (#4738)
  • Fix Plotly undefined value errors for eventdata (#4355)


  • Ensure updates to Tabulator formatter or editor updates model (#4296, #4781)
  • Ensure Tabulator internal _index_mapping is updated on stream (#4292)
  • Ensure Tabulator header filters aren’t treated as regex (#4423)
  • Ensure Tabulator styles are re-applied when local pagination changes (#4795)


  • Ensure JupyterLab preview works on Windows (#4819)
  • Ensure notifications are enabled even if hv.extension has been loaded (#4330)