ContainDS Dashboards is an extension for JupyterHub allowing you to publish interactive visualizations for non-technical colleagues to try out. There are now a number of different open-source visualization frameworks supported out-of-the-box, and this post summarises those available, helping you decide which might be right for your project.


Voila is very closely related to Jupyter itself – it’s really just a user-friendly and secure version of the Jupyter Notebook or Lab server that you might use to build out your prototype in the first place. Basically, it runs the notebook from top-to-bottom, hiding code cells by default, and blocking arbitrary code from being executed.

The problem with showing Jupyter notebooks directly to colleagues is that the code cells will get in the way – either by clouding their reading experience, or because the user may make unexpected or even unsafe changes. Voila solves this in a way that closely mirrors the work you’re already doing in Jupyter. Add in some interactive widgets and you can very easily build a web app!

Since apps are just Jupyter notebooks, you can write them in any language that works for you – Python, R, or anything supported by Jupyter.

Our Voila user guide shows the simple deployment of a Voila dashboard on your JupyterHub using ContainDS Dashboards.

Example from Voila Gallery


Streamlit is a really interesting new framework based on a simple Python declarative scripting paradigm. It’s easy to create great-looking web apps using widgets (e.g. sliders and dropdowns) in a Python script that makes intuitive sense to the developer without having to worry about ‘events’ – how the code should react when something is clicked.

Whereas other frameworks may require you to think through the user flow yourself and connect up events, Streamlit by default takes care of this logic for you. As long as you’ve declared a slider, when the user interacts with it, Streamlit will take care of re-running the appropriate parts of your script.

This simplistic paradigm comes back to make some things more complicated of course – such as having to add caching decorators if too much of your code is being run too often.

Streamlit scripts must be run through the ‘streamlit run’ command.

See our Medium article Streamlit apps: Deploy Instantly with Zero Configuration or our Streamlit user guide.

Streamlit Covid-19 Explorer by Christian Werner

Plotly Dash

Plotly Dash is a ‘full-stack’ framework whereby you can use Python, R, or Julia to control not only the back-end data processing side of things, but also the front-end UI. Compared to Streamlit, you more often have to think through the way the user interface flow will work, connecting events. That’s not necessarily a bad thing, and ultimately gives you more control earlier on.

Similarly, you have more options for how you can work a Plotly Dash app as a sub-app into a wider-ranging application. The underlying server mechanism is more obviously exposed.

According to their website, Plotly Dash is the most popular framework for building ML and data science apps. It is well commercialized too (much like R Shiny – see below). That may give you more confidence in the development teams’ sustainability and ability to offer commercial options when needed, or, depending on your outlook, you may have more confidence in a crowd-built open-source framework that has been around for a long time (such as Bokeh).

See our Medium article Streamlit apps: Deploy Instantly with Zero Configuration or our Plotly Dash user guide.

Example from Plotly Dash Gallery


This is a long-standing framework that, in the Python world at least, popularised the idea of a visualization framework.

Bokeh is an interactive visualization library for modern web browsers. It provides elegant, concise construction of versatile graphics, and affords high-performance interactivity over large or streaming datasets. Bokeh can help anyone who would like to quickly and easily make interactive plots, dashboards, and data applications.

The Bokeh website

Bokeh grew out of Anaconda Inc (the virtual environment company) and is supported by the NumFOCUS non-profit which also supports Jupyter and many other scientific computing packages such as NumPy.

Its strength is in really detailed control of interactive graphs.

As a direct comparison, most people say they find Plotly Dash easier to get started and ultimately provides a similar level of control. But Bokeh can dive a bit deeper into more complex visualizations.

See our Bokeh user guide.

Example from the Bokeh Gallery


Panel builds on top of Bokeh. It provides a more flexible widget system, not just focusing on graphics. And it has a design goal of being able to run almost identically in a Jupyter notebook as it can as a standalone app.

As a result of this background, ContainDS Dashboards doesn’t actually have a ‘panel’ presentation type for you to choose directly. You can run Panel ipynb files through either the Voila or Bokeh deployment options! (Bokeh must be used for Panel in py scripts.)

Panel allows you to easily incorporate other open-source visualization components into your app. It is itself part of the wider HoloViz effort to simplify data visualization in Python.

If you like open-source and grant-supported projects that somehow seem to tie together the broader scientific computing movement, Panel is as pure as it gets!

Example from Panel Gallery

R Shiny Server

If you’re an enthusiast of the R language you’ll already know about the Shiny framework for interactive apps… and if you’re firmly a Pythonista you’re not about to switch now!

Shiny user interfaces can be built entirely using R, or can be written directly in HTML, CSS, and JavaScript for more flexibility.

If you’re only building a dashboard, and R is perfect for your analysis, Shiny should be perfect for your UI too. But it’s worth bearing in mind that if your code is going to develop into a larger web app in the future, you may end up missing the database and general software engineering power brought by a more general purpose language like Python.

Shiny is part of a powerful suite of data scientists’ tools brought to you by RStudio.

Note that Voila of course supports R notebooks. If you have a simple Jupyter notebook written in R then Voila may be the quickest way to make it interactive.

See our R Shiny Server user guide.

All these frameworks have their strengths and weaknesses. If you have a team of data scientists working on discrete bespoke projects then you’ll find that different frameworks will make sense for different problems.

That’s why the ContainDS Dashboards JupyterHub extension allows your team to use your existing JupyterHub authentication and hosting infrastructure to deploy web apps built in any open source framework.