A modern desktop application built with PyQt6 to help students manage their personal finances, track expenses, set monthly budgets, and gain insights through interactive reports.
- Secure user registration and login system
- Password hashing with SHA-256 for local security
- Support for username, email, or phone-based login
- Fully isolated user data directories
- Real-time budget KPI cards (Monthly Budget, Total Spent, Remaining)
- Visual budget usage progress bar
- Quick-add expense form with custom categories
- Recent activity ledger showing latest 12 transactions
- Complete transaction ledger with advanced filtering
- Search by description keywords
- Filter by category, start date, and end date
- One-click deletion of records
- Automatic unique ID generation
- Set and modify monthly spending limits
- Visual progress bars for each spending category
- Color-coded alerts (green → amber → red) based on spending levels
- Automatic budget status monitoring
- Interactive Matplotlib donut chart showing category breakdown
- Spending rankings by category
- Month-over-month (MoM) spending comparison
- Export reports as PDF or TXT files
| Component | Technology |
|---|---|
| GUI Framework | PyQt6 |
| Backend Logic | Python 3 |
| Data Storage | CSV Files (per-user directories) |
| Charts & Graphs | Matplotlib |
| Password Security | SHA-256 Hashing |
PennyPal/
├── main.py # Main application entry point
├── user_manager.py # User registration, login, credentials management
├── database_manager.py # CSV database operations (expenses, budgets)
├── finance_engine.py # Financial calculations, filtering, budget analysis
├── logo_widget.py # Custom PennyPal logo widget
├── ui_login.py # Login screen UI
├── ui_signup.py # Registration screen UI
├── ui_dashboard.py # Main dashboard UI
├── ui_transactions.py # Transaction ledger UI
├── ui_budgets.py # Budget management UI
├── ui_reports.py # Financial reports & charts UI
├── test_backend.py # Backend functionality test script
└── data_base/ # User data directory (created automatically)
├── UserData.csv # User credentials (legacy format)
└── users/ # Per-user expense data folders
- Python 3.8+
- PyQt6
- Matplotlib
- pandas (for legacy login module)
# Clone the repository
git clone https://github.com/yourusername/PennyPal.git
cd PennyPal
# Install required dependencies
pip install PyQt6 matplotlib pandas
# Run the application
python main.py# Test backend functionality (user registration, database operations)
python test_backend.py| Screen | Purpose |
|---|---|
| Login | User authentication with secure password verification |
| Sign Up | Create a new student account |
| Dashboard | Overview of budget health, quick expense entry |
| Transactions | Full ledger with advanced filtering & deletion |
| Budgets | Set monthly limits, view category progress |
| Reports | Visual analytics, PDF/TXT export |
Each user gets a separate folder (data_base/users/{username}/) with their own CSV files. This ensures complete data privacy between accounts.
The database folder is anchored relative to the project folder (os.path.dirname(os.path.dirname(os.path.abspath(__file__)))), preventing the issue where running from different directories creates duplicate data folders.
Expenses are stored in separate CSV files per category (e.g., food.csv, rent.csv). This design makes data retrieval fast and allows for easy expansion of custom categories.
All views (Dashboard, Transactions, Budgets, Reports) are connected via signals and slots, so adding a transaction or updating a budget instantly refreshes all screens.
from database_manager import DatabaseManager
from finance_engine import FinanceEngine
# Create session for user "john"
db = DatabaseManager(username="john")
engine = FinanceEngine(db)
# Log an expense
db.add_expense("2026-08-24", "Food", 15.50, "University cafeteria meal")
# Get budget status for August 2026
status = engine.get_budget_status("2026-08")
print(status)db.save_budget(1200.00, "2026-08")- Passwords are stored as SHA-256 hashes, never plaintext
- No external network calls — all data stays locally on your device
- User sessions are fully isolated
The test_backend.py script verifies:
- User registration and login flow
- Database manager initialization
- Expense logging and retrieval
- Budget calculation engine
- Built as a modular desktop application demonstrating clean separation of backend logic and PyQt6 UI components
- Inspired by modern fintech UI design patterns
This project is open-source and available for educational purposes. Feel free to use, modify, and contribute!
Made with 💚 for students managing their finances.