ymsoft/filament-money
Filament Money provides currency-aware money input fields and table columns for Laravel Filament admin panels, making it easy to enter, format, and display monetary values consistently with locale-friendly output.
Architecture fit. ymsoft/filament-money is a narrow, single-concern plugin that sits in the presentation/storage boundary of a Filament admin panel: it supplies a form field (masked decimal input, currency selector, locale-aware formatting) plus a cast or accessor/mutator pair that translates between the database column and a money value object. That is the correct shape for this problem — money handling in Filament is a known rough edge, because Filament's stock TextInput and TextColumn treat values as floats or raw strings, and naive ->numeric() fields leak binary floating-point error into financial data. As a TPM I would position this package as a thin convenience layer, not an accounting engine: it should not be relied upon for tax calculation, FX conversion, or ledger postings.
Architecturally the important question is what it delegates to. If it depends on moneyphp/money or brick/money, we inherit a battle-tested value object with correct minor-unit arithmetic and ISO 4217 currency metadata, and the plugin is genuinely low-risk glue. If it rolls its own value object or — worst case — performs arithmetic on floats internally, the plugin becomes a liability hiding behind a nice UI. The repository metadata does not answer this, and it is the first thing to verify in code review.
Integration feasibility. Composer-installable, Laravel package auto-discovery, MIT licensed — no procurement or legal friction. Integration is expected to be three lines: composer require, register the plugin on the Panel in the PanelProvider, and swap TextInput/TextColumn for the package's field classes. A php artisan vendor:publish step for config (default currency, locale, symbol placement, decimal separator) is likely. Realistically a competent Laravel developer completes a spike in half a day.
The non-trivial work is not the package — it is our schema. If the plugin assumes integer minor units stored in a BIGINT column, that is the correct design but may not match existing DECIMAL(10,2) columns; if it assumes DECIMAL, it is simpler to adopt but constrains us to two-decimal currencies and complicates future FX. Either way, adoption triggers a data-shape decision, backfill, and a validation pass against production data.
Technical risk. The dominant risk is not technical, it is provenance. Ten stars, zero dependents, and a single-author GitHub account means effectively zero production validation and a bus factor of one. A recent release date is reassuring for activity but tells us nothing about correctness under load or across currency edge cases. Specific technical risks to close out before committing:
TextColumn money formatting is display-only; verifying that sorting still hits the underlying numeric column rather than a formatted alias is essential for admin usability at scale.Key questions for the maintainer or code review: Which money library, if any, is the arithmetic dependency? What is the declared support matrix across Filament, Livewire, Laravel, and PHP? What is the storage contract (minor units vs decimal, column type, currency column location)? Is multi-currency supported, and is there any FX or conversion surface (there should not be)? What is the test suite coverage on currency edge cases, and is there CI? What is the deprecation/BC policy?
Stack fit. Excellent, if we are already on Filament. It is a same-vendor, same-ecosystem package with no new runtime dependency beyond the underlying money library and no new infrastructure. For a Laravel/TALL-stack product this is the lowest-friction category of dependency: no service, no container, no external call. It fits cleanly into the existing App\Filament\Resources layer without touching domain or persistence code, provided we keep monetary rules (pricing, tax, discounting) in our own domain services and use the package only for input, cast, and display.
Migration path. Sequence it as a bounded pilot rather than a horizontal rollout:
composer.json with a documented upgrade owner; capture the resolved version in the ADR.DECIMAL(10,2) and the package wants minor units, do not convert in place. Add parallel columns, dual-write, verify parity with a reconciliation query, then cut over and drop the old columns in a separate release.MoneyCast and MoneyInput aliases (or a thin App\Support\Money facade) so resources reference our classes, not Ymsoft\... directly. This is the single highest-value step: it converts a bus-factor-one dependency into a swappable implementation detail.Compatibility. Treat the Filament major version as the hard gate. If our panel is on Filament v3 and the package only declares v4 (or vice versa), stop — do not patch around it, because the next Filament upgrade will break the workaround silently. Also confirm Laravel and PHP constraints against our platform baseline before the spike, not after.
Sequencing note. Do the schema decision before the UI swap. Reversing that order means writing money fields against a column shape we intend to abandon, and reworking the resource twice.
Maintenance. This is the weakest dimension. One maintainer, ten stars, no dependents, no visible commercial backing. We should assume we may need to fork within twelve months. That is acceptable only because the surface area is small — a field, a cast, and formatting config are a few hundred lines and comfortably forkable — and because the wrapper layer in step 4 means a fork is a namespace change rather than a resource rewrite. Budget a modest, explicit maintenance allowance: an owner, a quarterly review of upstream releases, and a standing item on the Filament upgrade checklist.
Support. Community-only, via GitHub issues on a low-traffic repository. Expect slow response, no SLA, and no security advisory process. Mitigation: our own smoke tests around the field so regressions surface in CI rather than in production. Note also that a currency-formatting plugin has a shallow attack surface — no deserialization of untrusted payloads, no network calls — so the security exposure is low even without an advisory channel.
Scaling. Negligible runtime cost: formatting and casting are pure in-process string/number operations with no measurable per-request overhead. The scaling risks are functional, not volumetric. First, formatting-heavy TextColumns on large tables: confirm sorting and searching resolve to the underlying numeric column, or admin list performance degrades and sort order becomes lexicographic. Second, aggregation queries (revenue rollups, reporting) must continue to run against the raw column — never against formatted output — so our reporting layer must stay unaware of the plugin. Neither is blocking at typical admin-panel volumes.
Failure modes. Ranked by expected damage:
Ramp-up. Low, for anyone already productive in Filament: the API is idiomatic and a developer unfamiliar with the package should be shipping a money field within an hour. The real ramp-up cost is conceptual, not syntactic — engineers must internalise the minor-units storage contract and the rule that no arithmetic happens in the UI layer. Budget a short written standard ("all money is integer minor units plus an explicit ISO code; no floats in the domain; formatting is display-only") alongside the pilot. That document, not the package, is what prevents the precision failures above.
How can I help you explore Laravel packages today?