Store every snapshot
Current availability is temporary. Keeping every update creates the historical record required for trend analysis and forecasting.
Engineering case study
A production data platform that collects, enriches and predicts parking availability across multiple Swiss cities from heterogeneous public data sources.
01 — The challenge
Public parking operators generally publish only the current availability. Once that value changes, the previous state disappears.
Without historical data it is impossible to analyse behaviour, observe trends, estimate occupancy evolution, or predict future availability. The data needed for intelligence simply does not exist yet.
Existing city websites are fragmented too. Users must consult several city-specific interfaces independently instead of using one coherent view.
The objective was never to replace official city websites. Instead, the platform unlocks value from public data that was never intended to support historical analysis or forecasting.
The goal became a unified platform: not a collection of city websites, but a production data system that turns temporary public feeds into a structured historical database.
02 — The solution
The website is only the presentation layer. The engineering value lies in the platform underneath it: connectors collect public updates, PostgreSQL preserves the history, enrichment adds context, and daily regression models turn accumulated observations into forecasts.
City-specific collection is deliberately separated from shared validation, storage, prediction and presentation. This keeps the system extensible as new Swiss cities and new public interfaces are added.
03 — Data pipeline
A parking operator exposes a new RSS, JSON, XML or open-data record.
The city-specific connector translates the source into the shared platform shape.
Freshness, completeness and duplicate observations are checked before storage.
The observation becomes a historical PostgreSQL record instead of replacing the previous value.
Weather and contextual variables are associated; trends and occupancy are updated.
Daily models retrain and the Flask application serves the newest data and forecasts.
The public interface updates as soon as the pipeline has processed a new observation. Model training remains an automated daily operation on top of the continuously growing history.
04 — Key engineering decisions
Current availability is temporary. Keeping every update creates the historical record required for trend analysis and forecasting.
Each parking behaves differently. Independently trained models preserve local behaviour instead of hiding it inside one global average.
Weather, weekday, weekend, season, occupancy percentage and historical evolution give a forecast more context than raw capacity alone.
Each city can expose a different interface. Adding a city means implementing its connector while reusing the backend, templates and interface.
05 — Historical database
Official providers expose live information, not a usable history. The platform continuously creates that history one validated snapshot at a time.
Every parking update is stored instead of overwritten. That simple decision changes the nature of the product: availability becomes an observable time series rather than a disposable number.
Once the historical database exists, it supports every advanced feature around it—trend analysis, occupancy evolution, behavioural analysis, forecasting, and future machine learning applications. The database is not an implementation detail; it is the product’s foundation.
Current availability
Current availability
+ Historical trends
+ Weather context
+ Forecasts
+ Behaviour analysis
06 — Prediction engine
Predictions are based on historical regression models. Every parking has its own independently trained model because each location has different capacity, usage patterns and local behaviour.
Railway stations, shopping districts, city centres and residential areas exhibit fundamentally different occupancy patterns. Independent models preserve these local behaviours better than a single global model.
Training occurs daily as new observations become available. Forecasts therefore evolve naturally as the historical dataset accumulates more evidence.
Newly added cities initially have lower prediction accuracy because their models have shorter historical datasets. Accuracy can improve organically as the platform continues collecting observations.
07 — User experience
The interface was intentionally designed for users who want context, not only a single current number. Every parking combines current availability with occupation percentage, historical trends, forecast evolution, and a visible refresh timestamp.
An interactive Leaflet map built on OpenStreetMap provides geographic context, while a list view makes comparison and scanning fast. The website makes the platform legible; it does not replace the platform’s ingestion, history or prediction layers.
Open the official interface to explore current parking availability across Switzerland.
Visit findparking.ch ↗08 — Results
The current deployment covers five Swiss cities, 88 monitored parkings and approximately 26,000 parking spaces. The historical database continues to grow as automated ingestion records new public observations.
Ingestion, enrichment, daily model retraining and publication run automatically in a production deployment on a VPS. The platform is ready to expand through additional city connectors.
09 — My role
I independently designed and developed the complete platform: the architecture, PostgreSQL schema, city-specific data ingestion, validation, duplicate detection, historical database and data-enrichment workflow.
I also built the prediction engine, Flask application, Leaflet and OpenStreetMap frontend, deployment workflow, CI/CD pipeline and production operations on the VPS.
10 — Lessons learned
Live data is useful. Historical data enables intelligence: behaviour, trends, occupancy evolution and forecasts become possible only after observations accumulate.
Separating data collection from presentation makes expansion straightforward. A new source does not require a new application.
Capturing contextual information from day one creates a foundation for forecasting and future machine learning capabilities.