Skip to main content

Bowser

Map-based viewer for InSAR time-series outputs — GeoZarr cubes, dolphin workflow directories, or loose GeoTIFFs — served through a local FastAPI server and rendered by titiler in the browser.

Quickstart

Zero-install — run the latest release against a GeoZarr cube:

uvx --from bowser-insar bowser run --stack-file example-cube.zarr

Open the http://127.0.0.1:8000 link that bowser prints.

Note on PyPI installing an GDAL: The PyPI wheel is enough for GeoZarr cubes and plain GeoTIFFs. For other input formats, pixi is the easiest way:

pixi global install bowser-insar

Installation in another project

# GeoZarr / GeoTIFF only
pip install bowser-insar       # or: uv add bowser-insar

# Full format support (NetCDF, HDF5, VRT) via conda-forge GDAL
pixi add bowser-insar

Quickstarts

From dolphin

bowser setup-dolphin scans a dolphin work directory and writes a bowser_rasters.json describing every raster group it finds. bowser run then serves them.

bowser setup-dolphin work/
bowser run

Note: these outputs must be geocoded to work with bowser, which lays them out on a basemap using web mapping tools.

If you're running over ssh, tunnel the port back to your laptop:

ssh -N -L 8000:localhost:8000 myserver

From dolphin → GeoZarr cube

Once the bowser_rasters.json file is created, you can convert the data into a GeoZarr cube:

pixi run -e writer bowser tifs-to-geozarr \
    --pyramid bowser_rasters.json cube.zarr

DISP-S1 → GeoZarr cube

To work with DISP-S1 products, you may convert them once into a single pyramidal GeoZarr cube, then serve that. The converter handles the reference-date bookkeeping for morving temporal reference,, builds multiscale pyramids, and writes GeoZarr convention attributes so titiler can pick the right overview per tile zoom.

# 1. prepare per-band GeoTIFFs and a bowser_rasters.json
bowser setup-disp-s1 /path/to/disp-s1/outputs

# 2. convert to a single sharded GeoZarr cube with pyramid
pixi run -e writer bowser tifs-to-geozarr \
    --pyramid bowser_rasters.json cube.zarr

# 3. serve
bowser run --stack-file cube.zarr

For a multi-dataset catalog (pick from a map of bounding boxes at startup) and an EC2 deployment serving cubes from a private S3 bucket, see deploy/README.md for the bowser register CLI, the Docker image, and the EC2 bootstrap script end-to-end.

CLI Usage

$ bowser --help
Commands:
  prepare-amplitude      Convert complex SLC GeoTIFFs to amplitude-in-dB.
  prepare-disp-s1        Create VRTs pointing into DISP-S1 NetCDFs.
  prepare-nisar-gunw     Create VRTs pointing into NISAR GUNW NetCDFs.
  register               Add a dataset entry to a catalog TOML file.
  run                    Run the web server.
  set-data               Specify what raster data to use (interactive).
  setup-aligned-disp-s1  Write bowser_rasters.json for aligned DISP-S1.
  setup-disp-s1          Write bowser_rasters.json for DISP-S1 outputs.
  setup-dolphin          Write bowser_rasters.json for a dolphin run.
  setup-hyp3             Write bowser_rasters.json for HyP3 Gamma.
  setup-nisar-gunw       Write bowser_rasters.json for NISAR GUNW.

Developer setup

git clone git@github.com:opera-adt/bowser.git && cd bowser
pixi install            # default env: runtime deps
pixi install -e writer  # optional env: includes geozarr-toolkit for the converter
pixi run bowser run

Frontend (TypeScript + Vite):

npm install
npm run build   # rebuilds src/bowser/dist/ after .tsx / CSS changes

The PyPI wheel bundles src/bowser/dist/ (built by the CD workflow before publishing), so end users can pip install bowser-insar without Node. From a git checkout, run npm run build first to populate src/bowser/dist/ before pip install -e ..

For a hot-reload loop on UI/styling changes, run the backend and the Vite dev server in two terminals. Vite proxies API calls to the backend on port 8000:

# Terminal 1 — backend
pixi run bowser run

# Terminal 2 — frontend with HMR on http://localhost:5173
npm run dev

Override the backend URL with VITE_API_URL=http://localhost:8001 npm run dev.

Legacy workflows

DISP-S1 via VRTs (pre-GeoZarr)

The older path is to make a GDAL VRT per NetCDF variable and let bowser read through those. This predates bowser tifs-to-geozarr and has two drawbacks: remote NetCDF/HDF5 reads are slow (no standard overview format), and VRTs require a conda-forge GDAL with the NetCDF driver.

Kept working, but prefer the GeoZarr path above for new setups.

mkdir my_disp_files; cd my_disp-files
s5cmd --numworkers 4 cp 's3://opera-bucket/OPERA_L3_DISP-S1_IW_F11115*/*.nc' .
bowser prepare-disp-s1 -o vrts *.nc
bowser setup-disp-s1 vrts
bowser run

License

Copyright 2024, by the California Institute of Technology. ALL RIGHTS RESERVED. United States Government Sponsorship acknowledged. Any commercial use must be negotiated with the Office of Technology Transfer at the California Institute of Technology.

This software may be subject to U.S. export control laws. By accepting this software, the user agrees to comply with all applicable U.S. export laws and regulations. User has the responsibility to obtain export licenses, or other export authority as may be required before exporting such information to foreign countries or providing access to foreign persons.

Metadata

Release files for bowser-insar 0.5.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for bowser-insar 0.5.0
File Size Uploaded Provenance Actions
bowser_insar-0.5.0.tar.gz 4.4 MB With provenance Details for bowser_insar-0.5.0.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for bowser-insar 0.5.0
File Interpreter ABI Platform Actions
bowser_insar-0.5.0-py3-none-any.whl Python 3 none any Details for bowser_insar-0.5.0-py3-none-any.whl

Total release size: 4.8 MB

Release files / bowser_insar-0.5.0.tar.gz

Download URL bowser_insar-0.5.0.tar.gz
Size 4.4 MB
Tags Source
SHA-256 checksum
How to use checksums
a87e8e5c2ab180aa1fa1c2cf8b4a9ab812f125adb0a44b5560dc33f57da401a6
BLAKE2b-256 checksum
How to use checksums
85ff68d95fcc81bf29dbd7fa47d8e14665a7d0b143b48fbd56f4a2ad95b6748c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 5, 2026.

Transparency log

Release files / bowser_insar-0.5.0-py3-none-any.whl

Download URL bowser_insar-0.5.0-py3-none-any.whl
Size 413.4 kB
Tags Python 3
SHA-256 checksum
How to use checksums
e0f314af4bf863c313c0913f42e6bed4294881ad8b200caf53943b204bcfb150
BLAKE2b-256 checksum
How to use checksums
1cc74e39eed190a7830748f5188519d93af8311b8b916ef580c5a6886304874c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 5, 2026.

Transparency log

Security for bowser-insar 0.5.0

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

Full provenance

All 2 files in this release have been uploaded with provenance metadata.

Select from 2 files

Attestation for bowser_insar-0.5.0.tar.gz

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 5, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page