Actual

Local-first personal finance with envelope budgeting, end-to-end encryption, and multi-device sync — no subscription required.

27.4Kstars
2.6Kforks
MIT License
TypeScript

Actual is a free, open-source personal finance application built around the envelope budgeting method. Unlike cloud-based alternatives, it stores all financial data locally on your device by default, giving you full ownership and privacy over your money without ever sending sensitive information to a third party. An optional self-hosted sync server lets you move changes across devices without any central service having access to your unencrypted data.

The project is organized as a TypeScript monorepo with clearly separated packages: loot-core for the platform-agnostic business logic, desktop-client for the React web and Electron UI, sync-server for the Node.js synchronization backend, and a public API package for programmatic access. A custom spreadsheet engine backed by reactive cell dependencies powers the budget calculations, making the entire budget feel like a live, formula-driven document that updates in real time as transactions flow in.

Actual supports automatic bank feeds via goCardless for European banks and SimpleFIN for US and Canadian institutions, a scheduled-transaction engine for recurring bills, goal-template scripting inside budget categories, and a growing dashboard of custom reports including net worth, cash flow, spending breakdowns, and a balance-forecast projection. The application ships as downloadable desktop apps for Windows, macOS, and Linux, a self-hosted web server deployable with Docker, and managed hosting options through Fly.io and PikaPods.

With over 27,000 GitHub stars, 460+ contributors, and monthly releases that have shipped without interruption for more than three years, Actual has become the most actively maintained open-source personal finance application available today.

What You Get

  • Envelope Budgeting Engine - A reactive spreadsheet-backed budget where every dollar is assigned to a category before it is spent, with automatic carryover of overspending and underspending month to month.
  • Local-First Data Storage - All budgets and transactions are stored in a SQLite database on your own device; no account or internet connection is needed to view or edit your data.
  • End-to-End Encrypted Sync - Optional synchronization across phones, tablets, and computers uses a CRDT-based conflict resolution algorithm and encrypts data before it leaves the device, so the sync server never sees plaintext.
  • Automatic Bank Feeds - Connect European bank accounts via goCardless, North American accounts via SimpleFIN, New Zealand accounts via Akahu, or EU accounts via EnableBanking to import transactions automatically without CSV exports.
  • Goal Templates and Scheduled Transactions - Write declarative budget goals directly in category notes using a mini-language, and define recurring bills as schedules so Actual can pre-fill expected transactions automatically.
  • Custom Report Dashboard - Build a personal dashboard from widgets including net worth, cash flow, spending by category, budget analysis, balance forecast, age of money, and a Sankey spending flow — all computed locally from your own data.
  • YNAB Migration Importer - Import complete transaction history from YNAB 4 or YNAB 5 (nYNAB) with categories, payees, and split transactions preserved, enabling a zero-loss migration.
  • Public API and CLI - Automate budget management, run queries against your data, or build integrations using the official JavaScript API package or the command-line client included in the monorepo.

Common Use Cases

  • Privacy-first household budgeting - A couple tracks every shared expense in Actual running on a home server, confident that their complete transaction history never leaves their own network while still being accessible from both laptops.
  • YNAB refugee migration - A long-time YNAB subscriber exports five years of budget history and imports it directly into Actual using the built-in YNAB 5 importer, retaining all categories and transactions without paying another annual fee.
  • Multi-country freelancer - A freelancer living across EU and US jurisdictions connects both goCardless European accounts and SimpleFIN US accounts to a single Actual budget, reconciling income and expenses in multiple currencies from one interface.
  • Developer-driven financial dashboard - A software engineer uses the Actual API to query budget data programmatically, pipe spending summaries into a home automation system, and receive weekly spending alerts via a custom webhook script.
  • Debt payoff tracking - A family working through the debt snowball method uses scheduled transactions and goal templates to automatically project payoff dates and flag months where spending in discretionary categories risks delaying debt repayment.
  • Air-gapped financial record keeping - A privacy-conscious user runs Actual in local-only mode with no sync server, using it purely as an offline ledger and exporting periodic CSV backups for archival purposes.

Under The Hood

