eg-mohamed/filament-otp-input
A Filament form component that adds a one-time password (OTP) input field to your admin panels. Users can enter verification codes with a clean, segmented input UI, making it easy to integrate OTP or PIN confirmation into Filament forms and workflows.
Package class: EG-Mohamed/filament-otp-input is a Filament form-field plugin that renders a segmented one-time-passcode input (auto-advance, paste handling, keyboard navigation) for use in Filament panels. It is a presentation-layer component, not an authentication library — it collects and validates digits; it does not generate, send, throttle, or verify codes. That distinction drives most of the assessment below.
Architecture fit: Good fit where the team is already on Filament. The component slots into the existing form schema builder (->schema([OtpInput::make('code')])), so it inherits Filament's validation, state binding, and panel theming with no bespoke front-end work. It is a poor fit if the OTP screen is a public, unauthenticated, mobile-first flow outside a panel — Filament's asset stack and Livewire round-trips are heavier than a standalone Blade component would be, and you would be paying for a framework you're not otherwise using on that route.
Integration feasibility: Low effort. Composer install, optional config publish, register the field in a form schema. Realistic estimate is well under a day for a developer familiar with Filament, including styling checks. The real work is not integration but the surrounding OTP lifecycle (issuance, delivery, expiry, rate limiting, replay prevention), which this package does not address and which must already exist or be built.
Technical risk: Overall low, with three specific caveats.
composer update.Key questions for the maintainer / team:
composer.json or merely tested?autocomplete="one-time-code", inputmode="numeric", screen-reader labelling of segmented inputs? Segmented OTP fields are a common accessibility failure point.Stack fit: Assumes Laravel 10/11, PHP 8.1+, Livewire 3, and a Filament panel (v3 or v4 — verify against the package's declared constraints, do not assume). If any of those are unmet, stop; there is no partial adoption path.
Migration path: Greenfield — trivial, add the field to the OTP form schema and style. Brownfield — treat as a like-for-like swap for whatever plain TextInput currently collects the code. No data migration, no schema change, no persistence implications: the field is stateless from the database's perspective. The only migration risk is behavioural, in how users type and paste codes.
Compatibility: Two axes to check before commit — Filament major version, and Livewire version. Also confirm the package does not pin a conflicting version of any shared front-end dependency. Run composer why-not against the target Filament version rather than reading the README.
Sequencing:
composer.json (4.2.0, not ^4.2) for anything in an auth path.Maintenance: Low, but non-zero. Expect occasional version bumps to track Filament majors, and expect to be the one who reads the diff because the release notes may not tell you. Assign a named owner; unowned UI dependencies in auth flows rot silently.
Support: No commercial support. Recourse is GitHub issues and, ultimately, forking — which is viable here precisely because the package is small. Confirm the licence permits the fork you'd need (MIT is typical; verify).
Scaling: Not a scaling concern. It is a client-side input component; load is whatever the surrounding Filament page already costs. No additional database, queue, or cache pressure. The OTP backend remains the thing that scales, and that is out of scope for this package.
Failure modes:
autocomplete="one-time-code" before shipping.Ramp-up: Minimal. A Filament-fluent developer is productive in under an hour. The genuinely unfamiliar territory is the OTP backend lifecycle, which is unrelated to this package and should be scoped separately — do not let a one-line field integration imply the surrounding auth work is similarly small.
Recommendation: Adopt, pinned to 4.2.0, contingent on reading the diff first. The release notes as published are insufficient to justify a blind bump, and the omission is itself the finding worth recording.
How can I help you explore Laravel packages today?