hasinhayder/tyro-login
Tyro Login is a drop-in authentication package for Laravel that adds email/password login, OTP-based passwordless sign-in, registration, password reset, and profile pages, complete with routes, controllers, views, and migrations you can customize.
Treat this as an auth scaffolding package first, a feature library second. The happy path is a fresh Laravel app where you want login, registration, password reset, email verification, OTP/TOTP, and captcha without hand-rolling each flow.
Minimal sequence:
composer require hasinhayder/tyro-login, then run the package's install/publish command exactly as documented in the README (config, migrations, views/assets). Don't guess tags — copy them from the docs.composer.json constraints and the service provider to see what it actually registers: routes, middleware aliases, guards, notifications, view namespaces. Any of these can collide with existing auth scaffolding.First real use case: a greenfield Laravel 12 app that needs a complete, themed auth UI in an afternoon. That's where the package earns its keep. If you already have Breeze/Jetstream/Fortify installed, expect friction.
Two modes, choose deliberately.
Config-driven feature toggling. Day-to-day, most changes are config edits: turning OTP on for login, switching layout/theme, enabling social providers, tightening lockout. Keep an environment-specific override (config/tyro-login.php reading from env()) so you can disable captcha in testing and loosen lockout in local.
Social login wiring. Provider credentials go in config/services.php; the package config maps which providers appear. Watch account-linking and email-collision policy — decide up front whether an existing email + social login auto-links or requires confirmation.
Theming and layouts. Choose one of the five layouts, publish it, and override via your own CSS layer rather than editing vendor blade files. Keeps upgrades clean.
Testing pattern. Write one feature test per flow (register, verify, login, reset, OTP, lockout). Use RefreshDatabase, disable captcha via config in phpunit.xml, and fake the mail/notification layer to assert templates fire. Assertion targets: session regeneration on login, redirects, and lockout state.
Deployment. php artisan config:cache after any config change; ensure published assets are in your build. If lockout uses the cache, confirm your production cache store is shared across nodes.
composer.json constraints — if it targets an unreleased major, pin carefully.config:clear in dev. A cached config silently ignoring your new toggles is the most common "it's broken" report.testing environment; otherwise every auth test fails on captcha validation.file or array store, lockouts won't be enforced consistently — use Redis/database cache.Mail::fake() and by actually sending one through your real mailer in staging.composer update can silently diverge from your overrides. Keep a changelog diff of published files and re-publish selectively.storage/logs plus the framework's auth events. Most issues trace back to config, guard mismatch, or a competing auth package.Bottom line: high leverage for prototypes and internal tools where speed beats depth; for production systems with real security exposure, budget time to audit the package internals or wrap it in feature-slice mode so you can eject cleanly.
How can I help you explore Laravel packages today?