Version 0.3.0 of ContainDS has some exciting new features!

Streamlit Apps

It is now possible to run Streamlit apps in ContainDS, easily starting new environments to develop and run your apps. When finished, export as a ‘containds’ file so you can share directly with your clients and colleagues. Then can import the file into ContainDS running on their computer and see your app running exactly as you intended.

For a guide to working with a Streamlit app see Getting Started with Streamlit. To see how to export as a containds file see Share Streamlit container as a file.

Export as Voila presentation

Jupyter notebooks can optionally be exported as containds files such that the receipient will automatically view it as a Voila presentation. Voila is a system for running Jupyter notebooks as a form of web app where the user doesn’t see code cells, and the notebook is run from top-to-bottom safely and automatically.


There is now no such thing as an integrated workspace! Workspace folders will always be mounted from your local hard drive. In the case of Binder-based images, the workspace will be automatically extracted from the image.

You can always specify the precise workspace folder when a container is created, but by default these are in your user’s home folder. This default root location can be changed in the Preferences screen.

Jupyter Lab no longer default

With a fresh install of ContainDS, Jupyter-based containers will now default to the older Jupyter Notebooks rather than the newer JupyterLab user interface.

This decision was made because even new Binder images sometimes require a ‘Javascript rebuild’ when run. Similarly, ipywidgets often need to be activated manually.

You can change the behavior back to running JupyterLab through the Preferences screen, or just go to the /lab URL in your browser when Jupyter is running.

Allow Insecure Writes

There is an environment variable JUPYTER_ALLOW_INSECURE_WRITES which must be set to true for Jupyter to work correctly in Windows hosted containers. This is now set automatically by ContainDS but requires a package jupyter_core >= 4.6.2 inside the container in order to pick this up.

This allows kernel secrets to be set in a way that isn’t confused by the fact that Docker cannot understand file permissions on bind mounted folders.

The upshot is that older Binder-generated images may not work any longer (since the workspace is now extracted and mounted, as described above). This version of ContainDS uses ‘ideonate’ images for jupyter notebooks and repo2docker to ensure the latest version of jupyter_core is included.


As ever, your feedback is really important to the future of this project. Please get in touch with any thoughts or questions at all.