Een controleerbaar data-platform voor gemeentelijke bevolkingsinformatie: van officiële CBS OData-records tot een responsive, read-only dashboard. Ontwikkeld door Salah Abdulkader als end-to-end portfolio voor data-engineering en applicatieontwikkeling.
Live dashboard · Publieke API-docs · GitHub-profiel · LinkedIn
Dashboard bekijken · API-documentatie · Portfolio-walkthrough
Open overheidsdata is pas bruikbaar wanneer herkomst, kwaliteit en interpretatie zichtbaar blijven. Dit platform haalt CBS OData-data op, valideert en bewaart immutable raw runs, transformeert naar processed Parquet/CSV, laadt PostgreSQL-marts transactioneel en biedt die veilig aan via FastAPI en React.
flowchart LR
CBS[CBS Open Data] --> ETL[Extractie en validatie] --> DB[PostgreSQL]
DB --> MART[Mart-views] --> API[FastAPI] --> UI[React-dashboard]
Het dashboard biedt nationale trends, gemeentelijke KPI's en leeftijdsopbouw, een interactieve kaart, CSV-export en deelbare URL-state. Eén vergelijking toont twee gemeenten in absolute aantallen of als index. Sticky sectienavigatie en inklapbare mobiele secties houden de pagina overzichtelijk. Broninformatie, lineage en een kwaliteitsmonitor ondersteunen de interpretatie.
Onderstaande bevolkingscijfers beschrijven de gevalideerde dataset 2020–2026; de actuele beschikbare perioden staan in het dashboard.
| Resultaat | Stand |
|---|---|
| Gemeentecodes in dimensie | 360, inclusief historische codes |
| Perioden en feiten | 7 perioden (2020–2026), 2.420 gemeente-jaarfeiten |
| Actieve gemeenten in 2026 | 342 |
| Ontbrekende waarde | Gemiddelde bevolking 2026 blijft null, nooit nul |
| Kwaliteit | Python 3.11/3.14, unit-, 5434-integratie- en browser-E2E-tests |
Historische codes blijven voor herleidbare tijdreeksen in de dimensie en zijn niet allemaal actief in 2026. Woonplaatsen zoals Benthuizen en Ter Aar zijn geen zelfstandige gemeenten en hebben daarom geen gemeentecode.
| Onderdeel | Keuze |
|---|---|
| Ingestion/transformatie | Python, CBS OData, datacontracten, Parquet/CSV |
| Database | PostgreSQL 17, Alembic, core/mart/ops |
| API/frontend | FastAPI least-privilege, React, TypeScript, Vite |
| Infra/kwaliteit | Docker Compose, Nginx, pytest, Vitest, Playwright, GitHub Actions |
| Publieke hosting | Render voor dashboard/API, Neon voor PostgreSQL |
| Architectuur | C4, ERD, lineage, TOGAF-light, ADRs |
Dit portfolio-project demonstreert end-to-end data-engineering: Python en SQL, datacontracten en kwaliteitsvalidatie, idempotente transactionele loads, PostgreSQL-modellering, FastAPI-security, React/TypeScript, Docker Compose, unit-/integratie-/E2E-tests en GitHub Actions. De trade-offs staan in de C4-, ERD- en lineageweergaven, TOGAF-light en ADRs.
Datacontracten en checksums maken ETL-runs reproduceerbaar en herleidbaar; validatie gaat vooraf aan atomaire loads. PostgreSQL-rollen hebben minimale rechten en de publieke API is read-only. Secrets blijven buiten Git. GitHub Actions controleert wijzigingen vóór integratie; deployment en rollback zijn beschreven in het runbook. Het dashboard toont ontbrekende waarden als onbekend en maakt historische herindelingen expliciet.
Enkele technische keuzes:
- Transactionele loads laten bestaande productiedata intact wanneer een dataset ongeldig is; lineage koppelt publicaties aan hun verwerkingsrun.
- Grote GeoJSON-geometrieën worden iteratief verwerkt, zonder spread-argumenten die een stack overflow kunnen veroorzaken.
- Ontbrekende waarden blijven
null; de interface vangt Render cold-starts op met laadfeedback en begrensde herhaalpogingen. - Docker en GitHub Actions ondersteunen reproduceerbare CI/CD. Cloudbootstrap is een expliciete beheerstap, gescheiden van de read-only publieke runtime; zie clouddeployment.
Bronnen: CBS 03759ned (bevolking), 70072ned (leeftijdsopbouw) en CBS/PDOK-gemeentegrenzen 2026. Bevolking en leeftijd gebruiken 1 januari als peildatum. Zie het gemeenteprofiel en de kwaliteitsmonitor voor dekking en interpretatie.
Vereist: Git, Docker Desktop en Python 3.14. Node/npm is alleen nodig voor frontendontwikkeling buiten Docker.
git clone https://github.com/salahooo/gemeente-data-platform.git
cd gemeente-data-platform
Copy-Item secrets/postgres_password.txt.example secrets/postgres_password.txt
Copy-Item secrets/app_password.txt.example secrets/app_password.txt
Copy-Item secrets/api_password.txt.example secrets/api_password.txt
# Vul ieder lokaal secretbestand met een eigen sterk wachtwoord; commit ze nooit.
docker compose --profile dashboard up -d --build
Start-Process http://localhost:3000
Start-Process http://localhost:8000/docsStop zonder volumes te verwijderen: docker compose --profile dashboard stop dashboard api en docker compose stop postgres. Voor losse ontwikkeling: start PostgreSQL/API zoals hierboven en voer in frontend/ npm ci; npm run dev uit. Alleen voor nieuwe brondata is py -3.14 -m gemeente_data_platform.run_pipeline nodig.
- Architectuur en C4 · databaseontwerp/ERD
- Raw contract · processed contract
- API · dashboard · pipeline operations
- Runbook · CI/CD · Clouddeployment · TOGAF-light
- ADR-register · portfolio-walkthrough
Beschrijving: “Traceerbaar CBS gemeentelijk bevolkingsplatform met Python, PostgreSQL, FastAPI en React.” Website: live dashboard. Topics: python, fastapi, postgresql, react, typescript, docker, data-engineering, cbs-open-data, github-actions, data-quality, alembic, government-data.
