Skip to content
Β 
Β 

Latest commit

Β 

History

1,308 Commits

Folders and files

NameName
Last commit message
Last commit date
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

Cashew




Promo banner

Cashew is a full-fledged, feature-rich application designed to empower users in managing their finances effectively. Built using Flutter - with Drift's SQL package, and Firebase - this app offers a seamless and intuitive user experience across various devices. Development started in September 2021.


Features

Review Video

Cashew was featured on YouTube on 'The Best Free and Open Source Apps in 2024!' (and in the thumbnail!)


Review Video

Cashew was featured on YouTube on 'The Best Apps of 2023!'


Review Video

Cashew was featured on YouTube on 'Top Android Apps! (November 2023)'


Play Store Feature

Cashew was featured on Google Play's Editorial 'New Apps We Love' (November 2023)!


Material Apps List Feature

Cashew was featured in the Material You Apps List!

Release

Check out the official website!

This application is available on the App Store, Google Play, GitHub and as a Web App (PWA).

Changelog

Changes and progress about development is all heavily documented in GitHub commits and in the changelog

Key Features

πŸ’Έ Budget Management

  • Custom Budgets and Time Periods: Set up personalized budgets with flexible time periods, such as monthly, weekly, daily, or any custom time period that suits your financial planning needs. A custom time period is useful if you plan on setting a one-time travel budget!
  • Added Budgets: Selectively add transactions to specific budgets, allowing you to focus on specific expense categories.
  • Category Spending Limits per Budget: Set limits for each category within a budget, ensuring responsible spending.
  • Past Budget History Viewing: Analyze your spending habits over time by accessing past budget history, enabling comparison and tracking of financial progress.
  • Goals: Create spending and saving goals and put transactions towards different purchases or savings. Track your progress towards achieving your financial goals.

πŸ’° Transaction Management

  • Support for Different Transaction Types: Categorize transactions effectively based on types such as upcoming, subscription, repeating, debts (borrowed), and credit (lent). Each type behaves in certain ways in the interface. Pay your upcoming transactions when you're ready, or mark your lent out transactions as collected.
  • Custom Categories: Create personalized categories to organize transactions according to your unique spending habits. Search through multiple icons and select the default option as expenses or income when adding transactions.
  • Custom Titles: Automatically assign transactions with the same name to specific categories, saving time and ensuring consistency. These titles are stored in memory and popup when you add another transaction with a similar name.
  • Search and Filters: Easily search and filter transactions based on various criteria such as date, category, amount, or custom tags, enabling quick access to information.
  • Easy Editing: Long-press and swipe to select multiple budgets, edit accordingly as needed or delete multiple at once.

πŸ’± Financial Flexibility

  • Multiple Currencies and Accounts: Manage finances across different currencies and accounts with up-to-date conversion rates for accurate calculations and effortless currency conversions. The interface shows the original amount added and the converted amount to the selected account.
  • Switch Accounts and Currencies with Ease: On the homepage, easily select a different account and currency and everything will be converted automatically in an instant.

πŸ”’ Enhanced Security and Accessibility

  • Biometric Lock: Secure budget data using biometric authentication, adding an extra layer of privacy.
  • Google Login: Conveniently log in to the app using your Google account, ensuring a streamlined and hassle-free authentication process.

🎨 User Experience and Design

  • Material You Design: Enjoy a visually appealing and modern interface, following the principles of Material You design for a delightful user experience.
  • Custom Accent Color: Personalize the app by selecting a custom accent color that suits your style, or follow that of the system.
  • Light and Dark Mode: Seamlessly switch between light and dark themes to optimize visibility and reduce eye strain.
  • Customizable Home Screen: Tailor the home screen layout and widgets to display the financial information that matters most to you, providing a personalized and efficient dashboard.
  • Detailed Graph Visuals: Gain valuable insights into spending patterns through detailed and interactive graphs, visualizing financial data at a glance.
  • Beautiful Adaptive UI: A responsive user interface that adapts flawlessly to both web and mobile platforms, providing an immersive and consistent user experience across devices.

☁ Backup and Syncing

  • Cross-Device Sync: Keep budget data synchronized across all devices, ensuring access to financial information wherever you go.
  • Google Drive Backup: Safeguard budget data by utilizing Google Drive's backup functionality, allowing easy restoration of data if needed.

