ezBookkeeping

Lightweight self-hosted personal finance manager with AI receipt scanning, multi-currency support, and MCP integration for complete data privacy.

5.2Kstars
581forks
MIT License
Go

ezBookkeeping is a self-hosted personal finance application built for individuals and homelab enthusiasts who want full control over their financial data without cloud dependencies. Deployed with a single Docker command, it runs efficiently on Raspberry Pi, NAS devices, and MicroServers, making privacy-first bookkeeping accessible even on low-resource hardware.

The application offers dual interfaces optimized for both mobile and desktop, with PWA support so it can be pinned to a phone’s home screen and used like a native app. Its Go backend and Vue 3 frontend are fully decoupled, communicating through a typed REST API, which keeps the server lightweight while delivering a rich, responsive user experience.

Beyond basic expense tracking, ezBookkeeping integrates large language models for receipt image recognition—supporting providers like OpenAI, Anthropic, Google AI, Ollama, and LM Studio—and exposes a Model Context Protocol (MCP) server so AI assistants can query account balances, transactions, and exchange rates directly. It also ships with extensive import support covering more than a dozen bank and accounting formats, from OFX and QIF to MT940 and Beancount.

Security is treated seriously: two-factor authentication, WebAuthn hardware keys, OIDC single sign-on, application PIN lock, and login rate limiting are all built in. The result is a bookkeeping tool that rivals commercial alternatives in features while keeping every byte of financial data on infrastructure you own.

What You Get

  • AI Receipt Image Recognition - Plug in your preferred LLM provider (OpenAI, Anthropic, Google AI, Ollama, or LM Studio) to extract transaction details from receipt photos, cutting manual data entry to near zero.
  • MCP Server for AI Assistants - An optional Model Context Protocol server exposes your accounts, transactions, and exchange rates so AI tools like Claude Desktop can query your finances via natural language.
  • Multi-Format Bank Import - Import statements from CSV, OFX, QFX, QIF, IIF, Camt.052, Camt.053, MT940, GnuCash, Firefly III, Beancount, Alipay, WeChat Pay, Feidee MyMoney, JD.com, and custom scripts—covering virtually every bank and accounting ecosystem.
  • Automatic Multi-Currency Exchange Rates - Pull live rates from central banks worldwide (ECB, Bank of Canada, Norges Bank, and more) or define your own custom rates, with automatic currency conversion across all transactions.
  • Two-Level Accounts and Categories - Organize finances with hierarchical structures (e.g., Expenses > Food > Restaurants) and move transactions between accounts in bulk when needed.
  • Location Tracking with Maps - Tag transactions with GPS coordinates from your device or a map picker, with Leaflet-based maps and optional AMap integration for detailed geolocation.
  • Scheduled and Recurring Transactions - Automate repeating income or expense entries with flexible recurrence rules to keep budgets current without manual re-entry.
  • PWA with Home Screen Installation - Add the app to your iPhone or Android home screen for a native-like experience with offline access—no app store required.
  • Advanced Security Stack - TOTP two-factor authentication, WebAuthn hardware keys, OIDC external login (Nextcloud, GitHub, Gitea, Azure AD, Keycloak), application PIN/biometric lock, and per-IP login rate limiting.
  • Rich Analytics and Charting - Visualize spending with category breakdowns, trend lines, Sankey charts, bubble charts, and radar charts; export custom date ranges in multiple formats.
  • Tag Groups and Custom Filtering - Tag transactions with grouped labels and filter by included or excluded tags simultaneously for precise spending analysis.
  • Cross-Platform Single Binary - Runs on Windows, macOS, and Linux across x86, amd64, and ARM, making deployment straightforward whether on a NAS, MicroServer, or cloud VM.

Common Use Cases

  • Self-hosting a budget tracker on a Raspberry Pi - A privacy-conscious user deploys ezBookkeeping on a home server with SQLite, uses AI receipt scanning to auto-capture grocery and utility receipts, and reviews monthly spending via the built-in trend charts—all without sending data to any external service.
  • Managing multi-currency finances as a digital nomad - A remote worker living across Europe and Asia records transactions in EUR, JPY, and USD, relies on automatic ECB and Bank of Japan exchange rate updates, and uses the Sankey chart to visualize currency-adjusted spending by category.
  • Consolidating accounts from multiple banks - A user with accounts at three different banks imports MT940 from one, OFX from another, and a custom CSV from a credit union into a single unified dashboard, then reconciles balances with the built-in reconciliation statement tool.
  • Querying finances via an AI assistant - A user enables the MCP server and connects Claude Desktop, then asks natural-language questions like ‘What did I spend on food last month?’ and ‘Show my current account balances’—ezBookkeeping responds directly through the MCP protocol.
  • Securing family finances on a shared tablet - A household enables WebAuthn and application PIN lock so each family member must authenticate before accessing transaction records, while OIDC integration with a Nextcloud instance provides centralized login management.

