Panel 0.12.0

We are very excited to announce the release of 0.12.0! This release is a major step forward towards the Panel 1.0 release with many new features but also great focus on making Panel more robust with many bug fixes. Many thanks to everyone who contributed to this release directly or indirectly.

Find a blog post with an overview of the most exciting features here: HoloViz Blog

The 0.12.0 release is a minor release with a lot of exciting and a huge amount of bug fixes. We are very excited about the growing community and the many contributions we received. In particular we would like to thank @douglas-raillard-arm, @mathrick, @jlstevens, @hyamanieu, @Liam-Deacon, @Stubatiger, @ablythed, @syamajala, @Hoxbro, @jbednar, @brl0, @OBITORASU, @fleming79, dhruvbalwada and @rmorshea for contributing various fixes and improvements and the core developers @xavArtley, @MarcSkovMadsen and @philippjfr for continuing to push the development of Panel.



  • Add empty Progress bar (#2088)
  • Optimize initialization of templates (#2096)
  • Serialize Perspective schema (#2130)
  • Updated JSON pane to accept single quote and wrap properly (#2143, #2443)
  • Improvements for Perspective (#2153)
  • Improve handling of server prefix and proxied deployment scenarios (#2159, #2162)
  • Add support for setting bokeh theme (#2164, #2166, #2170)
  • Completely overhauled the default index template (#2198, #2340)
  • Enhancements for Template modals (#2269, #2523)
  • Make the Template sidebar width configurable (#2301)
  • Improve look and feel and styling of Fast templates (#2303, #2469, #2484, #2488)
  • Allow setting kwargs in Reactive.controls (#2304)
  • Add global configuration variable to always throttle sliders (#2306)
  • Add support for controlling text alignment in DataFrame and Tabulator (#2331)
  • Add Tabulator theme for Fast Templates (#2425)
  • Add ability to make only certain Tabulator rows selectable (#2433)
  • Add visible parameter to all components (#2440)
  • Send Plotly restyle and relayout events rather than full updates (#2445)
  • Add push_notebook helper function for syncing bokeh property changes in notebooks (#2447)
  • Improve visual styling of Card (#2343, #2348, #2376, #2437, #2527)
  • Ensure config variables are configured per user session (#2358, #2455, #2481)
  • Add save_layout and prevent_collision to ReactTemplate and FastGridTemplate (#2296, #2357)
  • Add ability to declare root application from panel serve (#2392)
  • Support jslinking Parameterized class (#2441)
  • Improve config.sizing_mode behavior (#2442)
  • Add separate RangeSlider value_start and value_end parameters (#2457, #2468)
  • Allow saving Templates (#2461)
  • Bundle Tabulator resources to allow usage in airgapped environment (#2471)
  • Ensure Trend indicator title wraps (#2483)
  • Scroll on Tabulator selection (#2503)
  • Increase notebook resource load timeout (#2515)
  • Auto-detect VSCode and Colab comms (#2536)
  • Add tooltip to Tabulator cells to see unformatted value (#2543)

Bug fixes:

  • Fix missing video in Video (#2109)
  • use idom.config to set dist dir (#2117)
  • Remove bootstrap CSS from FastGridTemplate (#2123)
  • Fix issues with Ace z-index (#2126)
  • Fix updating of Tabulator selection property (#2128)
  • Ensure changes on ReactiveData source are scheduled correctly (#2134)
  • Fixed Player looping when start is 0 (#2141)
  • Fix divide by zero issues on Trend indicator (#2148)
  • Ensure GridSpec override handles duplicate matches (#2150)
  • Fix for loading parameter widget linking (#2160)
  • Fix Tabulator ajax call on empty data (#2161)
  • Fix Tabulator sorting and data initialization (#2163)
  • Fix editing Tabulator with filters applied (#2165)
  • Fix theming on HoloViews plot updates (#2209)
  • Fixed data handling on Perspective pane (#2212)
  • Improve template and resource management for png export (#2221)
  • Improve and standardize selection behavior of Tabulator (#2230)
  • Ensure JS changes to Plotly pane are applied if not explicitly triggered (#2251)
  • Fix server-side Tabulator selection changes (#2252)
  • Fix update of Param subobjects (#2255)
  • Add support for vtkCornerAnnotations (#2257)
  • Improve request handling for remote pagination on Tabulator (#2265)
  • Allow setting Param precedence to None (#2266)
  • Disable nested field separators on Tabulator (#2289)
  • Fix errors when applying Perspective filters (#2300, #2521)
  • Ensure Param pane handles changes to unknown parameter (#2346)
  • Fix issues with local Audio and Video (#2380)
  • Ensure ReactiveData emits correct old data in event (#2398)
  • Ensure Plotly interactivity works when Plotly panes are displayed in tabs (#2418, #2463)
  • Fix Ace widget disabled parameter (#2449)
  • Ensure external resources are configured correctly on save (#2452)
  • Ensure table formatters and editors are copied on render to avoid bokeh errors (#2453)
  • Allow unicode auth response body (#2462)
  • Workaround TypeError for non-string json keys on Plotly pane (#2465)
  • Fix issue with throttled updates on Param (#2470)
  • Ensure Tabulator style is applied while streaming (#2478)
  • Fix issues setting resources on save (#2492)
  • Fix VideoStream unpause (#2508)
  • Ensure DataFrame and Tabulator widget data can be updated in callback (#2510)
  • Fix chaining of bind functions (#2513)
  • Fix broken serialisation when syncing url parameters (#2520)
  • Fix Perspective for string types (#2525)
  • Fix race condition in --autoreload (#2539)


  • Update Server_Deployment.ipynb (#2118)
  • Expand description of watch=True in Param.ipynb (#2120)
  • Switch to PyData Sphinx Theme (#2139)
  • Replace altair iris example with penguins (#2213)
  • Enable Binder (#2198)
  • Updates and fixes for Developer Guide (#2381)
  • Fixed Tabs documentation (#2448)
  • Added basic description and example of the Tabulator.configuration parameter (#2412)
  • Add parameters to Plotly reference guide (#2385)
  • Add useful links to developer docs (#2319)
  • Add documentation about parameterized components (#2454)
  • Demonstrate how to lazily load tabs (#2479)


  • Compatibility with HoloViews 2.0 (#2344)
  • Fix Tabulator styling with pandas 1.3 (#2512)


  • Remove add_periodic_callback method (#2439)
  • Remove deprecated panel.callbacks modules
  • Remove deprecated Ace pane and Audio Widget (#2427)
  • Remove Progress widget docs (#2451)
  • Tabulator no longer loaded by default, must be initialized with pn.extension('tabulator') (#2364)

Wow. You call this a “minor” release.

Congrats @philippjfr and Panel community. :+1:


Semantic versioning is kind of silly isn’t it: MAJOR.MINOR.PATCH

1 Like

Amazing work!
The reactive html looks very useful. Are there any guidelines as to when to use custom bokeh extensions and when a ReactiveHTML?
It looks that the ReactiveHTML is simpler to implement, as it doesn’t require node.js to build the extension?
Are there any drawbacks to using a ReactiveHTML? If I look at the Custom Components docs page it seems that ReactiveHTML is the way to go.

1 Like

I have never made a Bokeh model as the learning curve seems too high for my usage (although I use Panel extensively).
I could make a special button using ReactiveHTML within minutes inspired by the doc examples. I believe it’s the biggest (r)evolution of this version.


That’s a great question which I don’t have great answers to. Certainly if you find yourself writing a ton “scripts” and/or wrapping complex Javascript functionality or libraries I would consider writing an actual Bokeh model, so that the code is compiled once. ReactiveHTML components are definitely simpler to write and iterate on and in many cases are all you’ll need. The other major benefit of ReactiveHTML components is that they are not subject to the Bokeh layout engine (unless they are embedded in a bokeh layout like Row, Column, Tabs etc.) This means that if you add a ReactiveHTML component as the root of your application you can potentially avoid all the performance bottlenecks associated with bokeh more generally. That said the hope is that in Bokeh 3.0 the managed layout engine mostly disappears anyway.