Skip to content

Requirements

What Conness GIS needs to run, what each dependency is for, and how versions are kept in check.

To build and run

  • Node 24 or newer. app/package.json declares engines.node: ">=24", so npm warns on an older Node, and the repo's .nvmrc says 24, so nvm use picks it. The real floor comes from Vite 8 and from npm run test, which runs TypeScript files directly with Node's built-in type stripping.
  • Install with npm ci. It installs the exact versions in package-lock.json, the tested set. Use npm install only after you change package.json.
  • A browser with WebGL2, which every current browser has. MapLibre 6 dropped WebGL1, so a device without WebGL2 gets no map.

A clean npm ci prints no warnings and reports 0 vulnerabilities. If that changes, npm outdated and npm audit show what moved.

What each dependency is for

Runtime (shipped in the built app, some only loaded when a project uses them):

Package Used for
maplibre-gl The map
react, react-dom The interface
zustand App state (the store)
pmtiles PMTiles layers
flatgeobuf FlatGeobuf layers
@duckdb/duckdb-wasm GeoParquet, duckdb and mvt layers; loaded only when a project has one
esri-gl Esri map and feature services; loaded only when a project has one
@mapbox/mapbox-gl-draw The Draw and Measure widgets
@turf/turf Measurements and layer bounds
hyparquet-writer GeoParquet export; loaded on first export
react-markdown The info modal; loaded when it opens
re-resizable Resizable popups

Development only: vite and @vitejs/plugin-react (dev server and build), tailwindcss, @tailwindcss/vite and @tailwindcss/typography (styles; typography styles the info modal), typescript, eslint with typescript-eslint and the React hooks and refresh plugins, and the @types/* packages.

Deliberate holds and overrides

What Why
@duckdb/duckdb-wasm pinned to 1.33.1-dev65.0 The npm next build of DuckDB 1.5.6; its extensions must match the core version exactly
TypeScript stays on 6.0 (~6.0) typescript-eslint doesn't support TypeScript 7 yet
overrides: esri-gl → our maplibre-gl esri-gl declares MapLibre 5 or older, but only calls the map it's given, so it works with MapLibre 6
overrides: postcss-selector-parser 7.1.6 for @tailwindcss/typography A security fix the plugin's pinned version doesn't have
overrides: node-domexception → @nolyfill/domexception A deprecated Node-only polyfill pulled in by esri-gl; never bundled for the browser
allowScripts: { fsevents: false } fsevents (Vite's file watcher on macOS) ships a prebuilt binary, so its install script isn't needed

Other ranges are ^ with the floor at the tested version, so npm install on a fresh package.json stays close to what was tested; the lockfile pins the exact tree.

Python (optional, separate from the app)

  • Data conversion scripts (convert-data-python/): requirements.txt pins geopandas, pyarrow and ipykernel. See Converting Data.
  • This docs site (docs/): requirements.txt pins zensical. After upgrading it, re-run scripts/breakpoints.py (see docs/README.md).