πŸ’Ώ Smart Automation

  • Notifications: Stay informed about important financial events and receive timely reminders for budget goals, transactions, and upcoming due dates.
  • Import CSV Files: Seamlessly import financial data by uploading CSV files, facilitating a smooth transition from other applications or platforms.
  • Import Google Sheets: Seamlessly import Google Sheets tables, quickly importing many transactions from a spreadsheet.
  • App Links: Automatically create transactions with pre-filled data using app linking (documentation below)

Automation

See the Automation section on the FAQ website for information on how to add transactions automatically: https://cashewapp.web.app/faq.html#automation

Bundled Packages

This repository contains, bundled in, modified versions of the discontinued packages listed below. They can be found in the folder /budget/packages

Translations

The translations are available here: https://docs.google.com/spreadsheets/d/1QQqt28cmrby6JqxLm-oxUXCuM3alniLJ6IRhcPJDOtk/edit?usp=sharing. If you would like to help translate, please reach out on email: dapperappdeveloper@gmail.com

To Update Translations

  1. Run budget\assets\translations\generate-translations.py
  2. Restart the application

Developer Notes

Pull Requests and Contributions

Unfortunately, I am currently not accepting contributions due to licensing and credits. Since this application turns some profits, I want to avoid any muddy water when it comes to compensation for contributions. You are free to submit an issue and I can consider it!

Toolchain

CI pins Flutter 3.41.4 (.github/workflows/build.yml). Local builds should match β€” several dependencies are held back specifically by that pin, so a different Flutter can resolve a different dependency set than CI does.

Before opening a PR, from budget/:

  • flutter analyze β€” must report 0 errors (warnings and infos are tracked but not gating)
  • flutter test

Firebase Configuration

The Firebase client config is not committed. lib/firebase_options.dart reads every value through String.fromEnvironment with empty defaults, so supply them at build time:

  1. Copy budget/firebase_config.json.example to budget/firebase_config.json and fill in the values from your own Firebase project. This file is gitignored β€” do not commit it.
  2. Pass it to every build: flutter build <target> --dart-define-from-file=firebase_config.json

Android additionally needs budget/android/app/google-services.json (copy from google-services.json.example), and iOS needs budget/ios/Runner/GoogleService-Info.plist. Both are gitignored for the same reason.

Builds without these still compile, but anything that touches Firebase β€” Google login, shared budgets, cloud sync β€” will not work.

Android Release

  • To build an app-bundle Android release, run flutter build appbundle --release

Note: requires the Android SDK, and NDK 28.2.13676358 (set in budget/android/app/build.gradle). The NDK is not installed by default β€” add it from the Android Studio SDK Manager, or with sdkmanager "ndk;28.2.13676358". It is needed because sqlite3 now compiles SQLite from source (see SQLite and Build Hooks).

iOS Release

  • To build an IPA iOS release, run flutter build ipa

Note: requires MacOS, and Xcode targeting iOS 15.0 or newer. The minimum used to be lower; the Firebase 6.x packages raised it. It is set in budget/ios/Podfile (platform :ios, '15.0') and in the IPHONEOS_DEPLOYMENT_TARGET entries of budget/ios/Runner.xcodeproj. The CI job Build iOS checks both, so lowering one without the other fails the build.

budget/ios/Podfile.lock is intentionally absent β€” the committed one predated the Firebase upgrade and was unsatisfiable. It will be regenerated on the first pod install.

SQLite and Build Hooks

sqlite3_flutter_libs has been removed. It was retired upstream (published as 0.6.0+eol) and as of that release provides no functionality. drift 2.32+ uses package:sqlite3 3.x, which bundles SQLite itself through Dart build hooks β€” so SQLite is now compiled as part of the normal build on every platform, including Windows and Linux desktop, which previously got it from the Flutter libs package.

Practical consequences:

  • Android needs the NDK version pinned above.
  • Desktop builds need a working native toolchain (ninja-build + libgtk-3-dev on Linux; Visual Studio with the C++ workload on Windows).
  • flutter build windows needs Developer Mode enabled on Windows, for symlink support.
  • If a build fails with a stale generated plugin registrant, run flutter clean before flutter pub get. CI does this on every job.

