Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
16 commits
Select commit Hold shift + click to select a range
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
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
5 changes: 4 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -46,4 +46,7 @@ app.*.map.json
*.env
*.freezed.dart

google-services.json
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.
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
97 changes: 97 additions & 0 deletions android/app/proguard-rules.pro
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
# ──────────────────────────────────────────────────────────────────────────────
# VentExpensePro — ProGuard / R8 Rules
# ──────────────────────────────────────────────────────────────────────────────

# ── Flutter Engine ────────────────────────────────────────────────────────────
-keep class io.flutter.app.** { *; }
-keep class io.flutter.plugin.** { *; }
-keep class io.flutter.util.** { *; }
-keep class io.flutter.view.** { *; }
-keep class io.flutter.** { *; }
-keep class io.flutter.plugins.** { *; }
-dontwarn io.flutter.embedding.**

# ── Firebase Crashlytics ─────────────────────────────────────────────────────
-keepattributes SourceFile,LineNumberTable # Readable stack traces
-keep public class * extends java.lang.Exception # Keep custom exceptions
-keep class com.google.firebase.crashlytics.** { *; }
-dontwarn com.google.firebase.crashlytics.**

# ── Firebase Core ────────────────────────────────────────────────────────────
-keep class com.google.firebase.** { *; }
-dontwarn com.google.firebase.**

# ── Google Play Services / Auth ──────────────────────────────────────────────
-keep class com.google.android.gms.** { *; }
-dontwarn com.google.android.gms.**

# ── Google Drive API & HTTP Client ───────────────────────────────────────────
-keep class com.google.api.client.** { *; }
-keep class com.google.api.services.drive.** { *; }
-keep class com.google.http.** { *; }
-dontwarn com.google.api.client.**
-dontwarn com.google.api.services.**
-dontwarn com.google.http.**

# ── Gson (used by Google HTTP Client) ────────────────────────────────────────
-keepattributes Signature
-keepattributes *Annotation*
-dontwarn sun.misc.**
-keep class com.google.gson.** { *; }
-keep class * implements com.google.gson.TypeAdapterFactory
-keep class * implements com.google.gson.JsonSerializer
-keep class * implements com.google.gson.JsonDeserializer
-keepclassmembers,allowobfuscation class * {
@com.google.gson.annotations.SerializedName <fields>;
}

# ── SharedPreferences ────────────────────────────────────────────────────────
-keep class io.flutter.plugins.sharedpreferences.** { *; }
-keep class androidx.datastore.** { *; }
-dontwarn androidx.datastore.**

# ── SQFlite (SQLite) ─────────────────────────────────────────────────────────
-keep class com.tekartik.sqflite.** { *; }
-dontwarn com.tekartik.sqflite.**

# ── Path Provider ────────────────────────────────────────────────────────────
-keep class io.flutter.plugins.pathprovider.** { *; }

# ── Share Plus ───────────────────────────────────────────────────────────────
-keep class dev.fluttercommunity.plus.share.** { *; }
-dontwarn dev.fluttercommunity.plus.share.**

# ── PDF Generation ───────────────────────────────────────────────────────────
-keep class com.ril.pdf_box.** { *; }
-dontwarn com.ril.pdf_box.**

# ── Kotlin ───────────────────────────────────────────────────────────────────
-keep class kotlin.Metadata { *; }
-dontwarn kotlin.**
-dontwarn kotlinx.**

# ── Kotlin Serialization ────────────────────────────────────────────────────
-keepattributes *Annotation*, InnerClasses
-dontnote kotlinx.serialization.AnnotationsKt
-keepclassmembers class kotlinx.serialization.json.** {
*** Companion;
}
-keepclasseswithmembers class kotlinx.serialization.json.** {
kotlinx.serialization.KSerializer serializer(...);
}

# ── General ──────────────────────────────────────────────────────────────────
-keepattributes *Annotation*
-keepattributes Exceptions
-keepattributes InnerClasses
-keepattributes Signature
-keepattributes EnclosingMethod

# Suppress warnings for common third-party libraries
-dontwarn javax.annotation.**
-dontwarn org.codehaus.mojo.**
-dontwarn org.conscrypt.**
-dontwarn org.bouncycastle.**
-dontwarn org.openjsse.**
-dontwarn org.apache.http.**
-dontwarn android.net.http.**
3 changes: 2 additions & 1 deletion android/app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<uses-permission android:name="android.permission.INTERNET"/>
<application
android:label="vent_expense_pro"
android:label="VentExpensePro"
android:name="${applicationName}"
android:icon="@mipmap/ic_launcher">
<activity
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.example.vent_expense_pro
package com.digiventure.ventexpensepro

import io.flutter.embedding.android.FlutterActivity

Expand Down
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
5 changes: 5 additions & 0 deletions android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@color/ic_launcher_background"/>
<foreground android:drawable="@drawable/ic_launcher_foreground"/>
</adaptive-icon>
Binary file modified android/app/src/main/res/mipmap-hdpi/ic_launcher.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified android/app/src/main/res/mipmap-mdpi/ic_launcher.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified android/app/src/main/res/mipmap-xhdpi/ic_launcher.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
4 changes: 4 additions & 0 deletions android/app/src/main/res/values/colors.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="ic_launcher_background">#FFFFFF</color>
</resources>
8 changes: 8 additions & 0 deletions android/key.properties.example
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
## Release signing configuration for VentExpensePro
## Copy this file as `key.properties` and fill in your values.
## ⚠️ NEVER commit `key.properties` to version control!

storePassword=your_keystore_password
keyPassword=your_key_password
keyAlias=your_key_alias
storeFile=/path/to/your/keystore.jks
2 changes: 2 additions & 0 deletions android/settings.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@ plugins {
id("dev.flutter.flutter-plugin-loader") version "1.0.0"
id("com.android.application") version "8.11.1" apply false
id("org.jetbrains.kotlin.android") version "2.2.20" apply false
id("com.google.gms.google-services") version "4.4.2" apply false
id("com.google.firebase.crashlytics") version "3.0.3" apply false
}

include(":app")
Loading