A full-featured personal finance management application built with Quasar Framework (Vue 3), Firebase, and Capacitor. Available as a Progressive Web App (PWA) and Android app.
- Features
- Tech Stack
- Project Structure
- Prerequisites
- Firebase Setup
- Environment Variables
- Installation
- Running the App
- Building for Production
- Building for Android
- Linting & Formatting
- Application Routes
- Dashboard — Monthly income/expense summary with balance overview and balance-mood emojis
- Accounts — Manage multiple financial accounts (cash, bank, mobile banking, etc.)
- Transactions — Add income, expenses, and transfers between accounts
- Categories — Custom categories with icons and colors for organizing transactions
- Reports — Visual charts (powered by ApexCharts) for income/expense analysis
- Market Lists — Shopping list manager
- Notes — Quick personal notes
- Search — Full-text search across all transactions
- Bilingual UI — Full support for Bengali (বাংলা) and English
- Dark Mode — Toggle between light and dark themes
- App Lock — PIN-based lock screen with SHA-256 hashed PIN storage
- Offline Support — Firestore persistent local cache; writes are queued and synced automatically when back online
- PWA — Installable on desktop and mobile browsers
- Android — Native Android app via Capacitor
| Layer | Technology |
|---|---|
| Framework | Quasar v2 + Vue 3 |
| Language | JavaScript (ES2022 modules) |
| State Management | Pinia |
| Routing | Vue Router v4 |
| Backend / Auth | Firebase v12 (Auth + Firestore) |
| Charts | ApexCharts via vue3-apexcharts |
| Internationalisation | vue-i18n v11 |
| PWA | Workbox (GenerateSW mode) |
| Mobile | Capacitor (Android) |
| Package Manager | pnpm |
| Build Tool | Vite (via @quasar/app-vite) |
| Linter | ESLint (flat config) + Prettier |
finance/
├── src/
│ ├── boot/ # App boot files (Firebase, Pinia, i18n)
│ ├── components/ # Shared Vue components
│ ├── css/ # Global SCSS styles
│ ├── i18n/ # Translation files (bn.js, en.js)
│ ├── layouts/ # Page layouts (Main, Auth, Landing)
│ ├── pages/ # Route-level page components
│ ├── router/ # Vue Router config & routes
│ └── stores/ # Pinia stores (auth, account, transaction, etc.)
├── src-capacitor/ # Android / Capacitor project
├── src-pwa/ # PWA service worker & manifest
├── public/ # Static assets & custom fonts
├── quasar.config.js # Quasar CLI configuration
├── .env.example # Environment variables template
└── package.json
Make sure the following are installed before you begin:
| Tool | Minimum Version | Install |
|---|---|---|
| Node.js | v20 (LTS) | https://nodejs.org |
| pnpm | v10 | npm install -g pnpm |
| Quasar CLI | latest | pnpm add -g @quasar/cli |
| Git | any | https://git-scm.com |
For Android development, additionally install:
| Tool | Notes |
|---|---|
| Java JDK 17+ | https://adoptium.net |
| Android Studio | https://developer.android.com/studio |
| Android SDK | Install via Android Studio → SDK Manager |
This project requires a Firebase project with Authentication and Firestore enabled.
- Go to https://console.firebase.google.com
- Click Add project, give it a name, and follow the wizard
- Enable Google Analytics if desired
- In the Firebase console, go to Build → Authentication
- Click Get started
- Under the Sign-in method tab, enable Email/Password
- Go to Build → Firestore Database
- Click Create database
- Choose Start in production mode (recommended) or test mode for local development
- Select a region close to your users
- Important: This app uses a named database with the ID
finance. After the default database is created, go to the Databases list and create an additional database with the IDfinance.
In Firestore → Rules, apply the following to protect each user's data:
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
match /users/{userId}/{document=**} {
allow read, write: if request.auth != null && request.auth.uid == userId;
}
}
}
- In Project Settings → General, scroll down to Your apps
- Click Add app → Web (
</>) - Register the app and copy the
firebaseConfigvalues — you will need these in the next step
Create a .env file in the project root by copying the provided template:
cp .env.example .envOpen .env and fill in your Firebase project values:
VITE_FIREBASE_API_KEY=your_firebase_api_key_here
VITE_FIREBASE_AUTH_DOMAIN=your_project_id.firebaseapp.com
VITE_FIREBASE_DATABASE_URL=https://your_project_id-default-rtdb.firebaseio.com
VITE_FIREBASE_PROJECT_ID=your_project_id
VITE_FIREBASE_STORAGE_BUCKET=your_project_id.firebasestorage.app
VITE_FIREBASE_MESSAGING_SENDER_ID=your_messaging_sender_id
VITE_FIREBASE_APP_ID=your_firebase_app_id
VITE_FIREBASE_MEASUREMENT_ID=your_measurement_idNever commit
.envto version control. It is already listed in.gitignore.
Clone the repository and install all dependencies:
# Clone the repository
git clone https://github.com/your-username/finance.git
cd finance
# Install dependencies using pnpm
pnpm installpnpm dev
# or
quasar devThe browser will open automatically at http://localhost:9000.
quasar dev -m pwaquasar dev -m capacitor -T androidThis will sync web assets to the Capacitor project and launch the app via Android Studio or a connected device.
pnpm build
# or
quasar buildOutput files are placed in dist/spa/. Deploy this folder to any static hosting provider.
quasar build -m pwaOutput files are placed in dist/pwa/.
# Install the Firebase CLI
npm install -g firebase-tools
# Login and initialise hosting
firebase login
firebase init hosting
# Deploy
firebase deploy --only hostingWhen prompted for the public directory during firebase init hosting, enter dist/spa (or dist/pwa for PWA builds).
quasar build -m capacitor -T androidcd src-capacitor
npx cap open androidInside Android Studio, go to Build → Build Bundle(s) / APK(s) and select your desired output format.
Note: Make sure
src-capacitor/android/local.propertiescontains the correctsdk.dirpath pointing to your Android SDK installation, for example:sdk.dir=C\:\\Users\\YourName\\AppData\\Local\\Android\\Sdk
# Check for lint errors
pnpm lint
# Auto-format all files with Prettier
pnpm format| Path | Page | Auth Required |
|---|---|---|
/ |
Landing page | No |
/login |
Login | No |
/register |
Register | No |
/dashboard |
Home / Dashboard | Yes |
/dashboard/accounts |
Accounts list | Yes |
/dashboard/add-income |
Add income | Yes |
/dashboard/add-expense |
Add expense | Yes |
/dashboard/transfer |
Transfer between accounts | Yes |
/dashboard/categories |
Manage categories | Yes |
/dashboard/market-lists |
Shopping / market lists | Yes |
/dashboard/notes |
Personal notes | Yes |
/dashboard/reports |
Charts & reports | Yes |
/dashboard/search |
Search transactions | Yes |
/dashboard/all-transactions |
Full transaction history | Yes |
/dashboard/account/:id/transactions |
Per-account transactions | Yes |
/dashboard/category/:id/transactions |
Per-category transactions | Yes |
/dashboard/settings |
App settings | Yes |
/dashboard/help |
Help page | Yes |
This project is licensed under the MIT License — free to use, modify, and distribute for both personal and commercial purposes. See the LICENSE file for the full text.