Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
38 commits
Select commit Hold shift + click to select a range
4fb0b88
feat 1.0.0: Implement core financial tracking features for accounts, …
HellBus1 Feb 20, 2026
5c9284b
feat account-management-1.0.0: Implement account management features …
HellBus1 Feb 20, 2026
c71907a
feat account-management-1.0.0: conditionally display FloatingActionBu…
HellBus1 Feb 20, 2026
cb51a6e
feat: Add CI workflow and refactor for lint compliance
HellBus1 Feb 21, 2026
aee031c
Merge pull request #1 from HellBus1/account-management-1.0.0
HellBus1 Feb 21, 2026
f1ab5e9
feat account-management-1.0.0: Implement comprehensive transaction an…
HellBus1 Feb 21, 2026
abcac25
Merge pull request #2 from HellBus1/transaction-logging-1.0.0
HellBus1 Feb 21, 2026
536ea33
feat smart-settlement-1.0.0: Add credit account bill payment function…
HellBus1 Feb 21, 2026
e63fe2e
Merge pull request #3 from HellBus1/smart-settlement-1.0.0
HellBus1 Feb 21, 2026
461dc0b
feat google-drive-sync-1.0.0: Implement Google Drive backup and resto…
HellBus1 Feb 21, 2026
059e770
Merge pull request #4 from HellBus1/google-drive-sync-1.0.0
HellBus1 Feb 21, 2026
0f595de
feat bank-ready-reports-1.0.0: enable PDF and Excel report generation…
HellBus1 Feb 21, 2026
64def36
Merge pull request #5 from HellBus1/bank-ready-reports-1.0.0
HellBus1 Feb 21, 2026
ac46ad4
feat dashboard-1.0.0: Implement quick spending stats strip on the led…
HellBus1 Feb 21, 2026
4ae2a49
Merge pull request #6 from HellBus1/dashboard-1.0.0
HellBus1 Feb 21, 2026
fd32417
refactor code-lint-enhancement-1.0.0: Add `context.mounted` checks fo…
HellBus1 Feb 21, 2026
286a025
Merge pull request #7 from HellBus1/code-lint-enhancement-1.0.0
HellBus1 Feb 21, 2026
4fb4e14
feat: Lower minimum Dart SDK version requirement and add analysis out…
HellBus1 Feb 21, 2026
4ea978e
chore 1.0.0: Upgrade Dart SDK to 3.11.0, remove explicit Flutter vers…
HellBus1 Feb 21, 2026
234547a
refactor 1.0.0: Update github workflows
HellBus1 Feb 21, 2026
8f992e3
Merge pull request #8 from HellBus1/1.0.0
HellBus1 Feb 21, 2026
b9ca80f
Feat performance-enhancement-1.0.0: Cache transaction computations, o…
HellBus1 Feb 25, 2026
ed07ec3
Merge pull request #9 from HellBus1/performance-enhancement-1.0.0
HellBus1 Feb 25, 2026
f103d26
Feat bank-ready-reports-1.0.0: Implement statistics and pie charts fo…
HellBus1 Feb 25, 2026
a2edf53
Feat bank-ready-reports-1.0.0: Add mock data for testing report scree…
HellBus1 Feb 27, 2026
cdc5fba
Feat bank-ready-reports-1.0.0: Add seed command
HellBus1 Feb 27, 2026
237e700
Merge pull request #10 from HellBus1/bank-ready-reports-1.0.0
HellBus1 Feb 27, 2026
d5e769b
Feat production-configuration-1.0.0: Integrate Firebase Crashlytics w…
HellBus1 Feb 27, 2026
f7f2ce5
Feat production-configuration-1.0.0: Integrate Firebase Crashlytics, …
HellBus1 Feb 27, 2026
ab67471
Merge pull request #11 from HellBus1/production-configuration-1.0.0
HellBus1 Feb 27, 2026
44e54bb
Feat documentation-1.0.0: Integrate production build configurations i…
HellBus1 Feb 27, 2026
37adb2e
Merge pull request #12 from HellBus1/documentation-1.0.0
HellBus1 Feb 27, 2026
9278387
Feat production-configuration-1.0.0: Implement app icons for Android …
HellBus1 Feb 27, 2026
6aaceef
Merge pull request #13 from HellBus1/production-configuration-1.0.0
HellBus1 Feb 27, 2026
63c5906
Feat 1.0.0: Implement comprehensive production build configurations, …
HellBus1 Feb 27, 2026
4cd83c9
Feat 1.0.0: Add curly braces to a conditional return statement.
HellBus1 Feb 27, 2026
1e46213
Feat 1.0.0: Comment the dead code
HellBus1 Feb 27, 2026
9ae255b
Merge pull request #14 from HellBus1/1.0.0
HellBus1 Feb 27, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 29 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
name: VentExpensePro CI

on:
pull_request:
branches:
- master
- staging

