[{"data":1,"prerenderedAt":304},["ShallowReactive",2],{"cases-en-budgetra":3,"published":204},{"doc":4,"versions":190,"related":193},{"id":5,"title":6,"body":7,"client":163,"description":164,"draft":165,"extension":166,"lang":167,"lead":168,"meta":169,"minutes":170,"modified":171,"navigation":172,"path":173,"price":174,"published":171,"role":175,"seo":176,"seoTitle":177,"services":178,"stack":181,"stem":187,"year":188,"__hash__":189},"cases\u002Fen\u002Fcases\u002Fbudgetra.md","Budgetra: a budgeting app with a forecast",{"type":8,"value":9,"toc":154},"minimark",[10,15,33,38,46,49,53,56,90,94,132,136,147,151],[11,12],"app-shots",{":alts":13,"dir":14},"[\"Home screen: how much you can spend, the daily limit and the forecast to the end of the month\",\"Voice input: say an expense and the app picks out the amount and category\",\"Receipt scanning: shop, total and date from a photo\",\"One expense split across several categories\",\"Recurring payments: subscriptions and bills\",\"Monthly budget: limits by category\",\"Charts: spending breakdown and use of income\",\"Accounts: cash, card, bank and crypto in one budget\"]","\u002Fcases\u002Fbudgetra\u002Fen\u002F",[16,17,18,19,26,27,32],"p",{},"Download: ",[20,21,25],"a",{"href":22,"rel":23},"https:\u002F\u002Fapps.apple.com\u002Fus\u002Fapp\u002Fbudgetra-budget-forecast\u002Fid6801909137",[24],"nofollow","App Store"," · ",[20,28,31],{"href":29,"rel":30},"https:\u002F\u002Fplay.google.com\u002Fstore\u002Fapps\u002Fdetails?id=com.budgetra.budgetra",[24],"Google Play",".",[34,35,37],"h2",{"id":36},"the-problem","The problem",[16,39,40,41,45],{},"Most budgeting apps show where your money went. I wanted an answer to a different question: ",[42,43,44],"strong",{},"how long will what's left last",". Budgetra works out a daily limit from your actual pace of spending and updates the forecast after every purchase: whether you'll make it to the end of the month, or when the money runs out.",[16,47,48],{},"The second requirement was that users keep their data. There is no need to connect a bank account, and the core data stays on the phone.",[34,50,52],{"id":51},"what-idid","What I did",[16,54,55],{},"The whole product, from the first commit to release:",[57,58,59,66,72,78,84],"ul",{},[60,61,62,65],"li",{},[42,63,64],{},"interface design",": dark and light themes, one screen for one answer, numbers first;",[60,67,68,71],{},[42,69,70],{},"the Flutter app",": one codebase for iOS and Android;",[60,73,74,77],{},[42,75,76],{},"the backend"," on Firebase Cloud Functions;",[60,79,80,83],{},[42,81,82],{},"the release"," on the App Store and Google Play, store listings and screenshots in three languages;",[60,85,86,89],{},[42,87,88],{},"the Pro subscription"," through RevenueCat.",[34,91,93],{"id":92},"how-it-works","How it works",[57,95,96,102,108,114,120,126],{},[60,97,98,101],{},[42,99,100],{},"Offline first."," Data is stored locally in an encrypted SQLite database (SQLCipher), and backups are encrypted too. The app works without an internet connection.",[60,103,104,107],{},[42,105,106],{},"The forecast."," The daily limit, the date your money lasts until, and signals when a category nears its limit are all worked out on the device after every expense.",[60,109,110,113],{},[42,111,112],{},"Voice input."," A phrase like \"groceries 25 euros\" is transcribed by Whisper, and a language model splits it into amount, shop and category. Requests go through Cloud Functions, so no service keys ship inside the app.",[60,115,116,119],{},[42,117,118],{},"Receipts."," On iPhone the receipt text is recognised on the device itself (Apple Vision): shop, date and total fill themselves in.",[60,121,122,125],{},[42,123,124],{},"Several currencies and accounts:"," cash, cards, banks and crypto in one budget, with exchange rates updated automatically.",[60,127,128,131],{},[42,129,130],{},"Three languages:"," Ukrainian, English and Russian, like this site.",[34,133,135],{"id":134},"quality","Quality",[57,137,138,141,144],{},[60,139,140],{},"over 280 automated test files plus end-to-end Maestro flows that go through the app the way a user does;",[60,142,143],{},"Firebase Crashlytics and Analytics, and App Check against outside requests to the backend;",[60,145,146],{},"my own metrics dashboard: App Store sales, Google Play installs and RevenueCat subscription events in one place.",[34,148,150],{"id":149},"result","Result",[16,152,153],{},"Budgetra is live on the App Store and Google Play and keeps growing: the latest version added accounts and transfers between them. The project shows that I can cover the whole path on my own, from idea and design to code, backend, release and support.",{"title":155,"searchDepth":156,"depth":156,"links":157},"",2,[158,159,160,161,162],{"id":36,"depth":156,"text":37},{"id":51,"depth":156,"text":52},{"id":92,"depth":156,"text":93},{"id":134,"depth":156,"text":135},{"id":149,"depth":156,"text":150},"Own product","My own budgeting app built with Flutter: a forecast to the end of the month, voice input, receipt scanning. Published on the App Store and Google Play.",false,"md","en","My own product: an app that shows how long your money will last until the end of the month. I took it from idea to the App Store and Google Play on my own.",{},3,"2026-11-02",true,"\u002Fen\u002Fcases\u002Fbudgetra",null,"Idea, design, development, release",{"title":6,"description":164},"Budgetra — a budgeting app for iOS and Android: case study",[179,180],"flutter-apps","full-stack",[182,183,184,185,186],"Flutter","Dart","SQLite","Firebase","RevenueCat","en\u002Fcases\u002Fbudgetra","2026","eySR638sz1aRKubeynJbuWFjm7CvR38bHKjOh-DDuSE",[167,191,192],"ru","uk",[194,199],{"path":195,"title":196,"description":197,"draft":165,"short":198},"\u002Fen\u002Fservices\u002Fflutter-apps","Flutter mobile apps","A Flutter mobile app: one codebase for iOS and Android, modern interface, connection to your server. From design to App Store and Google Play.","One codebase for iOS and Android: from interface to store publishing.",{"path":200,"title":201,"description":202,"draft":165,"short":203},"\u002Fen\u002Fservices\u002Ffull-stack","Full-stack development","Full-stack development: interface, server and database from one person. Fewer middlemen, faster results. Vue, Nuxt, React. Remote, for clients anywhere.","Interface, server and database in one pair of hands. From design to launch.",[205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303],"\u002Fen\u002Fservices\u002Fbusiness-card-site\u002F","\u002Fen\u002Fservices\u002Fcatalog-site\u002F","\u002Fen\u002Fservices\u002Fcorporate-site\u002F","\u002Fen\u002Fservices\u002Ffigma-to-html\u002F","\u002Fen\u002Fservices\u002Fflutter-apps\u002F","\u002Fen\u002Fservices\u002Ffull-stack\u002F","\u002Fen\u002Fservices\u002Flanding-page\u002F","\u002Fen\u002Fservices\u002Fonline-store\u002F","\u002Fen\u002Fservices\u002Fportal\u002F","\u002Fen\u002Fservices\u002Fredesign\u002F","\u002Fen\u002Fservices\u002Fsite-speed\u002F","\u002Fen\u002Fservices\u002Fsite-support\u002F","\u002Fen\u002Fservices\u002Fweb-apps\u002F","\u002Fen\u002Fservices\u002Fwordpress\u002F","\u002Fru\u002Fservices\u002Fbusiness-card-site\u002F","\u002Fru\u002Fservices\u002Fcatalog-site\u002F","\u002Fru\u002Fservices\u002Fcorporate-site\u002F","\u002Fru\u002Fservices\u002Ffigma-to-html\u002F","\u002Fru\u002Fservices\u002Fflutter-apps\u002F","\u002Fru\u002Fservices\u002Ffull-stack\u002F","\u002Fru\u002Fservices\u002Flanding-page\u002F","\u002Fru\u002Fservices\u002Fonline-store\u002F","\u002Fru\u002Fservices\u002Fportal\u002F","\u002Fru\u002Fservices\u002Fredesign\u002F","\u002Fru\u002Fservices\u002Fsite-speed\u002F","\u002Fru\u002Fservices\u002Fsite-support\u002F","\u002Fru\u002Fservices\u002Fweb-apps\u002F","\u002Fru\u002Fservices\u002Fwordpress\u002F","\u002Fservices\u002Fbusiness-card-site\u002F","\u002Fservices\u002Fcatalog-site\u002F","\u002Fservices\u002Fcorporate-site\u002F","\u002Fservices\u002Ffigma-to-html\u002F","\u002Fservices\u002Fflutter-apps\u002F","\u002Fservices\u002Ffull-stack\u002F","\u002Fservices\u002Flanding-page\u002F","\u002Fservices\u002Fonline-store\u002F","\u002Fservices\u002Fportal\u002F","\u002Fservices\u002Fredesign\u002F","\u002Fservices\u002Fsite-speed\u002F","\u002Fservices\u002Fsite-support\u002F","\u002Fservices\u002Fweb-apps\u002F","\u002Fservices\u002Fwordpress\u002F","\u002Fservices\u002F","\u002Fen\u002Fservices\u002F","\u002Fru\u002Fservices\u002F","\u002Fen\u002Fcases\u002Fbudgetra\u002F","\u002Fru\u002Fcases\u002Fbudgetra\u002F","\u002Fcases\u002Fbudgetra\u002F","\u002Fcases\u002F","\u002Fen\u002Fcases\u002F","\u002Fru\u002Fcases\u002F","\u002Fen\u002Fblog\u002Fbusiness-card-site-price\u002F","\u002Fen\u002Fblog\u002Fcatalog-or-online-store\u002F","\u002Fen\u002Fblog\u002Fcorporate-site-cost\u002F","\u002Fen\u002Fblog\u002Ffigma-to-html-checklist\u002F","\u002Fen\u002Fblog\u002Ffull-stack-vs-team\u002F","\u002Fen\u002Fblog\u002Flanding-page-cost\u002F","\u002Fen\u002Fblog\u002Fmobile-app-cost\u002F","\u002Fen\u002Fblog\u002Fonline-store-cost\u002F","\u002Fen\u002Fblog\u002Fpersonal-account-guide\u002F","\u002Fen\u002Fblog\u002Fportal-where-to-start\u002F","\u002Fen\u002Fblog\u002Fredesign-without-losing-seo\u002F","\u002Fen\u002Fblog\u002Fsite-support-guide\u002F","\u002Fen\u002Fblog\u002Fslow-site-checklist\u002F","\u002Fen\u002Fblog\u002Fwordpress-or-custom-code\u002F","\u002Fru\u002Fblog\u002Fbusiness-card-site-price\u002F","\u002Fru\u002Fblog\u002Fcatalog-or-online-store\u002F","\u002Fru\u002Fblog\u002Fcorporate-site-cost\u002F","\u002Fru\u002Fblog\u002Ffigma-to-html-checklist\u002F","\u002Fru\u002Fblog\u002Ffull-stack-vs-team\u002F","\u002Fru\u002Fblog\u002Flanding-page-cost\u002F","\u002Fru\u002Fblog\u002Fmobile-app-cost\u002F","\u002Fru\u002Fblog\u002Fonline-store-cost\u002F","\u002Fru\u002Fblog\u002Fpersonal-account-guide\u002F","\u002Fru\u002Fblog\u002Fportal-where-to-start\u002F","\u002Fru\u002Fblog\u002Fredesign-without-losing-seo\u002F","\u002Fru\u002Fblog\u002Fsite-support-guide\u002F","\u002Fru\u002Fblog\u002Fslow-site-checklist\u002F","\u002Fru\u002Fblog\u002Fwordpress-or-custom-code\u002F","\u002Fblog\u002Fbusiness-card-site-price\u002F","\u002Fblog\u002Fcatalog-or-online-store\u002F","\u002Fblog\u002Fcorporate-site-cost\u002F","\u002Fblog\u002Ffigma-to-html-checklist\u002F","\u002Fblog\u002Ffull-stack-vs-team\u002F","\u002Fblog\u002Flanding-page-cost\u002F","\u002Fblog\u002Fmobile-app-cost\u002F","\u002Fblog\u002Fonline-store-cost\u002F","\u002Fblog\u002Fpersonal-account-guide\u002F","\u002Fblog\u002Fportal-where-to-start\u002F","\u002Fblog\u002Fredesign-without-losing-seo\u002F","\u002Fblog\u002Fsite-support-guide\u002F","\u002Fblog\u002Fslow-site-checklist\u002F","\u002Fblog\u002Fwordpress-or-custom-code\u002F","\u002Fblog\u002F","\u002Fen\u002Fblog\u002F","\u002Fru\u002Fblog\u002F","\u002Fbrief\u002F","\u002Fen\u002Fbrief\u002F","\u002Fru\u002Fbrief\u002F",1793579960704]