kantorge/yaffa
YAFFA is a self-hosted personal finance manager built with Laravel. Track accounts, transactions, budgets, and investments; import bank statements; categorize spending; and generate reports through a clean, responsive web interface with multi-currency support.
YAFFA is a Laravel monolith (self-hosted personal-finance app), not a drop-in library. "Integration" means deploying the app and consuming its /api/v1 surface plus the UI — so the evaluation is about adopting a fast-moving, single-tenant application as a dependency. v4.1.0 lands three weeks after the 4.0.0 major and is a stabilisation release: no /api/v1 contract changes, no new migration of the 4.0 severity class, but it does carry three items that matter to us — an observability removal, a dependency-driven AI capability change, and a schema move for import profiles.
Architecture fit
.env config, queue/scheduler, Blade + Vue front end) — familiar to any Laravel team, low conceptual overhead.rrule column for schedules and budgets remains the right architectural direction: recurrence logic converges on one model and third-party RRULE tooling becomes applicable. 4.1 does not disturb it.preferred import profile moves from account_entities to accounts. This is a data-model correction (the preference belongs to the account, not the entity) but it means another schema/data migration and a possible change in how that field surfaces in exports or UI state. Treat any read of the old location as at-risk.Integration feasibility
/api/v1/* responses, and GET /api/v1/transactions/scheduled-items no longer accepts type=budget|budget_only|both|any. Silent-breaking for typed clients. 4.1 buys us nothing here — the client work is identical.ext-bcmath + Laravel 13 remain prerequisites from 4.0. 4.1's composer update and npm install do not relax them; they add churn on top.sentry/sentry-laravel. If our deployment model assumed the app ships its own error reporting, that assumption is now void and we must supply APM/error capture at the platform layer (container logs → our aggregator, or an SDK we inject).gpt-4o, gpt-4o-mini). AI document extraction is therefore coupled to a configurable, still-supported model. This converts an "internal feature" into a config-managed external dependency with its own lifecycle and cost profile.Technical risk
Budget rows and deleted from transactions; migrate:rollback cannot restore them. 4.1 does not change this. Anyone upgrading 3.x → 4.1 in one hop inherits the full risk in a single window.CACHE_PREFIX, REDIS_PREFIX, and SESSION_COOKIE defaults still log every user out and can orphan cache entries if unpinned. composer update in 4.1 makes it more likely, not less, that a loose constraint drifts onto a newer framework patch.ext-bcmath + exact decimal arithmetic still changes rounding behaviour by design — totals may differ by cents. Finance stakeholders notice before engineers do.gpt-4o/gpt-4o-mini, extraction fails or silently falls back. Treat as an unverified assumption until tested.package.json vulnerability reduction, plus the 4.0 XSS fix, TOTP + recovery codes, scoped tokens, and removal of unmaintained roach-php. Supply-chain posture is materially better than 3.x.Key questions
transactions, or on the type= filter for scheduled items? (Unchanged from 4.0 — still open.).env, and is it overridable without a code change? What is the fallback when extraction fails?account_entities.preferred_import_profile — exports, BI queries, saved reports, or our own scripts — and does the 4.1 migration preserve values?Stack fit
Migration path
composer update + npm install, plus the import-profile migration. Still rehearse on staging — the migration is small but not necessarily reversible.php artisan app:check:budget-migration in production read-only to size the 4.0 budget-transaction conversion.accounts column move; measure wall-clock time.Compatibility
CACHE_PREFIX, REDIS_PREFIX, and SESSION_COOKIE in .env before upgrading to preserve sessions and cache namespace.ext-bcmath; pin framework constraints tightly so 4.1's composer update cannot drift us onto an untested Laravel 13 patch.gpt-4o baseline.https Compose profile; add APP_PORT handling to deployment scripts.Sequencing
bcmath, Laravel 13, PHP baseline, no Sentry) → 2. .env prefix pinning + OpenAI model re-point → 3. staging rehearsal of migrations (budget conversion, pivot dedup, import-profile move) → 4. API client updates to string decimals and the removed type filter → 5. observability cutover and alert test → 6. production migration window → 7. verify reports, budget-vs-actual, reconciliation, and AI extraction → 8. roll out scoped API tokens and TOTP, retire shared credentials → 9. backfill the reCAPTCHA replacement and AI-document retention policy as follow-ups.Maintenance
composer update and npm install commits mean minor releases also carry dependency churn we must validate.roach-php and the Sentry SDK both reduce third-party surface; the Sentry removal trades supply-chain risk for operational blindness, which is a net loss unless we backfill.Support
Scaling
bcmath exact decimal arithmetic is slower per operation than native floats; benchmark the heaviest report rather than assuming a net win from the formatter caching.Failure modes
transactions return different numbers with no error.0 or truncated, or scheduled-items requests failing on the removed type param. Loud in typed clients, silent in loose ones.account_entities → accounts move if backfill is incomplete.Ramp-up
.env pinning, image rebuild, and staging rehearsal; add 2–3 days per API consumer for the bcmath/decimal-string changes; add 1 day for the 4.1 items (observability backfill, OpenAI model re-point, import-profile verification).APP_PORT changes, APP_KEY auto-generation behaviour, backup/restore drill, plus 1 day for the new logging/alerting pipeline replacing Sentry.How can I help you explore Laravel packages today?