ezBookkeeping is a self-hosted personal finance manager designed for users who want full control over their financial data without relying on cloud services. It targets individuals, homelab enthusiasts, and privacy-conscious users who need a robust yet lightweight tool to record transactions, import bank data, and visualize spending patterns. Built with Go and Vue.js, it runs efficiently on low-resource devices like Raspberry Pi and NAS systems.
The app supports Docker-based deployment with optional SQLite, MySQL, or PostgreSQL backends, and offers a responsive PWA interface that works seamlessly on mobile and desktop. Its architecture emphasizes minimal resource usage, multi-language support, and integration with external authentication systems like OIDC, making it ideal for technical users seeking a private, customizable alternative to commercial finance apps.
What You Get
- AI-Powered Receipt Image Recognition - Uses computer vision to extract transaction details from receipt images, reducing manual data entry.
- MCP (Model Context Protocol) Support - Enables integration with external AI models for automated categorization and financial insights.
- Multi-Currency & Exchange Rate Automation - Supports real-time exchange rate updates from multiple sources and automatic currency conversion.
- CSV/OFX/QFX/QIF/IIF/Camt.052/Camt.053/MT940/GnuCash/Firefly III/Beancount Import - Imports transaction data from 12+ bank and accounting formats without manual re-entry.
- Two-Level Accounts & Categories - Organize finances with hierarchical account structures (e.g., Income > Salary, Expenses > Groceries > Supermarket).
- Location Tracking with Maps - Automatically tags transactions with geolocation data from device GPS or manual map pinning.
- Scheduled Transactions - Automate recurring expenses and income entries with customizable recurrence rules.
- PWA with Mobile Home Screen Support - Install as a native-like app on iOS and Android with offline access and push notifications.
- Two-Factor Authentication (2FA) & WebAuthn - Secure access with TOTP and hardware key authentication, preventing unauthorized access.
- OIDC External Authentication - Integrate with identity providers like Keycloak, Auth0, or Azure AD for enterprise or family use.
- Dark Mode & Custom Date/Currency Formats - Tailor the UI and data display to regional preferences with full localization support.
- Application Lock (PIN/WebAuthn) - Add a device-level PIN or biometric lock to protect sensitive financial data on shared devices.
Common Use Cases
- Running a personal budget on a Raspberry Pi - A user deploys ezBookkeeping on a home server to track daily expenses without relying on cloud services, using AI receipt scanning to auto-capture grocery and gas purchases.
- Managing multi-currency expenses for digital nomads - A traveler records transactions in EUR, USD, and JPY with automatic exchange rate updates and visualizes spending trends across countries.
- Syncing bank data from multiple institutions - A user imports OFX files from their bank, QIF from credit cards, and MT940 from international transfers into a single dashboard for unified financial oversight.
- Securing financial data in a shared household - A family uses WebAuthn and application lock to ensure only authorized members can view or edit transaction records on a shared tablet.
Under The Hood
Architecture
- Clean layered architecture with Go backend separating concerns into distinct modules (datastore, log, storage, mail) using dependency injection for modular initialization
- Domain models are decoupled from UI concerns via explicit serialization and validation logic
- Vue 3 frontend employs component-based design with Pinia state management and typed props/emits, while utility classes enforce consistent theming via singleton patterns
- Backend and frontend are fully decoupled, communicating via REST with TypeScript interfaces enforcing API contracts
- Centralized configuration via INI files loaded into strongly-typed structs, with environment-aware service initialization using container patterns
Tech Stack
- Go backend powered by Gin, XORM, and Logrus with support for MySQL and SQLite
- Vue 3 frontend with Vuetify, Pinia, and TypeScript, built using Vite and configured for strict type safety
- Dockerized multi-stage builds with Alpine Linux, isolating Go and Node.js environments for optimized deployment
- Comprehensive testing stack using Jest with TypeScript and JSON-driven test data
- Middleware stack includes caching, compression, and JWT authentication for production-grade security and performance
Code Quality
- Extensive test coverage with data-driven test cases validating complex fiscal and calendar logic
- Strong type safety across frontend and backend through TypeScript and Go structs, reducing runtime errors
- Consistent, descriptive naming conventions improve readability and test maintainability
- Limited structured error handling; relies on native exceptions and undefined checks without custom error classes or centralized logging
- Linting and formatting tooling is implied but not explicitly configured in the codebase
What Makes It Unique
- Integrates LLM-powered transaction categorization directly into the accounting engine for context-aware auto-classification without external dependencies
- Implements a custom UUID generator embedding server metadata and client IP hashing to enable traceable audit trails in distributed systems
- Features a native financial charting engine with built-in support for non-Gregorian fiscal calendars and dynamic data aggregation
- Delivers mobile-first components with offline-first synchronization and native-like gesture interactions
- Uses SVG-based visualizations with dynamic stroke-dash and clip-path text rendering, eliminating external charting libraries
- Embeds Google Maps integration with on-demand script loading and click-to-geocode functionality directly within the accounting interface