A self-hosted web application for uploading, viewing, and managing sticker locations worldwide — with automatic GPS extraction from photos.
Browse all sticker locations on a MapLibre GL 6 world map, with a toggle between street, satellite, and terrain tile layers.
Upload a photo and GPS coordinates are automatically read from EXIF metadata — no manual entry needed.
Keycloak-backed authentication with four composite client roles — sm-viewer, sm-uploader, sm-editor, sm-admin — each inheriting the one below it.
Air-gap friendly Helm v4 chart with no chart dependencies — every template is inlined. Bring your own PostgreSQL/PostGIS and Keycloak.
Organise stickers into custom categories, each with its own uploaded icon, created and maintained by admins.
Removal reports with a review queue, archive/unarchive, GeoJSON and CSV export, and background maintenance jobs for thumbnails, image compression, EXIF stripping, and orphan cleanup.
Runtime i18n with Dutch (default) and English — switch languages without reloading the app.
AGPL-3.0 licensed. Run it on your own infrastructure — your data stays yours.
# Add repo helm repo add stickermap https://watskebart.github.io/stickermap helm repo update
helm install stickermap stickermap/stickermap \ --namespace stickermap --create-namespace \ --set ingress.hostname=stickers.example.com \ --set keycloak.url=https://auth.example.com \ --set database.existingSecretName= \ --set database.host=postgres.example.com \ --set database.password=changeme
helm install stickermap stickermap/stickermap \ --namespace stickermap --create-namespace \ --set ingress.hostname=stickers.example.com \ --set keycloak.url=https://auth.example.com \ --set database.existingSecretName=my-db-secret
helm install stickermap \ oci://ghcr.io/watskebart/stickermap/stickermap-helm/stickermap \ --namespace stickermap --create-namespace
HTTP→HTTPS redirect is enabled by default via a Traefik Middleware (ingress.httpRedirect=true).
Set it to false if you use a different ingress controller.
Full configuration reference and mandatory values: helm/README.md
| Layer | Technology |
|---|---|
| Frontend | Angular 22 (zoneless), TypeScript 6.0, MapLibre GL 6.x |
| Backend | Python 3.14, FastAPI, Pydantic |
| Database | PostgreSQL with PostGIS (SRID 4326) |
| Authentication | Keycloak, JWT RS256 |
| Container | Podman / Docker, compose |
| Kubernetes | Helm v4 |
Since 1.22.0 the map requires a browser with WebGL2 — MapLibre GL v6 removed the WebGL1 renderer. WebGL2 has been available in every major browser since 2021.