lara-zeus/filament-locationpickr-field
A Filament form field that lets users pick a location on an interactive map. Search for an address, drop a pin, and save latitude and longitude coordinates straight to your model—simple, lightweight map integration for Laravel admin panels.
Architecture fit. This is a presentation-layer artifact: one Filament form field that renders an interactive map, captures a point, and hands back a latitude/longitude pair for the host model to persist. It ships no domain logic, no schema of its own, no queue workers, no scheduled work, and no meaningful bootstrapping beyond field registration. For a TPM that is the best possible shape for a bounded back-office widget — the blast radius is one form schema, removal is a composer remove plus a column decision, and it cannot leak business rules into the domain layer. The reframing that matters is that the package is the small half of what we are actually approving. Adopting it commits us to two platforms: Filament 5 at the framework tier, and a metered map provider (Google Maps JavaScript + Places per the package description) at the commercial tier. The field is a thin adapter between them; our real dependency is the adapter's upstreams.
Integration feasibility. Engineering effort is measured in hours: require the package, optionally publish config/views, add the field to a form schema, add two nullable decimal(10,7) columns, seed a default center/zoom. In a Filament 5 panel this is a same-sprint spike with time left over. The gating work is organisational and will dominate the critical path — provisioning a Google Cloud project, enabling Maps JavaScript and Places, minting a browser key restricted by HTTP referrer and API, setting quota caps and budget alerts, and clearing privacy/ToS review. In most enterprises that sequence outlasts the coding by weeks, so plan the schedule around procurement rather than around the engineer.
Technical risk.
Key questions.
composer.json actually pin — PHP, Laravel, and Filament floors? That read is faster and more honest than the README.Verdict. A small, cheap, removable field wrapped around a larger and more permanent external relationship. The package is not the decision; the map provider and the Filament major are. Proceed on an already-scoped back-office screen, on Filament 5, with a named owner for provider-side change — and run a same-sprint bake-off against a self-built alternative, because at this adoption level writing it ourselves is a credible and possibly preferable outcome.
Stack fit. Laravel + Filament 5 admin panel, with the target model carrying nullable latitude/longitude. It fits nowhere else: no API surface, no customer-facing page, no console command. Confirm the package's PHP and Laravel floors against the panel's existing constraints before sequencing — an unmet PHP floor quietly converts a one-hour integration into an environment change with its own regression surface. Where the panel is pinned to Filament 3 or 4, this is not an integration task at all but a forcing function for a full admin-framework migration; treat that as a separate, separately funded decision and do not let a map widget be the reason for it.
Migration path. Frame this as net-new capability on a net-new screen, because there is nothing to migrate — no legacy data to backfill, no prior geo workflow to retire. The one durable commitment is the data model: adopting this means latitude/longitude become first-class numeric columns, which shapes every downstream distance query, geo index, and report for the life of the feature. Choose plain nullable decimals and resist spatial column types for a picker. Store enough raw provider context alongside the point (formatted address or raw response) that a coordinate can be re-derived or re-verified if the widget is replaced, while keeping retention inside the provider's ToS.
Compatibility. Three axes to verify, in this order: (1) Filament major — v5.0.0 targets Filament 5 and should be assumed to drop 4 until proven otherwise; pin explicitly. (2) PHP/Laravel floors in composer.json. (3) Provider API generation — legacy Places versus Places API (New) is a live fork in the road and the package's support for the current generation is unstated. Also inventory every other Filament plugin in the panel: the classic Filament 5 failure is a panel with one lagging plugin, and render-time breakage does not appear until a form loads.
Sequencing.
composer.json floors, source review for which provider is initialised, what is persisted, and whether a manual-entry fallback exists. Cheap, and it can end the evaluation.composer.lock revert plus any republished config or views — before this reaches production.Maintenance. We inherit very little code and a disproportionate share of upstream churn. Two independent clocks govern our exposure: Filament majors, which will require a coordinated bump of this package with the panel and every other plugin, and provider API deprecations, which arrive on the vendor's schedule with notice but no coordination with a one-maintainer project. Assume an internal owner for the adapter exists. Budget the realistic carrying cost as a recurring small tax on every Filament upgrade plus an unpredictable line item on every provider deprecation — not as "MIT, therefore free."
Support. There is no vendor, no SLA, and no security-response commitment. The mitigation is structural, and it only works if we build it now: the source is small, permissively licensed, and confined to a presentation boundary, so fork-or-replace is credible rather than aspirational — provided we have wrapped it in an internal field class and kept a self-built path costed at one to two engineer-days. Escalation paths are internal by construction; a TPM should record that explicitly so no stakeholder assumes a support relationship exists.
Scaling. Two dimensions, and only one scales for free. Adding operators or records is linear in admin usage and costs nothing in the package itself. Adding address lookups scales the metered spend directly — this is usage-shaped, not seat-shaped, so a budget owner who approved "a free MIT package" must see the per-lookup economics and the quota caps before launch. Keep the field back-office only: placing metered map loads on a customer-facing page creates both a cost and an abuse surface, and that is a product boundary worth writing down rather than assuming.
Failure modes. Rank by likelihood and blast radius:
Ramp-up. For engineering, hours: one example form, one README, done. For whoever owns the Google Cloud relationship, days-to-weeks: key restrictions, quota and budget configuration, and the privacy/ToS interpretation, none of which the package documents. For support staff, near-zero — which is precisely why an undocumented degradation path is dangerous; if quota runs out and the field simply stops working, first-line support will have no prior context. Ship with a short runbook covering what a blank map means, who to notify, and how to fall back to manual coordinates. Total time-to-first-screen is dominated by procurement, so sequence the engineer behind the Cloud project rather than in front of it.
How can I help you explore Laravel packages today?