diff --git a/packages/py-pyvista/package.py b/packages/py-pyvista/package.py
new file mode 100644
index 0000000000000000000000000000000000000000..38054a2f6df6746d90f9debd7bae7b1cc236c5ae
--- /dev/null
+++ b/packages/py-pyvista/package.py
@@ -0,0 +1,44 @@
+# Copyright 2013-2024 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 PyPyvista(PythonPackage):
+    """Easier Pythonic interface to VTK."""
+
+    homepage = "https://github.com/pyvista/pyvista"
+    pypi = "pyvista/pyvista-0.32.1.tar.gz"
+
+    # Requires optional trame dependency
+    skip_modules = ["pyvista.ext", "pyvista.jupyter", "pyvista.trame"]
+
+    maintainers("banesullivan")
+
+    license("MIT")
+
+    # begin EBRAINS (added): add version
+    version("0.43.0", sha256="0118060d56de7f9b583405723ddd8f77f20d7d8af601ad7c0b0521c6302069cf")
+    # end EBRAINS
+    version("0.42.3", sha256="00159cf0dea05c1ecfd1695c8c6ccfcfff71b0744c9997fc0276e661dc052351")
+    version("0.37.0", sha256="d36a2c6d5f53f473ab6a9241669693acee7a5179394dc97595da14cc1de23141")
+    version("0.32.1", sha256="585ac79524e351924730aff9b7207d6c5ac4175dbb5d33f7a9a2de22ae53dbf9")
+
+    depends_on("py-setuptools", type="build")
+    depends_on("py-matplotlib@3.0.1:", when="@0.39:", type=("build", "run"))
+    depends_on("py-numpy", type=("build", "run"))
+    depends_on("pil", type=("build", "run"))
+    depends_on("py-pooch", when="@0.37:", type=("build", "run"))
+    depends_on("py-scooby@0.5.1:", type=("build", "run"))
+    depends_on("vtk+python", type=("build", "run"))
+    depends_on("py-typing-extensions", when="^python@:3.7", type=("build", "run"))
+
+    # Historical dependencies
+    depends_on("py-appdirs", when="@:0.36", type=("build", "run"))
+    depends_on("py-imageio", when="@:0.38", type=("build", "run"))
+    depends_on("py-meshio@4.0.3:4", when="@:0.32", type=("build", "run"))
+
+    # '>=3.7.*' in python_requires: setuptools parser changed in v60 and errors.
+    depends_on("py-setuptools@:59", when="@:0.37", type="build")
diff --git a/packages/py-tvb-widgets/package.py b/packages/py-tvb-widgets/package.py
new file mode 100644
index 0000000000000000000000000000000000000000..339a25f6bc7561cd021bbf68d848d784f64b0b67
--- /dev/null
+++ b/packages/py-tvb-widgets/package.py
@@ -0,0 +1,60 @@
+# Copyright 2013-2024 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 import *
+
+
+class PyTvbWidgets(PythonPackage):
+    """
+    "The Virtual Brain" Project (TVB Project) has the purpose of offering modern tools to the Neurosciences community,
+    for computing, simulating and analyzing functional and structural data of human brains, brains modeled at the level
+    of population of neurons.
+    """
+
+    homepage = "https://www.thevirtualbrain.org/"
+    pypi = 'tvb-widgets/tvb-widgets-2.0.3.tar.gz'
+
+    maintainers = ['paulapopa', 'ldomide', 'teodoramisan']
+
+    version('2.0.3', '33bd94bef5b49df6843a022342d4c4c0d080851d638b5d07295880298cd6fb00')
+
+    # python_requires
+    depends_on('python@3.8:', type=('build', 'run'))
+
+    # setup_requires
+    depends_on('py-setuptools', type='build')
+
+    # install_requires
+    depends_on('py-colorcet', type=('build', 'run'))
+    depends_on('py-ebrains-drive', type=('build', 'run'))
+    depends_on('py-ipympl@0.8.5:', type=('build', 'run'))
+    depends_on('py-ipywidgets', type=('build', 'run'))
+    depends_on('py-ipython', type=('build', 'run'))
+    depends_on('py-joblib', type=('build', 'run'))
+    depends_on('py-mne@1.0:', type=('build', 'run'))
+    depends_on('py-numpy', type=('build', 'run'))
+    depends_on('py-plotly', type=('build', 'run'))
+    depends_on('py-pyvista@0.43.0:', type=('build', 'run'))
+    depends_on('py-tvb-data', type=('run', 'test'))
+    depends_on('py-tvb-library', type=('build', 'run'))
+    depends_on('py-tvb-framework', type=('build', 'run'))
+    depends_on('py-pyunicore@1.0.0:', type=('build', 'run'))
+    depends_on('py-traitlets@5.7.1:', type=('build', 'run'))
+    depends_on('py-toml', type=('build', 'run'))
+    depends_on('py-bokeh', type=('build', 'run'))
+    depends_on('vtk@=9.2.6', type=('build', 'run'))
+
+
+    depends_on('py-pytest', type='test')
+    depends_on('py-pytest-mock', type='test')
+
+    @run_after('install')
+    @on_package_attributes(run_tests=True)
+    def install_test(self):
+        with working_dir('spack-test', create=True):
+            python('-c',
+                   'import tvbwidgets; '
+                   'from tvbwidgets.ui.pse_widget import PSEWidget')
+
diff --git a/spack.yaml b/spack.yaml
index e65872cdd00411c52de9aa282b8701fa5826fcc7..12f16a1bc00697197d93e93952529172be43d1bb 100644
--- a/spack.yaml
+++ b/spack.yaml
@@ -53,6 +53,7 @@ spack:
     - py-tvb-library@2.9
     - py-tvb-multiscale@2.1.0.ebrains
     - py-tvb-storage@2.9
+    - py-tvb-widgets@2.0.3
     - py-viziphant@0.4.0
     - pynn-brainscales@8.0-a5
     - r-rgsl@0.1.1