The DB schema and Fortify backend support for 2FA is already in place —
users.two_factor_secret, users.two_factor_recovery_codes,
users.two_factor_confirmed_at columns exist from the
2026_05_24_235929_add_two_factor_columns_to_users_table migration. The
Fortify feature is enabled in config/fortify.php.
What's missing is the front-end. Users have no way to turn 2FA on.
Done means
Notes
- Use the typed wrappers in
apps/web/lib/api.ts — add a twoFactor
namespace alongside auth.
- Don't reinvent the password-confirm modal — Fortify's challenge flow
exists, just consume it.
The DB schema and Fortify backend support for 2FA is already in place —
users.two_factor_secret,users.two_factor_recovery_codes,users.two_factor_confirmed_atcolumns exist from the2026_05_24_235929_add_two_factor_columns_to_users_tablemigration. TheFortify feature is enabled in
config/fortify.php.What's missing is the front-end. Users have no way to turn 2FA on.
Done means
apps/web/app/settings/security/page.tsx.POST /auth/user/two-factor-authentication→ shows the QR (SVG returnedby Fortify) + secret string.
POST /auth/user/confirmed-two-factor-authenticationwithcode.GET /auth/user/two-factor-recovery-codes) witha "download as .txt" and "regenerate" action.
(
POST /auth/user/confirm-password).two_factor: truefrom/auth/login.TopNav.tsxuser-menu dropdown → "Account settings".Notes
apps/web/lib/api.ts— add atwoFactornamespace alongside
auth.exists, just consume it.