Research scientist and scientific software engineer · differentiable Earth observation in JAX
UNEP IMEO · Methane Alert and Response System (MARS) · Valencia, Spain
GeoStack docs · Research notebook · LinkedIn · X / Twitter
I build the software that turns satellite and in-situ observations into numbers someone can act on, each with an honest error bar. The physics is differentiable, the inference is Bayesian, and every step is checked against a trusted oracle. All of it lives in one open-source JAX stack: GeoStack.
Earth observation code usually means gluing together a reader, a regridder, a physics model, an inverse method and an ML model that were never designed to meet. GeoStack is the opposite: small libraries with one contract each, laid out along the data-maturity axis from raw instrument output (L0) to decisions (L5). The science axis says what each level means. The compute between two levels is where physics and inference live. The engineering axis underneath says how the data is stored, carried and composed at every level.
| Layer | Library | What it does |
|---|---|---|
| GeoStack | geotoolz | Raster operators, STAC catalog and patching; geoarray, one geo-carrier for NumPy and JAX, with a differentiable affine transform |
| xrtoolz | The same operator model on xarray: indices, temporal statistics, CF output | |
| pipekit | Composable Operator and pipeline protocols shared by every package |
|
| GeoNumerics | gaussx | Structured linear algebra: Kalman filters, GP primitives, block operators on lineax |
| finitevolX | Finite-volume operators on staggered grids | |
| spectraldiffx | Spectral derivatives and solvers | |
| GeoML | vardax | Variational data assimilation: 3D-Var, 4D-Var, optimal estimation |
| filterax | Ensemble and Kalman filtering | |
| pyrox · kernellib | Gaussian processes and probabilistic NNs for NumPyro; kernels | |
| geonnax | Neural fields and basis functions for geoscience | |
| gauss_flows | Normalizing flows and SurVAE | |
| optax_bayes | The Bayesian learning rule as Optax optimizers | |
| xtremax | Extreme values with JAX and NumPyro | |
| GeoModels | radtrax | Differentiable radiative transfer, matched filters, retrievals |
| plumax | Plume physics: masks, integrated mass enhancement, flux, emission rates | |
| somax | Simple ocean models: quasi-geostrophic, shallow water |
Every problem in the stack follows the same ladder. Step 2, a slow but trusted physics-based inversion, is the oracle that every faster learned method must match before it ships.
Detecting and quantifying methane plumes from EMIT, Sentinel-2 and Landsat 8/9. A layered Beer–Lambert forward model in radtrax gives the matched-filter target and every Jacobian by autodiff. The pipeline then runs matched filter, plume vetting and optimal estimation through vardax. plumax turns the column enhancement into an emission rate in kg/h.
Mapping the ocean's mesoscale from sparse along-track altimetry. OceanBench: The Sea Surface Height Edition (NeurIPS 2023, Datasets and Benchmarks) is a benchmark and toolkit for SSH interpolation (docs, code). The methods range from optimal interpolation and neural fields (ml4ssh, knerf, functa4eo) to quasi-geostrophic models in somax inside 4D-Var.
GeoStack is not a fresh start; it is ten years of research code, rebuilt so the pieces fit.
Older work still worth a look: rbig (Rotation-Based Iterative Gaussianization and information measures), jbayesevt (Bayesian extreme value models), manipy (semi-supervised manifold learning), keras-fairkl (fair kernel learning), and my research notebook of notes and tutorials.
- JAX all the way down. Equinox modules, with
jit,vmapandgradthrough the physics, and float64 where the maths needs it. - Tested against the truth. Every refactor merges behind numeric gates: parity with the code it replaces, autodiff against finite differences, closed-form oracles.
- Small packages, explicit seams. Heavy dependencies sit behind optional extras, and everything is MIT-licensed.
Interests: atmospheric retrievals · data assimilation · Gaussian processes and uncertainty quantification · neural fields · extremes · ML for dynamical systems.
GeoStack stands on the shoulders of these open-source projects, and the packages above are designed to compose with them rather than replace them.
JAX numerics · JAX · Equinox · jaxtyping · lineax · diffrax · optimistix · matfree · finitediffx · interpax · einx · einops
Probabilistic ML and training · NumPyro · Optax · FlowJAX · BlackJAX · Grain · Orbax
Geospatial data · xarray · georeader (GeoTensor) · rasterio · rioxarray · GeoPandas · Shapely · pyproj · xvec · regionmask · xrft
Cloud-native storage and catalogs · obstore · async-geotiff · Zarr · fsspec · Dask · DuckDB · PyArrow · pystac · pystac-client
Data access · earthaccess · Planetary Computer · Earth Engine · Copernicus Marine · CDS API · HITRAN
The scientific Python base · NumPy · SciPy · scikit-learn · scikit-image · pandas
A special thanks to Patrick Kidger's JAX ecosystem: Equinox, lineax, diffrax, optimistix and jaxtyping are the backbone of nearly every package here.
Figures generated with GeoStack's own figure code · Python · JAX · Equinox · NumPyro · xarray





