├── .gitignore ├── LICENSE ├── README.md ├── environment.yml ├── examples ├── basics.ipynb ├── iris.csv └── test.db ├── img ├── 99-ways-extend-jupyter.png ├── awesome-jupyter.png ├── extension-manager.png ├── jupyterlab-celltags.gif ├── jupyterlab-code-formatter.gif ├── jupyterlab-commenting.gif ├── jupyterlab-debugger.png ├── jupyterlab-drawio.gif ├── jupyterlab-extensions-github.png ├── jupyterlab-go-to-definition.gif ├── jupyterlab-heroku.gif ├── jupyterlab-kernelspy.png ├── jupyterlab-logo.png ├── jupyterlab-lsp.png ├── jupyterlab-material-darker.png ├── jupyterlab-matplotlib.gif ├── jupyterlab-nbdime.png ├── jupyterlab-pkg-installer.gif ├── jupyterlab-python-bytecode.gif ├── jupyterlab-quickopen.gif ├── jupyterlab-rich-text-mode.gif ├── jupyterlab-sidecar.gif ├── jupyterlab-sql.gif ├── jupyterlab-templates.gif ├── jupyterlab-theme-darcula.png ├── jupyterlab-toc.gif ├── jupyterlab-topbar.gif ├── jupyterlab-variableinspector.gif ├── quantstack-logo.svg ├── skip.png ├── voila-jupyterlab-preview.gif └── zethus.mp4 ├── postBuild └── presentation.ipynb /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | .DS_Store 6 | 7 | # C extensions 8 | *.so 9 | 10 | # Distribution / packaging 11 | .Python 12 | env/ 13 | build/ 14 | develop-eggs/ 15 | dist/ 16 | downloads/ 17 | eggs/ 18 | .eggs/ 19 | lib/ 20 | lib64/ 21 | parts/ 22 | sdist/ 23 | var/ 24 | *.egg-info/ 25 | .installed.cfg 26 | *.egg 27 | 28 | # PyInstaller 29 | # Usually these files are written by a python script from a template 30 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 31 | *.manifest 32 | *.spec 33 | 34 | # Installer logs 35 | pip-log.txt 36 | pip-delete-this-directory.txt 37 | 38 | # Unit test / coverage reports 39 | htmlcov/ 40 | .tox/ 41 | .coverage 42 | .coverage.* 43 | .cache 44 | nosetests.xml 45 | coverage.xml 46 | *,cover 47 | .hypothesis/ 48 | 49 | # Translations 50 | *.mo 51 | *.pot 52 | 53 | # Django stuff: 54 | *.log 55 | local_settings.py 56 | 57 | # Flask stuff: 58 | instance/ 59 | .webassets-cache 60 | 61 | # Scrapy stuff: 62 | .scrapy 63 | 64 | # Sphinx documentation 65 | docs/_build/ 66 | 67 | # PyBuilder 68 | target/ 69 | 70 | # IPython Notebook 71 | .ipynb_checkpoints 72 | 73 | # pyenv 74 | .python-version 75 | 76 | # celery beat schedule file 77 | celerybeat-schedule 78 | 79 | # dotenv 80 | .env 81 | 82 | # virtualenv 83 | venv/ 84 | ENV/ 85 | 86 | # Spyder project settings 87 | .spyderproject 88 | 89 | # Rope project settings 90 | .ropeproject 91 | 92 | # Untitled files 93 | [Uu]ntitled* 94 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2019 Jeremy Tuloup 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # A Tour of JupyterLab Extensions 2 | 3 | [![Binder](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/jtpio/a-tour-of-jupyterlab-extensions/master?urlpath=lab%2Ftree%2Fpresentation.ipynb) 4 | 5 | ## PyConDE & PyData Berlin 2019 6 | 7 | ### 2019-10-10 8 | 9 | This presentation is an extended (and updated!) version of the lightning talk given at the PyData Berlin Meetup (December 2018). 10 | 11 | JupyterLab extensions greatly improve the user experience when it comes to working with Jupyter Notebook and Data Science workflows. The extension mechanism lets third-party developers write their own extensions and contribute back to the Jupyter ecosystem. 12 | 13 | There is now a growing number of these extensions which provide IDE-like features such as: git integration, code formatting, table of content, diagram editor, and many more. 14 | 15 | The goal of this presentation is to complement the online documentation by doing a demo of a curated list of these JupyterLab extensions. All happening in JupyterLab. 16 | 17 | ### Layout 18 | 19 | - Introduction to JupyterLab extensions: what are they and why are they useful? [5 min] 20 | - Demo of 20 JupyterLab extensions in 20 minutes [20 min] 21 | - What's next and questions? [5 min] 22 | 23 | ## Local Setup 24 | 25 | ```bash 26 | # create an environment 27 | conda env create 28 | 29 | # install the extensions 30 | chmod +x ./postBuild 31 | ./postBuild 32 | 33 | # start JupyterLab 34 | jupyter lab 35 | ``` 36 | -------------------------------------------------------------------------------- /environment.yml: -------------------------------------------------------------------------------- 1 | name: pydata-berlin-2019 2 | channels: 3 | - conda-forge 4 | dependencies: 5 | - black 6 | - ipycanvas 7 | - ipyleaflet 8 | - jupyterlab=1 9 | - nbdime 10 | - pip 11 | - python=3.7 12 | - voila 13 | - pip: 14 | - jupyterlab-git 15 | - jupyterlab_code_formatter 16 | - jupyterlab-quickopen 17 | - jupyterlab_sql 18 | - nbresuse 19 | - sidecar 20 | 21 | -------------------------------------------------------------------------------- /examples/basics.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# So easy, *voilà*!\n", 8 | "\n", 9 | "In this example notebook, we demonstrate how voila can render Jupyter notebooks with interactions requiring a roundtrip to the kernel." 10 | ] 11 | }, 12 | { 13 | "cell_type": "markdown", 14 | "metadata": {}, 15 | "source": [ 16 | "## Jupyter Widgets" 17 | ] 18 | }, 19 | { 20 | "cell_type": "code", 21 | "execution_count": null, 22 | "metadata": {}, 23 | "outputs": [], 24 | "source": [ 25 | "import ipywidgets as widgets\n", 26 | "\n", 27 | "slider = widgets.FloatSlider(description='$x$', value=4)\n", 28 | "text = widgets.FloatText(disabled=True, description='$x^2$')\n", 29 | "\n", 30 | "def compute(*ignore):\n", 31 | " text.value = str(slider.value ** 2)\n", 32 | "\n", 33 | "slider.observe(compute, 'value')\n", 34 | "\n", 35 | "widgets.VBox([slider, text])" 36 | ] 37 | }, 38 | { 39 | "cell_type": "markdown", 40 | "metadata": {}, 41 | "source": [ 42 | "## Basic outputs of code cells" 43 | ] 44 | }, 45 | { 46 | "cell_type": "code", 47 | "execution_count": null, 48 | "metadata": {}, 49 | "outputs": [], 50 | "source": [ 51 | "import pandas as pd\n", 52 | "\n", 53 | "iris = pd.read_csv('./iris.csv')\n", 54 | "iris" 55 | ] 56 | } 57 | ], 58 | "metadata": { 59 | "kernelspec": { 60 | "display_name": "Python 3", 61 | "language": "python", 62 | "name": "python3" 63 | }, 64 | "language_info": { 65 | "codemirror_mode": { 66 | "name": "ipython", 67 | "version": 3 68 | }, 69 | "file_extension": ".py", 70 | "mimetype": "text/x-python", 71 | "name": "python", 72 | "nbconvert_exporter": "python", 73 | "pygments_lexer": "ipython3", 74 | "version": "3.7.3" 75 | } 76 | }, 77 | "nbformat": 4, 78 | "nbformat_minor": 4 79 | } 80 | -------------------------------------------------------------------------------- /examples/iris.csv: -------------------------------------------------------------------------------- 1 | sepal_length,sepal_width,petal_length,petal_width,species 2 | 5.1,3.5,1.4,0.2,setosa 3 | 4.9,3.0,1.4,0.2,setosa 4 | 4.7,3.2,1.3,0.2,setosa 5 | 4.6,3.1,1.5,0.2,setosa 6 | 5.0,3.6,1.4,0.2,setosa 7 | 5.4,3.9,1.7,0.4,setosa 8 | 4.6,3.4,1.4,0.3,setosa 9 | 5.0,3.4,1.5,0.2,setosa 10 | 4.4,2.9,1.4,0.2,setosa 11 | 4.9,3.1,1.5,0.1,setosa 12 | 5.4,3.7,1.5,0.2,setosa 13 | 4.8,3.4,1.6,0.2,setosa 14 | 4.8,3.0,1.4,0.1,setosa 15 | 4.3,3.0,1.1,0.1,setosa 16 | 5.8,4.0,1.2,0.2,setosa 17 | 5.7,4.4,1.5,0.4,setosa 18 | 5.4,3.9,1.3,0.4,setosa 19 | 5.1,3.5,1.4,0.3,setosa 20 | 5.7,3.8,1.7,0.3,setosa 21 | 5.1,3.8,1.5,0.3,setosa 22 | 5.4,3.4,1.7,0.2,setosa 23 | 5.1,3.7,1.5,0.4,setosa 24 | 4.6,3.6,1.0,0.2,setosa 25 | 5.1,3.3,1.7,0.5,setosa 26 | 4.8,3.4,1.9,0.2,setosa 27 | 5.0,3.0,1.6,0.2,setosa 28 | 5.0,3.4,1.6,0.4,setosa 29 | 5.2,3.5,1.5,0.2,setosa 30 | 5.2,3.4,1.4,0.2,setosa 31 | 4.7,3.2,1.6,0.2,setosa 32 | 4.8,3.1,1.6,0.2,setosa 33 | 5.4,3.4,1.5,0.4,setosa 34 | 5.2,4.1,1.5,0.1,setosa 35 | 5.5,4.2,1.4,0.2,setosa 36 | 4.9,3.1,1.5,0.2,setosa 37 | 5.0,3.2,1.2,0.2,setosa 38 | 5.5,3.5,1.3,0.2,setosa 39 | 4.9,3.6,1.4,0.1,setosa 40 | 4.4,3.0,1.3,0.2,setosa 41 | 5.1,3.4,1.5,0.2,setosa 42 | 5.0,3.5,1.3,0.3,setosa 43 | 4.5,2.3,1.3,0.3,setosa 44 | 4.4,3.2,1.3,0.2,setosa 45 | 5.0,3.5,1.6,0.6,setosa 46 | 5.1,3.8,1.9,0.4,setosa 47 | 4.8,3.0,1.4,0.3,setosa 48 | 5.1,3.8,1.6,0.2,setosa 49 | 4.6,3.2,1.4,0.2,setosa 50 | 5.3,3.7,1.5,0.2,setosa 51 | 5.0,3.3,1.4,0.2,setosa 52 | 7.0,3.2,4.7,1.4,versicolor 53 | 6.4,3.2,4.5,1.5,versicolor 54 | 6.9,3.1,4.9,1.5,versicolor 55 | 5.5,2.3,4.0,1.3,versicolor 56 | 6.5,2.8,4.6,1.5,versicolor 57 | 5.7,2.8,4.5,1.3,versicolor 58 | 6.3,3.3,4.7,1.6,versicolor 59 | 4.9,2.4,3.3,1.0,versicolor 60 | 6.6,2.9,4.6,1.3,versicolor 61 | 5.2,2.7,3.9,1.4,versicolor 62 | 5.0,2.0,3.5,1.0,versicolor 63 | 5.9,3.0,4.2,1.5,versicolor 64 | 6.0,2.2,4.0,1.0,versicolor 65 | 6.1,2.9,4.7,1.4,versicolor 66 | 5.6,2.9,3.6,1.3,versicolor 67 | 6.7,3.1,4.4,1.4,versicolor 68 | 5.6,3.0,4.5,1.5,versicolor 69 | 5.8,2.7,4.1,1.0,versicolor 70 | 6.2,2.2,4.5,1.5,versicolor 71 | 5.6,2.5,3.9,1.1,versicolor 72 | 5.9,3.2,4.8,1.8,versicolor 73 | 6.1,2.8,4.0,1.3,versicolor 74 | 6.3,2.5,4.9,1.5,versicolor 75 | 6.1,2.8,4.7,1.2,versicolor 76 | 6.4,2.9,4.3,1.3,versicolor 77 | 6.6,3.0,4.4,1.4,versicolor 78 | 6.8,2.8,4.8,1.4,versicolor 79 | 6.7,3.0,5.0,1.7,versicolor 80 | 6.0,2.9,4.5,1.5,versicolor 81 | 5.7,2.6,3.5,1.0,versicolor 82 | 5.5,2.4,3.8,1.1,versicolor 83 | 5.5,2.4,3.7,1.0,versicolor 84 | 5.8,2.7,3.9,1.2,versicolor 85 | 6.0,2.7,5.1,1.6,versicolor 86 | 5.4,3.0,4.5,1.5,versicolor 87 | 6.0,3.4,4.5,1.6,versicolor 88 | 6.7,3.1,4.7,1.5,versicolor 89 | 6.3,2.3,4.4,1.3,versicolor 90 | 5.6,3.0,4.1,1.3,versicolor 91 | 5.5,2.5,4.0,1.3,versicolor 92 | 5.5,2.6,4.4,1.2,versicolor 93 | 6.1,3.0,4.6,1.4,versicolor 94 | 5.8,2.6,4.0,1.2,versicolor 95 | 5.0,2.3,3.3,1.0,versicolor 96 | 5.6,2.7,4.2,1.3,versicolor 97 | 5.7,3.0,4.2,1.2,versicolor 98 | 5.7,2.9,4.2,1.3,versicolor 99 | 6.2,2.9,4.3,1.3,versicolor 100 | 5.1,2.5,3.0,1.1,versicolor 101 | 5.7,2.8,4.1,1.3,versicolor 102 | 6.3,3.3,6.0,2.5,virginica 103 | 5.8,2.7,5.1,1.9,virginica 104 | 7.1,3.0,5.9,2.1,virginica 105 | 6.3,2.9,5.6,1.8,virginica 106 | 6.5,3.0,5.8,2.2,virginica 107 | 7.6,3.0,6.6,2.1,virginica 108 | 4.9,2.5,4.5,1.7,virginica 109 | 7.3,2.9,6.3,1.8,virginica 110 | 6.7,2.5,5.8,1.8,virginica 111 | 7.2,3.6,6.1,2.5,virginica 112 | 6.5,3.2,5.1,2.0,virginica 113 | 6.4,2.7,5.3,1.9,virginica 114 | 6.8,3.0,5.5,2.1,virginica 115 | 5.7,2.5,5.0,2.0,virginica 116 | 5.8,2.8,5.1,2.4,virginica 117 | 6.4,3.2,5.3,2.3,virginica 118 | 6.5,3.0,5.5,1.8,virginica 119 | 7.7,3.8,6.7,2.2,virginica 120 | 7.7,2.6,6.9,2.3,virginica 121 | 6.0,2.2,5.0,1.5,virginica 122 | 6.9,3.2,5.7,2.3,virginica 123 | 5.6,2.8,4.9,2.0,virginica 124 | 7.7,2.8,6.7,2.0,virginica 125 | 6.3,2.7,4.9,1.8,virginica 126 | 6.7,3.3,5.7,2.1,virginica 127 | 7.2,3.2,6.0,1.8,virginica 128 | 6.2,2.8,4.8,1.8,virginica 129 | 6.1,3.0,4.9,1.8,virginica 130 | 6.4,2.8,5.6,2.1,virginica 131 | 7.2,3.0,5.8,1.6,virginica 132 | 7.4,2.8,6.1,1.9,virginica 133 | 7.9,3.8,6.4,2.0,virginica 134 | 6.4,2.8,5.6,2.2,virginica 135 | 6.3,2.8,5.1,1.5,virginica 136 | 6.1,2.6,5.6,1.4,virginica 137 | 7.7,3.0,6.1,2.3,virginica 138 | 6.3,3.4,5.6,2.4,virginica 139 | 6.4,3.1,5.5,1.8,virginica 140 | 6.0,3.0,4.8,1.8,virginica 141 | 6.9,3.1,5.4,2.1,virginica 142 | 6.7,3.1,5.6,2.4,virginica 143 | 6.9,3.1,5.1,2.3,virginica 144 | 5.8,2.7,5.1,1.9,virginica 145 | 6.8,3.2,5.9,2.3,virginica 146 | 6.7,3.3,5.7,2.5,virginica 147 | 6.7,3.0,5.2,2.3,virginica 148 | 6.3,2.5,5.0,1.9,virginica 149 | 6.5,3.0,5.2,2.0,virginica 150 | 6.2,3.4,5.4,2.3,virginica 151 | 5.9,3.0,5.1,1.8,virginica 152 | -------------------------------------------------------------------------------- /examples/test.db: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtpio/a-tour-of-jupyterlab-extensions/6850c904be58a43c82e9216339347f1d7d001bb3/examples/test.db -------------------------------------------------------------------------------- /img/99-ways-extend-jupyter.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtpio/a-tour-of-jupyterlab-extensions/6850c904be58a43c82e9216339347f1d7d001bb3/img/99-ways-extend-jupyter.png -------------------------------------------------------------------------------- /img/awesome-jupyter.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtpio/a-tour-of-jupyterlab-extensions/6850c904be58a43c82e9216339347f1d7d001bb3/img/awesome-jupyter.png -------------------------------------------------------------------------------- /img/extension-manager.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtpio/a-tour-of-jupyterlab-extensions/6850c904be58a43c82e9216339347f1d7d001bb3/img/extension-manager.png -------------------------------------------------------------------------------- /img/jupyterlab-celltags.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtpio/a-tour-of-jupyterlab-extensions/6850c904be58a43c82e9216339347f1d7d001bb3/img/jupyterlab-celltags.gif -------------------------------------------------------------------------------- /img/jupyterlab-code-formatter.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtpio/a-tour-of-jupyterlab-extensions/6850c904be58a43c82e9216339347f1d7d001bb3/img/jupyterlab-code-formatter.gif -------------------------------------------------------------------------------- /img/jupyterlab-commenting.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtpio/a-tour-of-jupyterlab-extensions/6850c904be58a43c82e9216339347f1d7d001bb3/img/jupyterlab-commenting.gif -------------------------------------------------------------------------------- /img/jupyterlab-debugger.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtpio/a-tour-of-jupyterlab-extensions/6850c904be58a43c82e9216339347f1d7d001bb3/img/jupyterlab-debugger.png -------------------------------------------------------------------------------- /img/jupyterlab-drawio.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtpio/a-tour-of-jupyterlab-extensions/6850c904be58a43c82e9216339347f1d7d001bb3/img/jupyterlab-drawio.gif -------------------------------------------------------------------------------- /img/jupyterlab-extensions-github.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtpio/a-tour-of-jupyterlab-extensions/6850c904be58a43c82e9216339347f1d7d001bb3/img/jupyterlab-extensions-github.png -------------------------------------------------------------------------------- /img/jupyterlab-go-to-definition.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtpio/a-tour-of-jupyterlab-extensions/6850c904be58a43c82e9216339347f1d7d001bb3/img/jupyterlab-go-to-definition.gif -------------------------------------------------------------------------------- /img/jupyterlab-heroku.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtpio/a-tour-of-jupyterlab-extensions/6850c904be58a43c82e9216339347f1d7d001bb3/img/jupyterlab-heroku.gif -------------------------------------------------------------------------------- /img/jupyterlab-kernelspy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtpio/a-tour-of-jupyterlab-extensions/6850c904be58a43c82e9216339347f1d7d001bb3/img/jupyterlab-kernelspy.png -------------------------------------------------------------------------------- /img/jupyterlab-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtpio/a-tour-of-jupyterlab-extensions/6850c904be58a43c82e9216339347f1d7d001bb3/img/jupyterlab-logo.png -------------------------------------------------------------------------------- /img/jupyterlab-lsp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtpio/a-tour-of-jupyterlab-extensions/6850c904be58a43c82e9216339347f1d7d001bb3/img/jupyterlab-lsp.png -------------------------------------------------------------------------------- /img/jupyterlab-material-darker.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtpio/a-tour-of-jupyterlab-extensions/6850c904be58a43c82e9216339347f1d7d001bb3/img/jupyterlab-material-darker.png -------------------------------------------------------------------------------- /img/jupyterlab-matplotlib.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtpio/a-tour-of-jupyterlab-extensions/6850c904be58a43c82e9216339347f1d7d001bb3/img/jupyterlab-matplotlib.gif -------------------------------------------------------------------------------- /img/jupyterlab-nbdime.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtpio/a-tour-of-jupyterlab-extensions/6850c904be58a43c82e9216339347f1d7d001bb3/img/jupyterlab-nbdime.png -------------------------------------------------------------------------------- /img/jupyterlab-pkg-installer.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtpio/a-tour-of-jupyterlab-extensions/6850c904be58a43c82e9216339347f1d7d001bb3/img/jupyterlab-pkg-installer.gif -------------------------------------------------------------------------------- /img/jupyterlab-python-bytecode.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtpio/a-tour-of-jupyterlab-extensions/6850c904be58a43c82e9216339347f1d7d001bb3/img/jupyterlab-python-bytecode.gif -------------------------------------------------------------------------------- /img/jupyterlab-quickopen.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtpio/a-tour-of-jupyterlab-extensions/6850c904be58a43c82e9216339347f1d7d001bb3/img/jupyterlab-quickopen.gif -------------------------------------------------------------------------------- /img/jupyterlab-rich-text-mode.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtpio/a-tour-of-jupyterlab-extensions/6850c904be58a43c82e9216339347f1d7d001bb3/img/jupyterlab-rich-text-mode.gif -------------------------------------------------------------------------------- /img/jupyterlab-sidecar.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtpio/a-tour-of-jupyterlab-extensions/6850c904be58a43c82e9216339347f1d7d001bb3/img/jupyterlab-sidecar.gif -------------------------------------------------------------------------------- /img/jupyterlab-sql.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtpio/a-tour-of-jupyterlab-extensions/6850c904be58a43c82e9216339347f1d7d001bb3/img/jupyterlab-sql.gif -------------------------------------------------------------------------------- /img/jupyterlab-templates.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtpio/a-tour-of-jupyterlab-extensions/6850c904be58a43c82e9216339347f1d7d001bb3/img/jupyterlab-templates.gif -------------------------------------------------------------------------------- /img/jupyterlab-theme-darcula.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtpio/a-tour-of-jupyterlab-extensions/6850c904be58a43c82e9216339347f1d7d001bb3/img/jupyterlab-theme-darcula.png -------------------------------------------------------------------------------- /img/jupyterlab-toc.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtpio/a-tour-of-jupyterlab-extensions/6850c904be58a43c82e9216339347f1d7d001bb3/img/jupyterlab-toc.gif -------------------------------------------------------------------------------- /img/jupyterlab-topbar.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtpio/a-tour-of-jupyterlab-extensions/6850c904be58a43c82e9216339347f1d7d001bb3/img/jupyterlab-topbar.gif -------------------------------------------------------------------------------- /img/jupyterlab-variableinspector.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtpio/a-tour-of-jupyterlab-extensions/6850c904be58a43c82e9216339347f1d7d001bb3/img/jupyterlab-variableinspector.gif -------------------------------------------------------------------------------- /img/quantstack-logo.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | image/svg+xml -------------------------------------------------------------------------------- /img/skip.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtpio/a-tour-of-jupyterlab-extensions/6850c904be58a43c82e9216339347f1d7d001bb3/img/skip.png -------------------------------------------------------------------------------- /img/voila-jupyterlab-preview.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtpio/a-tour-of-jupyterlab-extensions/6850c904be58a43c82e9216339347f1d7d001bb3/img/voila-jupyterlab-preview.gif -------------------------------------------------------------------------------- /img/zethus.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jtpio/a-tour-of-jupyterlab-extensions/6850c904be58a43c82e9216339347f1d7d001bb3/img/zethus.mp4 -------------------------------------------------------------------------------- /postBuild: -------------------------------------------------------------------------------- 1 | jupyter labextension install @jupyter-widgets/jupyterlab-manager \ 2 | @jupyterlab/git \ 3 | @jupyterlab/toc \ 4 | jupyterlab-python-bytecode \ 5 | @jupyter-widgets/jupyterlab-sidecar \ 6 | jupyterlab-drawio \ 7 | jupyter-leaflet \ 8 | @parente/jupyterlab-quickopen \ 9 | jupyterlab-topbar-extension \ 10 | @jupyterlab/celltags \ 11 | @krassowski/jupyterlab_go_to_definition \ 12 | jupyterlab-system-monitor \ 13 | jupyterlab-topbar-text \ 14 | jupyterlab-logout \ 15 | jupyterlab-theme-toggle \ 16 | @ryantam626/jupyterlab_code_formatter \ 17 | @jupyter-voila/jupyterlab-preview \ 18 | @oriolmirosa/jupyterlab_materialdarker \ 19 | ipycanvas \ 20 | --no-build 21 | 22 | jupyter serverextension enable --py jupyterlab_git 23 | jupyter serverextension enable --py jupyterlab_code_formatter 24 | jupyter serverextension enable --py jupyterlab_sql 25 | 26 | jupyter lab build 27 | 28 | -------------------------------------------------------------------------------- /presentation.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "![](./img/skip.png)" 8 | ] 9 | }, 10 | { 11 | "cell_type": "markdown", 12 | "metadata": {}, 13 | "source": [ 14 | "# A Tour of JupyterLab Extensions\n", 15 | "\n", 16 | "![jlab-logo](./img/jupyterlab-logo.png)\n", 17 | "\n", 18 | "## PyConDE & PyData Berlin 2019 - 2019-10-10\n", 19 | "\n", 20 | "## Jeremy Tuloup - [github.com/jtpio](https://github.com/jtpio)" 21 | ] 22 | }, 23 | { 24 | "cell_type": "markdown", 25 | "metadata": {}, 26 | "source": [ 27 | "![](./img/skip.png)" 28 | ] 29 | }, 30 | { 31 | "cell_type": "markdown", 32 | "metadata": {}, 33 | "source": [ 34 | "![quantstack](./img/quantstack-logo.svg)\n", 35 | "\n", 36 | "\n", 37 | "## Scientific Software Engineer\n", 38 | "\n", 39 | "## - [quantstack.net](https://quantstack.net)\n", 40 | "\n", 41 | "## - [github.com/jtpio](https://github.com/jtpio)\n", 42 | "\n", 43 | "## - [twitter.com/jtpio](https://twitter.com/jtpio)" 44 | ] 45 | }, 46 | { 47 | "cell_type": "markdown", 48 | "metadata": {}, 49 | "source": [ 50 | "![](./img/skip.png)" 51 | ] 52 | }, 53 | { 54 | "cell_type": "markdown", 55 | "metadata": {}, 56 | "source": [ 57 | "# Extending Jupyter\n", 58 | "\n", 59 | "## 99 ways to extend the Jupyter ecosystem\n", 60 | "\n", 61 | "### https://blog.jupyter.org/99-ways-to-extend-the-jupyter-ecosystem-11e5dab7c54\n", 62 | "\n", 63 | "![blog](./img/99-ways-extend-jupyter.png)" 64 | ] 65 | }, 66 | { 67 | "cell_type": "markdown", 68 | "metadata": {}, 69 | "source": [ 70 | "![](./img/skip.png)" 71 | ] 72 | }, 73 | { 74 | "cell_type": "markdown", 75 | "metadata": {}, 76 | "source": [ 77 | "![jlab](./img/jupyterlab-logo.png)" 78 | ] 79 | }, 80 | { 81 | "cell_type": "markdown", 82 | "metadata": {}, 83 | "source": [ 84 | "![](./img/skip.png)" 85 | ] 86 | }, 87 | { 88 | "cell_type": "markdown", 89 | "metadata": {}, 90 | "source": [ 91 | "# JupyterLab\n", 92 | "\n", 93 | "## - Next-gen UI for Jupyter\n", 94 | "\n", 95 | "## - 1.0\n", 96 | "\n", 97 | "## - Extensible by design\n", 98 | "\n", 99 | "## - 60+ extensions in core\n", 100 | "\n", 101 | "## - TypeScript & npm" 102 | ] 103 | }, 104 | { 105 | "cell_type": "markdown", 106 | "metadata": {}, 107 | "source": [ 108 | "![](./img/skip.png)" 109 | ] 110 | }, 111 | { 112 | "cell_type": "markdown", 113 | "metadata": {}, 114 | "source": [ 115 | "# Core extensions\n", 116 | "\n", 117 | "## -
File Browser\n", 118 | "## -
Console\n", 119 | "## -
Notebook\n", 120 | "## - ..." 121 | ] 122 | }, 123 | { 124 | "cell_type": "markdown", 125 | "metadata": {}, 126 | "source": [ 127 | "![](./img/skip.png)" 128 | ] 129 | }, 130 | { 131 | "cell_type": "markdown", 132 | "metadata": {}, 133 | "source": [ 134 | "# Third-party extensions" 135 | ] 136 | }, 137 | { 138 | "cell_type": "code", 139 | "execution_count": null, 140 | "metadata": {}, 141 | "outputs": [], 142 | "source": [ 143 | "from IPython.display import Video\n", 144 | "\n", 145 | "Video(\"./img/zethus.mp4\")" 146 | ] 147 | }, 148 | { 149 | "cell_type": "markdown", 150 | "metadata": {}, 151 | "source": [ 152 | "![](./img/skip.png)" 153 | ] 154 | }, 155 | { 156 | "cell_type": "markdown", 157 | "metadata": {}, 158 | "source": [ 159 | "# A Tour of 10 JupyterLab Extensions" 160 | ] 161 | }, 162 | { 163 | "cell_type": "markdown", 164 | "metadata": {}, 165 | "source": [ 166 | "![](./img/skip.png)" 167 | ] 168 | }, 169 | { 170 | "cell_type": "markdown", 171 | "metadata": {}, 172 | "source": [ 173 | "# #1. jupyterlab-git\n", 174 | "\n", 175 | "## https://github.com/jupyterlab/jupyterlab-git\n", 176 | "\n", 177 | "## `jupyter labextension install @jupyterlab/git`\n", 178 | "\n", 179 | "" 180 | ] 181 | }, 182 | { 183 | "cell_type": "markdown", 184 | "metadata": {}, 185 | "source": [ 186 | "![](./img/skip.png)" 187 | ] 188 | }, 189 | { 190 | "cell_type": "markdown", 191 | "metadata": {}, 192 | "source": [ 193 | "# #2. nbdime\n", 194 | "\n", 195 | "## https://github.com/jupyter/nbdime\n", 196 | "\n", 197 | "## `pip install nbdime`\n", 198 | "\n", 199 | "## `jupyter labextension install nbdime-jupyterlab`\n", 200 | "\n", 201 | "![](./img/jupyterlab-nbdime.png)" 202 | ] 203 | }, 204 | { 205 | "cell_type": "code", 206 | "execution_count": null, 207 | "metadata": {}, 208 | "outputs": [], 209 | "source": [ 210 | "# CHANGE ME\n", 211 | "a = 42" 212 | ] 213 | }, 214 | { 215 | "cell_type": "markdown", 216 | "metadata": {}, 217 | "source": [ 218 | "![](./img/skip.png)" 219 | ] 220 | }, 221 | { 222 | "cell_type": "markdown", 223 | "metadata": {}, 224 | "source": [ 225 | "# #3. jupyterlab_code_formatter\n", 226 | "\n", 227 | "## https://github.com/ryantam626/jupyterlab_code_formatter\n", 228 | "\n", 229 | "## `pip install jupyterlab_code_formatter`\n", 230 | "\n", 231 | "## `jupyter labextension install @ryantam626/jupyterlab_code_formatter`\n", 232 | "\n", 233 | "![code_formatter](./img/jupyterlab-code-formatter.gif)" 234 | ] 235 | }, 236 | { 237 | "cell_type": "code", 238 | "execution_count": null, 239 | "metadata": {}, 240 | "outputs": [], 241 | "source": [ 242 | "from ipywidgets import Label, IntSlider, FloatSlider, HBox, VBox, Button, interact, Layout\n", 243 | "\n", 244 | "x = { 'a':1,'b':2,\n", 245 | " \n", 246 | "'c': 3}" 247 | ] 248 | }, 249 | { 250 | "cell_type": "markdown", 251 | "metadata": {}, 252 | "source": [ 253 | "![](./img/skip.png)" 254 | ] 255 | }, 256 | { 257 | "cell_type": "markdown", 258 | "metadata": {}, 259 | "source": [ 260 | "# #4. jupyterlab-toc\n", 261 | "\n", 262 | "## https://github.com/jupyterlab/jupyterlab-toc\n", 263 | "\n", 264 | "## `jupyter labextension install @jupyterlab/toc`\n", 265 | "\n", 266 | "![jupyterlab-toc](./img/jupyterlab-toc.gif)" 267 | ] 268 | }, 269 | { 270 | "cell_type": "markdown", 271 | "metadata": {}, 272 | "source": [ 273 | "![](./img/skip.png)" 274 | ] 275 | }, 276 | { 277 | "cell_type": "markdown", 278 | "metadata": { 279 | "toc-hr-collapsed": false 280 | }, 281 | "source": [ 282 | "# #5. jupyterlab-quickopen\n", 283 | "\n", 284 | "## https://github.com/parente/jupyterlab-quickopen\n", 285 | "\n", 286 | "## `pip install jupyterlab-quickopen`\n", 287 | "\n", 288 | "## `jupyter labextension install @parente/jupyterlab-quickopen`\n", 289 | "\n", 290 | "![](./img/jupyterlab-quickopen.gif)" 291 | ] 292 | }, 293 | { 294 | "cell_type": "markdown", 295 | "metadata": {}, 296 | "source": [ 297 | "![](./img/skip.png)" 298 | ] 299 | }, 300 | { 301 | "cell_type": "markdown", 302 | "metadata": { 303 | "toc-hr-collapsed": false 304 | }, 305 | "source": [ 306 | "# #6. jupyterlab-sidecar\n", 307 | "\n", 308 | "## https://github.com/jupyter-widgets/jupyterlab-sidecar\n", 309 | "\n", 310 | "## `jupyter labextension install @jupyter-widgets/jupyterlab-sidecar`\n", 311 | "\n", 312 | "![jupyterlab-sidecar](./img/jupyterlab-sidecar.gif)" 313 | ] 314 | }, 315 | { 316 | "cell_type": "markdown", 317 | "metadata": {}, 318 | "source": [ 319 | "### Example with ipycanvas by Martin Renou: https://twitter.com/martinRenou" 320 | ] 321 | }, 322 | { 323 | "cell_type": "code", 324 | "execution_count": null, 325 | "metadata": {}, 326 | "outputs": [], 327 | "source": [ 328 | "from math import pi\n", 329 | "\n", 330 | "from ipycanvas import Canvas\n", 331 | "from sidecar import Sidecar\n", 332 | "\n", 333 | "canvas = Canvas(size=(200, 200))\n", 334 | "canvas" 335 | ] 336 | }, 337 | { 338 | "cell_type": "code", 339 | "execution_count": null, 340 | "metadata": {}, 341 | "outputs": [], 342 | "source": [ 343 | "# Draw a poker face\n", 344 | "canvas.clear()\n", 345 | "canvas.begin_path()\n", 346 | "canvas.arc(75, 75, 50, 0, pi * 2, True) # Outer circle\n", 347 | "canvas.move_to(105, 95)\n", 348 | "canvas.line_to(45, 95) # straight mouth\n", 349 | "canvas.move_to(65, 65)\n", 350 | "canvas.arc(60, 65, 5, 0, pi * 2, True) # Left eye\n", 351 | "canvas.move_to(95, 65)\n", 352 | "canvas.arc(90, 65, 5, 0, pi * 2, True) # Right eye\n", 353 | "canvas.stroke()" 354 | ] 355 | }, 356 | { 357 | "cell_type": "code", 358 | "execution_count": null, 359 | "metadata": {}, 360 | "outputs": [], 361 | "source": [ 362 | "sc = Sidecar(title='smiley')\n", 363 | "\n", 364 | "with sc:\n", 365 | " display(canvas)" 366 | ] 367 | }, 368 | { 369 | "cell_type": "code", 370 | "execution_count": null, 371 | "metadata": {}, 372 | "outputs": [], 373 | "source": [ 374 | "# make her happy!\n", 375 | "\n", 376 | "canvas.clear()\n", 377 | "canvas.begin_path()\n", 378 | "canvas.arc(75, 75, 50, 0, pi * 2, True) # Outer circle\n", 379 | "canvas.move_to(110, 75)\n", 380 | "canvas.arc(75, 75, 35, 0, pi, False) # Mouth (clockwise)\n", 381 | "canvas.move_to(65, 65)\n", 382 | "canvas.arc(60, 65, 5, 0, pi * 2, True) # Left eye\n", 383 | "canvas.move_to(95, 65)\n", 384 | "canvas.arc(90, 65, 5, 0, pi * 2, True) # Right eye\n", 385 | "canvas.stroke()" 386 | ] 387 | }, 388 | { 389 | "cell_type": "markdown", 390 | "metadata": {}, 391 | "source": [ 392 | "![](./img/skip.png)" 393 | ] 394 | }, 395 | { 396 | "cell_type": "markdown", 397 | "metadata": { 398 | "toc-hr-collapsed": false 399 | }, 400 | "source": [ 401 | "# #7. jupyterlab-drawio\n", 402 | "\n", 403 | "## https://github.com/QuantStack/jupyterlab-drawio\n", 404 | "\n", 405 | "## `jupyter labextension install jupyterlab-drawio`\n", 406 | "\n", 407 | "![](./img/jupyterlab-drawio.gif)" 408 | ] 409 | }, 410 | { 411 | "cell_type": "markdown", 412 | "metadata": {}, 413 | "source": [ 414 | "![](./img/skip.png)" 415 | ] 416 | }, 417 | { 418 | "cell_type": "markdown", 419 | "metadata": { 420 | "toc-hr-collapsed": false 421 | }, 422 | "source": [ 423 | "# #8. jupyterlab-topbar\n", 424 | "\n", 425 | "## https://github.com/jtpio/jupyterlab-topbar\n", 426 | "\n", 427 | "## `jupyter labextension install jupyterlab-topbar jupyterlab-topbar-extension`\n", 428 | "\n", 429 | "![](./img/jupyterlab-topbar.gif)" 430 | ] 431 | }, 432 | { 433 | "cell_type": "markdown", 434 | "metadata": {}, 435 | "source": [ 436 | "![](./img/skip.png)" 437 | ] 438 | }, 439 | { 440 | "cell_type": "markdown", 441 | "metadata": { 442 | "toc-hr-collapsed": false 443 | }, 444 | "source": [ 445 | "# #9. jupyterlab-sql\n", 446 | "\n", 447 | "## https://github.com/pbugnion/jupyterlab-sql\n", 448 | "\n", 449 | "## `pip install jupyterlab_sql`\n", 450 | "\n", 451 | "## `jupyter serverextension enable jupyterlab_sql --py --sys-prefix`\n", 452 | "\n", 453 | "![](./img/jupyterlab-sql.gif)" 454 | ] 455 | }, 456 | { 457 | "cell_type": "markdown", 458 | "metadata": {}, 459 | "source": [ 460 | "![](./img/skip.png)" 461 | ] 462 | }, 463 | { 464 | "cell_type": "markdown", 465 | "metadata": { 466 | "toc-hr-collapsed": false 467 | }, 468 | "source": [ 469 | "# #10. jupyterlab-celltags\n", 470 | "\n", 471 | "## https://github.com/jupyterlab/jupyterlab-celltags\n", 472 | "\n", 473 | "![](./img/jupyterlab-celltags.gif)" 474 | ] 475 | }, 476 | { 477 | "cell_type": "markdown", 478 | "metadata": {}, 479 | "source": [ 480 | "![](./img/skip.png)" 481 | ] 482 | }, 483 | { 484 | "cell_type": "markdown", 485 | "metadata": { 486 | "toc-hr-collapsed": false 487 | }, 488 | "source": [ 489 | "# 10 more!" 490 | ] 491 | }, 492 | { 493 | "cell_type": "markdown", 494 | "metadata": {}, 495 | "source": [ 496 | "![](./img/skip.png)" 497 | ] 498 | }, 499 | { 500 | "cell_type": "markdown", 501 | "metadata": { 502 | "toc-hr-collapsed": false 503 | }, 504 | "source": [ 505 | "# #11. jupyterlab-go-to-definition\n", 506 | "\n", 507 | "## https://github.com/krassowski/jupyterlab-go-to-definition\n", 508 | "\n", 509 | "### `jupyter labextension install @krassowski/jupyterlab_go_to_definition`\n", 510 | "\n", 511 | "![](./img/jupyterlab-go-to-definition.gif)" 512 | ] 513 | }, 514 | { 515 | "cell_type": "markdown", 516 | "metadata": {}, 517 | "source": [ 518 | "![](./img/skip.png)" 519 | ] 520 | }, 521 | { 522 | "cell_type": "markdown", 523 | "metadata": { 524 | "toc-hr-collapsed": false 525 | }, 526 | "source": [ 527 | "# #12. jupyterlab-lsp\n", 528 | "\n", 529 | "## https://github.com/krassowski/jupyterlab-lsp\n", 530 | "\n", 531 | "![](./img/jupyterlab-lsp.png)" 532 | ] 533 | }, 534 | { 535 | "cell_type": "markdown", 536 | "metadata": {}, 537 | "source": [ 538 | "![](./img/skip.png)" 539 | ] 540 | }, 541 | { 542 | "cell_type": "markdown", 543 | "metadata": { 544 | "toc-hr-collapsed": false 545 | }, 546 | "source": [ 547 | "# #13. @jupyter-voila/jupyterlab-preview\n", 548 | "\n", 549 | "## https://github.com/voila-dashboards/voila\n", 550 | "\n", 551 | "## [example.ipynb](./examples/basics.ipynb)\n", 552 | "\n", 553 | "![](./img/voila-jupyterlab-preview.gif)" 554 | ] 555 | }, 556 | { 557 | "cell_type": "markdown", 558 | "metadata": {}, 559 | "source": [ 560 | "![](./img/skip.png)" 561 | ] 562 | }, 563 | { 564 | "cell_type": "markdown", 565 | "metadata": { 566 | "toc-hr-collapsed": false 567 | }, 568 | "source": [ 569 | "# #14. jupyterlab-python-bytecode\n", 570 | "\n", 571 | "## https://github.com/jtpio/jupyterlab-python-bytecode\n", 572 | "\n", 573 | "![](./img/jupyterlab-python-bytecode.gif)" 574 | ] 575 | }, 576 | { 577 | "cell_type": "markdown", 578 | "metadata": {}, 579 | "source": [ 580 | "![](./img/skip.png)" 581 | ] 582 | }, 583 | { 584 | "cell_type": "markdown", 585 | "metadata": { 586 | "toc-hr-collapsed": false 587 | }, 588 | "source": [ 589 | "# #15. jupyterlab-matplotlib\n", 590 | "\n", 591 | "## https://github.com/matplotlib/jupyter-matplotlib\n", 592 | "\n", 593 | "![](./img/jupyterlab-matplotlib.gif)" 594 | ] 595 | }, 596 | { 597 | "cell_type": "markdown", 598 | "metadata": {}, 599 | "source": [ 600 | "![](./img/skip.png)" 601 | ] 602 | }, 603 | { 604 | "cell_type": "markdown", 605 | "metadata": { 606 | "toc-hr-collapsed": false 607 | }, 608 | "source": [ 609 | "# #16. jupyterlab-variableinspector\n", 610 | "\n", 611 | "## https://github.com/lckr/jupyterlab-variableInspector\n", 612 | "\n", 613 | "![](./img/jupyterlab-variableinspector.gif)" 614 | ] 615 | }, 616 | { 617 | "cell_type": "markdown", 618 | "metadata": {}, 619 | "source": [ 620 | "![](./img/skip.png)" 621 | ] 622 | }, 623 | { 624 | "cell_type": "markdown", 625 | "metadata": { 626 | "toc-hr-collapsed": false 627 | }, 628 | "source": [ 629 | "# #17. jupyterlab-kernelspy\n", 630 | "\n", 631 | "## https://github.com/vidartf/jupyterlab-kernelspy\n", 632 | "\n", 633 | "![](./img/jupyterlab-kernelspy.png)" 634 | ] 635 | }, 636 | { 637 | "cell_type": "markdown", 638 | "metadata": {}, 639 | "source": [ 640 | "![](./img/skip.png)" 641 | ] 642 | }, 643 | { 644 | "cell_type": "markdown", 645 | "metadata": { 646 | "toc-hr-collapsed": false 647 | }, 648 | "source": [ 649 | "# #18. jupyterlab-heroku\n", 650 | "\n", 651 | "## https://github.com/jtpio/jupyterlab-heroku\n", 652 | "\n", 653 | "![](./img/jupyterlab-heroku.gif)" 654 | ] 655 | }, 656 | { 657 | "cell_type": "markdown", 658 | "metadata": {}, 659 | "source": [ 660 | "![](./img/skip.png)" 661 | ] 662 | }, 663 | { 664 | "cell_type": "markdown", 665 | "metadata": { 666 | "toc-hr-collapsed": false 667 | }, 668 | "source": [ 669 | "# #19. jupyterlab-templates\n", 670 | "\n", 671 | "## https://github.com/timkpaine/jupyterlab_templates\n", 672 | "\n", 673 | "![](./img/jupyterlab-templates.gif)" 674 | ] 675 | }, 676 | { 677 | "cell_type": "markdown", 678 | "metadata": {}, 679 | "source": [ 680 | "![](./img/skip.png)" 681 | ] 682 | }, 683 | { 684 | "cell_type": "markdown", 685 | "metadata": {}, 686 | "source": [ 687 | "![](./img/skip.png)" 688 | ] 689 | }, 690 | { 691 | "cell_type": "markdown", 692 | "metadata": { 693 | "toc-hr-collapsed": false 694 | }, 695 | "source": [ 696 | "# #20. jupyterlab-material-darker\n", 697 | "\n", 698 | "## https://github.com/oriolmirosa/jupyterlab_materialdarker\n", 699 | "\n", 700 | "![](./img/jupyterlab-material-darker.png)" 701 | ] 702 | }, 703 | { 704 | "cell_type": "markdown", 705 | "metadata": {}, 706 | "source": [ 707 | "![](./img/skip.png)" 708 | ] 709 | }, 710 | { 711 | "cell_type": "markdown", 712 | "metadata": { 713 | "toc-hr-collapsed": false 714 | }, 715 | "source": [ 716 | "# Where to find new JupyterLab extensions?" 717 | ] 718 | }, 719 | { 720 | "cell_type": "markdown", 721 | "metadata": {}, 722 | "source": [ 723 | "![](./img/skip.png)" 724 | ] 725 | }, 726 | { 727 | "cell_type": "markdown", 728 | "metadata": {}, 729 | "source": [ 730 | "## [github.com/topics/jupyterlab-extension](https://github.com/topics/jupyterlab-extension)\n", 731 | "\n", 732 | "![github-topic](./img/jupyterlab-extensions-github.png)" 733 | ] 734 | }, 735 | { 736 | "cell_type": "markdown", 737 | "metadata": {}, 738 | "source": [ 739 | "![](./img/skip.png)" 740 | ] 741 | }, 742 | { 743 | "cell_type": "markdown", 744 | "metadata": {}, 745 | "source": [ 746 | "## Extension Manager\n", 747 | "\n", 748 | "![screenshot](./img/extension-manager.png)" 749 | ] 750 | }, 751 | { 752 | "cell_type": "markdown", 753 | "metadata": {}, 754 | "source": [ 755 | "![](./img/skip.png)" 756 | ] 757 | }, 758 | { 759 | "cell_type": "markdown", 760 | "metadata": {}, 761 | "source": [ 762 | "![awesome-jupyter](./img/awesome-jupyter.png)\n", 763 | "\n", 764 | "### https://github.com/markusschanta/awesome-jupyter" 765 | ] 766 | }, 767 | { 768 | "cell_type": "markdown", 769 | "metadata": {}, 770 | "source": [ 771 | "![](./img/skip.png)" 772 | ] 773 | }, 774 | { 775 | "cell_type": "markdown", 776 | "metadata": { 777 | "toc-hr-collapsed": false 778 | }, 779 | "source": [ 780 | "# What's next?" 781 | ] 782 | }, 783 | { 784 | "cell_type": "markdown", 785 | "metadata": {}, 786 | "source": [ 787 | "![](./img/skip.png)" 788 | ] 789 | }, 790 | { 791 | "cell_type": "markdown", 792 | "metadata": { 793 | "toc-hr-collapsed": false 794 | }, 795 | "source": [ 796 | "# Debugger UI\n", 797 | "\n", 798 | "![debugger](./img/jupyterlab-debugger.png)\n", 799 | "\n", 800 | "# Rich Text Mode\n", 801 | "\n", 802 | "![rich-text-mode](./img/jupyterlab-rich-text-mode.gif)\n", 803 | "\n", 804 | "# Package installer\n", 805 | "\n", 806 | "![pkg-installer](./img/jupyterlab-pkg-installer.gif)\n", 807 | "\n", 808 | "# Commenting\n", 809 | "\n", 810 | "![jupyterlab-commenting](./img/jupyterlab-commenting.gif)\n", 811 | "\n", 812 | "# Many more!" 813 | ] 814 | }, 815 | { 816 | "cell_type": "markdown", 817 | "metadata": {}, 818 | "source": [ 819 | "![](./img/skip.png)" 820 | ] 821 | }, 822 | { 823 | "cell_type": "markdown", 824 | "metadata": { 825 | "toc-hr-collapsed": true 826 | }, 827 | "source": [ 828 | "## Thanks!\n", 829 | "\n", 830 | "## [github.com/jtpio](https://github.com/jtpio)" 831 | ] 832 | }, 833 | { 834 | "cell_type": "markdown", 835 | "metadata": {}, 836 | "source": [ 837 | "![](./img/skip.png)" 838 | ] 839 | } 840 | ], 841 | "metadata": { 842 | "kernelspec": { 843 | "display_name": "Python 3", 844 | "language": "python", 845 | "name": "python3" 846 | }, 847 | "language_info": { 848 | "codemirror_mode": { 849 | "name": "ipython", 850 | "version": 3 851 | }, 852 | "file_extension": ".py", 853 | "mimetype": "text/x-python", 854 | "name": "python", 855 | "nbconvert_exporter": "python", 856 | "pygments_lexer": "ipython3", 857 | "version": "3.7.3" 858 | }, 859 | "toc-autonumbering": false, 860 | "toc-showmarkdowntxt": false, 861 | "toc-showtags": false 862 | }, 863 | "nbformat": 4, 864 | "nbformat_minor": 4 865 | } 866 | --------------------------------------------------------------------------------