diff --git a/README.md b/README.md index 4183f406..f76c0d68 100644 --- a/README.md +++ b/README.md @@ -1,314 +1,197 @@ -# GeoIntel Belgium and the Belgian North Sea +# GeoIntel -GeoIntel is a map-first GeoAI Workbench for Belgium and the Belgian North Sea. -It combines governed official-source coverage, raster/vector processing, -historical comparison, computer vision, QA/QC and geospatial exports. +

+ GeoIntel logo +

-Mol and the Kempen remain deep regression and model-validation references. The -release scope is all of Belgium plus legally labelled Belgian maritime zones; -source coverage remains explicit per theme and jurisdiction. +

Evidence-first GeoAI voor België en de Belgische Noordzee.

-GeoIntel is not a generic dashboard or chatbot. The core product is: +GeoIntel is een kaartgerichte GeoAI-workbench waarin officiële databronnen, +ruimtelijke analyse, PyTorch-computervisie, QA/QC en export samenkomen. Het +platform bewaart niet alleen een resultaat, maar ook de bron, ruimtelijke +context, modelversie en het bewijs waarmee dat resultaat gecontroleerd kan +worden. -> data → processing → geospatial output → QA/QC → export +> **Data → ruimtelijke verwerking → AI-resultaat → kwaliteitsbewijs → export** -## Current milestone +![GeoIntel landingspagina](docs/assets/portfolio/geointel-landing-hero.png) -**v1.0.0 - Belgium/North Sea release** +## Waarom GeoIntel? -The canonical release controls are: +Veel geoportalen tonen lagen. GeoIntel ondersteunt een volledige, +controleerbare analyseketen: -- `docs/00-start/START_HERE.md` -- `docs/RC_SCOPE_FREEZE_BELGIUM_NORTH_SEA.md` -- `docs/RC_ROADMAP_BELGIUM_NORTH_SEA.md` -- `docs/RELEASE_RUNBOOK.md` -- `docs/KNOWN_LIMITATIONS.md` -- `docs/DEFINITION_OF_DONE.md` +- selecteer een officiële grens of teken een eigen Area of Interest; +- combineer vector-, raster- en historische bronnen met expliciete dekking; +- voer GIS- en CUDA-versnelde beeldanalyse uit; +- vergelijk kandidaatresultaten met referentiedata; +- inspecteer false positives, false negatives, overlap en provenance; +- exporteer alleen wat als reproduceerbaar resultaat is vastgelegd. -Older milestone and sprint handoff files remain historical evidence. They do -not override the active national/maritime scope freeze or RC roadmap. +Mol en de Kempen blijven de gouden regressiegebieden. De productgrens is heel +België plus de juridisch benoemde Belgische maritieme zones. -## Core V1 vertical slice +## Product in beeld -The first implementation target is: +### Interactieve projectketen -1. Project + Area creation. -2. Dataset registration/upload and metadata extraction. -3. Reference building layer loading. -4. Predicted detection layer loading/import. -5. QA/QC matching against reference polygons. -6. Metrics and false positive/false negative outputs. -7. GeoJSON export. -8. Minimal map/workbench UI. +De landingspagina vertaalt de technische keten naar vier interactieve +schakels. De illustratie reageert op selectie, bronnen, analyse en bewijs en +respecteert automatisch `prefers-reduced-motion`. -## Primary stack +![Interactieve GeoIntel-projectketen](docs/assets/portfolio/geointel-interactive-story.png) -- Frontend: React, TypeScript, MapLibre GL, Deck.gl, Tailwind. -- Backend: FastAPI, Python. -- Database: PostgreSQL + PostGIS. -- GIS processing: GeoPandas, Shapely, Rasterio, PyProj, GDAL. -- AI: PyTorch, Ultralytics YOLO, SAM-compatible architecture. -- Jobs: Redis + RQ. -- Storage: local filesystem first, MinIO-compatible later. +### Kaart als werkruimte -## Codex instructions +De kaart blijft het primaire werkblad. Thema, broncontext, selectie en +resultaten zijn vanuit dezelfde ruimtelijke context bereikbaar. -Codex must start with: +![GeoIntel kaartwerkruimte](docs/assets/portfolio/geointel-workbench-map.png) -1. `docs/00-start/START_HERE.md` -2. `prompts/codex/M11_ARCHITECT_MASTER_PROMPT.md` +### Kwaliteit vóór resultaat -Then follow the build order in: +QA/QC is een eerste-klas workflow. Bewaarde controles koppelen scores aan +objectbewijs, kandidaat- en referentielagen en technische provenance. -- `docs/build/BUILD_ORDER_DEPENDENCY_GRAPH.md` -- `docs/build/CODEX_OPERATING_SYSTEM.md` +![GeoIntel kwaliteitscontrole](docs/assets/portfolio/geointel-workbench-quality.png) -Before every implementation pass, run available preflight/smoke scripts where applicable. +## Kernmogelijkheden -## Repo principle +| Domein | Mogelijkheden | +| --- | --- | +| Werkgebieden | Officiële grenzen, vrije AOI-selectie, clipping en buffering | +| Bronnen | GeoJSON, vector, raster, orthofoto, historische en regionale catalogi | +| GIS | CRS-normalisatie, spatial joins, rasterstatistiek, tile- en selectieanalyse | +| GeoAI | PyTorch, Ultralytics YOLO en SAM-compatibele abstrahering | +| Tijd | Immutable DatasetVersions en vergelijking van ruimtelijke snapshots | +| QA/QC | Precision, recall, F1, IoU, false-positive/-negative evidence en reviews | +| Export | Reproduceerbare GeoJSON- en artefactexports met provenance | +| Runtime | DockerMan-native Unraid-container met PostGIS, Redis, backend en frontend | -This is a documentation-driven engineering repo. The documentation is not decorative; it is the control system for autonomous implementation. +## Architectuur -## Fastest Day 1 command path - -```bash -make readiness +```mermaid +flowchart LR + UI["React + MapLibre workbench"] --> API["FastAPI contracts"] + API --> GIS["GeoPandas / Shapely / Rasterio"] + API --> JOBS["Redis + RQ"] + JOBS --> AI["PyTorch / YOLO / SAM"] + GIS --> DB[("PostgreSQL + PostGIS")] + AI --> DB + DB --> QA["QA/QC + provenance"] + QA --> UI + QA --> EXPORT["GeoJSON / artifacts"] ``` -## Unraid / Tower deployment +De publieke endpoints volgen [docs/API_CONTRACTS.md](docs/API_CONTRACTS.md). +PostGIS en de persistentieregels volgen +[docs/DATABASE_IMPLEMENTATION_PLAN.md](docs/DATABASE_IMPLEMENTATION_PLAN.md). -GeoIntel runs on Unraid as an all-in-one DockerMan-native container. The container embeds PostGIS, runs the FastAPI backend internally, and serves the frontend through nginx on one editable web port. +## Stack -Unraid template assets live in: +- **Frontend:** React 18, TypeScript, MapLibre GL, Lucide en Vite +- **Backend:** FastAPI en Python +- **Spatial:** GeoPandas, Shapely, Rasterio, PyProj en GDAL +- **AI:** PyTorch, Ultralytics YOLO en SAM-compatibele segmentatie +- **Data:** PostgreSQL/PostGIS, lokale artefactopslag en immutable versions +- **Jobs:** Redis en RQ +- **Deployment:** één DockerMan-native Unraid-container -- `deploy/unraid/geointel.env.example` -- `deploy/unraid/geointel-unraid-template.xml` -- `deploy/unraid/geointel-icon.svg` -- `deploy/unraid/geointel-icon.png` -- `docker-compose.unraid.yml` +## Lokaal starten -Copy the Unraid env template to `.env` in the checkout and edit ports/paths there: - -```bash -cd /mnt/user/appdata/geointel -cp deploy/unraid/geointel.env.example .env -nano .env -docker build -f deploy/unraid/Dockerfile.all-in-one -t geointel-all-in-one:latest . -bash deploy/unraid/run-dockerman-container.sh -``` - -Common editable values: - -```env -GEOINTEL_FRONTEND_PORT=1202 -GEOINTEL_STORAGE_PATH=/mnt/user/appdata/geointel/storage -GEOINTEL_POSTGIS_DATA_PATH=/mnt/user/appdata/geointel/postgres-data -``` - -### Guest demonstration access - -Guest access is enabled by default whenever the operator login gate is active. -No additional guest toggle is required for a new authenticated installation: - -```env -GEOINTEL_AUTH_ENABLED=true -GEOINTEL_AUTH_USERNAME=operator -GEOINTEL_AUTH_PASSWORD_HASH=pbkdf2_sha256$... -GEOINTEL_AUTH_SESSION_SECRET= -GEOINTEL_GUEST_ACCESS_ENABLED=true -GEOINTEL_GUEST_DISPLAY_NAME=Gast -GEOINTEL_GUEST_SESSION_TTL_SECONDS=7200 -``` - -The login page offers **Als gast verkennen**. A guest receives a short-lived, -read-only session scoped to the seeded demo project and sees only the map and -existing quality evidence. Set `GEOINTEL_GUEST_ACCESS_ENABLED=false` to hide and -disable this route. This is not multi-user authorization or tenant isolation; -use a separate demo instance when the installation contains private or -operational datasets. - -The backend and PostGIS ports are intentionally not exposed to the LAN in the all-in-one runtime. See `deploy/unraid/README.md` for full setup, port-change and cleanup notes. - -On Tower/Unraid, `scripts/deploy_tower.ps1` and `scripts/deploy_tower.sh` validate the Compose reference but build with plain `docker build`, then automatically install the editable DockerMan template as `/boot/config/plugins/dockerMan/templates-user/my-geointel.xml`, install the PNG icon as `/boot/config/plugins/dockerMan/images/geointel-icon.png`, remove any old Compose-owned `geointel` container and start the final container with DockerMan labels. - -## Sprint 2 quick start - -- Update dependencies: +Vereisten: Python 3.11+, Node 20.19+ of 22.12+, PostgreSQL/PostGIS en Redis. ```bash python -m pip install -e backend/.[dev] -cd frontend && npm install +cd frontend +npm install +npm run start ``` -- Run full readiness checks (with no scope expansion): +Voor de volledige lokale stack: ```bash +docker compose up --build +``` + +Open daarna `http://localhost:1202`. + +### Gastdemo + +Met `GEOINTEL_GUEST_ACCESS_ENABLED=true` biedt de toegangspagina een +kortlevende, alleen-lezen demosessie. Die toont uitsluitend het ingestelde +demoproject en bewaard kwaliteitsbewijs; dit is geen multi-user- of +tenantisolatie. + +## NVIDIA/CUDA + +Productie-AI gebruikt de NVIDIA GPU van de server. De runtime faalt gesloten +wanneer CUDA vereist maar niet beschikbaar is; ontbrekende modelconfiguratie +wordt als `not_configured` getoond en nooit als geslaagde inferentie. + +Controleer GPU-zichtbaarheid in de container met: + +```bash +docker exec geointel nvidia-smi +``` + +## Kwaliteitscontrole + +```bash +# Backend python -m compileall backend/app cd backend && python -m pytest -cd ../frontend && npm run typecheck && npm run build -bash scripts/run_readiness_check.sh -``` -- Raster workflow validation command (backend only): - -```bash -bash scripts/smoke_backend_import.sh -cd backend && python -c "from app.main import app; print(app.title)" -``` - -If `rasterio` is not installed, raster metadata endpoints return `RASTER_PROCESSING_UNAVAILABLE` and the frontend displays the -state as failed until the dependency is added. - -## Sprint 4 raster foundation - -- Raster operations now support: - - raster metadata extraction, - - raster preview generation, - - raster clip by area (with provenance on derived datasets), - - raster tile generation with manifest output. -- Raster services are dependency-aware: - - if `rasterio` is unavailable, endpoints return `RASTER_PROCESSING_UNAVAILABLE`. - - if preview dependencies (`numpy`, `pillow`) are unavailable, preview generation is unavailable with a clear error. -- Enable raster stack explicitly when needed: - -```bash -cd backend && python -m pip install -e .[dev,raster] -``` - -## Sprint 5 raster analytics hardening - -- Added raster band statistics (min/max/mean/std, nodata ratio/count, valid pixel count, dtype, optional histograms). -- Added raster reproject workflow with CRS validation and provenance persistence. -- Extended tile manifest expectations (`tile_set_id`, `tile_size`, `overlap`, `bounds`, `source_raster_id`, `tile_paths`, `tile_server`). -- Clarified raster operation availability in frontend/backend docs (`RASTER_PROCESSING_UNAVAILABLE` and invalid-CRS cases). - -- Raster workflow command set (where available): - -```bash -cd backend -python -m pip install -e .[dev,raster] -python -m pytest -cd ../frontend +# Frontend +cd frontend npm run typecheck +npm run test:unit npm run build ``` -Then give Codex the prompt in: +Een wijziging is pas afgerond wanneer de toepasselijke criteria uit +[docs/DEFINITION_OF_DONE.md](docs/DEFINITION_OF_DONE.md) aantoonbaar zijn +afgevinkt. -- `prompts/codex/final/DAY_1_MASTER_PROMPT.md` +## Tower / Unraid deploy +De canonieke checkout op Tower staat in `/mnt/user/appdata/geointel`. Gebruik +de releasewrapper; de productiecontainer wordt niet met een alternatieve +Compose-checkout vervangen. -## M13 Codex optimization - -For the first serious Codex build run, use: - -- `prompts/codex/m13/DAY_1_OPTIMIZED_MASTER_PROMPT.md` - -Codex should also use the relevant reusable skill under `skills/` for each implementation pass. Validate the optimization assets with: - -```bash -make m13 +```powershell +powershell -ExecutionPolicy Bypass -File scripts/deploy_tower.ps1 ` + -RemoteHost root@ ` + -RemotePath /mnt/user/appdata/geointel ` + -RemoteBranch main ` + -FrontendUrl http://:1202 ``` -The full readiness path remains: +Zie [deploy/unraid/README.md](deploy/unraid/README.md) en +[docs/RELEASE_RUNBOOK.md](docs/RELEASE_RUNBOOK.md) voor configuratie, +healthchecks en rollback. -```bash -make readiness -``` +## Documentatiekaart +- [Start hier](docs/00-start/START_HERE.md) +- [Belgium/North Sea scope freeze](docs/RC_SCOPE_FREEZE_BELGIUM_NORTH_SEA.md) +- [API-contracten](docs/API_CONTRACTS.md) +- [Database-implementatieplan](docs/DATABASE_IMPLEMENTATION_PLAN.md) +- [Bekende beperkingen](docs/KNOWN_LIMITATIONS.md) +- [Release-runbook](docs/RELEASE_RUNBOOK.md) -## M14 Build Launch +## Portfolio-assets -For the first serious implementation run, use: +De map [`docs/assets/portfolio`](docs/assets/portfolio) bevat presentatieklare +screenshots van de landingspagina, interactieve illustratie, kaartwerkruimte, +kwaliteitscontrole en mobiele weergave. De twee originele campagnebeelden +staan in [`frontend/public/portfolio`](frontend/public/portfolio) en worden +ook door de applicatie gebruikt. -- `docs/40-build-launch/SPRINT_1_SCOPE_FREEZE.md` -- `docs/40-build-launch/BUILD_SUCCESS_DEFINITION.md` -- `docs/40-build-launch/CODEX_STOP_RULES.md` -- `prompts/codex/m14/CODEX_FIRST_DAY_MASTER_PROMPT.md` +![GeoIntel mobiele landingspagina](docs/assets/portfolio/geointel-landing-mobile.png) -Validate launch assets with: +## Status -```bash -make m14 -``` +Actieve mijlpaal: **v1.0.0 — Belgium and Belgian North Sea**. -Full readiness remains: - -```bash -make readiness -``` - -## Sprint 1 execution (Sprint 1 only) - -From a clean machine: - -```bash -cd backend && python -m pip install -e .[dev] -cd .. -make backend-install -make frontend-install -make readiness -``` - -Copy `.env.example` to `.env` only when you want local overrides. Docker Compose has safe defaults for the local PostGIS/backend/frontend stack and does not require a root `.env` file to exist. - -With Docker Compose, open the workbench at `http://localhost:1202`. - -The Docker frontend is served by nginx and proxies `/api` and `/health` to the backend container, so browser clients should use the frontend URL only, for example `http://192.168.10.150:1202` on a LAN host. - -Runtime containers include healthchecks for PostGIS, backend and frontend. After -startup, inspect them with: - -```bash -docker compose ps -``` - -Verify the browser-facing API proxy after rebuilding Docker images: - -```bash -bash scripts/verify_browser_runtime.sh http://localhost:1202 http://localhost:8000/health -``` - -Verify the Docker GIS runtime after rebuilding the backend image: - -```bash -bash scripts/verify_gis_runtime.sh http://localhost:1202 -``` - -On the LAN host use the published browser URL, for example: - -```bash -bash scripts/verify_gis_runtime.sh http://192.168.10.150:1202 -``` - -Load the explicit offline demo workflow: - -```bash -curl -X POST http://192.168.10.150:1202/api/v1/demo/workflow -``` - -If `/api/v1/projects` returns frontend HTML instead of a JSON envelope, rebuild -and restart the frontend container. - -Useful direct verification commands: - -```bash -python -m compileall backend/app -cd backend && python -c "from app.main import app; print(app.title)" -python -m pytest -cd ../frontend && npm run typecheck -cd ../frontend && npm run build -docker compose config -bash scripts/run_readiness_check.sh -``` - -If `make` or `docker` are unavailable in your shell, run the equivalent script entrypoints directly: - -```bash -bash scripts/backend_install.sh -bash scripts/backend_test.sh -bash scripts/frontend_install.sh -bash scripts/frontend_typecheck.sh -bash scripts/frontend_build.sh -bash scripts/run_readiness_check.sh -``` +GeoIntel is een project van Jens / ITWorx.tech. diff --git a/docs/CODEX_EXECUTION_LOG.md b/docs/CODEX_EXECUTION_LOG.md index f1e07cd0..5f187ca2 100644 --- a/docs/CODEX_EXECUTION_LOG.md +++ b/docs/CODEX_EXECUTION_LOG.md @@ -11679,3 +11679,28 @@ Deployment evidence: - Repeated the browser-rendered landing, guest-session, map and quality checks against `http://192.168.10.150:1202`; the inspected live flow produced no browser-console errors. + +## 2026-07-28 - Interactive presentation and portfolio pass + +- Added a keyboard-operable four-stage project-chain illustration to the + public landing page. Selection, source governance, PyTorch analysis and QA + evidence each change the explanatory state and map treatment. +- Added restrained route, scan, evidence and map-depth motion. Every animation + and transition is disabled under `prefers-reduced-motion`. +- Generated two original, text-free GeoIntel campaign images: a Belgian + land/sea GeoAI hero and a building-detection/QA orthophoto composition. The + assets are stored in `frontend/public/portfolio` for reuse. +- Captured repository-owned portfolio screenshots for the landing hero, + interactive project story, map workbench, quality workbench and mobile + landing experience in `docs/assets/portfolio`. +- Replaced the legacy README with a product-led overview, visual tour, + architecture diagram, governed AI/CUDA behavior, setup, verification, + deployment and documentation map. +- Browser checks confirmed the tab interaction, the PyTorch stage content and + a 390 px layout without horizontal overflow. + +Verified in this pass: + +- `npm run typecheck` +- `npm run test:unit -- --maxWorkers=1 --reporter=verbose` (`45 passed`) +- `npm run build` (`1892 modules transformed`, production build passed) diff --git a/docs/TODO.md b/docs/TODO.md index 05c03b83..75be1b3e 100644 --- a/docs/TODO.md +++ b/docs/TODO.md @@ -980,3 +980,12 @@ This file now starts with the current implementation status. Older preparation/b - [x] Make guest authentication independent of optional browser scrolling support. - [x] Restore the explicit frontend dependency exclusion required by the Unraid build-context gate. - [x] Push the verified release and redeploy the Dockerman-native all-in-one runtime from `/mnt/user/appdata/geointel`. + +# Sprint 230 - Interactive storytelling and portfolio presentation + +- [x] Add an accessible interactive project-chain illustration to the public landing page. +- [x] Add restrained map, scan, route and evidence motion with a complete reduced-motion fallback. +- [x] Produce original GeoIntel hero and building-QA campaign imagery for project and portfolio use. +- [x] Capture portfolio-ready landing, story, map, quality and mobile screenshots. +- [x] Rewrite the repository README around product value, architecture, operation and visual evidence. +- [ ] Deploy and visually verify the presentation release on the Tower runtime. diff --git a/docs/assets/portfolio/geointel-interactive-story.png b/docs/assets/portfolio/geointel-interactive-story.png new file mode 100644 index 00000000..77feea0a Binary files /dev/null and b/docs/assets/portfolio/geointel-interactive-story.png differ diff --git a/docs/assets/portfolio/geointel-landing-hero.png b/docs/assets/portfolio/geointel-landing-hero.png new file mode 100644 index 00000000..c1c9e817 Binary files /dev/null and b/docs/assets/portfolio/geointel-landing-hero.png differ diff --git a/docs/assets/portfolio/geointel-landing-mobile.png b/docs/assets/portfolio/geointel-landing-mobile.png new file mode 100644 index 00000000..5e9f3ff9 Binary files /dev/null and b/docs/assets/portfolio/geointel-landing-mobile.png differ diff --git a/docs/assets/portfolio/geointel-workbench-map.png b/docs/assets/portfolio/geointel-workbench-map.png new file mode 100644 index 00000000..4dc5c9c3 Binary files /dev/null and b/docs/assets/portfolio/geointel-workbench-map.png differ diff --git a/docs/assets/portfolio/geointel-workbench-quality.png b/docs/assets/portfolio/geointel-workbench-quality.png new file mode 100644 index 00000000..7d74e668 Binary files /dev/null and b/docs/assets/portfolio/geointel-workbench-quality.png differ diff --git a/frontend/public/portfolio/geointel-belgium-north-sea-hero.png b/frontend/public/portfolio/geointel-belgium-north-sea-hero.png new file mode 100644 index 00000000..5e3f64f4 Binary files /dev/null and b/frontend/public/portfolio/geointel-belgium-north-sea-hero.png differ diff --git a/frontend/public/portfolio/geointel-building-qa.png b/frontend/public/portfolio/geointel-building-qa.png new file mode 100644 index 00000000..76fe9d19 Binary files /dev/null and b/frontend/public/portfolio/geointel-building-qa.png differ diff --git a/frontend/src/components/auth/LandingPage.tsx b/frontend/src/components/auth/LandingPage.tsx index 0aa5fd68..1ef49a23 100644 --- a/frontend/src/components/auth/LandingPage.tsx +++ b/frontend/src/components/auth/LandingPage.tsx @@ -22,6 +22,7 @@ import { formatAuthError } from '../../lib/authError' import '../../styles/landing.css' import { GeoIntelMark } from '../brand/GeoIntelBrand' import { ItWorxSignature } from '../brand/ItWorxSignature' +import { LandingProjectStory } from './LandingProjectStory' interface LandingPageProps { onAuthenticated: (session: AuthSession) => void @@ -338,6 +339,8 @@ export function LandingPage({ + +