Pursenal is a cross-platform personal and business finance manager designed for users who need to track transactions, set budgets, and analyze spending across multiple financial profiles. It solves the problem of fragmented financial tracking by offering unified, offline-capable money management with support for personal and business accounts in different currencies.
Built with Flutter and Drift, Pursenal provides a native-like experience on Android, Windows, and Linux. It uses a double-entry accounting system for accuracy and stores data locally for offline use, making it ideal for privacy-conscious users who want full control over their financial data without cloud dependency.
What You Get
- Multi-Profile Support - Manage separate financial profiles for personal and business finances, keeping transactions, budgets, and reports isolated and organized.
- Multi-Currency Support - Track income and expenses in multiple currencies with automatic conversion and reporting per currency.
- Double-Entry Accounting System - Record transactions with debits and credits to ensure accurate, audit-ready financial records for personal or business use.
- Comprehensive Transaction Tracking - Log cash, bank, credit card, and loan transactions with categories, dates, and notes for detailed financial history.
- Budget Management with Visual Analytics - Create budgets and visualize spending against limits using interactive charts and reports.
- Projects Feature - Assign income and expenses to specific projects to track profitability and cash flow for individual initiatives.
- Notifications & Reminders - Set daily alerts to remind you of bill payments, budget limits, or financial tasks to stay on track.
- Offline-First Design - All data is stored locally on the device with no cloud dependency, ensuring privacy and access without internet connectivity.
Common Use Cases
- Managing personal and business finances separately - A freelancer uses Pursenal to track personal expenses and client income in different profiles, avoiding commingled funds.
- Tracking project-based income and costs - A small business owner assigns all expenses and revenues from a client project to a single project in Pursenal to calculate net profit.
- Global users managing multiple currencies - A digital nomad records income in USD, expenses in EUR, and savings in GBP, with Pursenal automatically handling currency conversion and reporting.
- Privacy-focused individuals avoiding cloud apps - A user who refuses to upload financial data to third-party services uses Pursenal’s offline storage to maintain full control over their data.
Under The Hood
Architecture
- MVVM architecture enforces clear separation between UI (Flutter Widgets), state (ViewModels), and data (domain models) using Provider for reactive state management and dependency injection
- Repository pattern abstracts data persistence with interfaces and Drift-based implementations, isolating database logic from business logic
- Database operations run on isolates via DriftIsolate and SQLite3FlutterLibs, ensuring UI responsiveness without blocking the main thread
- Dependency injection is managed through ProxyProvider and direct Provider instantiation, decoupling repository construction from concrete implementations
- UI components consume ViewModels directly, leveraging FlChart and Flutter Animate for rich, animated visualizations with consistent theming and localization
Tech Stack
- Flutter SDK with Dart 3.5+ forms the foundation for cross-platform consistency across mobile, web, and desktop
- State management and persistence rely on Provider, Drift, and drift_flutter for type-safe, reactive SQLite operations
- Enhanced device integration is achieved through flutter_local_notifications, image_picker, file_picker, and pdf plugins
- Build tooling includes build_runner and drift_dev for code generation, alongside flutter_lints for strict code quality enforcement
- Cross-platform asset and icon generation is handled via flutter_launcher_icons with adaptive icons and PWA metadata support
- Localization and theming are powered by flutter_localizations and adaptive_theme, with custom typography using NotoSans and Poppins
Code Quality
- Modular code organization follows Flutter best practices with well-defined layers for core, widgets, screens, and utils
- Strong type safety is maintained through domain models, sealed enums, and encapsulated value objects
- Centralized logging with AppLogger ensures traceable error handling, though custom error classes are absent
- Consistent naming and structure improve readability and maintainability
- Test coverage is limited, with no unit or integration tests for repositories, viewmodels, or core business logic
What Makes It Unique
- Native Drift isolate integration enables non-blocking, background database operations without external dependencies
- Custom repository abstraction with ProxyProvider creates a clean, testable MVVM pipeline that decouples data sources from business logic
- Timezone-aware notifications with deep-linking to specific screens provide context-aware user reminders
- Domain-driven value objects with automatic toDomain() conversion enforce business rules at the data layer
- Granular LoadingStatus enum and real-time budget visualization via collection extensions deliver nuanced UI feedback tailored to financial workflows