QuPath extension to load OME-Zarr images from cloud storage
-
Log in to gcloud. You will need to do this regularly, depending on your credential expiration policies.
gcloud auth application-default loginMake sure to restart QuPath after logging in.
-
Download the extension JAR from …
-
Drag and drop the JAR onto QuPath.
-
Restart QuPath.
You can now add remote images to your QuPath project.
-
Create a new project, or open an existing one.
-
Add a new image using the project button.
-
Add the image by URL.
- For example, enter something like:
gs://my-bucket/my-data/images/LuCa-7color.zarr
- For example, enter something like:
-
To load annotations, check "Import Objects" then set the optional args to
--qpdata-path <your qpdata file- For example, something like:
--qpdata-path gs://my-bucket/my-data/annotations/LuCa-7color/data.qpdata
- For example, something like:
-
Add annotations, then save to cloud.
-
Load the annotations elsewhere:
- Repeat this process in another project (or simply copy the project file).
- If necessary, click "Refresh remote PathObjects" in the extension menu.
If you get any errors, please check the logs and report here. Auth errors are common if your login tokens expire after 24 hours, as is common in some enterprise environments.
The extension is currently capable of reading an OME-Zarr file (as output by bioformats2raw spec version 0.4). Here is a demo showing the LuCa7 file described here:
Once you have created some annotations, you can save them to the cloud. You can also refresh your local copy from the cloud.
Known issues:
- If you save to the cloud, it will replace whatever's there without question.
- If you load from the cloud, it won't detect
- The extension has no concept of which annotations have/haven't changed, it saves/loads everything.
- Adding
gs://bucket/file.zarrimage URIs doesn't work on Windows. - Auth failures are not displayed very intuitively, you need to read through the logs.
Our data is cloud-based, and traditional file system bridges (like cloud NFS) are non-performant or very expensive. Cloud viewers exist (like Avivator, part of Viv) but are view-only: no support for annotations.
The OME-NGFF aka OME-Zarr format is a natural choice for scalable cloud access. Clients can download just the chunks they need, at the level of detail (aka resolution / downsampling) they need.
Our primary user profile is a bioinformatician who is very familiar with QuPath, and does most of their work using QuPath (tools, scripting, etc.). It would be a lot of work to develop & maintain a QuPath replacement, with no benefit other than cloud compatibility.
QuPath has a rich extension framework; for example the OMERO integration is an extension as is the support for the BioFormats plugin.
The ZarrReader BioFormats extension support OME-Zarr, but is S3 only, and has a longer release cycle. Furthermore, we don't need the full BioFormats complexity, at least not yet while we prove out cloud annotations. As an example of the complexity going between BioFormats and QuPath, see this PR addressing optimal tile size.
As we build & test our cloud-first solution, we need:
- a simple release cycle
- direct, low(-ish) level access to the data (mostly for scale optimization)
A QuPath extension seems like the perfect fit.
You should be able to build the extension like a usual gradle project.
./gradlew shadowJarYou can run the tests like so:
./gradlew cleanTest testThe extension relies on native C-Blosc binaries from the QuPath project. It should work for these architectures: Windows-x86-64, Linux-x86-64, Linux-aarch64, Mac-x86-64, and Mac-aarch64.
See binary compatibility note above.
As of 2025-04-30, the built-in binary dependencies have only been tested on Mac-aarch64 (David's laptop).



