You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Thomas Joise 809976fd8b feat(d36): login history (IP + device) + first-login change nudge
Captures every /auth/login attempt in a login_event table (SQLite schema + PG migration
013): staff_id (or null for an unknown user), username tried, outcome (success/failed/
locked), IP, and user-agent — best-effort, never breaks login. New owner 'Login history'
page (Admin): who signed in / failed, when, from which IP + parsed device, outcome filter,
paginated. login() now returns mustChangePassword; an invited user on their default
password is sent to Profile to change it on sign-in. typecheck + auth/employee tests green.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2 days ago
..
components fix(review): frontend quality pass — a11y, UX safety, error handling (medium/low) 4 days ago
pages feat(d36): login history (IP + device) + first-login change nudge 2 days ago
Layout.tsx feat(d30): clients-per-module count on Modules page + comment fix 3 days ago
Login.tsx feat(d36): login history (IP + device) + first-login change nudge 2 days ago
api.ts feat(d36): login history (IP + device) + first-login change nudge 2 days ago
app.css fix(ui): group each client module into its own collapsible coloured section 2 days ago
main.tsx feat(d36): login history (IP + device) + first-login change nudge 2 days ago
nav.ts feat(d36): login history (IP + device) + first-login change nudge 2 days ago
pulse.ts feat(hq-web): relationship-pulse ribbon on Client 360 overview 5 days ago
statement.ts feat(d26): functional-feature UIs — GST report, doc search, statement, bulk ops 3 days ago
vite-env.d.ts feat(pwa/d25): installable PWA + phone polish 4 days ago