Architecture Actual is structured as a Yarn-workspace monorepo with explicit package boundaries enforced at the build level using LAGE, a task pipeline runner that understands dependency graphs between packages. The core business logic lives in loot-core, a platform-agnostic library that runs identically in Electron, the browser, and Node.js through a thin platform shim layer that swaps filesystem, SQLite, and networking implementations at build time. On top of this sits a handler-based RPC architecture where the UI sends named method calls to a background worker running the core, keeping all database access off the main thread. The sync layer uses a Conflict-free Replicated Data Type (CRDT) clock based on hybrid logical timestamps and a Merkle trie for efficient diff detection, allowing multiple devices to converge on a consistent state even after being offline for extended periods.

Tech Stack The entire project is written in TypeScript 6 with strict mode enabled across all packages, and linting is handled by oxlint and oxfmt rather than the traditional ESLint/Prettier combination, reflecting a deliberate choice of high-performance Rust-based tooling. The frontend is a React application bundled by Vite, styled with a proprietary component library backed by Emotion CSS-in-JS, and using TanStack Query for server-state management. Budget calculations run inside a custom reactive spreadsheet engine where cells declare named dependencies and recompute lazily when upstream values change, implemented entirely in TypeScript without any third-party spreadsheet library. The sync server is a Node.js application that can be containerized with Docker or deployed to Fly.io, and uses better-sqlite3 for local storage and Protocol Buffers for binary sync message serialization. End-to-end testing uses Playwright against both the browser build and the Electron desktop app.

Code Quality With 151 test files spanning unit, integration, and end-to-end scenarios, the project maintains comprehensive automated coverage including snapshot tests for the AQL query compiler, property-based validation tests for the CRDT timestamp and Merkle trie implementations, and Playwright visual regression tests for UI components. Type safety is enforced with strict TypeScript across all packages, and the codebase uses discriminated union types extensively for error modeling rather than throwing untyped exceptions. CI runs typecheck, lint, and the full test suite on every pull request across multiple platform targets. The monorepo includes a dedicated eslint-plugin-actual package that encodes project-specific lint rules for import ordering, i18n string usage, and TypeScript path conventions.

What Makes It Unique The most distinctive technical choice is the reactive spreadsheet engine that powers the envelope budget: budget cells are named nodes in a dependency graph that recompute automatically when transactions are added or categories are modified, giving the UI live budget figures without polling or manual refresh triggers. Layered on top is a goal-template mini-language — parsed using a PEG grammar — that lets users write declarative rules like “budget 3 months of expenses” or “fill to scheduled amount” directly in category notes, with the engine evaluating them on each budget application pass. The CRDT sync implementation uses a Merkle trie over base-3 representations of hybrid logical clock timestamps, enabling sub-millisecond identification of the earliest divergence point between two device states — a space-efficient approach that avoids transmitting full operation logs on reconnection.

Self-Hosting

Actual is released under the MIT License, which is one of the most permissive open-source licenses available. This means you can use it commercially, modify the source code, redistribute it, and even embed it inside proprietary products without any obligation to publish your changes. There is no copyleft requirement, no contributor license agreement, and no open-core restrictions — the version on GitHub is the complete application with no features withheld.

Running Actual yourself requires either a local desktop installation or a server to host the sync component. The desktop apps for Windows, macOS, and Linux are self-contained and need no server at all; if you want multi-device sync, you deploy the sync-server package, which is a lightweight Node.js process that can run in a Docker container with roughly 256 MB of RAM and minimal CPU. You are responsible for keeping the server updated with each monthly release, configuring TLS termination through a reverse proxy like Caddy or nginx, managing backups of the SQLite database files, and handling any downtime. The project ships a Docker Compose file and Fly.io configuration to reduce setup friction, but operational responsibility — uptime, data durability, access control — rests entirely with you.

Actual has no official paid or SaaS tier maintained by the core team. Third-party managed hosting is available through PikaPods and Fly.io at low per-month costs, both of which handle server maintenance and updates on your behalf. Compared to managed options, self-hosting gives you complete data isolation and zero recurring software cost, but you trade away automated backups, guaranteed uptime SLAs, and platform-managed upgrades. There is no commercial support contract available; community support flows through the Discord server and GitHub issues, with response times dependent on volunteer availability.

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