Firebase Deployment

  • To deploy to firebase, run firebase deploy

Note: required Firebase.

GitHub release

Building the Release APK in CI

.github/workflows/release-apk.yml builds a signed release APK. It is deliberately not part of build.yml β€” that workflow gates every push and PR, and a release build is far slower than the --debug one it already runs.

It triggers on a pushed tag (v* or 1.2.3) and via Run workflow in the Actions tab.

android/app/build.gradle fails the release variant outright when the keystore is missing (:app:validateSigningRelease > Keystore file ... not found), so the workflow always provides one. Which one depends on the repository secrets:

Secret Effect if unset
ANDROID_KEYSTORE_BASE64 Signs with a throwaway key generated per run. The APK installs and exercises the full release pipeline, but cannot upgrade an existing install and is never attached to a Release.
ANDROID_KEYSTORE_PASSWORD, ANDROID_KEY_ALIAS, ANDROID_KEY_PASSWORD Required alongside the keystore.
GOOGLE_SERVICES_JSON Falls back to google-services.json.example; Firebase features will not work.
FIREBASE_CONFIG_JSON Built without --dart-define-from-file, so Google login is dead.

Signing locally uses the same two files, and they live in different directories β€” build.gradle reads rootProject.file('key.properties') but resolves storeFile with a bare file(...) inside the :app project:

  • budget/android/key.properties
  • budget/android/app/keystore.jks (i.e. storeFile=keystore.jks is relative to android/app/)

Putting the keystore next to key.properties fails with Keystore file ... not found for signing config 'release'. Both paths are gitignored.

To produce a publishable build in CI, set all the secrets above. The keystore is uploaded base64-encoded:

base64 -w0 keystore.jks          # Linux
certutil -encodehex -f keystore.jks out.txt 0x40000000   # Windows

On a tag, a properly signed APK is attached to a draft GitHub Release β€” nothing is published without a human pressing the button. A throwaway-signed APK is only ever uploaded as a workflow artifact, clearly named so.

Scripts

deploy_and_build_windows.bat

  • Deploy to Firebase and build the apk and appbundle

open_release_builds.bat

  • Opens the location of the built apk and appbundle

update_translations.bat

  • Downloads the latest version of Cashew translations. Runs budget\assets\translations\generate-translations.py

Develop Wirelessly on Android

  • adb tcpip 5555
  • adb connect <IP>
  • Get the phone's IP by going to About Phone > Status Information > IP Address

Migrate Database

  1. Make any database changes to the schema and tables
  2. Bump the schema version
    • Change int schemaVersionGlobal = ...+1 in tables.dart
  3. Make sure you are in application root directory
    • cd .\budget\
  4. Generate database code
    • Run dart run build_runner build
  5. Export the new schema
  6. Generate step-by-step migrations
    • Run dart run drift_dev schema steps drift_schemas/ lib\database\schema_versions.dart
  7. Implement migration strategy
    • Edit await stepByStep(...) function in tables.dart and add the migration strategy for the new version migration

Get Platform

  • Use getPlatform() from functions.dart
  • Since Platform is not supported on web, we must create a wrapper and always use this to determine the current platform

Push Route

  • If we want to navigate to a new page, stick to pushRoute(context, page) function from functions.dart
  • It handles the platform routing and PageRouteBuilder

Wallets vs. Accounts

  • Wallets have been been renamed to Accounts on the front-end but internally, the name Wallet is still used.

Objectives vs. Goals

  • Objectives have been been renamed to Goals on the front-end but internally, the name Objectives is still used.

Long Term Loans

  • Long term loans create a goal. However, the goals total is not used. Instead the total of the goal is calculated by totalling the proper polarity of transactions of the opposite type. For example, if it was a loan of 100$ lent out, the initial transaction would be 100$ of negative polarity (expense) and that would be the total of the goal. When a payment is made, it is made in the opposite (positive) polarity (income) and added to the total 'paid back'. We can easily find how much is remaining by taking the difference (or the addition including polarities).

About

πŸ’Έ An app created to help users manage a budget and purchases

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages