A self-hosted GIS portal, field PWA, and QGIS plugin. Built for teams that want data on their own hardware and want out of ArcGIS Online seat licenses. What is credible today is the portal (items, groups, sharing), field collection, and QGIS. It is not a full ArcGIS Online replacement, and it is not a drop-in for Experience Builder, Survey123, Field Maps, or enterprise identity depth.
Status: v1.2.0. The public surface follows semantic versioning. For what ships today, see docs/walkthrough.md and the changelog. Store-listed native mobile apps are not part of 1.0; the field PWA is the supported field client.
Try it: gratisgis.org is a public demo (test credentials and a daily reset on the landing page). Same sample workspace as in-app "Load sample data." Bugs and chat: Issues · Discussions.
Contribute: Issues and PRs welcome. See CONTRIBUTING.md for branch naming, Conventional Commits, and how reviews work (the maintainer is the final reviewer).
| Layer | Project |
|---|---|
| Language | TypeScript |
| API | Node.js + NestJS |
| Database | PostgreSQL + PostGIS |
| ORM | Prisma |
| Auth | Keycloak (OIDC) |
| Authorization | Cedar |
| Object storage | MinIO |
| Edge | Caddy |
| Tiles | pg_tileserv + PostGIS MVT |
| Web | Next.js + React |
| Maps | MapLibre GL + Terra Draw |
| Tile bundles | PMTiles |
| Raster / vector I/O | GDAL (gdal-async) |
| UI | shadcn/ui, Tailwind, lucide |
| Monorepo | pnpm + Turborepo |
| CI | GitHub Actions |
gratis-gis/
├── apps/
│ ├── portal-api/ NestJS backend
│ ├── portal-web/ Next.js portal (field PWA, app builder)
│ └── portal-mcp/ MCP server
├── packages/ engine, shared-types, form-schema, ui
├── tools/pointcloud-worker/
├── docs/
├── infra/ Docker Compose, install, deploy
└── .github/workflows/
Single-host Docker Compose. A 4-core / 8 GB VPS is enough for a small org (the public demo runs on that).
curl -fsSL https://raw.githubusercontent.com/palavido-dev/gratis-gis/main/infra/install.sh | bashOr by hand:
git clone https://github.com/palavido-dev/gratis-gis /opt/gratis-gis
cd /opt/gratis-gis
./infra/setup.sh
./infra/deploy.sh
./infra/doctor.shInstalls track the latest release tag (GG_REF to pin). See
docs/deployment.md and
docs/UPGRADING.md.
Home NAS (TrueNAS or Dockge), one paste, no domain name: docs/truenas.md.
Prereqs: Node 24.9+, pnpm 9+, Docker, git.
git clone https://github.com/palavido-dev/gratis-gis.git
cd gratis-gis
pnpm install
cp .env.example apps/portal-api/.env
cp .env.example apps/portal-web/.env
pnpm infra:up
pnpm --filter @gratis-gis/portal-api db:migrate
pnpm --filter @gratis-gis/portal-api db:seed
pnpm dev
# portal-api :4000 · portal-web :3000 · keycloak :8080Start here:
- docs/SETUP.md — local setup
- docs/walkthrough.md — features today
- CONTRIBUTING.md — how to contribute
- docs/deployment.md — install and operate
Deeper references live under docs/ (architecture, data
model, sharing, auth, design system, sample data, discoverability).
Roadmap: ROADMAP.md. Architecture overview:
ARCHITECTURE.md.
Copyright (C) 2026 Matt Palavido
GNU Affero General Public License v3.0 or later (AGPL-3.0-or-later). See LICENSE.
You may use, modify, self-host, and redistribute, including commercially. Hosting it as a network service (or running modified versions on a network) requires offering corresponding source under the same license. Selling support, hosting, training, or custom work around it is fine; wrapping it in a closed-source product is not.
GratisGIS is independent and not affiliated with or endorsed by any commercial GIS vendor. Third-party names appear only for descriptive interoperability.