[{"data":1,"prerenderedAt":292},["ShallowReactive",2],{"navigation_docs_en":3,"-en-development-offline":191,"-en-development-offline-surround":287},[4,61,127,171],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":60},"Guide","i-lucide-book-open","\u002Fen\u002Fguide","en\u002F1.guide",[10,15,20,25,30,35,40,45,50,55],{"title":11,"path":12,"stem":13,"icon":14},"Introduction","\u002Fen\u002Fguide\u002Fintroduction","en\u002F1.guide\u002F01.introduction","i-lucide-house",{"title":16,"path":17,"stem":18,"icon":19},"Install the App","\u002Fen\u002Fguide\u002Finstallation","en\u002F1.guide\u002F02.installation","i-lucide-smartphone",{"title":21,"path":22,"stem":23,"icon":24},"Authentication","\u002Fen\u002Fguide\u002Fauth","en\u002F1.guide\u002F03.auth","i-lucide-lock",{"title":26,"path":27,"stem":28,"icon":29},"Wallets","\u002Fen\u002Fguide\u002Fwallets","en\u002F1.guide\u002F04.wallets","i-lucide-wallet",{"title":31,"path":32,"stem":33,"icon":34},"Categories","\u002Fen\u002Fguide\u002Fcategories","en\u002F1.guide\u002F05.categories","i-lucide-tags",{"title":36,"path":37,"stem":38,"icon":39},"Transactions","\u002Fen\u002Fguide\u002Ftransactions","en\u002F1.guide\u002F06.transactions","i-lucide-receipt",{"title":41,"path":42,"stem":43,"icon":44},"Transfers","\u002Fen\u002Fguide\u002Ftransfers","en\u002F1.guide\u002F07.transfers","i-lucide-arrow-left-right",{"title":46,"path":47,"stem":48,"icon":49},"Statistics","\u002Fen\u002Fguide\u002Fstatistics","en\u002F1.guide\u002F08.statistics","i-lucide-bar-chart-3",{"title":51,"path":52,"stem":53,"icon":54},"Theme","\u002Fen\u002Fguide\u002Ftheme","en\u002F1.guide\u002F09.theme","i-lucide-palette",{"title":56,"path":57,"stem":58,"icon":59},"Settings","\u002Fen\u002Fguide\u002Fsettings","en\u002F1.guide\u002F10.settings","i-lucide-settings",false,{"title":62,"icon":63,"path":64,"stem":65,"children":66,"page":60},"Development","i-lucide-code","\u002Fen\u002Fdevelopment","en\u002F2.development",[67,72,77,82,87,92,97,102,122],{"title":68,"path":69,"stem":70,"icon":71},"Installation","\u002Fen\u002Fdevelopment\u002Finstallation","en\u002F2.development\u002F01.installation","i-lucide-download",{"title":73,"path":74,"stem":75,"icon":76},"Codebase Graph","\u002Fen\u002Fdevelopment\u002Funderstand-anything","en\u002F2.development\u002F02.understand-anything","i-lucide-network",{"title":78,"path":79,"stem":80,"icon":81},"Offline & PWA","\u002Fen\u002Fdevelopment\u002Foffline","en\u002F2.development\u002F03.offline","i-lucide-wifi-off",{"title":83,"path":84,"stem":85,"icon":86},"Data Migration History","\u002Fen\u002Fdevelopment\u002Fmigration","en\u002F2.development\u002F04.migration","i-lucide-database",{"title":88,"path":89,"stem":90,"icon":91},"Deployment","\u002Fen\u002Fdevelopment\u002Fdeployment","en\u002F2.development\u002F05.deployment","i-lucide-rocket",{"title":93,"path":94,"stem":95,"icon":96},"Testing","\u002Fen\u002Fdevelopment\u002Ftesting","en\u002F2.development\u002F06.testing","i-lucide-flask-conical",{"title":98,"path":99,"stem":100,"icon":101},"Date Utilities","\u002Fen\u002Fdevelopment\u002Fdate-utilities","en\u002F2.development\u002F07.date-utilities","i-lucide-calendar",{"title":103,"path":104,"stem":105,"children":106,"page":60},"Ai Workflow","\u002Fen\u002Fdevelopment\u002Fai-workflow","en\u002F2.development\u002F08.ai-workflow",[107,112,117],{"title":108,"path":109,"stem":110,"icon":111},"Overview","\u002Fen\u002Fdevelopment\u002Fai-workflow\u002Foverview","en\u002F2.development\u002F08.ai-workflow\u002F01.overview","i-lucide-bot",{"title":113,"path":114,"stem":115,"icon":116},"Agents","\u002Fen\u002Fdevelopment\u002Fai-workflow\u002Fagents","en\u002F2.development\u002F08.ai-workflow\u002F02.agents","i-lucide-users",{"title":118,"path":119,"stem":120,"icon":121},"Skills","\u002Fen\u002Fdevelopment\u002Fai-workflow\u002Fskills","en\u002F2.development\u002F08.ai-workflow\u002F03.skills","i-lucide-lightbulb",{"title":123,"path":124,"stem":125,"icon":126},"Troubleshooting","\u002Fen\u002Fdevelopment\u002Ftroubleshooting","en\u002F2.development\u002F09.troubleshooting","i-lucide-life-buoy",{"title":128,"icon":129,"path":130,"stem":131,"children":132,"page":60},"Reference","i-lucide-file-code","\u002Fen\u002Freference","en\u002F3.reference",[133,138,142,147,152,156,161,166],{"title":134,"path":135,"stem":136,"icon":137},"Architecture","\u002Fen\u002Freference\u002Farchitecture","en\u002F3.reference\u002F01.architecture","i-lucide-boxes",{"title":139,"path":140,"stem":141,"icon":44},"Transaction Types","\u002Fen\u002Freference\u002Ftransaction-types","en\u002F3.reference\u002F02.transaction-types",{"title":143,"path":144,"stem":145,"icon":146},"Sync","\u002Fen\u002Freference\u002Fsync","en\u002F3.reference\u002F03.sync","i-lucide-refresh-cw",{"title":148,"path":149,"stem":150,"icon":151},"Offline-first","\u002Fen\u002Freference\u002Foffline-first","en\u002F3.reference\u002F04.offline-first","i-lucide-list-ordered",{"title":153,"path":154,"stem":155,"icon":121},"Technical Decisions","\u002Fen\u002Freference\u002Ftech-decisions","en\u002F3.reference\u002F05.tech-decisions",{"title":157,"path":158,"stem":159,"icon":160},"Validation Strategy","\u002Fen\u002Freference\u002Fvalidation-strategy","en\u002F3.reference\u002F06.validation-strategy","i-lucide-shield-check",{"title":162,"path":163,"stem":164,"icon":165},"What Changed Since Firebase","\u002Fen\u002Freference\u002Ffirebase-migration","en\u002F3.reference\u002F07.firebase-migration","i-lucide-hamburger",{"title":167,"path":168,"stem":169,"icon":170},"Performance","\u002Fen\u002Freference\u002Fperformance","en\u002F3.reference\u002F08.performance","i-lucide-gauge",{"title":172,"icon":173,"path":174,"stem":175,"children":176,"page":60},"Premium","i-lucide-star","\u002Fen\u002Fpremium","en\u002F4.premium",[177,181,186],{"title":108,"path":178,"stem":179,"icon":180},"\u002Fen\u002Fpremium\u002Foverview","en\u002F4.premium\u002F01.overview","i-lucide-layers",{"title":182,"path":183,"stem":184,"icon":185},"Telegram Bot","\u002Fen\u002Fpremium\u002Ftelegram-bot","en\u002F4.premium\u002F02.telegram-bot","i-lucide-send",{"title":187,"path":188,"stem":189,"icon":190},"AI Chat","\u002Fen\u002Fpremium\u002Fai-chat","en\u002F4.premium\u002F03.ai-chat","i-lucide-sparkles",{"id":192,"title":78,"body":193,"description":279,"extension":280,"links":281,"meta":282,"navigation":283,"path":79,"seo":284,"stem":80,"__hash__":286},"docs_en\u002Fen\u002F2.development\u002F03.offline.md",{"type":194,"value":195,"toc":268},"minimark",[196,201,205,222,225,229,232,237,240,243,246,250,253,257,260],[197,198,200],"h2",{"id":199},"pwa-installation","PWA Installation",[202,203,204],"p",{},"Finapp is a Progressive Web App (PWA). You can install it on your device for a native app-like experience:",[206,207,208,216],"ul",{},[209,210,211,215],"li",{},[212,213,214],"strong",{},"Desktop"," - click the install icon in your browser's address bar",[209,217,218,221],{},[212,219,220],{},"Mobile"," - use \"Add to Home Screen\" from the browser menu",[202,223,224],{},"The installed app runs in standalone mode without browser UI.",[197,226,228],{"id":227},"working-offline","Working Offline",[202,230,231],{},"Finapp is offline-first. All your data lives in a local SQLite database in the browser (backed by PowerSync, persisted in IndexedDB). You can create, edit, and delete transactions, wallets, and categories while offline - reads and writes always hit the local database first, so the UI never waits on the network.",[233,234,236],"h3",{"id":235},"how-writes-sync","How writes sync",[202,238,239],{},"Every write goes to local SQLite immediately and is recorded in PowerSync's built-in upload queue. While you are offline the queue simply waits.",[202,241,242],{},"When connectivity is restored, PowerSync drains the queue to the server (Supabase) automatically and in order. There is no manual queue and no client-generated temporary IDs to remap - every row carries the client-generated UUID it was created with, on both the device and the server.",[202,244,245],{},"If the server permanently rejects a write (for example a row-level-security or constraint violation), that change is discarded so the queue is not blocked forever, and the app shows a sync-error toast so you know your local copy is now ahead of the server.",[233,247,249],{"id":248},"how-reads-stay-fresh","How reads stay fresh",[202,251,252],{},"The app subscribes to the local database. Any change - whether it came from your own write or from an incoming sync from another device - re-runs the relevant queries and updates the UI. The same subscription handles the initial load and live updates, so a second device sees your changes shortly after they sync.",[197,254,256],{"id":255},"sync-strategy","Sync Strategy",[202,258,259],{},"PowerSync replicates each user's rows incrementally: after the first full sync it streams only the changes (inserts, updates, and deletes) for the tables you are subscribed to. Exchange rates are a shared, read-only stream available to every user. You do not pick a strategy per data type - it is incremental for everything.",[202,261,262,263,267],{},"Demo mode is the one exception: it has no backend and persists to ",[264,265,266],"code",{},"localforage"," instead, so a reload works without signing in.\n",{"title":269,"searchDepth":270,"depth":270,"links":271},"",2,[272,273,278],{"id":199,"depth":270,"text":200},{"id":227,"depth":270,"text":228,"children":274},[275,277],{"id":235,"depth":276,"text":236},3,{"id":248,"depth":276,"text":249},{"id":255,"depth":270,"text":256},"Working offline and PWA installation.","md",null,{},{"icon":81},{"title":78,"description":285},"How Finapp works offline as a Progressive Web App, backed by PowerSync's local-first sync.","95N5GAEnRtVaXeC2IW573UDBqE-DmslubXdKUKKXw1o",[288,290],{"title":73,"path":74,"stem":75,"description":289,"icon":76,"children":-1},"Interactive knowledge graph of the Finapp codebase generated by the understand-anything plugin.",{"title":83,"path":84,"stem":85,"description":291,"icon":86,"children":-1},"Historical overview of the Finapp backend migration - from Firebase to Supabase + PowerSync.",1782114343100]