Two capabilities in one. Browse and ingest imagery from remote public catalogs — Element 84 Earth Search, Microsoft Planetary Computer, or any custom STAC API — and turn a folder of local rasters, vectors, and point clouds into a spec-conformant STAC catalog your whole team can query.
The browser auto-detects whether a catalog speaks the OGC CQL2 Filter Extension or the older STAC query extension, and emits the right request from a single query — no hand-writing filters.
NeedsSigning asset hrefs are signed server-side so the browser can GET COGs directly.// single query → correct dialect per catalog { "collections": ["sentinel-2-l2a"], "intersects": { "type": "Polygon", "coordinates": [/* AOI */] }, "datetime": "2026-05-01/2026-06-30", "query": { "eo:cloud_cover": { "lt": 10 } } } → assets rendered as ArcGIS ImageryTileLayer
Ingest a folder of GeoTIFFs, COGs, Shapefiles, GeoJSON, GPKG, or LAS/LAZ/COPC and serve it as a spec-conformant STAC API at /stac — landing page, conformance, collections, queryables, items, and GET + POST /search.
AssetMetadataExtractor pulls bbox, CRS, and projection from rasters (GDAL), vectors (OGR), and point clouds (native LasReader).
Catalog items persist in a local stac.gpkg — survives restarts, fully offline.
STAC API 1.0.0 core, collections, OGC API Features, item-search (+sort, +fields), and the query extension v0.3.0.
Reads queryables + collection summaries to build filter widgets — no field list hardcoded.
STAC assets stream into ImageryTileLayer / ImageryLayer for instant visualization.
The desktop proxy absorbs browser-hostile CORS, SAS signing, and bearer auth so the client just works.
Remote search is proxied under /api/stac; your own catalog lives under the spec path /stac with management under /api/stacserver.
| Surface | Endpoint | Purpose |
|---|---|---|
| Remote client | GET/POST /api/stac/sources | List / add / remove remote catalogs |
| Remote client | POST /api/stac/sources/{id}/search | Search a remote catalog (dialect auto) |
| Remote client | GET /api/stac/sources/{id}/collections | List collections + queryables |
| In-app server | GET /stac · /stac/conformance | STAC 1.0.0 landing + conformance |
| In-app server | GET /stac/collections/{cid}/items | Serve items from stac.gpkg |
| In-app server | GET+POST /stac/search | Spec item-search (sort + fields) |
| Management | POST /api/stacserver/collections/{cid}/ingest | Ingest local files into a collection |
Endpoints reflect StacRoutes.cs and StacServerRoutes.cs on commit f714fcc75. STAC version is 1.0.0 per the served conformance document.
# ingest a folder of rasters + clouds POST /api/stacserver/collections/{cid}/ingest { "paths": ["D:/imagery/*.tif", "D:/clouds/*.laz"] } # then any STAC client can query it GET /stac/collections/{cid}/items POST /stac/search { "bbox": [...] } ● spec-conformant · offline · on :5059
Browsers can't talk to most STAC APIs directly — CORS, Planetary Computer SAS signing, and bearer auth all block the client. The desktop host sits in between and absorbs all of it, so analysts search and render imagery without ever leaving the map.
Both STAC roles — consumer and provider — ship in a single in-app feature, fully offline-capable.