2FA, Students Analytics
This release includes 4 database migration(s). Back up your database before upgrading.
b8c9d0e1f2a3_add_user_audit_event.pye9f0a1b2c3d4_add_organization_plan_history.pyt6u7v8w9x0y1_add_user_mfa_tables.pyu9v8w7x6y5z4_add_user_activity_day.py
Features
- feat(auth): 2FA, magic-link login, per-org auth policy, session isolation & 2FA reset36c6502c
- feat(billing): active-user tracking and overage billing77c210ed
- feat(users): integrate student analytics into Users tab (per-row Analytics button + compare); drop separate tab; fix modal spacing31f53151
- feat(audit): gate student analytics behind Pro plan, not Enterprisef6d7a8de
- feat(users): per-student audit & analyticsda31eea3
- feat(api): email users when they join an organizationc6d417c2
- Merge pull request #972 from learnhouse/feat/2fa-passkeys1ff71127
Fixes
- fix(editor): scale embed frame height with its container708a3e14
- fix(deps): update all non-major dependencies440080b9
- fix(deps): update dependency html2canvas-pro to v228ae73b6
- fix(transfer): keep S3 walk roots slash-normalised when base path ends in /eed9bd04
- fix: normalize walk_directory paths to POSIX separators on Windowsa69a191b
- fix: stop startup, email and list-render failures from cascading4080d4ca
- fix(web): retrying a partial AI-task save no longer duplicates saved tasks00a02984
- fix(web): stop losing autosaved answers and align grade previews with the server2e5a6e7f
- fix(assignments): reconcile grades and certificates when tasks or answers change4edad97c
- fix(assignments): cap AI tasks, reject negative max grade, block token file access, dedupe submit events3d1cc921
- fix(api): admin-seat limit allows paid-plan overage (only free is capped)8298adcf
- fix(api): admin-seat check 403'd every SaaS org — resolve limit from plan, not resolve_featured4ec421d
- fix(deps): pin dependency regex to v2026.1.157b70e745
- fix(migration): base user_audit_event on prod head r5s6t7u8v9w0, not the orphan a2b3 branch00170bc7
- fix(web): use nice-shadow, not a border, on the grading-type cards617828a2
- fix(web): always close the confirmation modal once the action settlesc07d1084
- fix(security): run the content access check on the canonical resolved path399ef01e
- fix(plans): correct SaaS plan limits to 200/500 members, 2000 Pro creditsca0ae9cc
- fix(api): don't block an instructor from saving their own quiz answers48ce5866
- fix(web): show the org logo for standard and pro, not just enterpriseab694c6c
- fix(security): harden local content path handling687206b6
- fix(api): point organization emails at the org, not the platform pickere646e2ac
- fix(web): show progress while an assignment submits5c4bd431
- fix(web): stop truncating gzipped SCORM assets and cache them6f3d02ed
- fix(web): unify certificate PDF and unblock joining from a signed-in sessiona31ca766
- fix(web): make shared links absoluteef16ca3d
- fix(rbac): scope "Users Only" resources to their own organizationdffce3cd
- fix(invites): key invites on the normalised address and count only pending onesbd737c69
- fix(certifications): stop deleting awarded certificates with the templatefc6e39e3
- fix(auth): forward the client IP through the auth proxy, and log refresh outcomesc42b1121
- fix(web): forward client IP, pass redirects through, resolve roles after SSO3ca647e0
- fix(auth): join the organization on Google sign-upe6f1e763
- fix(assignments): learner UX gaps and assignment integrity issuesa04102ae
- fix(auth): stop unexpected sign-outs from transient refresh failuresc652c159
- Merge pull request #976 from marceli1404/fix/walk-directory-path-separators10c526dd
- Merge pull request #978 from learnhouse/renovate/all-minor-patch6dc6dfe0
- Merge pull request #981 from learnhouse/renovate/html2canvas-pro-2.x7e05755a
- Merge pull request #974 from learnhouse/fix/assignments-sweep-hardeningc475d394
- Merge pull request #977 from learnhouse/renovate/pin-dependencies2da76467
- Merge pull request #968 from learnhouse/fix/saas-plan-member-limits40b47287
- Merge pull request #967 from learnhouse/fix/instructor-quiz-autosave-blocked857681fe
- Merge pull request #970 from learnhouse/fix/grading-cards-nice-shadow045d47d2
- Merge pull request #969 from learnhouse/fix/content-idor-and-modal-closee0322b06
- Merge pull request #965 from learnhouse/fix/scorm-truncation-submit-ux-email-links755ffca4
- Merge pull request #966 from learnhouse/fix/org-logo-standard-proe8c6b44d
- Merge pull request #964 from learnhouse/fix/shareable-links-join-emailc832f214
- Merge pull request #963 from learnhouse/fix/cross-org-users-only0e42e2cf
- Merge pull request #956 from learnhouse/fix/learner-ux-feedbackd7332406
- Merge pull request #961 from learnhouse/fix/auth-client-ip-and-telemetryab18c820
- Merge pull request #957 from learnhouse/fix/oauth-org-membership8db734c0
- Merge pull request #958 from learnhouse/fix/session-stabilityfe59ef09
- Merge pull request #959 from learnhouse/fix/certification-data-lossc3babd2b
- Merge pull request #960 from learnhouse/fix/invite-lifecycle14574fac
- Merge pull request #955 from learnhouse/fix/session-unexpected-logoutsfc113110
Performance
Refactoring
- refactor(usage): align member metering with plan seats307bc3a3
Maintenance
- chore(deps): regenerate apps/web/bun.lock56738fa1
- chore(deps): regenerate apps/web/bun.locke34abc08
- chore(deps): update actions/cache action to v62f718e64
- chore(deps): update astral-sh/setup-uv action to v9ffb78d08
- chore(deps): update actions/setup-python action to v75dc4de3d
- Merge pull request #984 from learnhouse/renovate/actions-cache-6.x1a2ad7d6
- Merge pull request #979 from learnhouse/renovate/actions-setup-python-7.x1d4336e9
- Merge pull request #980 from learnhouse/renovate/astral-sh-setup-uv-9.x5694e6ff
Contributors
npx learnhouse update --to 1.3.3