MappView

Architecture

How MappView is deployed and how the codebase is organized. Two views, same system.

Delivery

MappView ships three ways from one Bun workspaces monorepo. The viewer is a React app served as static files by nginx (Docker) or installed as a Tauri v2 desktop app for Windows, macOS and Linux. The management console and the share/admin API deploy as containers, and a Jupyter anywidget embeds the viewer in notebooks. Distribution is closed-source: Docker images plus signed desktop installers, no app stores and no update servers.

Runtime topology

flowchart LR
  subgraph clients["Clients"]
    Browser["Browser · PWA"]
    Desktop["Desktop · Tauri v2"]
    Jupyter["Jupyter · anywidget"]
    Console["Management console"]
  end

  subgraph viewer["Viewer stack · nginx"]
    Static["Static React app"]
    Sidecar["FastAPI sidecar · /sidecar
Whitebox · conversion · raster · SQL"] Static --> Sidecar end subgraph control["Control plane"] Admin["Management API · Bun
SQLite share.db · Clerk auth"] RustFS["RustFS · S3 object store
layers · photos · share blobs"] Plugins["Plugin registry CDN
registry.json"] end subgraph ai["AI relay"] Edge["Edge proxy · Bun
model routing · rate limits"] EdgeRedis["Redis"] end subgraph geonode["GeoNode stack · hosted-layers profile"] Django["GeoNode Django + bridge API"] PostGIS["PostGIS"] GeoServer["GeoServer"] Celery["Celery + Redis"] end Browser --> Static Desktop --> LocalSidecar["Local sidecar · 127.0.0.1:8765"] Jupyter --> Static Console --> Admin Admin --> RustFS Admin --> Django Admin --> Edge Edge --> EdgeRedis Django --> PostGIS Django --> GeoServer Django --> Celery Browser -->|"hosted layers WMS/WFS/tiles"| GeoServer

Trust boundaries

  • The desktop app talks to its local sidecar over 127.0.0.1only; heavier Python processing never leaves the machine unless a remote processing service is configured.
  • The viewer container reaches the sidecar same-origin at /sidecar — no CORS surface. Set MAPPVIEW_DISABLE_SIDECAR=1 to serve static files only.
  • The management API fronts object storage with signed, time-limited layer URLs (LAYER_ACCESS_TTL_SECONDS) and per-tenant storage quotas.
  • The edge AI proxy authenticates viewers with a token, allowlists models, and rate-limits per client; provider keys never reach the browser.