CacheInterceptor кэширует каждый успешный GET по путь+параметры в drift (sqlite нативно, wasm+OPFS в браузере) и подменяет им сетевую ошибку; провайдер отдаёт Cached<T>, экран показывает баннер «данные на …». Контракт для остальных экранов — docs/ai/offline-cache.md. flake.nix: libsecret/pkg-config для линуксовой сборки, jq/curl для just app-web-assets (сборка sqlite3.wasm + drift_worker.js).
fintracker_app
Flutter-клиент fin-tracker (web, Linux, Windows, Android).
nix develop .#app # из корня репозитория
cd app && flutter pub get
flutter run -d chrome --dart-define=API_BASE_URL=http://127.0.0.1:8000
flutter build web # Caddy раздаёт app/build/web
Клиент API — packages/api_client, генерируется just gen-client из openapi/openapi.json.