doode/filament-map-picker
A Filament form field that lets users pick a location on an interactive map, saving latitude and longitude directly to your model. Drop it into any resource form for fast, accurate address or coordinate selection with minimal setup.
Architecture fit. filament-map-picker remains a Filament panel plugin that registers a custom form field. It slots into the existing form-schema layer (Filament\Forms\Components\Field), renders a Leaflet map in the browser, layers Geoman.io draw tools on top, and syncs geometry back into Livewire state via Alpine. That is still the correct extension point — additive, not invasive. Nothing in v1.6.5 changes this.
What it is not: a geo backend. No server-side geocoding, reverse geocoding, geometry validation, spatial indexing, or coordinate transformation. Any requirement beyond "let an admin drop a pin or draw a shape and persist it" is our build, not the package's. The release note does not add any of this.
Integration feasibility. Mechanically cheap and now marginally cheaper: one composer require, one ->plugin() registration in the panel provider, one MapPicker::make('location') in a resource schema. Realistic effort for a Filament-fluent developer is half a day including a smoke test. The non-trivial work is still the data contract — whether the field persists a single JSON blob, a GeoJSON string, or fans out to paired lat/lng columns — because that propagates into schema design, API serialization, and every downstream spatial query. The release note is silent on state shape; still verify from source before committing.
What changed in v1.6.5, and what it means.
Technical risk.
vitormicillo/filament-map-picker, while our recorded package name is doode/filament-map-picker. Either we are tracking a fork, the vendor name differs from the GitHub org, or the original assessment captured the wrong identifier. Verify the exact Composer package name against Packagist before composer require — installing an unverified vendor string is a supply-chain hazard, not a typo.leaflet-geoman-free are still injected via CDN unless source proves otherwise. That is a hard external runtime dependency on every form render and a supply-chain surface we may not be permitted to accept.Key questions to resolve before approval.
vitormicillo/… or doode/… — and which repo is authoritative? Resolve before install.composer.json declare, and is v4 supported or planned? Still the top risk, still unanswered.Stack fit. Now targets Laravel 10/11/12 + Filament v3 panels with Livewire 3 and PHP 8.1+. If our panels are on Filament v3, fit is clean and Laravel 12 no longer forces a constraint pin. If we are mid-migration to Filament v4, this package remains a blocker on the migration path and should be deferred or forked — v1.6.5 does not change that.
Migration path. Most likely we already have latitude/longitude decimal columns. Two options:
lat/lng accessors for existing read paths. Cleaner long-term, costs a backfill and a read-path audit.->afterStateUpdated() / ->dehydrateStateUsing() to decompose the map output. Lower migration cost, but we own the glue and inherit the package's state-shape change risk.For any real querying (radius search, bounding box, "which zone contains this point"), plan on MySQL ST_* with a POINT/POLYGON column and an SPATIAL INDEX, or PostGIS if we are already there. Do not query against JSON.
Compatibility. Verify against our exact Filament minor and our exact Laravel minor — Laravel 12 support is declared, not proven against our dependency graph. Watch for Alpine/Livewire morph issues on repeaters and wizard steps where the map field re-initializes; the classic failure is a duplicated or orphaned Leaflet instance after a Livewire re-render. The new test suite, if it runs in CI, is a reasonable place to look for whether this class of bug is covered.
Sequencing.
vitormicillo vs doode. Do this first; everything else is wasted if we install the wrong artifact.GeoPointPicker component that extends or composes the package field. Still the single highest-leverage risk mitigation: one file to patch, one place to swap implementations, a clean seam if we fork or hand-roll a Leaflet field later.Treat this as buy-and-insulate, not buy-and-depend. Budget the wrapper as part of the adoption cost. The v1.6.5 release modestly improves the odds the insulation is never needed; it does not remove the need.
Maintenance. Assume we own this, but assume it slightly less grimly. Pin the version exactly, watch the repo for releases, and plan for a fork if the maintainer goes quiet or Filament ships a major. The demonstrated cadence (through v1.6.5) suggests a maintainer who is responsive today — that is a reason to relax the emergency-fork timeline, not to drop the wrapper. Ongoing cost is 1–2 engineer-days per year for version tracking plus a larger, unplanned hit whenever Filament majors land. Set a calendar reminder to reassess at each Filament major; the v1.6.5 note tracking Laravel 12 but not Filament v4 is precisely the pattern to watch.
Support. No commercial support, no SLA, no vendor to escalate to. The new tests do not change this — they reduce the frequency of surprises, not the cost of one. Internal runbook still required: how to re-vendor JS assets, how to disable the field if it breaks a panel, and the fallback (plain lat/lng numeric inputs). A single flag that swaps the map field for numeric inputs is cheap insurance and worth building.
Scaling. Unchanged. The map is client-side and per-form-instance, so server load is negligible — but every render is a burst of tile requests plus Leaflet/Geoman JS.
Failure modes to design for. All still live — none are addressed by a Laravel compatibility release:
null. Add save-time validation that fails loudly.lat without lng, or a GeoJSON string where an array is expected) → field throws on hydrate. Normalize on read.->dehydrated()-only on save.Ramp-up. Very low for a Filament-familiar engineer — under a day to productive use. The knowledge that matters is not the package; it is the spatial data model and tile infrastructure, and that is our intellectual property either way. Do not let the package's simplicity — or a reassuring patch release — disguise the fact that "geo" as a capability has a permanent operational footprint: tile budget, spatial index, and a geometry validation rule.
How can I help you explore Laravel packages today?