Why requests run natively
The rail hosts used do not allow browser requests from another website. DB also blocks several common script runtimes by their TLS fingerprint, so an ordinary web client fails before it can process the response.
In the installed app, Capacitor forwards the standard fetchcall to URLSession on iOS or OkHttp on Android. These native network stacks send the request directly to DB or Flix, with no Bahnsparer proxy in between.
Only the local development environment has a relay: Vite passes allowed test requests to curl. This path is not part of the production bundle and cannot process requests from an installed app.
WebView and background process divide the work
WebView
It runs searches, filters connections, evaluates reliability and stores price histories. On launch and return to the app, it reads the current background-process state.
Background runner
It records active journeys first, then checks a rotating subset of watched travel days. This keeps the request budget bounded. iOS and Android decide when a run may occur, so the app promises no interval.
The runner stores new lows and recorded arrivals. Local price and passenger-rights notices are created directly on the device. Neither a push provider nor a Bahnsparer server receives this data.
Which data lives in each store
- Storage
- WebView storage
- Contents
- Einstellungen, Routen, Fahrten und Preisverläufe
- Boundary
- Lokal mit lesbarer Sicherungs- und Wiederherstellungskopie
- Storage
- CapacitorKV
- Contents
- Preisalarme, Fahrten, Beobachtungen und Runner-Fortschritt
- Boundary
- Für WebView und Background Runner, nicht für iCloud
- Storage
- Keychain or Keystore
- Contents
- Optionaler DB-Aktualisierungsschlüssel
- Boundary
- Native sichere Ablage, nie im App-Datensatz
- Storage
- Private CloudKit database
- Contents
- Preisalarme, Fahrten, Routen und Sucheinstellungen
- Boundary
- Nur nach Aktivierung, im privaten iCloud-Konto
| Storage | Contents | Boundary |
|---|---|---|
| WebView storage | Einstellungen, Routen, Fahrten und Preisverläufe | Lokal mit lesbarer Sicherungs- und Wiederherstellungskopie |
| CapacitorKV | Preisalarme, Fahrten, Beobachtungen und Runner-Fortschritt | Für WebView und Background Runner, nicht für iCloud |
| Keychain or Keystore | Optionaler DB-Aktualisierungsschlüssel | Native sichere Ablage, nie im App-Datensatz |
| Private CloudKit database | Preisalarme, Fahrten, Routen und Sucheinstellungen | Nur nach Aktivierung, im privaten iCloud-Konto |
Price histories, notification state and DB sign-in data are not synced through iCloud. The private CloudKit database first pulls server changes, merges records using stable IDs and timestamps, then uploads local changes.
What continues to work after a failure
Each interface has its own client. If carriage order fails, for example, fare search and the train run remain usable. Missing live data is not reported as on time or empty.
Saved routes, previous price observations and the reliability model remain on the device. A failed network request does not delete that state.
The exact hosts and request paths are documented under Data interfaces. The optional data that leaves the device is explained in the privacy notice.

