Pursenal

Free, cross-platform personal and business finance manager with multi-profile support, double-entry accounting, and full offline operation.

47stars
6forks
Custom / Unknown
Dart

Pursenal is a free and open-source money management app built with Flutter that lets individuals and small businesses track income, expenses, and budgets across multiple financial profiles and currencies without ever touching the cloud. Built on a double-entry accounting model, it provides the kind of transaction accuracy typically found in professional accounting software while remaining accessible to everyday users managing household or freelance finances.

The app runs natively on Android, Windows, and Linux, offering a consistent experience across device types. All financial data is stored locally using a SQLite database managed by the Drift ORM, meaning users retain complete control over their information with no subscription requirements, no server dependencies, and no data sharing with third parties.

Pursenal goes beyond basic expense tracking with features like project-based income and cost attribution, multi-currency support, budget monitoring with visual analytics, and scheduled payment reminders. Its architecture follows MVVM conventions with clean separation of concerns, enabling the UI layer to remain fully decoupled from data persistence — a design that makes the codebase maintainable as the feature set continues to expand.

What You Get

  • Multi-Profile Management - Create and switch between separate financial profiles for personal and business use, keeping transactions, budgets, and reports fully isolated between profiles.
  • Double-Entry Accounting - Record every transaction with matching debit and credit entries across account types including wallets, banks, credit cards, loans, income, and expenses for audit-accurate financial records.
  • Multi-Currency Support - Track income and expenses in a wide variety of global currencies with per-currency reporting, making it suitable for international users and multi-currency business operations.
  • Project-Based Financial Tracking - Assign transactions to specific projects to measure profitability, track cash flow per initiative, and produce project-level financial summaries.
  • Budget Creation and Monitoring - Set spending budgets by category and visualize actual spending against budget limits with interactive charts showing progress in real time.
  • Visual Financial Analytics - Generate charts and reports from transaction history to surface spending patterns, income trends, and financial insights without requiring any external reporting tools.
  • Payment Reminders with Notifications - Schedule daily alerts tied to specific financial tasks, with deep-link navigation directly to the relevant screen when tapping a notification.
  • Offline-First Local Storage - All data is stored on-device via SQLite with no cloud sync, ensuring full functionality without internet access and complete user data sovereignty.

Common Use Cases

  • Freelancer separating personal and client finances - A freelancer creates two profiles in Pursenal — one for household expenses and one for client invoicing — keeping income, costs, and budgets strictly separated without needing two separate apps.
  • Small business owner tracking project profitability - A contractor assigns every material purchase and labor cost to a named project, then reviews the project summary to determine whether each job made or lost money.
  • Digital nomad managing multi-currency spending - A remote worker living across countries logs expenses in local currencies, tracks USD-denominated income separately, and reviews per-currency summaries to understand their true financial position.
  • Privacy-conscious user avoiding cloud finance apps - A user uncomfortable with uploading bank data to third-party services runs Pursenal entirely offline, keeping full control over their financial history with no account required.
  • Person managing recurring payment obligations - A user schedules daily reminders for rent, subscriptions, and loan payments to ensure nothing is missed, with each notification navigating directly to the relevant transaction screen.

Under The Hood

Architecture Pursenal implements strict MVVM architecture with a clearly directional data flow — Flutter Widget screens consume ChangeNotifier-based ViewModels that call abstract Repository interfaces, which are fulfilled by Drift-backed implementations. A RepositoryRegistry with type-safe generic dispatch acts as a lightweight service locator, caching repository instances and scoping data access through a ProfileProvider injected at construction time. The DriftIsolate API spawns the SQLite database in a separate isolate, ensuring database operations never block the UI thread. ProxyProvider wires repositories reactively into ViewModels, and the dependency graph is assembled at app startup through MultiProvider — keeping concrete dependencies out of screen and ViewModel code entirely.

Tech Stack Flutter SDK with Dart 3.5+ delivers native performance across Android, Windows, and Linux from a single codebase. Drift with the drift_flutter adapter provides compile-time-verified, type-safe SQL queries with reactive streams against a local SQLite database managed by sqlite3_flutter_libs. State management uses the Provider package with ProxyProvider for reactive dependency injection. fl_chart handles financial visualizations and flutter_animate provides motion. flutter_local_notifications with the timezone package powers timezone-aware reminders. The pdf and open_filex packages handle cross-platform report export. adaptive_theme manages dark and light mode switching, and build_runner with drift_dev generates the database schema and query layer at compile time.

Code Quality The codebase follows clean Flutter conventions with well-named ViewModels, screens, and repositories organized into distinct directories matching their architectural roles. Strong type safety is achieved through domain model classes with toDomain() conversion, sealed enums like LoadingStatus and PrimaryType, and Drift’s fully type-checked table definitions. AppLogger provides centralized, structured logging using the logger package. However, test coverage is extremely limited — the only test file contains a boilerplate counter smoke test that does not reflect the actual app. There are no unit tests for ViewModels, repository implementations, or business logic, and no CI configuration to enforce quality gates automatically.

What Makes It Unique Pursenal’s double-entry accounting model sets it apart from the vast majority of Flutter personal finance apps, which use simpler single-entry debit tracking. Implementing proper double-entry semantics — with distinct account types covering assets, liabilities, income, and expenses — brings bookkeeping-grade accuracy to a consumer mobile app. The DriftIsolate non-blocking database architecture is a sophisticated engineering choice for a personal finance app of this scope. The RepositoryRegistry generic service locator provides a clean, testable abstraction layer without requiring heavy dependency injection frameworks, keeping the wiring lightweight while maintaining full decoupling between data access and business logic.

Self-Hosting

Pursenal is released under the GNU General Public License v3 with additional custom terms layered on top. The base GPL v3 allows free use, modification, and redistribution — including for commercial purposes — provided that derivative works are also released under GPL v3. However, the author adds three restrictions beyond the standard GPL: all forks and modifications must credit the original project and link to the repository; forks may not use the name “Pursenal”; and selling copies or monetized versions requires explicit written permission from the author. This creates a source-available personal use and contribution license in practice, with commercial redistribution effectively gated behind author approval.

Self-hosting Pursenal in the traditional sense does not apply — it is a client-side mobile and desktop application, not a server you deploy. The application runs entirely on the end user’s device, with all data stored in a local SQLite database. There is no backend service to operate, no database server to maintain, and no infrastructure to provision. Operational responsibility consists solely of keeping the app updated on the devices where it is installed, managing local backups of the SQLite database file, and handling platform-specific build requirements (Flutter SDK, Dart SDK) if building from source rather than using a release binary.

There is no hosted or managed tier, no SaaS offering, and no cloud synchronization feature in Pursenal. Users who want to access their financial data across multiple devices must manage database file transfers manually. There is no automatic backup, no account-based data recovery, and no vendor support channel beyond GitHub issues. For users who need cloud sync, cross-device access, or professional support guarantees, a managed personal finance service like YNAB, Mint, or QuickBooks would provide those capabilities — Pursenal trades those conveniences for complete data ownership and zero subscription cost.

Join founders buildingwith open source

Opinionated takes, migration guides, cost-saving tips, and insights from the open source ecosystem.

Subscribe on Substack

No spam. Unsubscribe anytime.

Join 750+ subscribers
No spam. Unsubscribe anytime.

Search