Account Security

Manage your account settings, active sessions, and connected applications.

Account Information

<%= form_with model: @user, url: profile_path, method: :patch, class: "space-y-6" do |form| %> <% if @user.errors.any? %>

<%= pluralize(@user.errors.count, "error") %> prohibited this from being saved:

    <% @user.errors.each do |error| %>
  • <%= error.full_message %>
  • <% end %>
<% end %>
<%= form.label :email_address, "Email Address", class: "block text-sm font-medium text-gray-700" %> <%= form.email_field :email_address, required: true, autocomplete: "email", class: "mt-1 block w-full rounded-md border-gray-300 shadow-sm focus:border-blue-500 focus:ring-blue-500 sm:text-sm" %>
<%= form.submit "Update Email", class: "inline-flex justify-center rounded-md border border-transparent bg-blue-600 py-2 px-4 text-sm font-medium text-white shadow-sm hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2" %>
<% end %>

Change Password

<%= form_with model: @user, url: profile_path, method: :patch, class: "space-y-6" do |form| %>
<%= form.label :current_password, "Current Password", class: "block text-sm font-medium text-gray-700" %> <%= form.password_field :current_password, autocomplete: "current-password", placeholder: "Enter current password", class: "mt-1 block w-full rounded-md border-gray-300 shadow-sm focus:border-blue-500 focus:ring-blue-500 sm:text-sm" %>
<%= form.label :password, "New Password", class: "block text-sm font-medium text-gray-700" %> <%= form.password_field :password, autocomplete: "new-password", placeholder: "Enter new password", class: "mt-1 block w-full rounded-md border-gray-300 shadow-sm focus:border-blue-500 focus:ring-blue-500 sm:text-sm" %>

Must be at least 8 characters

<%= form.label :password_confirmation, "Confirm New Password", class: "block text-sm font-medium text-gray-700" %> <%= form.password_field :password_confirmation, autocomplete: "new-password", placeholder: "Confirm new password", class: "mt-1 block w-full rounded-md border-gray-300 shadow-sm focus:border-blue-500 focus:ring-blue-500 sm:text-sm" %>
<%= form.submit "Update Password", class: "inline-flex justify-center rounded-md border border-transparent bg-blue-600 py-2 px-4 text-sm font-medium text-white shadow-sm hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2" %>
<% end %>

Two-Factor Authentication

Add an extra layer of security to your account by enabling two-factor authentication.

<% if @user.totp_enabled? %>

Two-factor authentication is enabled

<% else %> <%= link_to new_totp_path, class: "inline-flex items-center rounded-md border border-transparent bg-blue-600 px-4 py-2 text-sm font-medium text-white shadow-sm hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2" do %> Enable 2FA <% end %> <% end %>

Passkeys

Use your fingerprint, face recognition, or security key to sign in without passwords.

Give this passkey a memorable name so you can identify it later.

Your Passkeys

<% if @user.webauthn_credentials.exists? %>
<% @user.webauthn_credentials.order(created_at: :desc).each do |credential| %>
<% if credential.platform_authenticator? %> <% else %> <% end %>
<%= credential.nickname %>
<%= credential.authenticator_type.humanize %> • Last used <%= credential.last_used_ago %> <% if credential.backed_up? %> • Synced <% end %>
<% if credential.created_recently? %> New <% end %> <%= link_to webauthn_credential_path(credential), method: :delete, data: { confirm: "Are you sure you want to delete '#{credential.nickname}'? You'll need to set it up again to sign in with this device.", turbo_method: :delete }, class: "text-red-600 hover:text-red-800 text-sm font-medium" do %> <% end %>
<% end %>

Tip: Add passkeys on multiple devices for easy access. Platform authenticators (like Touch ID) are synced across your devices if you use iCloud Keychain or Google Password Manager.

<% else %>

No passkeys

Get started by adding your first passkey for passwordless sign-in.

<% end %>