Earth Genome just launched Recharge IQ. This post covers what I learned about leveraging PMTiles for handling raster data (TL;DR: it works great).
Recharge IQ is part of Earth Genome’s Flood-MAR work: an effort to help practitioners and planners understand where managed aquifer recharge (MAR) might realistically work at scale. Flood-MAR focuses on using episodic surface water (often from floods) to replenish depleted groundwater systems. It’s a promising idea, but one that is deeply site-specific. Soil, slope, land use, surface water availability, groundwater conditions, and risk factors all matter, and they rarely line up cleanly in one place.
Recharge IQ exists to help narrow that search space. It covers the lower 48 states and brings together a range of contextual datasets so users can explore where MAR might be feasible, and just as importantly, where it likely is not. It’s not a siting or design tool. Instead, it’s meant to support early-stage screening and comparison, giving users a clearer picture of regional patterns before they zoom into local analysis.
Today, Recharge IQ uses many contextual layers, but only two raster datasets:
- a MAR suitability layer generated as part of our analysis, and
- a wildfire (burn) risk layer that provides critical environmental context.
The MAR suitability layer helps users understand where surface conditions support recharge, while the burn risk layer highlights areas where post-fire impacts could complicate or constrain MAR efforts. Because these layers cover the entire lower 48 states, they still represent a non-trivial data footprint. More importantly, they set the pattern for how additional raster layers could be added in the future.
The original setup: PMTiles for vectors, TiTiler for rasters
For vector data, we were already in a good place. We’ve been using PMTiles for a while to serve vector tiles efficiently from static storage, and that model has worked extremely well. Raster data was the exception. Initially, the MAR suitability and burn risk layers were served from GeoTIFFs using a TiTiler instance running on AWS. This is a very common and very reasonable approach. TiTiler works well, and cloud-optimized GeoTIFFs are a solid standard.
But architecturally, it always felt a little off.
Recharge IQ is a Next.js application hosted on Vercel. Everything else about the app is static or CDN-backed. Introducing a separate raster tile server meant additional infrastructure to deploy, monitor, secure, and keep running. It added cost, operational overhead, and another failure surface. For just two raster layers, that tradeoff felt especially hard to justify.
The goal: a fully static, serverless map stack
From early on, the goal was clear: serve all map layers, vector and raster, without running any application servers. Ideally, everything would be static assets, delivered via a CDN, with the same mental model across the entire stack.
That’s already the promise of PMTiles for vector data. The question was whether raster data could fit into the same model.
PMTiles added raster tile support in version 3 in late 2022. I was aware of this in the abstract, but despite generating vector PMTiles for years, I had never actually tried using PMTiles for large raster datasets.
A reproducible pipeline: GeoTIFF to PMTiles
At a high level, the pipeline looks like this:
GeoTIFF → byte-scaled single-band raster → MBTiles → PMTiles
Both the MAR suitability and burn risk layers start as Float32 GeoTIFFs. For visualization purposes, that level of precision isn’t necessary, and serving Float32 tiles would be wasteful. The first step is to scale the data into an 8-bit range appropriate for display, while carefully handling nodata values. This dramatically reduces file size and improves tile performance, while preserving the information needed for interpretation.
We then convert the scaled GeoTIFF into MBTiles using GDAL. MBTiles still plays an important role here: it gives us a standard tiled pyramid structure, and it allows us to explicitly generate overviews for efficient zoomed-out rendering. Those overviews matter even when you only have a couple of raster layers, because they determine how responsive the map feels at regional and national zoom levels.
Finally, we convert the MBTiles archive into PMTiles using go-pmtiles. The result is a single, compact PMTiles file that can be uploaded to object storage and served directly via a CDN. Because PMTiles is designed around HTTP range requests, clients only fetch the portions of the archive they actually need.
The entire pipeline runs in a Docker container, which makes it easy to rerun, document, and share. It also removes the friction of managing GDAL versions locally.
The result: instant raster layers, zero servers
Moving fully to PMTiles simplified Recharge IQ in ways that go beyond performance. Operationally, the app is easier to reason about and easier to maintain. Deployment is simpler. There are fewer moving parts, fewer credentials to manage, and fewer things that can quietly break. From a product perspective, it lowers the barrier to adding new raster layers in the future.
Even with just two raster layers, having a clean, static-first approach makes the app more resilient and easier to evolve. PMTiles makes it possible to treat raster and vector data the same way operationally, which is especially valuable for public-facing decision-support tools like Recharge IQ.
Other articles

.png)
RechargeIQ: reduce flood risk, restore aquifers, benefit ecosystems
RechargeIQ is a new tool promoting the practice of managed aquifer recharge across the U.S.


.png)
Cows going global – reflections on a year mapping manure around the world
Of late, I have been appreciating how big the world is. We have been slicing its land surface into squares, hundreds of millions of them, and inquiring into each as to whether it boasts any notable concentration of cows. We’ve hit on a few surprises.


