Skip to content
🌱 Talk to it. Get your data.

Ask in plain English. Get satellite imagery on your disk.

geedl is the agent-friendly Earth Engine downloader. Tell Claude, Cursor, Codex β€” any coding agent β€” what you want, and it writes the YAML. You run one command. No Python to write, no SDK to learn, no notebook to debug, no Cloud Storage, no Drive. Just Sentinel and Landsat imagery, composited, indexed, and written as Cloud-Optimized GeoTIFFs.

Sentinel-1, Sentinel-2, Landsat 7/8/9 out of the box 10+ spectral indices (NDVI, EVI, NDWI, NBR, RVI…) MIT licensed Β· Python 3.12+
⚑

Direct to local disk

Pixels flow through ee.data.computePixels() straight to your filesystem. No GCS buckets, no Drive folders, no waiting on export tasks.

πŸ”

Resumable & crash-safe

Every tile is checkpointed in SQLite. Atomic writes guarantee no corrupt files. Kill the process and re-run β€” it picks up exactly where it stopped.

πŸ’¬

Built for AI agents

Every config field is declarative YAML. Drop the README into Claude, Cursor, or Codex and ask in English β€” the agent emits a runnable job. No code, no SDK, no hallucinated fields.

πŸ—ΊοΈ

Smart tiling

Auto-projects your shapefile to UTM, classifies tiles as inside / partial / outside, skips empty space, and orders by Hilbert curve for cache-warm EE requests.

πŸ›°οΈ

Plugin-only indices

Add a new spectral index with one decorated function. NDVI, EVI, NDWI, NDMI, NBR, NDSI, SAVI, BSI, RVI, VV/VH β€” and your own β€” all interchangeable in YAML.

πŸ“¦

COG + STAC + GeoParquet

Outputs are Cloud-Optimized GeoTIFFs with per-tile STAC sidecars and a unified GeoParquet catalog. Readable by QGIS, GDAL, stackstac, and STAC browsers out of the box.

Home

No code. No SDK. Just words.

Describe what you want. Run one command.

Drop the README into any coding agent's context β€” Claude Code, Cursor, Codex, Aider, ChatGPT. Then ask in plain English. The agent writes the YAML. You run geedl.

You

I need a monthly NDVI and NDWI time series over my farm in Tuscany for all of 2023. Shapefile is at data/tuscany.shp. Sentinel-2, mask clouds and shadows, output COGs, drop the source bands. Run 24 tiles in parallel.

Your agent β†’ job.yaml
job_name: tuscany_ndvi_ndwi_2023

roi:
  path: data/tuscany.shp

dataset:
  name: sentinel-2
  bands:
    select: []                  # drop source bands, keep only indices
  indices:
    - {name: NDVI}
    - {name: NDWI}
  cloud_mask:
    enabled: true
    mask_shadow: true

date:
  start: "2023-01-01"
  end:   "2023-12-31"

composite:
  strategy: median
  window:
    type: calendar_month
    label_format: "%Y-%m"

output:
  dir: ./output
  format: COG
  dtype: float32
  structure:
    separate_indices: true      # one GeoTIFF per index

pipeline:
  concurrency: 24
You
geedl plan -c job.yaml && geedl run -c job.yaml

That's the whole loop. Need to change sensor? "Switch to Landsat 8 with the same indices." Need a different window? "Make it 16-day composites anchored on the window start." Need urban detection from SAR? "Give me Sentinel-1 SAR_URBAN false-color for the first week of May." The agent edits the YAML. You re-run geedl.

Why does this work so well with agents?

The repo ships with a CLAUDE.md that documents every config field, every module boundary, and every non-negotiable constraint β€” atomic writes, plugin-only indices, Sentinel-1-must-be-mosaic, and the rest. An agent reading it has the full schema and the full set of rules β€” so it doesn't hallucinate fields or pick physically wrong composite strategies. Drop the README and CLAUDE.md into your agent's context and you get one-shot, correct configs.