Yaffa is a self-hosted personal finance application built with PHP and Laravel, designed for users who want full control over their financial data without relying on cloud-based services. It focuses on long-term planning through detailed transaction tracking, budgeting, and investment monitoring, making it ideal for privacy-conscious individuals and families managing complex finances.
The app leverages external APIs like Frankfurter for currency rates, AlphaVantage for investment pricing, and OpenAI/Gemini with Tesseract OCR for AI-powered transaction parsing from documents, emails, and images. It supports multi-currency, scheduled transactions, and account grouping, and is deployed via standard web server setups with MySQL or PostgreSQL.
What You Get
- Multi-currency support with automatic rate updates - Tracks income and expenses in multiple currencies with daily automatic updates via the free Frankfurter service, no API key required.
- AI-powered transaction parsing - Automatically extracts and pre-fills transaction details from uploaded PDFs, images, text files, emails, and Google Drive documents using OpenAI or Gemini with optional Tesseract OCR for image text extraction.
- Scheduled and recurring transactions - Define recurring income or expenses to generate forecasted financial projections and optionally auto-record them without manual input.
- Investment tracking with real-time pricing - Monitor investment portfolios by automatically fetching current prices via the AlphaVantage API (requires free API key registration).
- Transaction categorization and splitting - Split single transactions into multiple categories to analyze spending patterns and build accurate budgets.
- Account groups and multiple accounts - Organize bank accounts, cash, and other financial accounts into logical groups for consolidated views and reporting.
Common Use Cases
- Managing household finances across currencies - A family living in multiple countries uses Yaffa to track expenses in EUR, USD, and GBP with automatic exchange rate updates and consolidated dashboards.
- Tracking investments with automated pricing - An investor manually records stock purchases and uses AlphaVantage to auto-fetch current prices, calculating gains/losses without third-party brokerage access.
- Parsing receipts and bank statements with AI - A freelancer uploads scanned receipts and PDF statements; Yaffa uses OpenAI/Gemini to extract payee, amount, and date, reducing manual data entry by 70%.
- Planning long-term savings goals with recurring budgets - A young professional sets up monthly budgets and scheduled transfers to a savings account, using Yaffa’s forecasts to visualize progress toward a home down payment.
Under The Hood
Architecture
- Laravel-based MVC structure with clear separation between controllers, services, and models, leveraging traits like ModelOwnedByUserTrait for native multi-tenancy
- Dependency injection via constructor methods ensures loose coupling and testability across services and listeners
- Event-driven workflows decouple data ingestion from AI processing, enabling scalable and maintainable pipelines
- Custom traits and service providers provide reusable UI and domain utilities without controller bloat
- Middleware and policy-based authorization enforce access control at the HTTP and model layers, with resource classes abstracting API responses
- Modular directory structure follows Laravel conventions, organizing Jobs, Listeners, and Services for easy feature expansion
Tech Stack
- Laravel 12.48 backend with Sanctum for authentication, Telescope for debugging, and Sail for containerized development
- MySQL 8.0 with migrations and automated backup tooling
- Vite 7.3.0 with Vue 3.5.20 and Laravel-Vite-Plugin for hot-reloading frontend assets
- PHP tooling includes Pint, Larastan, and StyleCI for consistent code style and static analysis
- E2E testing via Laravel Dusk with Selenium and MailHog for email interception
- Frontend features Bootstrap 5, DataTables, Chart.js, and multiple visualization libraries for financial data
Code Quality
- Comprehensive test coverage spanning unit, feature, and browser-level scenarios with robust validation of API behavior and job logic
- Strong type safety and domain-specific exceptions ensure precise failure handling, particularly in AI schema validation
- Consistent naming and modular organization across layers enhance readability and maintainability
- Extensive use of Laravel’s testing utilities like RefreshDatabase and Queue mocking demonstrates mature testing practices
- Limited custom exception types in error-prone paths suggest inconsistent error classification, risking opaque failure modes
- Linting and static analysis are implied through clean code but lack explicit enforcement across the entire codebase
What Makes It Unique
- Native AI document processing pipeline with user-specific language and email triggers, fully integrated without external dependencies
- Dynamic, user-scoped validation rules that automatically enforce data isolation at the form level
- Client-side JavaScript utilities that inject route and translation data directly into the browser, eliminating REST overhead for dynamic UI updates
- Unified payee merging with configurable post-merge actions and real-time form synchronization via server-rendered selects
- Rich flash message system with metadata support, abstracting notification logic into a reusable trait while preserving session state
- Policy-based ownership enforcement baked into the model layer, ensuring multi-tenancy is foundational rather than additive