diff --git a/packages/py-ipycanvas/package.py b/packages/py-ipycanvas/package.py
new file mode 100644
index 0000000000000000000000000000000000000000..08adb0b957c82e6719023a1f8a8dff90c2590cf1
--- /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='a02c494834cb3c60509801172e7429beae837b3cb6c61d3becf8b586c5a66004')
+    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'))