jobs:
build:
runs-on: ubuntu-latest

steps:
- name: Checkout code
uses: actions/checkout@v4

- name: Setup Flutter
uses: subosito/flutter-action@v2
with:
channel: 'stable'

- name: Install dependencies
run: flutter pub get

- name: Analyze project source
run: flutter analyze

- name: Run tests
run: flutter test
7 changes: 6 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -44,4 +44,9 @@ app.*.map.json
/android/app/release

*.env
*.freezed.dart
*.freezed.dart

google-services.json
GoogleService-Info.plist
firebase_options.dart
**/firebase_app_id_file.json
113 changes: 102 additions & 11 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,17 +1,108 @@
# vent_expense_pro
# VentExpensePro 📈

A new Flutter project.
**The Analog Digital Ledger** — A lightweight, privacy-first personal finance application built with Flutter.

## Getting Started
VentExpensePro combines the simplicity of a paper ledger with the power of modern digital tools. It is designed for users who want total control over their financial data without compromising on aesthetics or ease of use.

This project is a starting point for a Flutter application.
---

A few resources to get you started if this is your first Flutter project:
## ✨ Features

- [Learn Flutter](https://docs.flutter.dev/get-started/learn-flutter)
- [Write your first Flutter app](https://docs.flutter.dev/get-started/codelab)
- [Flutter learning resources](https://docs.flutter.dev/reference/learning-resources)
### 📒 Smart Ledger
* **Effortless Logging**: Add transactions in seconds with a streamlined interface.
* **Categorization**: Organize expenses and income with customizable categories.
* **Rich Details**: Track dates, notes, and payment methods for every entry.

For help getting started with Flutter development, view the
[online documentation](https://docs.flutter.dev/), which offers tutorials,
samples, guidance on mobile development, and a full API reference.
### 🏦 Account Management
* **Multi-Account Support**: Manage Bank accounts, Cash, Credit Cards, and Wallets in one place.
* **Net Position**: Instantly view your total financial standing across all accounts.
* **Credit Settlement**: Specialized workflow for settling credit card bills.

### 📊 Reports & Insights
* **Visual Analytics**: Understand your spending patterns with dynamic charts (fl_chart).
* **PDF Export**: Generate professional expense reports for sharing or archival.
* **Data Filtering**: Drill down into your data by date range or account.

### ☁️ Privacy-First Sync
* **Google Drive Sync**: Securely backup and sync your data using your own Google Drive.
* **App Data Scope**: Uses the `drive.appdata` hidden folder scope, ensuring your data is only accessible by the app.
* **Offline First**: Full functionality without an internet connection.

### 🎨 Premium Design
* **Flat Aesthetic**: A clean, modern "Flat Design" look that prioritizes readability.
* **Custom Typography**: Features *Lora* for elegance and *JetBrains Mono* for data precision.
* **Micro-Animations**: Smooth transitions and interactive elements for a premium feel.

---

## 🛠️ Tech Stack

* **Framework**: [Flutter](https://flutter.dev/) (3.11+)
* **State Management**: [Provider](https://pub.dev/packages/provider)
* **Local Database**: [Sqflite](https://pub.dev/packages/sqflite) (SQLite)
* **Dependency Injection**: [GetIt](https://pub.dev/packages/get_it)
* **APIs & Infrastructure**:
* Google Drive API (Backup/Sync)
* Firebase Crashlytics (Crash Reporting)
* **Analytics & Reporting**:
* [fl_chart](https://pub.dev/packages/fl_chart)
* [pdf](https://pub.dev/packages/pdf)

---

## 🚀 Getting Started

### Prerequisites
* Flutter SDK (^3.11.0)
* Android Studio / VS Code with Flutter Extension
* (Optional) Firebase account for Crashlytics

### Setup
1. **Clone the repository**:
```bash
git clone https://github.com/HellBus1/VentExpensePro.git
cd VentExpensePro
```

2. **Install dependencies**:
```bash
flutter pub get
```

3. **Run the application**:
```bash
flutter run
```

### Production Build (Android)
The project is configured with ProGuard obfuscation and resource shrinking for optimized release builds.

```bash
flutter build apk --release
```

*Note: For Crashlytics functionality, ensure `google-services.json` is placed in `android/app/`.*

---

## 🏗️ Architecture

The project follows a **Clean Architecture** pattern to ensure maintainability and testability:

- **`lib/domain`**: Core business logic, entities, and repository interfaces (Pure Dart).
- **`lib/data`**: Implementation of repositories, SQLite data sources, and external service integrations.
- **`lib/presentation`**: UI layer consisting of Screens, Widgets (Clean Flat Design), and Providers (State Management).
- **`lib/core`**: Application-wide configurations like Themes, DI setup, and Constants.

---

## 🔒 Privacy & Security

* **No Central Server**: Your financial data is never stored on our servers.
* **Encrypted Sync**: Cloud sync happens directly between your device and your private Google Drive space.
* **Obfuscation**: Production builds are obfuscated using R8/ProGuard to protect the application logic.

---

## 📄 License
This project is for personal use and portfolio demonstration. See `LICENSE` for details.
44 changes: 21 additions & 23 deletions analysis_options.yaml
Original file line number Diff line number Diff line change
@@ -1,28 +1,26 @@
# This file configures the analyzer, which statically analyzes Dart code to
# check for errors, warnings, and lints.
#
# The issues identified by the analyzer are surfaced in the UI of Dart-enabled
# IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be
# invoked from the command line by running `flutter analyze`.

# The following line activates a set of recommended lints for Flutter apps,
# packages, and plugins designed to encourage good coding practices.
include: package:flutter_lints/flutter.yaml

linter:
# The lint rules applied to this project can be customized in the
# section below to disable rules from the `package:flutter_lints/flutter.yaml`
# included above or to enable additional rules. A list of all available lints
# and their documentation is published at https://dart.dev/lints.
#
# Instead of disabling a lint rule for the entire project in the
# section below, it can also be suppressed for a single line of code
# or a specific dart file by using the `// ignore: name_of_lint` and
# `// ignore_for_file: name_of_lint` syntax on the line or in the file
# producing the lint.
rules:
# avoid_print: false # Uncomment to disable the `avoid_print` rule
# prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule
prefer_single_quotes: true
always_declare_return_types: true
annotate_overrides: true
avoid_empty_else: true
avoid_print: true
avoid_relative_lib_imports: true
avoid_unnecessary_containers: true
prefer_const_constructors: true
prefer_const_declarations: true
prefer_final_fields: true
prefer_final_locals: true
sort_child_properties_last: true
unnecessary_brace_in_string_interps: true
use_key_in_widget_constructors: true

# Additional information about this file can be found at
# https://dart.dev/guides/language/analysis-options
analyzer:
errors:
missing_return: error
dead_code: warning
exclude:
- "**/*.g.dart"
- "**/*.freezed.dart"
5 changes: 5 additions & 0 deletions android/.gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -12,3 +12,8 @@ GeneratedPluginRegistrant.java
key.properties
**/*.keystore
**/*.jks

# Firebase credentials
app/google-services.json
google-services.json

56 changes: 51 additions & 5 deletions android/app/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,12 +1,30 @@
import java.util.Properties

plugins {
id("com.android.application")
id("kotlin-android")
// The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins.
id("dev.flutter.flutter-gradle-plugin")
}

// Apply Google Services and Crashlytics only if google-services.json exists
if (file("google-services.json").exists()) {
apply(plugin = "com.google.gms.google-services")
apply(plugin = "com.google.firebase.crashlytics")
println("Google Services and Crashlytics plugins applied")
} else {
println("google-services.json not found. Skipping Google Services and Crashlytics plugins")
}

// Load signing properties (if available)
val keystorePropertiesFile = rootProject.file("key.properties")
val keystoreProperties = Properties()
if (keystorePropertiesFile.exists()) {
keystoreProperties.load(keystorePropertiesFile.inputStream())
}

android {
namespace = "com.example.vent_expense_pro"
namespace = "com.digiventure.ventexpensepro"
compileSdk = flutter.compileSdkVersion
ndkVersion = flutter.ndkVersion

Expand All @@ -19,9 +37,19 @@ android {
jvmTarget = JavaVersion.VERSION_17.toString()
}

signingConfigs {
if (keystorePropertiesFile.exists()) {
create("release") {
keyAlias = keystoreProperties["keyAlias"] as String
keyPassword = keystoreProperties["keyPassword"] as String
storeFile = file(keystoreProperties["storeFile"] as String)
storePassword = keystoreProperties["storePassword"] as String
}
}
}

defaultConfig {
// TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
applicationId = "com.example.vent_expense_pro"
applicationId = "com.digiventure.ventexpensepro"
// You can update the following values to match your application needs.
// For more information, see: https://flutter.dev/to/review-gradle-config.
minSdk = flutter.minSdkVersion
Expand All @@ -32,8 +60,26 @@ android {

buildTypes {
release {
// TODO: Add your own signing config for the release build.
// Signing with the debug keys for now, so `flutter run --release` works.
isMinifyEnabled = true
isShrinkResources = true
isDebuggable = false
signingConfig = if (keystorePropertiesFile.exists()) {
signingConfigs.getByName("release")
} else {
signingConfigs.getByName("debug")
}
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro"
)
ndk {
debugSymbolLevel = "FULL" // For Crashlytics native crash symbolication
}
}
debug {
isMinifyEnabled = false
isShrinkResources = false
isDebuggable = true
signingConfig = signingConfigs.getByName("debug")
}
}
Expand Down
Loading