[{"data":1,"prerenderedAt":304},["ShallowReactive",2],{"navigation_docs":3,"-about-architecture":73,"-about-architecture-surround":299},[4,10,24,41,50,60],{"title":5,"path":6,"stem":7,"children":8},"Introduction","/introduction","0.introduction/index",[9],{"title":5,"path":6,"stem":7},{"title":11,"path":12,"stem":13,"children":14,"page":23},"Installation","/installation","1.installation",[15,19],{"title":16,"path":17,"stem":18},"Docker","/installation/docker","1.installation/1.docker",{"title":20,"path":21,"stem":22},"From source","/installation/manual","1.installation/2.manual",false,{"title":25,"path":26,"stem":27,"children":28,"page":23},"Features","/features","2.features",[29,33,37],{"title":30,"path":31,"stem":32},"Templates","/features/templates","2.features/1.templates",{"title":34,"path":35,"stem":36},"Assistant","/features/assistant","2.features/2.assistant",{"title":38,"path":39,"stem":40},"Profiles","/features/profiles","2.features/3.profiles",{"title":42,"path":43,"stem":44,"children":45,"page":23},"Guide","/guide","3.guide",[46],{"title":47,"path":48,"stem":49},"App usage","/guide/usage","3.guide/1.usage",{"title":51,"path":52,"stem":53,"children":54},"Contributing","/contribute","4.contribute/1.index",[55,56],{"title":51,"path":52,"stem":53},{"title":57,"path":58,"stem":59},"Localization","/contribute/localization","4.contribute/2.localization",{"title":61,"path":62,"stem":63,"children":64,"page":23},"About","/about","5.about",[65,69],{"title":66,"path":67,"stem":68},"Architecture","/about/architecture","5.about/0.architecture",{"title":70,"path":71,"stem":72},"Attribution","/about/attribution","5.about/1.attribution",{"id":74,"title":66,"body":75,"description":292,"extension":293,"links":294,"meta":295,"navigation":296,"path":67,"seo":297,"stem":68,"__hash__":298},"docs/5.about/0.architecture.md",{"type":76,"value":77,"toc":279},"minimark",[78,83,92,125,129,139,161,166,172,186,190,195,224,230,234,267,270],[79,80,82],"h2",{"id":81},"frontend-the-app","Frontend (The App)",[84,85,86,87,91],"p",{},"Found inside the ",[88,89,90],"code",{},"/front"," folder, it is a Single Page Application (SPA) built with:",[93,94,95,109,119],"ul",{},[96,97,98,108],"li",{},[99,100,101],"strong",{},[102,103,107],"a",{"href":104,"rel":105},"https://nuxt.com/",[106],"nofollow","Nuxt",": A powerful Vue.js framework that provides the application structure and routing.",[96,110,111,118],{},[99,112,113],{},[102,114,117],{"href":115,"rel":116},"https://vant-ui.github.io",[106],"Vant UI",": A lightweight Mobile UI Component library that gives Pico its native app feel.",[96,120,121,124],{},[99,122,123],{},"PWA"," (Progressive Web App): Allows the app to be installed on your device, work offline (to an extent), and launch like a native app.",[79,126,128],{"id":127},"backend-the-brains","Backend (The Brains)",[84,130,86,131,134,135,138],{},[88,132,133],{},"/back"," folder it exposes a REST API and proxies all requests to your ",[99,136,137],{},"Firefly III"," instance.",[93,140,141,151],{},[96,142,143,150],{},[99,144,145],{},[102,146,149],{"href":147,"rel":148},"https://laravel.com/",[106],"Laravel",": A robust PHP framework used for the REST API.",[96,152,153,160],{},[99,154,155],{},[102,156,159],{"href":157,"rel":158},"https://github.com/spatie/laravel-query-builder",[106],"Spatie Query Builder"," for implementing the JSON:API specification",[162,163,165],"h3",{"id":164},"database","Database",[84,167,168,171],{},[99,169,170],{},"Firefly-Pico"," maintains a separate, lightweight database to store:",[93,173,174,180],{},[96,175,176,179],{},[99,177,178],{},"Icons:"," Linked to Firefly resources (accounts, categories).",[96,181,182,185],{},[99,183,184],{},"Metadata:"," Extra columns not supported by Firefly III.",[79,187,189],{"id":188},"security","Security",[84,191,192,194],{},[99,193,170],{}," does not implement a separate authorization layer!",[93,196,197,203,208,218],{},[96,198,199,200,202],{},"It proxies all requests to the ",[99,201,137],{}," API.",[96,204,205,207],{},[99,206,137],{}," is responsible for checking the Authorization header.",[96,209,210,211,213,214,217],{},"Even custom endpoints (like /api/transaction-templates) are authorized by against ",[99,212,137],{},"'s ",[88,215,216],{},"v1/about/user"," endpoint first.",[96,219,220,223],{},[99,221,222],{},"Benefit:"," Single source of truth for authorization; no separate account needed.",[84,225,226],{},[227,228],"img",{"alt":66,"src":229},"/images/architecture.png",[162,231,233],{"id":232},"data-storage","Data Storage",[93,235,236,246],{},[96,237,238,241,242,245],{},[99,239,240],{},"Local Storage:"," App settings, tags, accounts, categories, budgets, and templates are cached in the browser's ",[88,243,244],{},"localStorage"," for instant access.",[96,247,248,251,252,255,256,259,260,259,263,266],{},[99,249,250],{},"Syncing:"," Data is re-synced every ",[88,253,254],{},"N days"," (configurable). You can manually trigger a sync via ",[88,257,258],{},"Settings"," -> ",[88,261,262],{},"App config",[88,264,265],{},"Save"," or by pulling to refresh on lists.",[79,268,16],{"id":269},"docker",[93,271,272],{},[96,273,274,275,278],{},"exposes a single port to the outside. Inside the container there is an Nginx instance which sends all requests containing ",[88,276,277],{},"/api"," to the backend and all other to the frontend instance.",{"title":280,"searchDepth":281,"depth":281,"links":282},"",2,[283,284,288,291],{"id":81,"depth":281,"text":82},{"id":127,"depth":281,"text":128,"children":285},[286],{"id":164,"depth":287,"text":165},3,{"id":188,"depth":281,"text":189,"children":289},[290],{"id":232,"depth":287,"text":233},{"id":269,"depth":281,"text":16},"Understand how Firefly Pico works under the hood.","md",null,{},true,{"title":66,"description":292},"QkFpdfgzn7cwmrfsATD58uwVHpwI0yM-pHqbwKkkhk4",[300,302],{"title":57,"path":58,"stem":59,"description":301,"children":-1},"Steps to add support for a new language",{"title":70,"path":71,"stem":72,"description":303,"children":-1},"Just like Firefly III this is licensed under the GNU Affero General Public License v3.",1774611300272]