// the find
koopjs/koop
Transform, query, and download geospatial data on the web.
Koop is a Node.js middleware server that bridges arbitrary geospatial data sources to ArcGIS's GeoServices API spec, so you can point ArcGIS/QGIS at APIs that don't natively speak it. The plugin architecture lets you write a provider for any data source and an output plugin for any format — GeoJSON, vector tiles, WMS out of the box. It's squarely aimed at GIS teams who need to feed modern data into Esri tooling without ETL pipelines.
The winnow package is the real gem here — it's a full in-memory SQL-like query engine for GeoJSON (WHERE clauses, spatial filters, aggregates, reprojection) that you can pull out and use independently. The monorepo is well-structured with per-package coverage badges and a CI pipeline that tracks coverage changes on PRs, which is more disciplined than most GIS projects. The plugin system is genuinely composable: providers and outputs are decoupled through a GeoJSON intermediate format, so adding a new source doesn't require touching output logic. Esri's own teams maintain this, so the GeoServices spec compliance is accurate and keeps pace with ArcGIS updates.
The in-memory cache is the default and only built-in caching strategy — for anything beyond toy datasets, you need to wire up an external cache plugin yourself, and the ecosystem of third-party plugins is thin and inconsistently maintained. The ArcGIS-first orientation means the abstraction leaks badly if your target isn't Esri: GeoServices URL patterns and ESRI-specific query params bleed through into provider development. TypeScript support is an afterthought — winnow has an index.d.ts but the rest of the monorepo is plain JavaScript with no type safety, which makes writing providers error-prone. There's no built-in pagination or streaming for large datasets; providers that return millions of features will blow up the Node process.