# Modelled travel times from Luxembourg and cross-border communes to six Luxembourg job hubs

Release 2026.10, generated 2026-10-18T22:40:40.398Z. 18,767 rows in 2 tables, as CSV and Parquet. Temporal coverage: 2026-09-26/2026-12-07.

Licence: [Open Data Commons Open Database License 1.0](https://opendatacommons.org/licenses/odbl/1-0/) (ODbL-1.0).

Cite as: Modelled travel times from Luxembourg and cross-border communes to six Luxembourg job hubs, ChatHome, release 2026.10. https://chathome.lu/en/data/travel-times

Modelled door-to-door travel times from every Luxembourg commune and from the French and German communes where at least 100 residents work in Luxembourg (IGSS counts, at most 400 communes) to six Luxembourg destinations: Luxembourg station, Kirchberg, Cloche d'Or, the city centre, Belval and Findel airport. Each row gives one origin, destination and weekday scenario: driving off-peak and at the morning and evening peaks, public transport in the morning and evening peaks, walking and cycling. Road, walking and cycling times come from the open-source Valhalla router on OpenStreetMap; public-transport times come from the R5 router on official GTFS timetables, with the 80th percentile published next to the median. Peak driving times are modelled with a national congestion ratio, not measured traffic. A median over 120 minutes is reported as no journey found, never as zero.Every row states when its timetable or road graph stops being valid. Belgian communes are not included while the licence of their centroid source is unresolved. Because the times are derived from OpenStreetMap, the dataset is published under the ODbL.

The files hold aggregates and public reference data only: no listing identifiers, descriptions, photos, addresses, listing coordinates, agency identities or user data.

## Notes on this release

- Travel times are published for 383 reference communes: 100 in Luxembourg, 189 in France and 94 in Germany (every Luxembourg commune, and the cross-border communes with at least 100 residents working in Luxembourg according to IGSS on 2026-03-31, highest counts first, at most 400).
- Belgian communes are not published: their reference points are derived from Walloon boundary polygons whose reuse licence is unresolved.
- 1 reference commune is not in the routing surface (fr:insee:54493); their rows have status not_routed.
- The 18384 rows cover 48 hub and scenario surfaces: 12513 ok, 5823 with no journey within 120 minutes found, 48 not routed.
- Routing starts at the centre of the H3 resolution-10 cell that contains each official centroid, at most 74 m from it.
- centroid_check: 3770 rows consistent, 672 differing by more than 10 minutes from the median of at least 5 other routed cells of the same commune, 13942 not checked.
- Peak driving times are modelled with a national congestion ratio (tomtom-luxembourg-2025-v1); they are not measured traffic.
- Rows are valid until: cycling 2027-09-26, driving 2027-09-26, transit 2026-12-07, walking 2027-09-26.
- The routing surface commute-v2-20260926224804988 expires on 2026-12-07, when its transit rows stop being valid; the expiring routing data (for public transport, the timetable) and the surface must be rebuilt by hand before then, or the next release refuses the surface.

## Tables

### `commune_hub_travel_times`: Commune-to-hub travel times

Routed weekday travel times between each reference commune (every Luxembourg commune, and the French and German communes with at least 100 residents working in Luxembourg) and six Luxembourg employment hubs, in eight scenarios: driving off-peak and at peak in both directions, public transport in the morning and evening peaks, walking and cycling. Road, walking and cycling times come from a self-hosted Valhalla router on OpenStreetMap; public-transport times from a self-hosted R5 router on official GTFS timetables. Where no journey within the cutoff was found the status says so and the minutes are empty, never zero.

- Rows: 18,384
- Grain: one row per reference commune × hub × scenario
- Source: ChatHome commute surface: self-hosted Valhalla (OpenStreetMap) and R5 (OpenStreetMap + official GTFS) routing.

| Column | Type | Description |
| --- | --- | --- |
| `locality_id` | string | Grande Région locality id: lu:lau:<code>, fr:insee:<code> or de:ags:<code>. |
| `country` | string | ISO 3166-1 alpha-2 country of the commune: LU, FR or DE. |
| `national_code` | string | Official municipality code: STATEC 4-digit, INSEE 5-digit or Destatis 8-digit AGS. |
| `hub_id` | string | Hub identifier, e.g. lux-gare or kirchberg. |
| `hub_name` | string | Hub name in English. |
| `scenario_id` | string | Scenario identifier, e.g. transit-weekday-am-to-target. |
| `mode` | string | driving, transit, walking or cycling. |
| `direction` | string | to_target (commune to hub) or from_target (hub to commune). |
| `time_basis` | string | depart_at, arrive_by, or static for time-invariant walking and cycling. |
| `window_from` | string | Start of the weekday local-time window (Europe/Luxembourg, HH:MM); empty for static modes. |
| `window_to` | string | End of the weekday local-time window (Europe/Luxembourg, HH:MM); empty for static modes. |
| `status` | string | ok; no_journey_within_cutoff: no journey within cutoff_minutes was found (a longer journey, a point the network does not reach, or for public transport too few departures in the window; the surface does not tell these apart); not_routed: the commune's centroid cell is not in the routing surface. |
| `minutes_p50` | float | Median journey time in minutes, 1 decimal; status ok only, so never above cutoff_minutes. Public transport: over the window minutes that have a journey within cutoff_minutes (at least 70% of them), including a per-ride reliability allowance calibrated on mobiliteit.lu observations. |
| `minutes_p80` | float | 80th-percentile journey time in minutes over the same window minutes as minutes_p50, with the per-ride allowance, 1 decimal; it can exceed cutoff_minutes. Public transport with status ok only, empty for driving, walking and cycling. |
| `distance_km` | float | Median routed distance in kilometres, 1 decimal; status ok only, empty for public transport. |
| `cutoff_minutes` | int | Longest journey the surface searched for. |
| `centroid_check` | string | consistent or differs_over_10_min: minutes_p50 at the commune centroid compared with the median over at least five other routed cells of the same commune in the same scenario; not_checked when fewer exist or the centroid has no journey. A representativeness flag only. |
| `peak_traffic_model` | string | Peak driving only: 'modelled national congestion ratio (<version>)'. Peak minutes are free-flow road time scaled by one national ratio calibrated on TomTom Traffic Index city figures, not measured traffic. Empty otherwise. |
| `provider` | string | Routing engine: valhalla (road, walking, cycling) or r5 (public transport). |
| `graph_version` | string | OpenStreetMap network version the router used. |
| `timetable_version` | string | GTFS timetable bundle version; public transport only. |
| `reliability_version` | string | Version of the public-transport reliability calibration; public transport only. |
| `computed_at` | string | When this hub and scenario were routed (ISO 8601, UTC). |
| `valid_until` | string | End of validity of the routing data behind this row (ISO 8601, UTC); for public transport, the end of the timetable. |
| `surface_version` | string | Version of the routing surface the row was read from. |

### `travel_time_localities`: Travel-time reference communes

The communes travel times are published for: official code, name and administrative area, the official centroid the routing starts from, and for French and German communes the number of residents working in Luxembourg (IGSS) and their straight-line distance to Luxembourg. Belgian communes are not included.

- Rows: 383
- Grain: one row per reference commune
- Source: Grande Région geography (Geoportail Luxembourg, INSEE COG and API Géo, Destatis GV-ISys) and IGSS employment by commune of residence.

| Column | Type | Description |
| --- | --- | --- |
| `locality_id` | string | Grande Région locality id: lu:lau:<code>, fr:insee:<code> or de:ags:<code>. |
| `country` | string | ISO 3166-1 alpha-2 country: LU, FR or DE. |
| `national_code` | string | Official municipality code: STATEC 4-digit, INSEE 5-digit or Destatis 8-digit AGS. |
| `national_authority` | string | Code authority: STATEC_LAU, INSEE_COG or DESTATIS_AGS. |
| `name` | string | Official commune name (French for Luxembourg and France); for Germany the plain register name without its administrative suffix such as ', Stadt' where the register gives one. |
| `admin_area` | string | Luxembourg canton, French department or German Kreis name; empty where the source gives only a code instead of a name. |
| `centroid_lat` | float | Official commune centroid latitude, WGS84, 5 decimals. Routing starts at the centre of the H3 resolution-10 cell that contains it. |
| `centroid_lng` | float | Official commune centroid longitude, WGS84, 5 decimals. |
| `lu_resident_workers` | int | Residents of this commune employed under Luxembourg social security (IGSS, rounded by IGSS to the nearest 10); empty for Luxembourg communes. |
| `igss_reference_date` | string | Reference date of lu_resident_workers (YYYY-MM-DD); empty for Luxembourg communes. |
| `distance_to_luxembourg_km` | float | Straight-line kilometres from the centroid to the nearest of five Luxembourg employment centres, as used to define the cross-border belt; empty for Luxembourg communes. |
| `routed` | bool | True when the commune's centroid cell is in the routing surface; false rows have status not_routed in commune_hub_travel_times. |

## Thresholds and methodology

- No sample threshold applies: each value is a modelled time for one fixed reference point.
- A row whose median time is above the 120-minute cutoff has status no_journey_within_cutoff and no minutes. The public-transport 80th percentile is published with its median and can exceed 120 minutes.
- The 80th percentile is published for public transport only; for driving it equals the median in the source surface and is left empty.
- A release refuses any row whose valid_until date has passed.
- Origin: the centre of the H3 resolution-10 cell that contains the commune's official centroid, at most about 75 m from it. Destinations: six fixed hub points.
- Driving, walking and cycling: Valhalla on OpenStreetMap extracts. Driving samples three times inside the window and walking and cycling once; minutes are the nearest-rank median of the samples.
- Public transport: R5 on the official GTFS timetables of Luxembourg and the neighbouring networks, evaluated for every minute of the window. The median and 80th percentile include a per-ride reliability allowance calibrated on mobiliteit.lu journey data.
- Peak driving multiplies free-flow time over the first 10 km by a national congestion ratio calibrated on TomTom Traffic Index figures for Luxembourg. It is modelled, not measured traffic.
- Public transport: the median and 80th percentile are taken over the window minutes that have a journey within 120 minutes. When fewer than 70% of the window's minutes have one, or the median exceeds 120 minutes, the row is no_journey_within_cutoff. not_routed means the commune's reference cell is not in this routing surface.
- centroid_check compares the reference time with the median over other routed cells of the same commune and publishes only the resulting label.
- Reference set: all 100 Luxembourg communes plus the French and German communes with at least 100 residents working in Luxembourg, ordered by that count and capped at 400.

Measurement: Door-to-door travel time computed with the Valhalla (road, walking, cycling) and R5 (public transport) routers from one reference point per commune to six fixed destinations, per weekday time window.

## Limitations: what this data is not

- Times are modelled, not observed journeys; real trips vary with traffic, works, weather and service changes.
- Peak driving uses one national congestion ratio, not corridor-level traffic.
- Each commune is represented by one point near its centroid; places inside a large commune can have very different times.
- Public-transport times are valid only for the timetable period stated in valid_until.
- No journey found within 120 minutes is not the same as unreachable.
- Belgian communes are not included.

## Sources and attribution

- OpenStreetMap contributors, via Geofabrik extracts: road, path and stop network: https://www.openstreetmap.org/copyright (ODbL 1.0)
- Administration des transports publics (Luxembourg): national public-transport timetables (GTFS), data.public.lu: https://data.public.lu/en/datasets/horaires-et-arrets-des-transport-publics-gtfs/ (CC BY 4.0)
- Région Grand Est: Fluo 57 interurban timetables (GTFS), transport.data.gouv.fr: https://transport.data.gouv.fr/datasets/offre-du-reseau-de-transport-interurbain-fluo-grand-est (Licence Ouverte 2.0)
- Région Grand Est: aggregate regional timetables (GTFS), transport.data.gouv.fr: https://transport.data.gouv.fr/datasets/horaires-des-lignes-regulieres-et-scolaires-du-reseau-fluo-grand-est (Licence Ouverte 2.0)
- NVBW GmbH: Baden-Württemberg, Rheinland-Pfalz and Saarland timetables (GTFS): https://www.nvbw.de/open-data/fahrplandaten (dl-de/by-2-0 (https://www.govdata.de/dl-de/by-2-0))
- OTW (TEC): Walloon bus timetables (GTFS): https://transportdata.be/dataset/tec-gtfs (CC0 1.0)
- mobiliteit.lu HAFAS API (Administration des transports publics): public-transport reliability calibration only: https://data.public.lu/en/datasets/api-mobiliteit-lu/ (CC BY 4.0)
- TomTom Traffic Index city figures: calibration of one national peak congestion ratio; no TomTom data is redistributed: https://www.tomtom.com/traffic-index/
- Administration du cadastre et de la topographie / Geoportail Luxembourg: administrative limits (Luxembourg codes, names, centroids): https://data.public.lu/fr/datasets/limites-administratives-du-grand-duche-de-luxembourg/ (CC0 1.0)
- INSEE: Code officiel géographique 2026 (French codes, names), with commune centres from API Géo: https://www.insee.fr/fr/information/8740222 (Licence Ouverte 2.0)
- Statistisches Bundesamt (Destatis): Gemeindeverzeichnis GV-ISys (German codes, names, centroids): https://www.destatis.de/DE/Themen/Laender-Regionen/Regionales/Gemeindeverzeichnis/_inhalt.html (dl-de/by-2-0 (https://www.govdata.de/dl-de/by-2-0))
- IGSS: employment by commune of residence in Luxembourg and the neighbouring countries: https://data.public.lu/en/datasets/emploi-total-par-commune-de-residence-au-luxembourg-et-dans-les-pays-frontaliers/ (CC0 1.0)

Credits to reproduce:

- © OpenStreetMap contributors. Road, path and stop network from OpenStreetMap (Geofabrik extracts), available under the Open Database License 1.0: https://www.openstreetmap.org/copyright
- Luxembourg public-transport timetables: Administration des transports publics, CC BY 4.0, via data.public.lu.
- Source : Région Grand Est — réseau Fluo; Source : Région Grand Est (GTFS, Licence Ouverte 2.0, transport.data.gouv.fr).
- Datensatz der NVBW GmbH, dl-de/by-2-0 (https://www.govdata.de/dl-de/by-2-0), nvbw.de/open-data.
- Walloon bus timetables: OTW (TEC), CC0.
- Public-transport reliability calibrated on the mobiliteit.lu HAFAS API (Administration des transports publics, CC BY 4.0).
- Peak driving times are modelled: free-flow road time scaled by one national congestion ratio calibrated on TomTom Traffic Index city figures. No TomTom data is redistributed.
- Luxembourg commune limits and centroids: Administration du cadastre et de la topographie / Geoportail Luxembourg (CC0).
- Source : Insee — Code officiel géographique 2026; commune centres from API Géo (Licence Ouverte 2.0).
- © Statistisches Bundesamt (Destatis), 2026 — Gemeindeverzeichnis GV-ISys, dl-de/by-2-0 (https://www.govdata.de/dl-de/by-2-0); changes made: register suffixes dropped from names, centroids rounded to 5 decimals.
- Residents working in Luxembourg: IGSS, employment by commune of residence (CC0).

## Files

Versioned URLs never change. Latest URLs always serve the current release.

| File | Bytes | SHA-256 | Versioned URL | Latest URL |
| --- | --- | --- | --- | --- |
| `commune_hub_travel_times.csv` | 5,527,583 | `efe497772df68f291ba6586a28ca896128194509b0544ef62afe874aeefc3395` | https://chathome.lu/data/files/2026.10/travel-times/commune_hub_travel_times.csv | https://chathome.lu/data/files/latest/travel-times/commune_hub_travel_times.csv |
| `commune_hub_travel_times.parquet` | 88,534 | `3f9babf0b66f4622f8284daa54d8576ae3974b70bbf383535c8d05097010c7d3` | https://chathome.lu/data/files/2026.10/travel-times/commune_hub_travel_times.parquet | https://chathome.lu/data/files/latest/travel-times/commune_hub_travel_times.parquet |
| `travel_time_localities.csv` | 34,319 | `d587019fe3d94762b0f78da3ef66dec67cbf6a7ef073d69895e33cd014cfbffd` | https://chathome.lu/data/files/2026.10/travel-times/travel_time_localities.csv | https://chathome.lu/data/files/latest/travel-times/travel_time_localities.csv |
| `travel_time_localities.parquet` | 16,785 | `effc2d36abc652b2e0d1cbbb5ebe869a324dd1127793f83f2bacf93d702afabf` | https://chathome.lu/data/files/2026.10/travel-times/travel_time_localities.parquet | https://chathome.lu/data/files/latest/travel-times/travel_time_localities.parquet |

- `README.md` (this description): https://chathome.lu/data/files/2026.10/travel-times/README.md
- `datapackage.json` (Frictionless Tabular Data Package metadata): https://chathome.lu/data/files/2026.10/travel-times/datapackage.json
- `ATTRIBUTION.md` (credits a reuser must reproduce): https://chathome.lu/data/files/2026.10/travel-times/ATTRIBUTION.md

Dataset page: https://chathome.lu/en/data/travel-times. All datasets: https://chathome.lu/en/data.

## Update cadence

Released when the routing surface is rebuilt; every row states its validity end.

## Corrections

- 2026-10-18 (release 2026.10): commune_rent_price_quarterly is withdrawn. Release 2026.08 labelled it as Observatoire de l'Habitat advertised rents, but it came from ChatHome's retired rental_price_index: it carried size brackets, medians and quartiles that the Observatoire does not publish, and 4,428 of its 9,470 rows had fewer than 5 observations.
- 2026-10-18 (release 2026.10): commune_sale_price_quarterly and commune_asking_price_annual are no longer published. They copied official Observatoire de l'Habitat series that could not be rebuilt reproducibly: the history is no longer stored and the stored commune codes were not the official ones. Use the originals on data.public.lu (CC0).
- 2026-10-18 (release 2026.10): frontalier_belt_communes (2,321 French communes) and cross_border_source_status are withdrawn. travel_time_localities in the travel-times dataset covers only the French and German travel-time reference communes, with official codes, names and IGSS cross-border worker counts, and carries no population or postal codes.
- 2026-10-18 (release 2026.10): Release 2026.08 published 25th and 75th percentiles in commune_prices_latest for 57 cells (in 50 communes) with only 2 to 4 observations. Quartiles are now empty below 5 observations.
- 2026-10-18 (release 2026.10): commune_name_lu in commune_registry was empty in release 2026.08. It is now filled.
- 2026-10-18 (release 2026.10): Release 2026.08 said the data was regenerated monthly. No later release was produced before this one; releases are now run by hand and each one states its date.

## Contact

ChatHome, https://chathome.lu, hello@chathome.lu
