Docs/Offline behaviour

Offline behaviour

RaceTagger Desktop is online-required by default. Without a connection, exactly two things keep working: reviewing results already analysed on this device (the review gallery) and exporting those already-processed results. Everything else — running an analysis (including the local ONNX face-recognition flow), loading participant presets, credits/token operations, and cross-device sync — needs an active connection, and the app is designed to fail clearly rather than hang or silently do nothing when it isn't there.

How to use it

  1. 1Open an execution from the home page's list of past analyses: scanLocalExecutions reads the local .analysis-logs directory (JSONL log + summary sidecar) with no network call, so the list and the review gallery render from files already on disk.
  2. 2Review, filter and correct results as normal — corrections you make while offline are still saved: update-analysis-log…: writes to the local JSONL/summary immediately, and the Supabase write is queued in the correction outbox (src/utils/correction-outbox.ts) for retry once the connection is back. If the immediate persist call itself fails, the log visualizer shows "Marked locally — saving failed (offline?). Use 'Save All Changes' to retry." and keeps the change queued for the Save All Changes button.
  3. 3Use Export & IPTC as normal: If the IPTC defaults lookup can't reach the app's backend, the modal falls back to a localStorage mirror of your account-level default IPTC template so export still runs.
  4. 4Anything else attempted offline — starting a new analysis, restoring an execution marked "☁ Cloud" (no local JSONL)…: , loading/saving participant presets, checking token balance — returns an explicit error asking you to check your connection, instead of failing silently.

Limits and known behaviour

  • An execution that only exists in the cloud (no local JSONL — another device, a reinstall, or a deleted file) cannot be reviewed offline: Restore from cloud (restore-execution-from-cloud) needs the connection to look up and download the backup, and returns "Couldn't reach the cloud to look up this analysis. Check your connection and try again." / "...couldn't download it..." when it can't reach Supabase.
  • Corrections queued offline in the outbox retry with exponential backoff (1s → 2s → 4s → 8s → 16s) up to 5 attempts, then are dropped and logged — the in-app state (No-Match / corrected value) is not rolled back, only the Supabase write is abandoned; a fresh save retries it. The outbox is durable JSONL under userData/.outbox/corrections.jsonl, so pending corrections survive an app restart or crash while offline.
  • The DB-reconstruction fallback that would let another machine review an execution whose local log is missing (loadFromDatabaseIfExists in execution-log-loader.ts) is gated behind a per-user feature_flags.db_execution_fallback flag, default off, and requires network by definition — it does not change offline behaviour on the device that ran the analysis.
  • Archived/expired server-side photos (storage-retention sweep) show a calm "Photo archived — your original is safe on your own disk" placeholder in the gallery rather than a broken image; this can appear with or without a connection, since it depends on whether the local copy is still on disk, not on network state.
  • Settings pages that read account-level configuration (e.g. the IPTC Pro default template status) show "Not configured" rather than guessing when the IPC/network call fails offline.
  • The online-required policy itself predates this changelog trail; the offline review/export mechanisms documented on this page (correction outbox, local executions scanner) date from 1.1.8–1.1.10.