# Alidade
**An open-source Web-GIS platform.**
PostGIS vector tiles, satellite imagery, full symbology, 3D models on the terrain,
and a real-time asset layer. No API keys anywhere.
[](https://github.com/aysanz/alidade/actions/workflows/ci.yml)
[](LICENSE)
[](#no-api-keys)
**[▶ Live demo](https://alidade.aysanz.dev)**
---
## What it is
The map is one JSON document. The core diffs two versions of it and emits a list of
operations; an adapter applies those operations to MapLibre. Editing the document
changes the map — and swapping the basemap does not destroy your layers.
That one decision is why undo is sixty whole documents deep, why a drawing survives
a basemap swap, and why the renderer could be replaced without touching the model.
```
packages/core the arithmetic · knows nothing about any renderer
packages/maplibre the only folder that knows MapLibre exists
packages/three the only folder that knows three.js exists
apps/studio React client
services/api FastAPI: ingest, vector tiles, imagery, WMS, live feed
```
 Layers, styled. Markers, outlines and a legend that follows what you set, over data loaded from a link a minute earlier. |
 Ask it things. Click a feature for what it is; the table pages, searches and finds the same row. |
 A real globe, not a picture of one — and a sphere at every zoom if you ask for one. |
 3D buildings from OpenStreetMap. Footprints extruded to their real height, lit from where the sun actually was. |
 Fly a landing. The aircraft banks because it is turning, not because a keyframe said so. |
 A live fleet over a WebSocket, with a connection light, because a stopped feed and a still fleet look identical. |
 Imagery. A schematic rather than a screenshot: what is on the map is whatever you loaded. See the imagery notes. |
 Basemaps, none of which need a key. Swapping one does not disturb your layers. |
## Run it
```bash
cp .env.example .env
# --env-file matters: compose looks for .env next to the compose file, not here.
docker compose --env-file .env -f deploy/docker-compose.yml up -d --build
# Install from the repository root. The studio depends on two workspace packages,
# so installing inside apps/studio cannot see them.
pnpm install
pnpm dev
```
- Studio —