Self-hosted spatial data platform and geoportal builder.
Upload your data, style it, and publish a map anyone can use — on your own server, with your own domain, and no per-seat pricing.
Try the live demo — no sign-up, wiped hourly
Documentation · Getting started · Access your data · Roadmap
One command gives you a complete spatial stack on a single Linux server: PostGIS, object storage, Martin for vector tiles and TiTiler for rasters, a web dashboard, and the portals you publish from it.
curl -fsSL https://raw.githubusercontent.com/bravemaster3/geodeploy/main/installer/install.sh | bashA setup wizard takes it from there — database, storage, admin account — and you are uploading data a couple of minutes later. No terminal, no Docker knowledge, no database configuration.
Want to look before installing? geodeploy-demo.kndev.org is a live instance anyone can use: join with a name, upload something, style it, publish a portal. Everyone shares one workspace and it is wiped every hour, so treat it as a sandbox — but it is the same code this repository installs, running with demo mode switched on.
- Bring data in. Shapefile, GeoPackage, GeoJSON, CSV, GeoParquet, GeoTIFF. Large files upload straight to object storage, so multi-gigabyte datasets are not a special case.
- Publish portals. Choose an experience — a web map, a scrollytelling story, a searchable
catalog, or a dashboard — arrange the layers, set who can see it, publish. Each gets its own
URL, and any portal embeds in another site with one
<iframe>. - Ask questions of the data. A dashboard puts charts, numbers, lists and filters around the map and cross-filters them: click a bar, draw a box, or type in a search box, and every other widget re-answers. Aggregates are computed on the server, in each layer's own storage.
- Share data properly. Layers you mark public are readable by standard clients over open standards, so QGIS, Python and R consume them directly with no export step.
- Work without the browser.
pip install geodeploygives you a command-line client covering the whole API — upload many files at once, style with data-driven symbology, build and publish a portal, administer the instance. It is also the zero-dependency Python client the QGIS plugin is built on. - Work as a team. Roles from viewer to owner, per-layer visibility, invitation links, scoped API tokens, and an audit log of who changed what.
- Operate it from the browser. Service logs, a terminal, scheduled backups to a separate destination, an in-app restore, and one-button updates.
If you have been looking for one of these, it is the same thing under a different name:
- a self-hosted alternative to a hosted geoportal — ArcGIS Online, ArcGIS Hub and the like — where the data stays on your server and there is no per-seat licence;
- a geoportal builder or small spatial data infrastructure (SDI) in one package, rather than a tile server, a catalog, a database and a front end assembled and kept in step by hand;
- a GIS data catalog with OGC API - Features and STAC endpoints, for publishing open data;
- a geospatial dashboard tool, for putting charts and figures around a map.
It does not replace a desktop GIS, and does not try to. QGIS stays where the analysis happens — the plugin and the Python client connect the two.
upload ──▶ PostGIS or GeoParquet ──▶ tiles ──▶ portal editor ──▶ published portal
│
└──▶ OGC API - Features · STAC · COG · PMTiles ──▶ QGIS · Python · R
Vector data lands in PostGIS or as GeoParquet depending on its size and how you will use it; rasters become Cloud-Optimized GeoTIFFs. Everything is then reachable two ways: through the portals you publish, and through open standards other tools already speak.
A Linux server. 4 GB of RAM is a comfortable recommendation and two cores are plenty — tiling included. 2 GB has been tested and runs well (2 CPU / 2 GB VPS).
Add swap, whatever the size of your server. Most cloud images ship with none at all, and building the dashboard during an update needs far more memory than running it does — with no swap the kernel kills the build part-way and the update appears to hang. It takes a minute:
free -m # Swap total 0? then:
fallocate -l 2G /swapfile && chmod 600 /swapfile
mkswap /swapfile && swapon /swapfile
echo '/swapfile none swap sw 0 0' >> /etc/fstab # survives a rebootMore in Performance tuning. Disk depends on your data, not on GeoDeploy, and you can attach S3-compatible storage so capacity is never a server decision. Docker is installed for you if missing; Docker Compose must already be available (it ships with current Debian/Ubuntu). A domain name is optional but recommended.
Full documentation: https://docs-geodeploy.kndev.org/
| Getting started | Install, set up, publish your first portal |
| Uploading data | Formats, the two vector backends, large files |
| Portals and experiences | Web map, story map, catalog, dashboard; templates, layout and access |
| Web maps | The layer list, layout choices, the tools visitors get |
| Story maps | Sections, capturing a camera, per-section layers |
| Catalogs | Facets, what a dataset card shows, portal or instance-wide |
| Dashboards | Widgets, cross-filtering, linked layers, placement |
| Users, roles and sharing | Roles, visibility, tokens, audit log |
| Access from other tools | QGIS, DuckDB, Python — which standard for which job |
| The QGIS plugin | Browse an instance, restyle its layers and publish back, from inside QGIS |
| Command line | pip install geodeploy — upload, style, publish and administer from a shell |
| API reference | Tokens, scopes, and the live OpenAPI docs |
| Updating | Self-update, services, the Infrastructure panel |
| Backups and restore | Scheduled backups and in-app restore |
Every instance also serves its own interactive API documentation at /api/docs.
| Layer | Technology |
|---|---|
| API | FastAPI + Celery + Redis |
| State + spatial database | PostgreSQL / PostGIS (provisioned automatically) |
| Vector tiles | Martin |
| Raster tiles | TiTiler |
| Object storage | MinIO, S3-compatible (provisioned automatically) |
| Columnar analytics | DuckDB (embedded) |
| Frontend | Vue 3 + MapLibre GL JS + deck.gl |
| Infrastructure | Docker Compose, nginx |
Issues and pull requests are welcome — see CONTRIBUTING.md. Contributing a template is the easiest place to start.
Commits need a Signed-off-by line (DCO) — git commit -s. No
copyright assignment: you keep your work, and there is no future relicensing that would need your
permission.
Developer notes live in each folder's README.md; CLAUDE.md describes how the repository is
organised and kept current.
Apache License 2.0. Every feature is in this repository — no paid tier, nothing held back, nothing that unlocks with a key.
Apache 2.0 rather than MIT for two reasons that matter to the institutions who run this: it grants patent rights explicitly, and it does not hand over the GeoDeploy name. Fork it, host it, sell it — just don't call your service GeoDeploy.
If a hosted GeoDeploy Cloud appears, it is hosting only: this same open-source code, run for people who would rather not run a server. It will not have features you cannot get by installing it yourself.