Actual is a local-first personal finance application designed for users who want full control over their financial data without relying on cloud services or paid subscriptions. Built with Node.js and TypeScript, it offers a robust envelope budgeting system that works offline by default but can sync across devices via self-hosted or managed servers. Unlike traditional budgeting apps that lock your data behind paywalls, Actual is 100% free and open-source, with all data stored locally unless you choose to enable syncing. This makes it ideal for privacy-conscious individuals, tech-savvy users, and those who distrust corporate financial platforms. The app supports Windows, macOS, Linux via downloadable apps, and can also be deployed using Docker or managed hosting services like Fly.io and PikaPods.
What You Get
- Local-first data storage - All your financial data is stored on your device by default, ensuring privacy and eliminating dependency on third-party servers.
- Cross-device sync via self-hosting - Use Docker or Fly.io to run your own sync server, allowing seamless budget updates across multiple devices without cloud intermediaries.
- Envelope budgeting system - Implements the popular envelope method where you allocate funds to categories and track spending against limits in real time.
- Multi-platform support - Native desktop apps for Windows, macOS, and Linux, plus Docker images and managed hosting options for advanced users.
- Open-source and community-driven - Fully transparent codebase with active community contributions, translations via Weblate, and public feature voting on GitHub.
Common Use Cases
- Building a private household budget without cloud reliance - A family wants to track expenses and stick to a monthly envelope budget but refuses to upload sensitive financial data to third-party services; they install the desktop app and use local storage for complete control.
- Migrating from Mint or YNAB to a free, open alternative - A user tired of subscription fees and data privacy concerns in YNAB or Mint exports their CSV data from their old app, imports it into Actual using the migration guide, and continues budgeting with full ownership of their data.
- Privacy-focused individual managing multiple accounts - A freelancer with bank accounts in different countries uses Actual’s desktop app to track income and expenses across currencies, then syncs the data securely between their laptop and tablet using a self-hosted Docker instance on a home server.
- DevOps teams deploying budgeting tools internally - A small company provides Actual as a self-hosted internal tool for employees to manage personal finances, using the official Docker image with reverse proxy and TLS via Nginx for secure access within their network.
Under The Hood
The Actual budgeting application is a modular, monorepo-based system designed for local-first personal finance management with support for both web and desktop environments. It emphasizes collaborative features, real-time data synchronization, and extensible architecture through shared components and APIs.
Architecture
This system adopts a layered monorepo structure with well-defined workspaces for distinct functional areas such as API, UI, and synchronization logic.
- The architecture separates core business logic from UI and sync layers, enabling maintainable and scalable development.
- Component composition is achieved through a shared library and modular configuration using lage and vitest for orchestration.
- CRDT-based conflict-free data synchronization is a key architectural element supporting real-time collaboration.
Tech Stack
The project is built primarily with TypeScript and React, leveraging modern web development tools and frameworks.
- The frontend utilizes React ecosystem libraries including react-aria-components and emotion for styling, with a strong emphasis on type safety.
- Development and build tools include Yarn workspaces, Vite, and Lage for task orchestration, ensuring a streamlined development workflow.
- Testing is handled via Vitest, Playwright, and Storybook, offering comprehensive coverage from unit to end-to-end scenarios.
Code Quality
The codebase reflects a mature testing approach with extensive unit and end-to-end test coverage across multiple packages.
- Error handling is consistently implemented using try/catch blocks and custom error types, although some redundancy exists in test setup.
- Code style remains reasonably consistent with TypeScript practices, though technical debt is present in areas like duplicated configuration logic.
- The modular structure supports clean development but introduces some complexity in test initialization and mocking patterns.
What Makes It Unique
The project distinguishes itself through its combination of real-time collaboration and modular design for multi-platform support.
- CRDT-based synchronization enables seamless real-time updates across distributed clients without central coordination.
- The modular monorepo allows shared UI components and backend services to power both web and desktop applications.
- Strong use of TypeScript ensures type safety and reduces runtime errors in a complex, multi-platform application.
- Emphasis on developer experience is evident through detailed documentation, contribution guidelines, and tooling support.