[{"data":1,"prerenderedAt":268},["ShallowReactive",2],{"navigation_docs_ru":3,"-ru-development-offline":167,"-ru-development-offline-surround":263},[4,61,101,146],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":60},"Руководство","i-lucide-book-open","\u002Fru\u002Fguide","ru\u002F1.guide",[10,15,20,25,30,35,40,45,50,55],{"title":11,"path":12,"stem":13,"icon":14},"Введение","\u002Fru\u002Fguide\u002Fintroduction","ru\u002F1.guide\u002F01.introduction","i-lucide-house",{"title":16,"path":17,"stem":18,"icon":19},"Установка","\u002Fru\u002Fguide\u002Finstallation","ru\u002F1.guide\u002F02.installation","i-lucide-smartphone",{"title":21,"path":22,"stem":23,"icon":24},"Авторизация","\u002Fru\u002Fguide\u002Fauth","ru\u002F1.guide\u002F03.auth","i-lucide-lock",{"title":26,"path":27,"stem":28,"icon":29},"Кошельки","\u002Fru\u002Fguide\u002Fwallets","ru\u002F1.guide\u002F04.wallets","i-lucide-wallet",{"title":31,"path":32,"stem":33,"icon":34},"Категории","\u002Fru\u002Fguide\u002Fcategories","ru\u002F1.guide\u002F05.categories","i-lucide-tags",{"title":36,"path":37,"stem":38,"icon":39},"Транзакции","\u002Fru\u002Fguide\u002Ftransactions","ru\u002F1.guide\u002F06.transactions","i-lucide-receipt",{"title":41,"path":42,"stem":43,"icon":44},"Переводы","\u002Fru\u002Fguide\u002Ftransfers","ru\u002F1.guide\u002F07.transfers","i-lucide-arrow-left-right",{"title":46,"path":47,"stem":48,"icon":49},"Статистика","\u002Fru\u002Fguide\u002Fstatistics","ru\u002F1.guide\u002F08.statistics","i-lucide-bar-chart-3",{"title":51,"path":52,"stem":53,"icon":54},"Тема","\u002Fru\u002Fguide\u002Ftheme","ru\u002F1.guide\u002F09.theme","i-lucide-palette",{"title":56,"path":57,"stem":58,"icon":59},"Настройки","\u002Fru\u002Fguide\u002Fsettings","ru\u002F1.guide\u002F10.settings","i-lucide-settings",false,{"title":62,"icon":63,"path":64,"stem":65,"children":66,"page":60},"Разработка","i-lucide-code","\u002Fru\u002Fdevelopment","ru\u002F2.development",[67,71,76,81,86,91,96],{"title":16,"path":68,"stem":69,"icon":70},"\u002Fru\u002Fdevelopment\u002Finstallation","ru\u002F2.development\u002F01.installation","i-lucide-download",{"title":72,"path":73,"stem":74,"icon":75},"Граф кодовой базы","\u002Fru\u002Fdevelopment\u002Funderstand-anything","ru\u002F2.development\u002F02.understand-anything","i-lucide-network",{"title":77,"path":78,"stem":79,"icon":80},"Офлайн и PWA","\u002Fru\u002Fdevelopment\u002Foffline","ru\u002F2.development\u002F03.offline","i-lucide-wifi-off",{"title":82,"path":83,"stem":84,"icon":85},"История миграций данных","\u002Fru\u002Fdevelopment\u002Fmigration","ru\u002F2.development\u002F04.migration","i-lucide-database",{"title":87,"path":88,"stem":89,"icon":90},"Деплой","\u002Fru\u002Fdevelopment\u002Fdeployment","ru\u002F2.development\u002F05.deployment","i-lucide-rocket",{"title":92,"path":93,"stem":94,"icon":95},"Тестирование","\u002Fru\u002Fdevelopment\u002Ftesting","ru\u002F2.development\u002F06.testing","i-lucide-flask-conical",{"title":97,"path":98,"stem":99,"icon":100},"Дата-утилиты","\u002Fru\u002Fdevelopment\u002Fdate-utilities","ru\u002F2.development\u002F07.date-utilities","i-lucide-calendar",{"title":102,"icon":103,"path":104,"stem":105,"children":106,"page":60},"Справочник","i-lucide-file-code","\u002Fru\u002Freference","ru\u002F3.reference",[107,112,116,121,126,131,136,141],{"title":108,"path":109,"stem":110,"icon":111},"Архитектура","\u002Fru\u002Freference\u002Farchitecture","ru\u002F3.reference\u002F01.architecture","i-lucide-boxes",{"title":113,"path":114,"stem":115,"icon":44},"Типы транзакций","\u002Fru\u002Freference\u002Ftransaction-types","ru\u002F3.reference\u002F02.transaction-types",{"title":117,"path":118,"stem":119,"icon":120},"Синхронизация","\u002Fru\u002Freference\u002Fsync","ru\u002F3.reference\u002F03.sync","i-lucide-refresh-cw",{"title":122,"path":123,"stem":124,"icon":125},"Офлайн-first","\u002Fru\u002Freference\u002Foffline-first","ru\u002F3.reference\u002F04.offline-first","i-lucide-list-ordered",{"title":127,"path":128,"stem":129,"icon":130},"Тех. решения","\u002Fru\u002Freference\u002Ftech-decisions","ru\u002F3.reference\u002F05.tech-decisions","i-lucide-lightbulb",{"title":132,"path":133,"stem":134,"icon":135},"Валидация","\u002Fru\u002Freference\u002Fvalidation-strategy","ru\u002F3.reference\u002F06.validation-strategy","i-lucide-shield-check",{"title":137,"path":138,"stem":139,"icon":140},"Что изменилось со времён Firebase","\u002Fru\u002Freference\u002Ffirebase-migration","ru\u002F3.reference\u002F07.firebase-migration","i-lucide-hamburger",{"title":142,"path":143,"stem":144,"icon":145},"Производительность","\u002Fru\u002Freference\u002Fperformance","ru\u002F3.reference\u002F08.performance","i-lucide-gauge",{"title":147,"icon":148,"path":149,"stem":150,"children":151,"page":60},"Премиум","i-lucide-star","\u002Fru\u002Fpremium","ru\u002F4.premium",[152,157,162],{"title":153,"path":154,"stem":155,"icon":156},"Обзор","\u002Fru\u002Fpremium\u002Foverview","ru\u002F4.premium\u002F01.overview","i-lucide-layers",{"title":158,"path":159,"stem":160,"icon":161},"Telegram-бот","\u002Fru\u002Fpremium\u002Ftelegram-bot","ru\u002F4.premium\u002F02.telegram-bot","i-lucide-send",{"title":163,"path":164,"stem":165,"icon":166},"AI Chat","\u002Fru\u002Fpremium\u002Fai-chat","ru\u002F4.premium\u002F03.ai-chat","i-lucide-sparkles",{"id":168,"title":77,"body":169,"description":255,"extension":256,"links":257,"meta":258,"navigation":259,"path":78,"seo":260,"stem":79,"__hash__":262},"docs_ru\u002Fru\u002F2.development\u002F03.offline.md",{"type":170,"value":171,"toc":244},"minimark",[172,177,181,198,201,205,208,213,216,219,222,226,229,233,236],[173,174,176],"h2",{"id":175},"установка-pwa","Установка PWA",[178,179,180],"p",{},"Финапка - прогрессивное веб-приложение (PWA). Его можно установить на устройство для нативного опыта:",[182,183,184,192],"ul",{},[185,186,187,191],"li",{},[188,189,190],"strong",{},"Десктоп"," - значок установки в адресной строке",[185,193,194,197],{},[188,195,196],{},"Мобильные"," - «Добавить на главный экран» из меню браузера",[178,199,200],{},"Приложение открывается в автономном режиме (standalone) без интерфейса браузера.",[173,202,204],{"id":203},"офлайн","Офлайн",[178,206,207],{},"Финапка работает по принципу offline-first. Все данные лежат в локальной базе SQLite в браузере (на основе PowerSync, хранится в IndexedDB). Транзакции, кошельки и категории можно создавать, редактировать и удалять без интернета - чтение и запись всегда идут сначала в локальную базу, поэтому интерфейс не ждёт сети.",[209,210,212],"h3",{"id":211},"как-синхронизируется-запись","Как синхронизируется запись",[178,214,215],{},"Любая запись сразу попадает в локальную SQLite и фиксируется во встроенной очереди отправки PowerSync. Пока вы офлайн, очередь просто ждёт.",[178,217,218],{},"При восстановлении связи PowerSync автоматически и по порядку отправляет очередь на сервер (Supabase). Здесь нет ручной очереди и нет временных клиентских ID, которые нужно переотображать - каждая строка несёт сгенерированный на клиенте UUID, одинаковый и на устройстве, и на сервере.",[178,220,221],{},"Если сервер навсегда отклоняет запись (например нарушение row-level security или ограничения), это изменение отбрасывается, чтобы не блокировать очередь, и приложение показывает тост об ошибке синхронизации - чтобы вы знали, что локальная копия теперь опережает сервер.",[209,223,225],{"id":224},"как-чтение-остаётся-актуальным","Как чтение остаётся актуальным",[178,227,228],{},"Приложение подписано на локальную базу. Любое изменение - от вашей записи или от входящей синхронизации с другого устройства - перезапускает нужные запросы и обновляет интерфейс. Одна и та же подписка отвечает и за первичную загрузку, и за живые обновления, поэтому второе устройство видит ваши изменения вскоре после их синхронизации.",[173,230,232],{"id":231},"стратегия-синхронизации","Стратегия синхронизации",[178,234,235],{},"PowerSync реплицирует строки каждого пользователя инкрементально: после первой полной синхронизации передаются только изменения (вставки, обновления и удаления) для таблиц, на которые вы подписаны. Курсы валют - общий поток только для чтения, доступный всем пользователям. Стратегию не нужно выбирать под тип данных - она инкрементальна для всего.",[178,237,238,239,243],{},"Единственное исключение - демо-режим: у него нет бэкенда, и он сохраняет данные в ",[240,241,242],"code",{},"localforage",", чтобы перезагрузка работала без входа.\n",{"title":245,"searchDepth":246,"depth":246,"links":247},"",2,[248,249,254],{"id":175,"depth":246,"text":176},{"id":203,"depth":246,"text":204,"children":250},[251,253],{"id":211,"depth":252,"text":212},3,{"id":224,"depth":252,"text":225},{"id":231,"depth":246,"text":232},"Как Финапка работает офлайн как прогрессивное веб-приложение.","md",null,{},{"icon":80},{"title":77,"description":261},"Как Финапка работает офлайн как прогрессивное веб-приложение на основе локальной синхронизации PowerSync.","Rh77nztFo1PBKu2_Kk7Ti1bo48Q7n6qQKE0E8OOSpUQ",[264,266],{"title":72,"path":73,"stem":74,"description":265,"icon":75,"children":-1},"Интерактивный граф знаний кодовой базы Finapp, сгенерированный плагином understand-anything.",{"title":82,"path":83,"stem":84,"description":267,"icon":85,"children":-1},"Исторический обзор миграции бэкенда Финапки - с Firebase на Supabase + PowerSync.",1782114340046]