# Changelog Notable changes to the app. Newest first. ## 2026-09-07 — data safety, robustness, easier input Addressed the top three findings from [improvements.md](improvements.md). ### Data safety (`DataStore`) - All writes (append / update / delete) now rebuild the full DataFrame and go through `_save_csv`: **rotating backup** to `data/backups/` (startup + before every change, keep 20, skip if unchanged) then **atomic write** (`tmp` + `fsync` + `os.replace`). - `orte.csv` missing / empty (`EmptyDataError`) / unreadable now falls back to an empty table or the newest backup instead of crashing. ### Geocoder robustness (`GeocoderWorker`, `geocode_city`) - Each queue item runs inside `try/except`; a failing lookup or callback logs a traceback and the worker keeps going (previously an unexpected error killed the thread and silently froze all further geocoding). - `geocode_city` raises `GeocodingUnavailable` when every query failed on a service/network error. After 3 in a row the app shows a one-time "Standortdienst nicht erreichbar" dialog; entries still save without coordinates. ### Easier, safer input - Date fields (entry form + edit dialog) are now `ttkbootstrap.DateEntry` calendar pickers, validated/normalized to ISO by `parse_date()` (also accepts `TT.MM.JJJJ`). Invalid dates are rejected with a dialog. - Edit dialog has manual **Breitengrad / Längengrad** fields for fixing coordinates by hand. - Tab 2: rows without coordinates shown in red, "Nur ohne Koordinaten" filter, count in the hint line, right-click **Koordinaten suchen**. ### Housekeeping - `git init` + `.gitignore`. - Rotating log file at `data/app.log` (`_setup_logging`). - Shared helpers `filter_locations` / `split_city_plz` / `parse_coord` replace duplicated combobox code. - Config constants: `GEOCODE_REGIONS`, `MAP_DEFAULT_CENTER`, `MAP_DEFAULT_ZOOM`, `MAX_BACKUPS`. - `generate_map` fits the view to the markers. ### Verification Non-GUI smoke tests (helpers, `DataStore` backup/atomic/recovery, geocoder resilience) pass. **The GUI could not be run on the development Mac** — see [dev-notes.md](dev-notes.md).