tomatophp/filament-wallet
Manage account balances and wallets in FilamentPHP with actions to charge wallets, view transactions, and track balances, built on Bavix Wallet for easy integration with any model.
Architecture fit
This package is a thin Filament admin surface over bavix/laravel-wallet, not a wallet engine. It contributes four things: a plugin registration hook (FilamentWalletPlugin::make()), a WalletAction table action for crediting a balance, wallet/transaction list resources, and an install command that publishes Bavix migrations. All ledger semantics — balance arithmetic, transaction records, locking, atomicity — belong to Bavix. That boundary is the single most important fact for a TPM: the blast radius of this package failing or being abandoned is your admin UI, not your money. It is replaceable with a few hundred lines of Filament code against the same underlying library.
Fit is therefore narrow and legible. Good for Laravel 12/13 + Filament v5 panels that need an internal ops view of balances and a manual charge button. Poor for API-only products, non-Filament panels, or any flow where end users move their own money rather than admins.
Integration feasibility
Low technical effort, moderate governance effort. Four steps: composer require tomatophp/filament-wallet, run filament-wallet:install, register the plugin in the panel provider, and add the Wallet interface plus HasWalletFloat trait to the target model. A Filament-competent developer measures this in hours, not weeks. The optional filament-account bridge adds a model publish step and ->useAccounts() on the plugin.
The real work is not integration, it is hardening. Authorization, dual control, idempotency, reason capture, and reconciliation are all absent from the README. Assume you build them.
Technical risk
| Risk | Severity | Notes |
|---|---|---|
| Adoption signal | Medium | 38 stars, 0 dependents, no known production users. You are an early adopter and will find the edge cases yourself. |
| Monetary precision | High | README prescribes HasWalletFloat, and release v1.0.6 explicitly changed integer to float. Verify whether Bavix stores minor units as decimal strings or true floats before touching real currency. True float is a blocker. |
| Money-movement UI without stated controls | High | WalletAction credits a wallet from a table action. No documented ceilings, approvals, reason codes, or per-operator authorization. |
| Dual-branch maintenance | Medium | v5 line targets Filament v5 / Laravel 12–13; a separate v4 branch serves Filament v4. Two upgrade paths, two security surfaces. |
| Single maintainer | Medium | No SLA, no commercial backing. Mitigated cheaply by MIT licensing and small surface area — forking is realistic. |
| Release cadence anomalies | Low | Latest release dated 2026-09-14 with v1.0.x → v4.0.0 → v5.0.0 jumps suggests fast, low-ceremony versioning. Pin exact versions. |
Key questions
HasWalletFloat satisfy it for every currency we touch?Stack fit
Good when the panel already runs Laravel 12/13 + Filament v5 + Livewire 3 and the team already consumes TomatoPHP packages (this plugin integrates with filament-plugins and filament-account). Neutral when the team is Filament-fluent but new to Bavix — the learning curve is Bavix's transaction model, not this package. Poor when the panel is on Filament v3, when balances must be exposed via API, or when the organization requires vendor support contracts.
Migration path
charge actually writes to the Bavix transaction table, and how balances render after concurrent operations.WalletAction in your own controls: policy checks, per-operator amount ceilings, mandatory reason field, structured audit record capturing actor and before/after balance, and a duplicate-submission guard on the form.Compatibility
| Component | Notes |
|---|---|
| Laravel | 12/13 on the v5 line; confirm the v4 branch range before pinning that path |
| Filament | v5 on the v5 line; v4 on the v4 branch; v3 unsupported |
| Livewire | 3+ assumed. The action uses lazy() rather than live() since v4.0.0 — older Livewire is a risk |
| bavix/laravel-wallet | v11 and v12; v12 introduces a TransactionType enum on transactions |
| Database | Requires Bavix migrations; the package adds no schema of its own |
| filament-account | Optional; integration only registers when that package is present (fixed in v5.0.0) |
Sequencing The spike and the build-vs-adopt decision must land before any sprint commitment — that decision gates everything downstream. Then: (1) install and model traits in a staging panel, (2) authorization and audit hardening, (3) reconciliation job and alerting, (4) production rollout to a small ops cohort, (5) broader access once audit data looks clean for a full cycle. Do not sequence payment-gateway integration ahead of reconciliation; you would have no way to detect drift.
Maintenance
Low code volume, two ongoing obligations: tracking the v5 and v4 branches separately, and tracking Bavix majors (v11 → v12 already happened, and v12 changed the transaction model with the TransactionType enum). Budget 2–5 engineer-days per year for version bumps plus a manual regression pass over charge and transaction flows. Forking adds rebase cost, but the codebase is thin enough that this stays small. CI badges cover style and tests; there is no evidence of concurrency or money-path testing, so every upgrade needs a human in the loop.
Support Community-only — GitHub issues, no SLA, no commercial backing. The single-maintainer pattern is the dominant support risk, and mitigation is contractual rather than technical: name an internal owner for the package, document a fallback plan to replace the UI layer, and set expectations with stakeholders to "we fix it ourselves." Realistically, first response on an upstream issue should be assumed to be days or never.
Scaling
The package is an admin console, so its ceiling is operator throughput, not request volume. lazy() on the charge action means a round trip per interaction — fine for tens of charges a day, painful for bulk work. Any bulk credit, backfill, or data migration should bypass the UI entirely and call Bavix through queued jobs with idempotency keys. Watch the wallet and transaction list resources against large tables: confirm indexes on the underlying Bavix tables (wallet_id, created_at, uuid) before volumes grow, and add default date filters to the resources so ops does not scan full history.
Failure modes
HasWalletFloat may expose decimals without controlling storage precision.filament-wallet:install must successfully publish and run Bavix migrations; a partially applied install leaves the UI functional-looking but the schema incomplete (a namespace bug in the install command was fixed only in v5.0.0).filament-account is present but the model traits are not attached, ->useAccounts() produces a broken experience rather than a clean error.Ramp-up Engineer: 1–2 days to read the package, install it, and wire the action; 3–5 days for the spike including precision verification. Ops users: under an hour of training on the charge flow, plus a one-page runbook covering reason codes, approval thresholds, and what to do when a charge looks wrong. Support/finance: budget half a day to understand the reconciliation report and the drift alert. Total organizational ramp-up is under two engineer-weeks for the cautious path — small enough that the build-vs-adopt decision should be based on control requirements, not on effort.
How can I help you explore Laravel packages today?