Pete Gadomski, Development Seed, STAC PSC
Open, community specification and ecosystem for geospatial search and discovery
---
config:
theme: neutral
look: handdrawn
---
timeline
2017 : Initial commit to what became the stac-spec repository
: Sprint 1 (Boulder)
: v0.1.0
2018 : Name changed to STAC
: Sprints 2 (Ft. Collins) and 3 (Menlo Park)
: v0.4.0 to v0.6.0
2019 : Sprints 4 and 5 (Arlington)
: v0.7.0 to v0.8.0
2020 : Sprint 6 (Virtual)
: v0.9.0
2021 : v1.0.0
2023 : Sprint 7 (Philadelphia)
: API v1.0.0
2024 : v1.1.0
2025 : Sprint 8 (Italy)
: OGC Community Standard
2026 : Workshop 1 (Japan)
...we knew the path to that goal was through a healthy ecosystem of software. From day one, the focus was on creating catalogs and tools that were not just compliant, but genuinely useful. We had a working server at the end of the first sprint.
— Matt Hanson
produce geospatial data and index those data with STAC
python -m pip install pystac
root_catalog = Catalog.from_file("./example-catalog/catalog.json")
print(f"ID: {root_catalog.id}")
print(f"Title: {root_catalog.title or 'N/A'}")
print(f"Description: {root_catalog.description or 'N/A'}")
dependencies = [
"pystac >= 1.15",
"pystac-ext-projection == 2.0.1",
"pystac-ext-my-custom-extension"
]
Sprint in Frascati, Italy, October 14-16, 2025
GeoZarr conventions explicitly borrow concepts from STAC extensions
Zarr groups and arrays can be represented by 2 STAC object types depending on the use case.
https://github.com/radiantearth/stac-best-practices/blob/main/best-practices-zarr.md
Good news: good STAC is inherently AI-ready!
Bad news: not all STAC is good STAC
Your collections are your "home pages"
Make them rich and informative
build and maintain infrastructure to serve STAC to the world
# Set default policy to public
DEFAULT_PUBLIC=true
# Require specific scopes for write operations
PRIVATE_ENDPOINTS='{
"^/collections$": [["POST", "collection:create"]],
"^/collections/([^/]+)$": [["PUT", "collection:update"], ["PATCH", "collection:update"], ["DELETE", "collection:delete"]],
"^/collections/([^/]+)/items$": [["POST", "item:create"]],
"^/collections/([^/]+)/items/([^/]+)$": [["PUT", "item:update"], ["PATCH", "item:update"], ["DELETE", "item:delete"]],
"^/collections/([^/]+)/bulk_items$": [["POST", "item:create"]]
}'
# Basic configuration
ITEMS_FILTER_CLS=stac_auth_proxy.filters:Template
ITEMS_FILTER_ARGS=["collection IN ('public')"]
# With keyword arguments
ITEMS_FILTER_CLS=stac_auth_proxy.filters:Opa
ITEMS_FILTER_ARGS=["http://opa:8181", "stac/items/allow"]
ITEMS_FILTER_KWARGS={"cache_ttl": 30.0}
Work in progress
https://github.com/radiantearth/stac-geoparquet-spec/blob/main/docs/best-practices.md
cosgp create source destination
aws s3 sync destination s3://my-bucket/destination # or whatever
| Benchmark | Original (s) | Optimized (s) | Speedup |
|---|---|---|---|
| Count in bbox | 72 | 1.5 | 49 |
| Geometry intersects | 11 | 1.6 | 9 |
| Most recent | 28 | 2.3 | 12 |
| ID | 26 | 2.2 | 12 |
https://github.com/developmentseed/cloud-optimized-stac-geoparquet
use STAC to find, visualize, and use geospatial data
python -m pip install rustac
for item in await rustac.search("s3://bucket/collection/*.parquet"):
print(f"- {item['id']}")
await rustac.search_to(
"items.parquet",
"https://stac.eoapi.dev",
collections=["MAXAR_yellowstone_flooding22"],
)
for item in await rustac.search("items.parquet"):
print(f"- {item['id']}")