diff --git a/packages/py-ipycanvas/package.py b/packages/py-ipycanvas/package.py
new file mode 100644
index 0000000000000000000000000000000000000000..e2142728bc5347a755c57a119d77ff1515c4121d
--- /dev/null
+++ b/packages/py-ipycanvas/package.py
@@ -0,0 +1,29 @@
+# Copyright 2013-2022 Lawrence Livermore National Security, LLC and other
+# Spack Project Developers. See the top-level COPYRIGHT file for details.
+#
+# SPDX-License-Identifier: (Apache-2.0 OR MIT)
+
+from spack.package import *
+
+
+class PyIpycanvas(PythonPackage):
+    """Interactive Canvas in Jupyter."""
+
+    homepage = "https://github.com/martinRenou/ipycanvas"
+    pypi     = "ipycanvas/ipycanvas-0.9.0.tar.gz"
+
+    version('0.12.0', sha256='3984339cef0c15674e347dd65ffb0cd1edc62e37869cbb5efea46f3259e976f3')
+    version('0.10.2', sha256='a02c494834cb3c60509801172e7429beae837b3cb6c61d3becf8b586c5a66004')
+    version('0.9.0', sha256='f29e56b93fe765ceace0676c3e75d44e02a3ff6c806f3b7e5b869279f470cc43')
+
+    depends_on('python@3.5:', type=('build', 'run'))
+    depends_on('python@3.6:', when='@10:', type=('build', 'run'))
+    depends_on('python@3.7:', when='@11:', type=('build', 'run'))
+    depends_on('py-setuptools@40.8:', type='build')
+    # TODO: replace this after concretizer learns how to concretize separate build deps
+    depends_on('py-jupyter-packaging7', type='build')
+    # depends_on('py-jupyter-packaging@0.7.0:0.7', type='build')
+    depends_on('py-jupyterlab@3.0:3', type='build')
+    depends_on('py-ipywidgets@7.6:', type=('build', 'run'))
+    depends_on('pil@6:', type=('build', 'run'))
+    depends_on('py-numpy', type=('build', 'run'))
diff --git a/spack.yaml b/spack.yaml
index 02f0dcb7f194cdb83c36be3b5eba973310ef7853..daaa6fd0d2d669e261671702ddc43d20f7f66f57 100644
--- a/spack.yaml
+++ b/spack.yaml
@@ -5,6 +5,7 @@ spack:
     - py-ipython
     - py-ipykernel
     - py-notebook
+    - py-ipycanvas
     # Collab utils
     - clb-nb-utils@0.1.0
     # General