mirror of
https://github.com/mauriceboe/TREK.git
synced 2026-06-21 14:21:46 +00:00
101 lines
5.7 KiB
Markdown
101 lines
5.7 KiB
Markdown
# Offline Mode and PWA
|
||
|
||
TREK can be installed as a Progressive Web App (PWA) and used without an internet connection for previously synced trips.
|
||
|
||
## Install as an app (PWA)
|
||
|
||
TREK must be served over **HTTPS** — the install prompt does not appear on plain HTTP.
|
||
|
||
**iOS (Safari):**
|
||
1. Open TREK in Safari.
|
||
2. Tap the Share button.
|
||
3. Select **Add to Home Screen**.
|
||
|
||
**Android (Chrome / Edge):**
|
||
1. Open TREK in the browser.
|
||
2. Tap the browser menu.
|
||
3. Select **Install app** or **Add to Home Screen**.
|
||
|
||
Once installed, TREK launches in **standalone** mode (fullscreen, no browser UI) using the TREK icon.
|
||
|
||
## How offline reads work
|
||
|
||
TREK uses **two independent offline layers**:
|
||
|
||
1. **IndexedDB (Dexie)** — the primary offline store. On login and whenever the network comes back online, TREK syncs full trip bundles into IndexedDB. All reads use a **stale-while-revalidate** strategy: cached data is returned instantly from IndexedDB, then a background network request updates the data when it completes. This means the UI is always instant regardless of connectivity — `navigator.onLine` is not used as a gate because it is unreliable on mobile (returns `true` whenever any network interface is active, even without actual internet access).
|
||
|
||
2. **Service-worker cache (Workbox)** — a secondary safety net for *degraded connectivity* (flaky Wi-Fi, captive portals). The SW intercepts API calls and serves cached responses if the network does not respond within the timeout.
|
||
|
||
This means a week-long offline trip works even if the SW cache has expired — the IndexedDB data has no time-based eviction (only stale trips older than 7 days are evicted on the next sync).
|
||
|
||
## What works offline
|
||
|
||
**Service-worker cache (Workbox)**
|
||
|
||
| Content | Cache name | Strategy | Default TTL | Default max entries |
|
||
|---------|------------|----------|-------------|---------------------|
|
||
| CartoDB / OpenStreetMap map tiles | `map-tiles` | CacheFirst | 30 days | 1 000 |
|
||
| Leaflet / CDN assets (unpkg) | `cdn-libs` | CacheFirst | 365 days | 30 |
|
||
| API responses (trips, places, bookings, etc.) | `api-data` | NetworkFirst (2 s timeout) | **7 days** | **500** |
|
||
| Cover images and avatars (`/uploads/covers`, `/uploads/avatars`) | `user-uploads` | CacheFirst | 7 days | 300 |
|
||
| App shell (HTML / JS / CSS) | precache | Precached | Until next deploy | — |
|
||
|
||
The `api-data` and `map-tiles` caches are **user-configurable at runtime** — see [Cache configuration](#cache-configuration) below.
|
||
|
||
> **Note:** The API cache excludes sensitive endpoints — `/api/auth`, `/api/admin`, `/api/backup`, and `/api/settings` are always fetched from the network.
|
||
|
||
**IndexedDB (Dexie) — structured trip data**
|
||
|
||
On login, when the network comes back online, and via the manual **Re-sync now** button, TREK runs a background sync that writes full trip bundles into IndexedDB:
|
||
|
||
- Trips, days, places, packing items, to-dos, budget items, reservations, accommodations, trip members, tags, and categories.
|
||
- Non-photo file attachments (PDFs, documents, etc.) are downloaded and stored as blobs in IndexedDB.
|
||
- Map tiles are pre-fetched into the service-worker `map-tiles` cache for zoom levels 10–16 across each trip's bounding box (capped at ~50 MB of tiles per sync).
|
||
|
||
**Sync scope and eviction**
|
||
|
||
- Only ongoing and future trips are cached (trips whose `end_date` is today or later, or has no end date).
|
||
- Trips that ended more than 7 days ago are automatically evicted from IndexedDB on the next sync.
|
||
|
||
## Offline Cache (Settings → Offline)
|
||
|
||
The **Offline Cache** section under Settings → Offline shows the current state of the local cache.
|
||
|
||
**Stats panel:**
|
||
- **Cached trips** — number of trips stored in IndexedDB (Dexie).
|
||
- **Pending changes** — number of actions taken offline that are queued to sync.
|
||
|
||
**Actions:**
|
||
- **Re-sync now** — forces a full sync with the server. Disabled when you are offline.
|
||
- **Clear cache** — removes all offline trip data from IndexedDB. You can re-sync any time while online.
|
||
|
||
Each cached trip entry shows the trip name, date range, place count, and file count, plus the time of the last successful sync.
|
||
|
||
## Cache configuration
|
||
|
||
The **Cache configuration** section in Settings → Offline lets you tune the service-worker cache limits without rebuilding TREK. Changes are saved to your browser's IndexedDB and sent to the active service worker immediately — no page reload required.
|
||
|
||
| Setting | Default | Range | Description |
|
||
|---------|---------|-------|-------------|
|
||
| API cache TTL (days) | 7 | 1–365 | How long API responses stay in the `api-data` cache |
|
||
| API max entries | 500 | 10–5 000 | Maximum number of API responses cached |
|
||
| Map tiles TTL (days) | 30 | 1–365 | How long map tiles stay in the `map-tiles` cache |
|
||
| Map tiles max entries | 1 000 | 10–5 000 | Maximum number of tiles cached across all trips |
|
||
|
||
> **Tip:** Existing cached entries follow their original TTL. New entries use the updated settings from the next request onwards.
|
||
|
||
> **Note on TTL and offline access:** Raising the API cache TTL extends coverage for *degraded connectivity* (flaky Wi-Fi). For a fully offline device, the primary data source is IndexedDB — always available regardless of TTL.
|
||
|
||
## Limitations
|
||
|
||
- New trips created while offline are queued and synced when connectivity is restored.
|
||
- Photo uploads require connectivity; non-photo file attachments are pre-cached automatically during sync.
|
||
- Real-time collaboration features require an active WebSocket connection.
|
||
- Mapbox GL tiles are not cached by the service worker (Mapbox manages its own tile cache internally).
|
||
- The map tile size cap (~50 MB) means very large trips spanning multiple countries may have tiles skipped entirely rather than partially cached.
|
||
|
||
## See also
|
||
|
||
- [User-Settings](User-Settings)
|
||
- [Display-Settings](Display-Settings)
|