The project started with Devise, the Rails default, and hit a wall on day one. Devise redirects to Rails views on email verification, which breaks entirely when the frontend is a separate Next.js app. The migration to Rodauth happened on day three.
Rodauth is lower-level but gives full control. Overriding the verification URL to point to Next.js, configuring httpOnly cookie sessions, and setting up account locking all became straightforward. The migration was painful, but the result is clean. The lesson: for any decoupled frontend, start with Rodauth.
Devise assumes a monolith. For a decoupled frontend, that assumption breaks immediately.