tanthammar/filament-country-select
Filament Country Select provides a searchable country picker field for Filament forms, showing country names and flags while storing standard ISO codes. Easy to drop into forms for consistent country selection.
Architecture fit
tanthammar/filament-country-select is a Filament form-field plugin that supplies a searchable country select backed by PHP-side country data. It sits in the presentation layer of a Laravel admin/panel application and introduces no new persistence, queue, or infrastructure concerns. Architecturally it is a leaf dependency: it renders options, and the chosen country code is handed back to the host form for storage. That makes it easy to adopt in a single panel or form without touching domain models. The main architectural question is not "does it fit" but "does it become the canonical source of country names in our UI" — if so, it should be treated as a data dependency, not just a widget.
Integration feasibility
Low effort. Typical path is composer require plus registering the plugin on the Filament panel provider and adding the field to a form schema. Realistic estimate is well under a day for a first working field, plus review time. The 1.1.2 release itself is a patch: it adds Turkish aliases for country names so that mb_strtolower('İ') casing behaviour does not break name matching. For an integrating team the change is invisible — no API surface change, no config change, no migration.
Technical risk Overall: low-to-moderate, dominated by package maturity rather than by this release.
tr locale usage.İ/i casing problem is the classic case-folding trap. The fact that it surfaced as a hardcoded alias list rather than a general case-folding fix suggests search/matching is string-comparison based and may have similar latent issues in other locales (e.g. German ß, Azeri, Greek final sigma). Worth probing before relying on multilingual search quality.mb_strtolower requires mbstring, which is present in nearly all PHP images but should be confirmed in minimal containers.Key questions
Recommendation: adopt for admin-side selection with a pinned minor version and a single-locale pilot; do not treat it as the authoritative country-name source for customer-facing output until data provenance is confirmed.
Stack fit
Designed for Laravel + Filament panels, PHP 8.x with mbstring; the form-field contract is Filament's, so it composes with existing fields, validation rules, and dependent selects (e.g. country → subdivision, country → dial code). It is a natural fit for back-office CRUD, onboarding forms, and address capture. It is not a fit for headless/API-only services — there the country list should be consumed as data, not as a UI component.
Migration path
Select::make('country') with the plugin field. Near-zero risk.Compatibility
Verify against the team's actual Filament major (2.x/3.x/4.x differ materially in plugin registration), Laravel version, and PHP minor. Confirm mbstring in production and CI images. Confirm behaviour under a non-UTF-8 default charset is irrelevant (it should be UTF-8 throughout). Check that the added Turkish aliases do not collide with any pre-existing custom option list or translation override already in the codebase.
Sequencing
İ/i search plus one ASCII control case) before pinning 1.1.2, so the fix is demonstrably covered.Maintenance Low ongoing cost: lockfile updates, occasional patch bumps, and a re-check at each Filament major upgrade (the most likely source of breakage). Budget roughly a few hours per quarter plus a day per Filament major. The alias-list approach means each locale fix arrives as a new patch, so expect a slow trickle of small releases rather than a single stable data model.
Support Community-supported, single maintainer, no commercial SLA. Internal ownership must be assigned to the team that owns the admin panel — not to platform/infra. Escalation path for a broken selector is "pin back one version, or vendor the field," both of which are cheap because the component is small and self-contained.
Scaling Negligible runtime footprint — roughly 250 options, rendered in a form request, no additional queries beyond whatever the host form already does. Search is the only scaling consideration, and at this option count even naive matching is fine. No impact on request throughput, queue depth, or database load.
Failure modes
mbstring → fatal on option normalisation; caught immediately at deploy.Ramp-up Hours for any developer already fluent in Laravel and Filament: install, register, drop into a form, done. The only non-obvious knowledge to transfer is (a) stored value is an ISO code and (b) search matching is locale-sensitive, so non-Latin/Turkic locale QA is warranted. Capture both in the team's component notes so the 1.1.2 class of bug is understood rather than rediscovered.
How can I help you explore Laravel packages today?