P R O J E C T SC O N T A C T

[10]

CITY 3D — CITY MAP

TIER B · YEAR 2026 · STATUS: LIVE · LANGUAGES: TYPESCRIPT / PYTHON

3D map of Sopot: events, crowd heatmap, quests, gamification

[FIG. 1] MISSION

Full-stack 3D map of Sopot (React 18 + deck.gl / MapLibre GL front, FastAPI + async SQLAlchemy + Postgres 16 + Redis back). Toggleable layers: Facebook events (Apify), an hour-slider crowd heatmap, popular places (Google Places), photo hotspots (Wikimedia) and city quests. Gamification loop: check-in → hashtag → Instagram post → one-time discount code. A custom dual-sided plugin system (a module is just a folder, no central registry) with real→fallback→mock graceful degradation — spins up with one `docker compose up` and zero API keys.

[FIG. 2] ARCHITECTURE

hover a block to see its description

[FIG. 2A] THE CITY AT EVERY HOUR

18:00

BOTTOM = BEACH (PEAK 1 PM) · MIDDLE = CENTRE (PEAK 8 PM)

LAYERS

GRACEFUL DEGRADATION — CLICK TO CUT A SOURCE

→ /api/health: heatmapa: real · eventy: real · miejsca: realthe same Pydantic contract either way

[FIG. 3] CHALLENGES

[+][CH-01]

Run with zero API keys — deterministic per-module mocks + a fallback chain, identical Pydantic contract in real and mock mode.

[+][CH-02]

Extensibility with no central registry — backend module auto-loader and frontend `import.meta.glob`; a new module is a new folder.

[+][CH-03]

Fusing several geo APIs (Apify/FB, Google, Outscraper, Wikimedia) into one deck.gl layer model.

[FIG. 4] AI LAYER

3D map of Sopot: events, crowd heatmap, quests, gamification

[FIG. 5] GALLERY

SCREENSHOTS INCOMING — see SHOTS-WANTED

[FIG. 6] STACK & LINKS

REACT 18VITEDECK.GLMAPLIBRE GLFASTAPISQLALCHEMY (ASYNC)POSTGRESQL 16REDISDOCKER COMPOSEAPIFYGOOGLE PLACES