GratisGIS
Sign in

This is a public test instance. Resets to a curated golden state every day at 04:00 UTC.

Sign in with tester-admin / Admin123!, tester-contributor / Contributor123!, or tester-viewer / Viewer123!. Items, users, and edits you create vanish at the next reset. Feedback is welcome via the GitHub Issues link below.

GratisGIS

Open Source Geospatial Portal

Open source GIS portal

An open-source, self-hosted GIS portal

GratisGIS is a portal for publishing datasets, web maps, forms, and dashboards on your own infrastructure. Built on open components (PostGIS, MapLibre, Keycloak). No license fees; your only cost is the hardware (or cloud bill) you choose to run it on.

  • Your data, your hardware

    PostGIS-backed datasets, web maps, and forms. Bring data in from shapefiles, GeoJSON, GDB, or any OGR-supported format.

  • Field-ready PWA

    A data-collection app that installs to the home screen, works offline, and syncs when you're back online.

  • Standards-friendly + ArcGIS-friendly

    OGC API Features, Tiles, Styles, and Records; CSW 2.0.2 catalog; Schema.org JSON-LD; WMS / WFS service references; plus Esri WebMap JSON export so portal maps open in ArcGIS Pro, ArcGIS Online, QGIS, and kepler.gl.

  • Built for self-hosting

    Docker compose, single-command deploy. Runs on a $20/month VPS or your existing infrastructure. No SaaS lock-in.

Built in, not bolted on

Operational features the portal ships with

  • Housekeeping that runs itself

    Stale items get flagged. Inactive users get auto-disabled. Expiring shares trigger warnings. Spatial extents get recomputed on a schedule. Admins get a dashboard, not a backlog.

  • Sync that doesn't lose your work

    Offline edits go to a per-edit queue with isolated retries. A bad row doesn't poison the rest. Schema changes notify every device that has cached the deployment so the field crew rebuilds before they next sync.

  • Email notifications you actually control

    Built-in templates for shares, expirations, schema changes, form submissions, and field captures. Org admins customize the copy through a guided editor with click-to-insert variables. Routed through one SMTP, not a sprawl of webhooks.

  • Sharing granularity that makes sense

    Share an item with a user, a group, or a folder. Folder shares cascade to every item in the folder. Per-share row scope ('all' vs 'own') and geographic clip (polygon) layer on top. View / download / edit / admin tiers, not a single 'shared' bit.

View on GitHubSend feedbackDiscussionsSend feedback goes to the maintainer's inbox; no account required. Discussions is the GitHub place for longer threads.

What's new

  • Spanish, Portuguese, French, German seed translations

    The four non-English catalogs are now seeded across every already-wired UI key, so the menu items, dialogs, and other strings the portal currently translates render in your chosen language. The seed is a machine-translated pass and the locale picker tags it "(MT)" so you know to expect rough edges; native speakers, please open a pull request fixing anything that sounds wrong (the picker now links to the contributor guide).

  • Pick your portal language

    A language picker now lives in the user menu in the top-right. Five languages are available: English, Spanish, Portuguese (Brazil), French, and German. Your pick is remembered across sessions. The translation coverage is still small (the picker shows each language's completeness), so most of the UI still renders in English for now; the navigation menu and Print this map dialog are translated as a start, and contributions extend the rest as the catalogs fill in.

  • Live PostgreSQL: any projection, no raw SQL filtering

    Two upgrades to live PostgreSQL + PostGIS layers. First, tables in any spatial reference system PostGIS knows about now render without needing to be in WGS84: the portal reprojects on the server with the GiST index still in play. Second, the layer filter you already use on any other map layer (column / operator / value rows) is now translated to safe parameterized SQL on the PostgreSQL side, so the database only sends back the rows that match. The raw SQL escape hatch is still there for power users.

  • Clip and erase by another layer

    Two new analysis steps. Clip cookie-cutters your features by another layer so only the parts inside survive (handy for "this dataset, but only inside this district"). Erase is the inverse, so you get only the parts outside (handy for "everything except this exclusion zone"). Attributes pass through unchanged on both. Add either from the toolbox in the derived-layer builder under "Compare with another layer."

  • Print PDFs match the map you're looking at

    The printed PDF now paints layers with the same colors and labels as the on-screen map: unique-value renderers, class-breaks, time- bins, and text labels all carry through, not just the simple fill / outline colors. The bound map's own basemap renders in the PDF too (raster, PMTiles, and Cloud-Optimized GeoTIFF), instead of vanilla OpenStreetMap. When the print Map element has a fixed scale set, the PDF honors that scale.

Explore public content

Datasets, maps, and apps GratisGIS has shared publicly.