Under The Hood

Architecture ezBookkeeping employs a clean layered architecture in Go, with the backend divided into clearly bounded packages—api, services, datastore, exchangerates, llm, mcp, converters, and uuid—each initialized through explicit container patterns and dependency injection rather than global state. The REST API layer delegates to service objects that coordinate between the datastore abstraction and external integrations, so adding a new exchange-rate source or LLM provider requires implementing a single interface without touching business logic. On the frontend, Vue 3 components are organized by domain (views, components, stores, router) with Pinia for reactive state and strongly typed props and emits throughout. The two layers communicate exclusively through a versioned REST API, which keeps the server a single Go binary while allowing the Vue frontend to be served as a fully static PWA.

Tech Stack The Go backend is built on Gin for HTTP routing, XORM for database access across SQLite, MySQL, and PostgreSQL, and Logrus for structured logging. JWT authentication, gocron for scheduled tasks, and the Minio client for S3-compatible object storage round out the backend dependencies. The Vue 3 frontend pairs Vuetify 3 for material-design components with Framework7 for the mobile-optimized views, ECharts for data visualization, Leaflet for maps, and vue-i18n for the 20-plus supported languages. Vite handles builds, vitest and Jest cover unit tests, and a Dockerfile produces multi-stage Alpine images that separate the Go and Node.js build environments for minimal production image sizes. The LLM subsystem supports five provider backends—OpenAI, Anthropic, Google AI, Ollama, and LM Studio—through a common interface, making the AI tier swappable at config time.

Code Quality ezBookkeeping has an extensive Go test suite with over 900 test functions covering exchange rate parsers, calendar logic, fiscal year calculations, UUID generation, and converter round-trips using data-driven table tests. The TypeScript frontend includes vitest tests for calendar computations, math utilities, and text normalization, with fixture files driving broad input coverage. Go structs and TypeScript interfaces enforce type safety across both layers. Error handling in Go follows idiomatic patterns with typed error constants in the errs package, though frontend error paths rely primarily on Axios response checks rather than a unified error class hierarchy. ESLint with vue and typescript plugins enforces frontend code style, and CI via GitHub Actions runs builds and tests on every commit.

What Makes It Unique ezBookkeeping’s combination of built-in MCP server support and multi-provider LLM receipt recognition sets it apart from every other self-hosted finance tool. Rather than relying on third-party integrations, the MCP layer exposes structured financial queries directly to AI assistants, enabling natural-language expense analysis without any data leaving the self-hosted environment. The custom UUID generator embeds a server ID and sequential counter in each transaction ID, supporting multi-instance deployments with traceable audit identities. The import subsystem’s breadth—covering Camt, MT940, Beancount, Alipay, WeChat Pay, and Feidee alongside standard OFX and QIF—reflects genuine investment in covering real-world bank ecosystems across Asia and Europe, not just Western markets. Support for non-Gregorian calendars (Persian Jalali, Chinese lunisolar) within the charting engine is similarly rare and reflects a genuinely internationalized design rather than a bolted-on translation layer.

Self-Hosting

ezBookkeeping is released under the MIT License, which is one of the most permissive open-source licenses available. You are free to use it commercially, modify the source code, distribute your changes, and run it for any purpose—personal, business, or otherwise—without paying royalties or notifying the original author. The license imposes only one condition: the original copyright notice must be included in any distribution. There are no copyleft requirements, so integrating ezBookkeeping into a proprietary product does not require you to open-source your own code.

Running ezBookkeeping yourself means taking full ownership of the operational stack. The application ships as a single Go binary or a Docker image, and getting it running takes minutes. For long-term production use, however, you will need to plan for database backups (SQLite file snapshots, or your MySQL/PostgreSQL backup strategy), OS and dependency updates, TLS certificate renewal, and monitoring for process health. The application does not include built-in clustering or high-availability features, so if the host machine goes down, the service is unavailable until it recovers. Users running it on a Raspberry Pi or NAS accept that trade-off in exchange for zero hosting costs and complete data locality.

There is no hosted SaaS version or paid commercial tier for ezBookkeeping—the project is entirely community-funded and maintained by its author and contributors. This means there is no vendor-managed upgrade path, no SLA, no official support contract, and no cloud backup service. What you gain is total control: your financial data never touches an external server, and you can inspect, modify, or extend every line of code. For users who want managed hosting or professional support, the recommended path is to either self-manage the deployment with standard DevOps tooling or hire a systems administrator familiar with Go-based applications.

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