OpenStreetMap User's Diaries
Who notices when the hairdresser changes their opening hours?
Nothing in OpenStreetMap goes stale faster than opening_hours. A business moves its closing day from Monday to Tuesday, edits one line on its website, and the map still shows last year’s answer. You find out when you are standing in front of a locked door.
So Fulda has had a small watchman running for a few weeks now: 559 business websites in the town and its district, each
Nothing in OpenStreetMap goes stale faster than opening_hours. A business moves its closing day from Monday to Tuesday, edits one line on its website, and the map still shows last year’s answer. You find out when you are standing in front of a locked door.
So Fulda has had a small watchman running for a few weeks now: 559 business websites in the town and its district, each checked every three days, and not the whole page but exactly the block that carries the hours. If one character in there changes, a message goes out.
The interesting part is not the machinery behind it, it is how little you need in order to join in. Two interfaces are enough, and you probably have both open already: GitHub for adding a page, Matrix for reading what comes back.
Adding a business: one issue, one number, one click
If you know a page whose opening hours are worth watching, you open an issue from the template Watch vorschlagen. Three fields: the page, the name of the business, its OSM id.
A bot takes over from there. It fetches the page, looks for the text blocks that could be opening hours, and posts them into the issue, numbered. Not as code, not as XPath, but as the text it would capture:
1) Montag - Freitag 09:00 - 18:00 Uhr / Samstag 09:00 - 13:00 Uhr
2) Termine nach Vereinbarung, Telefon 0661 ...
3) Bürozeiten der Hausverwaltung: Mo, Mi 10 - 12 Uhr
You answer with /pick X. The bot writes the file, pushes the branch and comments a link that opens the pull request with the title already filled in. One click, done.
No fork, no installation, no API key, no XPath. What the bot deliberately does not do for you is the reading: which of those three blocks really carries the hours of this business, rather than the landlord’s office hours, an appointment window or a running clock. That is the actual decision in this project, and it stays with a human.
The bot also knows when to say no. A page that is already watched gets named together with the file that covers it. A page that was looked at once and found unusable comes back with the reason and the date, instead of a proposal that the checks would reject anyway.
The alert arrives in Matrix
When a page reports in, it lands in a room shared with other mappers: #osm-fulda-openinghours:matrix.org. This is how the message arrived on 4 September, real and uncut:
Öffnungszeiten geändert: Klosterladen Abtei Fulda
Webseite: https://www.abtei-fulda.de/stadtkloster/klosterladen/
OpenStreetMap: https://www.openstreetmap.org/node/5511605749
+ Dienstag, 8. September, geöffnet: 13 – 16 Uhr
Zu tun: Zeiten in OSM prüfen, dann check_date:opening_hours setzen.
Zeigt der Diff keine Öffnungszeiten, ist es ein Fehlalarm: OSM bleibt unberührt, der Filter
muss nachgezogen werden.
Wie Fehlalarme entstehen
Fehlalarm melden
Title, page, OSM object, the line that changed, the job to do. The link to the object turns the alert into one click instead of a search through the map, and the last two lines are links whose addresses stay out of the way of the text. The message is German because the people acting on it map in Fulda.
False alarms happen, which is why the way to report one sits in the message itself. A filter that captures the hours today can hit the news box after a site relaunch. Then the diff shows no hours, OSM stays untouched, and the filter gets redrawn: another issue form, again without a fork.
To read along you need nothing but a Matrix account. No subscription, no flood of email: across roughly 560 watched pages that is a handful of messages a week, if that, plus a short report early on Mondays listing the watches whose capture no longer holds hours.
Why the chain ends at Matrix and not at OSM
Writing the new hours straight into OpenStreetMap would be technically easy. It would also be wrong.
A website can be wrong. A change can be a holiday notice that is gone again next week. A sign on the door beats the website in case of doubt. And a bad watch is noise, while a bad tag is somebody else’s data. So the automation stops at the message: the monitor points at something you would otherwise miss, and a person takes it from there, someone who can go and look if it comes to that.
What does not work
Honestly: not every page is usable. Chains publish their branch hours behind a postcode search, and a diff on the corporate page says nothing about the shop in town. Opening hours photographed as a sign are an image, not text. Some sites block every automated fetch. And more often than you would expect, a website simply never states its hours.
Those cases are not dropped quietly. Each one is recorded with a reason and a date to look again. A business that only has a social media page today may have its own next year.
This works one size smaller. And one size larger
It actually started one size smaller. The OSM user GeoMH had decided for himself to run changedetection on his own computer, to keep important infrastructure in his district up to date, pharmacies above all. Working that way took him across the district boundary into our corner of the map, which is how the contact came about, and his approach became the idea of building the concept out further. Everything described here is an extension of his version, not a replacement for it.
Fulda runs it permanently on a server because several people read along there. That is not a requirement. The core is changedetection.io, a container you start on your own machine whenever you have time for map work: it checks the pages you gave it, shows what changed since last time, and can be switched off again afterwards. One evening a month is enough for a small town.
Matrix and GitHub are interchangeable too, they are simply the most convenient choice here:
- Without Matrix. changedetection sends its notifications through the usual channels, email, ntfy, Telegram, whatever you actually read. We put a small relay in front of it because matrix.org hands out short-lived access tokens. Working alone you need no notification at all: the list of changed pages inside the app is the work list.
- Without GitHub. A watch is a small file. If you map for yourself, you keep those files locally. GitHub buys three things that only start to matter once more than one person joins in: a review before anything goes live, an automatic check on every proposal, and a way in for people who do not want to touch a repository.
There is just as much room upwards. The area sits in each entry’s category tag (fulda-bakery), so several places can live in one instance without mixing, and weekday and time-format detection is a small file of its own that takes further languages. Whether that becomes 60 watches for one district or a few thousand for a whole region changes nothing about the structure, only the question of who reads the alerts.
Rebuilding it
Everything is open, GPL-3.0. The craft is documented separately and in English, so another town can start from it: how to find the hours block on a page, how to tell that the filter caught the wrong one, and why a watch is a file rather than a form. What you need in order to contribute is written in German, because whoever adds a watch here is reading German opening hours anyway.
If you know a business in Fulda whose hours in OSM are out of date: the issue form is open, and the bot answers faster than any maintainer.
Nothing in OpenStreetMap goes stale faster than opening_hours. A business moves its closing day from Monday to Tuesday, edits one line on its website, and the map still shows last year’s answer. You find out when you are standing in front of a locked door.
So Fulda has had a small watchman running for a few weeks now: 559 business websites in the town and its district, each
Nothing in OpenStreetMap goes stale faster than opening_hours. A business moves its closing day from Monday to Tuesday, edits one line on its website, and the map still shows last year’s answer. You find out when you are standing in front of a locked door.
So Fulda has had a small watchman running for a few weeks now: 559 business websites in the town and its district, each checked every three days, and not the whole page but exactly the block that carries the hours. If one character in there changes, a message goes out.
The interesting part is not the machinery behind it, it is how little you need in order to join in. Two interfaces are enough, and you probably have both open already: GitHub for adding a page, Matrix for reading what comes back.
Adding a business: one issue, one number, one click
If you know a page whose opening hours are worth watching, you open an issue from the template Watch vorschlagen. Three fields: the page, the name of the business, its OSM id.
A bot takes over from there. It fetches the page, looks for the text blocks that could be opening hours, and posts them into the issue, numbered. Not as code, not as XPath, but as the text it would capture:
1) Montag - Freitag 09:00 - 18:00 Uhr / Samstag 09:00 - 13:00 Uhr
2) Termine nach Vereinbarung, Telefon 0661 ...
3) Bürozeiten der Hausverwaltung: Mo, Mi 10 - 12 Uhr
You answer with /pick X. The bot writes the file, pushes the branch and comments a link that opens the pull request with the title already filled in. One click, done.
No fork, no installation, no API key, no XPath. What the bot deliberately does not do for you is the reading: which of those three blocks really carries the hours of this business, rather than the landlord’s office hours, an appointment window or a running clock. That is the actual decision in this project, and it stays with a human.
The bot also knows when to say no. A page that is already watched gets named together with the file that covers it. A page that was looked at once and found unusable comes back with the reason and the date, instead of a proposal that the checks would reject anyway.
The alert arrives in Matrix
When a page reports in, it lands in a room shared with other mappers: #osm-fulda-openinghours:matrix.org. This is how the message arrived on 4 September, real and uncut:
Öffnungszeiten geändert: Klosterladen Abtei Fulda
Webseite: https://www.abtei-fulda.de/stadtkloster/klosterladen/
OpenStreetMap: https://www.openstreetmap.org/node/5511605749
+ Dienstag, 8. September, geöffnet: 13 – 16 Uhr
Zu tun: Zeiten in OSM prüfen, dann check_date:opening_hours setzen.
Zeigt der Diff keine Öffnungszeiten, ist es ein Fehlalarm: OSM bleibt unberührt, der Filter
muss nachgezogen werden.
Wie Fehlalarme entstehen
Fehlalarm melden
Title, page, OSM object, the line that changed, the job to do. The link to the object turns the alert into one click instead of a search through the map, and the last two lines are links whose addresses stay out of the way of the text. The message is German because the people acting on it map in Fulda.
False alarms happen, which is why the way to report one sits in the message itself. A filter that captures the hours today can hit the news box after a site relaunch. Then the diff shows no hours, OSM stays untouched, and the filter gets redrawn: another issue form, again without a fork.
To read along you need nothing but a Matrix account. No subscription, no flood of email: across roughly 560 watched pages that is a handful of messages a week, if that, plus a short report early on Mondays listing the watches whose capture no longer holds hours.
Why the chain ends at Matrix and not at OSM
Writing the new hours straight into OpenStreetMap would be technically easy. It would also be wrong.
A website can be wrong. A change can be a holiday notice that is gone again next week. A sign on the door beats the website in case of doubt. And a bad watch is noise, while a bad tag is somebody else’s data. So the automation stops at the message: the monitor points at something you would otherwise miss, and a person takes it from there, someone who can go and look if it comes to that.
What does not work
Honestly: not every page is usable. Chains publish their branch hours behind a postcode search, and a diff on the corporate page says nothing about the shop in town. Opening hours photographed as a sign are an image, not text. Some sites block every automated fetch. And more often than you would expect, a website simply never states its hours.
Those cases are not dropped quietly. Each one is recorded with a reason and a date to look again. A business that only has a social media page today may have its own next year.
This works one size smaller. And one size larger
It actually started one size smaller. The OSM user GeoMH had decided for himself to run changedetection on his own computer, to keep important infrastructure in his district up to date, pharmacies above all. Working that way took him across the district boundary into our corner of the map, which is how the contact came about, and his approach became the idea of building the concept out further. Everything described here is an extension of his version, not a replacement for it.
Fulda runs it permanently on a server because several people read along there. That is not a requirement. The core is changedetection.io, a container you start on your own machine whenever you have time for map work: it checks the pages you gave it, shows what changed since last time, and can be switched off again afterwards. One evening a month is enough for a small town.
Matrix and GitHub are interchangeable too, they are simply the most convenient choice here:
- Without Matrix. changedetection sends its notifications through the usual channels, email, ntfy, Telegram, whatever you actually read. We put a small relay in front of it because matrix.org hands out short-lived access tokens. Working alone you need no notification at all: the list of changed pages inside the app is the work list.
- Without GitHub. A watch is a small file. If you map for yourself, you keep those files locally. GitHub buys three things that only start to matter once more than one person joins in: a review before anything goes live, an automatic check on every proposal, and a way in for people who do not want to touch a repository.
There is just as much room upwards. The area sits in each entry’s category tag (fulda-bakery), so several places can live in one instance without mixing, and weekday and time-format detection is a small file of its own that takes further languages. Whether that becomes 60 watches for one district or a few thousand for a whole region changes nothing about the structure, only the question of who reads the alerts.
Rebuilding it
Everything is open, GPL-3.0. The craft is documented separately and in English, so another town can start from it: how to find the hours block on a page, how to tell that the filter caught the wrong one, and why a watch is a file rather than a form. What you need in order to contribute is written in German, because whoever adds a watch here is reading German opening hours anyway.
If you know a business in Fulda whose hours in OSM are out of date: the issue form is open, and the bot answers faster than any maintainer.
OpenStreetMap Blogs



Обеспечение загородного участка автономным водоснабжением — первоочередная задача для любого землевладельца. Традиционно для решения этой проблемы применяется крупногабаритная буровая техника на базе грузовых автомобилей (ЗиЛ, УРАЛ, КамАЗ). Однако на практике буровые бригады часто сталкиваются с объективными препятствиями: плотная застройка, наличие ухоженных газонов, проложенные подземные коммуникации, узкие ворота или линии электропередач, исключающие возможность подъезда и разворота тяжелых машин.














