Frappe Learning
Easy to use, open source Learning Management System
Alternative to: teachable, thinkific, udemy
About
Versions (84)
v2.59.0
2026-07-16What’s Changed
- refactor: batch dashboard by @pateljannat in https://github.com/frappe/lms/pull/2081
- fix: course form issues by @pateljannat in https://github.com/frappe/lms/pull/2096
- fix: duplicate enrollment validation on update by @raizasafeel in https://github.com/frappe/lms/pull/2104
- fix(security): remove ignore_xss_filter to enable HTML sanitization by @raizasafeel in https://github.com/frappe/lms/pull/2103
- fix: misc permission issues by @pateljannat in https://github.com/frappe/lms/pull/2108
- fix: check permission of session user during batch enrollment by @pateljannat in https://github.com/frappe/lms/pull/2109
- fix: misc issues by @pateljannat in https://github.com/frappe/lms/pull/2115
- fix(lesson): render codesandbox by @raizasafeel in https://github.com/frappe/lms/pull/2116
- fix: misc issues by @pateljannat in https://github.com/frappe/lms/pull/2119
- fix: misc issues by @pateljannat in https://github.com/frappe/lms/pull/2120
- fix: permission issue during quiz submission by @pateljannat in https://github.com/frappe/lms/pull/2126
- fix: permission issue during quiz submission (backport #2126) by @mergify[bot] in https://github.com/frappe/lms/pull/2127
- fix: sanitize data before creating new course or batch by @pateljannat in https://github.com/frappe/lms/pull/2129
- fix: verify quiz answers on server side by @pateljannat in https://github.com/frappe/lms/pull/2131
- fix: student home page issue when not enrolled in any batch by @pateljannat in https://github.com/frappe/lms/pull/2132
- fix: assignment upload issue by @pateljannat in https://github.com/frappe/lms/pull/2135
- fix: batch admin conditions by @pateljannat in https://github.com/frappe/lms/pull/2136
- fix: misc issues by @pateljannat in https://github.com/frappe/lms/pull/2137
- feat: nudge students to complete their profile by @pateljannat in https://github.com/frappe/lms/pull/2138
- fix: if certificate is linked to a batch then don’t validate course enrollment by @pateljannat in https://github.com/frappe/lms/pull/2141
- fix: misc issues by @pateljannat in https://github.com/frappe/lms/pull/2143
- fix: show profile nudge as icon when sidebar is collapsed by @Owaishk08 in https://github.com/frappe/lms/pull/2144
- fix: misc issues by @pateljannat in https://github.com/frappe/lms/pull/2155
- fix: pricing section issue in course form by @pateljannat in https://github.com/frappe/lms/pull/2157
- fix: pricing section issue in course form (backport #2157) by @mergify[bot] in https://github.com/frappe/lms/pull/2158
- feat: Google Meet integration for Live Classes by @rathorevaibhav in https://github.com/frappe/lms/pull/2122
- fix(payment gateway): add delete functionality and field details by @raizasafeel in https://github.com/frappe/lms/pull/2156
- fix: assignment conditions for save button visibility by @pateljannat in https://github.com/frappe/lms/pull/2163
- fix: misc issues by @pateljannat in https://github.com/frappe/lms/pull/2164
- merge
developintomain-hotifxby @pateljannat in https://github.com/frappe/lms/pull/2165 - fix: use backend field metadata for billing and transaction forms by @raizasafeel in https://github.com/frappe/lms/pull/2167
- fix(persona): redirection route and skip button by @raizasafeel in https://github.com/frappe/lms/pull/2168
- fix: misc issues by @pateljannat in https://github.com/frappe/lms/pull/2171
- feat: demo data by @pateljannat in https://github.com/frappe/lms/pull/2159
- feat: payment reminder setting by @pateljannat in https://github.com/frappe/lms/pull/2182
- fix(security): prevent stored XSS decoding in _lms.py by @raizasafeel in https://github.com/frappe/lms/pull/2185
- fix: evaluator role synched between doctype and role by @raizasafeel in https://github.com/frappe/lms/pull/2186
- feat: navigate between questions in quiz by @pateljannat in https://github.com/frappe/lms/pull/2188
- fix: sidebar scroll issue by @pateljannat in https://github.com/frappe/lms/pull/2194
- feat: added speed controls by @jagadish-7 in https://github.com/frappe/lms/pull/2080
- feat: Frappe appointment booking for trial sites by @pateljannat in https://github.com/frappe/lms/pull/2202
- feat: Frappe appointment booking for trial sites (backport #2202) by @mergify[bot] in https://github.com/frappe/lms/pull/2203
- fix: assignment issues by @pateljannat in https://github.com/frappe/lms/pull/2205
- feat: mark questions for review in quiz by @pateljannat in https://github.com/frappe/lms/pull/2206
- fix: hide evaluators search when list is empty by @LeoDanielA01 in https://github.com/frappe/lms/pull/2197
- feat(lesson): add support for html (heading, block code, list) by @raizasafeel in https://github.com/frappe/lms/pull/2207
- feat: add member modal, refactor control filters by @raizasafeel in https://github.com/frappe/lms/pull/2209
- feat(control): better ux, inline create functionality for link by @raizasafeel in https://github.com/frappe/lms/pull/2210
- refactor(multiselect): selected values are shown in input by @raizasafeel in https://github.com/frappe/lms/pull/2211
- fix: improve sidebar scrolling with overflow by @LeoDanielA01 in https://github.com/frappe/lms/pull/2199
- feat: change checkbox to switches, controls styling by @raizasafeel in https://github.com/frappe/lms/pull/2214
- fix: assignment issues (backport #2205) by @mergify[bot] in https://github.com/frappe/lms/pull/2223
- fix: reload and persist status filters in programming submissions by @LeoDanielA01 in https://github.com/frappe/lms/pull/2220
- fix: misc issues by @pateljannat in https://github.com/frappe/lms/pull/2229
- revert(course): use checkbox with tooltip for certification filter by @raizasafeel in https://github.com/frappe/lms/pull/2228
- fix: misc issues (backport #2229) by @mergify[bot] in https://github.com/frappe/lms/pull/2230
- fix: LiveCodeSession reference error and UI loading state by @LeoDanielA01 in https://github.com/frappe/lms/pull/2218
- fix: misc issues by @pateljannat in https://github.com/frappe/lms/pull/2233
- fix(JobDetail): application count and button now load properly on pag… by @LeoDanielA01 in https://github.com/frappe/lms/pull/2238
- fix: course progress updated for scorm and video end event by @raizasafeel in https://github.com/frappe/lms/pull/2247
- fix: misc issues in batch by @NagariaHussain in https://github.com/frappe/lms/pull/2246
- fix: course progress updated for scorm and video end event (backport #2247) by @mergify[bot] in https://github.com/frappe/lms/pull/2258
- fix: misc ui improvements by @pateljannat in https://github.com/frappe/lms/pull/2260
- fix: misc ui improvements (backport #2260) by @mergify[bot] in https://github.com/frappe/lms/pull/2261
- fix: add overflow-y-auto to settings dialog content panel (#2079) by @NuriaAmoros in https://github.com/frappe/lms/pull/2262
- fix: better sanitization of form fields by @pateljannat in https://github.com/frappe/lms/pull/2264
- fix: remove horizontal scrollbar and duplicate overflow div in sidebar by @Owaishk08 in https://github.com/frappe/lms/pull/2265
- fix(style): improve payment gateway header text visibility in dark mode by @LeoDanielA01 in https://github.com/frappe/lms/pull/2269
- fix(style): improve header text contrast in settings pages dark mode by @LeoDanielA01 in https://github.com/frappe/lms/pull/2270
- fix: evaluator navigation by syncing modal visibility with route change by @LeoDanielA01 in https://github.com/frappe/lms/pull/2271
- fix: prevent path transversals in lms by @raizasafeel in https://github.com/frappe/lms/pull/2274
- fix: prevent path transversals in lms (backport #2274) by @mergify[bot] in https://github.com/frappe/lms/pull/2275
- fix(notifications): single-line mobile header and improve empty state by @LeoDanielA01 in https://github.com/frappe/lms/pull/2250
- fix: prevent unauthorised enrollments in paid courses by @raizasafeel in https://github.com/frappe/lms/pull/2282
- fix: prevent unauthorised enrollments in paid courses (backport #2282) by @mergify[bot] in https://github.com/frappe/lms/pull/2283
- fix: take max signups from Frappe settings for custom LMS signup by @Rl0007 in https://github.com/frappe/lms/pull/2288
- feat: course package import and export by @pateljannat in https://github.com/frappe/lms/pull/2286
- revert: change switches into checkbox by @raizasafeel in https://github.com/frappe/lms/pull/2291
- fix: misc issues by @pateljannat in https://github.com/frappe/lms/pull/2293
- fix: allow zero amount checkout with coupons by @raizasafeel in https://github.com/frappe/lms/pull/2292
- fix: prevent xss in meta data by @raizasafeel in https://github.com/frappe/lms/pull/2294
- fix: prevent xss in meta data (backport #2294) by @mergify[bot] in https://github.com/frappe/lms/pull/2295
- fix: improved list for assignments and programming exercises by @pateljannat in https://github.com/frappe/lms/pull/2296
- fix: misc issues by @pateljannat in https://github.com/frappe/lms/pull/2298
- fix: prevent path traversal in scorm file by @raizasafeel in https://github.com/frappe/lms/pull/2299
- refactor: jobs and certified participants view by @pateljannat in https://github.com/frappe/lms/pull/2308
- feat: rtl support by @raizasafeel in https://github.com/frappe/lms/pull/2310
- fix: loading state on batch details, student enrollment by admin by @raizasafeel in https://github.com/frappe/lms/pull/2311
- fix: allow None for optional args in get_payment_link by @raizasafeel in https://github.com/frappe/lms/pull/2314
- fix: allow None for optional args in get_order_summary by @raizasafeel in https://github.com/frappe/lms/pull/2315
- fix: allow None for optional args in get_payment_link (backport #2314) by @mergify[bot] in https://github.com/frappe/lms/pull/2317
- fix: render styles properly in text editor by @raizasafeel in https://github.com/frappe/lms/pull/2322
- feat: on chapter completion continue learning takes you to next chapter by @raizasafeel in https://github.com/frappe/lms/pull/2321
- fix: show job count on jobs listing for guest users by @raizasafeel in https://github.com/frappe/lms/pull/2325
- fix: render styles properly in text editor (backport #2322) by @mergify[bot] in https://github.com/frappe/lms/pull/2328
- feat: on chapter completion continue learning takes you to next chapter (backport #2321) by @mergify[bot] in https://github.com/frappe/lms/pull/2327
- fix(patches): stale imports breaking bench migrate by @raizasafeel in https://github.com/frappe/lms/pull/2336
- fix: update notification count on sidebar after they are read by @raizasafeel in https://github.com/frappe/lms/pull/2338
- fix: sidebar_for_certified_members patch by @raizasafeel in https://github.com/frappe/lms/pull/2342
- fix: sanitize lesson blocks from server and client by @raizasafeel in https://github.com/frappe/lms/pull/2344
- fix: sidebar_for_certified_members patch (backport #2342) by @mergify[bot] in https://github.com/frappe/lms/pull/2358
- fix(patches): stale imports breaking bench migrate (backport #2336) by @mergify[bot] in https://github.com/frappe/lms/pull/2359
- fix: sanitize lesson blocks from server and client (backport #2344) by @mergify[bot] in https://github.com/frappe/lms/pull/2357
- fix: use before_insert to assign student role to preserve password by @raizasafeel in https://github.com/frappe/lms/pull/2363
- fix: use before_insert to assign student role to preserve password (backport #2363) by @mergify[bot] in https://github.com/frappe/lms/pull/2364
- fix: set proper payments version in frappe dependencies by @raizasafeel in https://github.com/frappe/lms/pull/2365
- feat: add empty states to settings by @raizasafeel in https://github.com/frappe/lms/pull/2367
- fix: timezone now renders for courses and batches by @raizasafeel in https://github.com/frappe/lms/pull/2376
- fix: keep only active course chapter expanded by @musaabhasan in https://github.com/frappe/lms/pull/2372
- fix: user roles are removed on uninstall by @raizasafeel in https://github.com/frappe/lms/pull/2377
- fix: user input questions now renders in quiz results by @raizasafeel in https://github.com/frappe/lms/pull/2378
- fix(settings): meta image uploads successfully by @raizasafeel in https://github.com/frappe/lms/pull/2380
- perf: refactor course outline and lesson to use qb by @raizasafeel in https://github.com/frappe/lms/pull/2381
- fix: recalculate enrollment on course progress save from desk by @raizasafeel in https://github.com/frappe/lms/pull/2382
- fix(quiz): exam submissions and scope check_answer by @raizasafeel in https://github.com/frappe/lms/pull/2383
- perf: refactor course outline and lesson to use qb (backport #2381) by @mergify[bot] in https://github.com/frappe/lms/pull/2384
- refactor(ui): consistent layout, header, and footer across pages by @raizasafeel in https://github.com/frappe/lms/pull/2388
- fix: user roles are removed on uninstall (backport #2377) by @mergify[bot] in https://github.com/frappe/lms/pull/2391
- fix: timezone now renders for courses and batches (backport #2376) by @mergify[bot] in https://github.com/frappe/lms/pull/2390
- fix(quiz): exam submissions and scope check_answer (backport #2383) by @mergify[bot] in https://github.com/frappe/lms/pull/2393
- fix: cloudflare/bunny embeds auto-complete after 30s by @raizasafeel in https://github.com/frappe/lms/pull/2394
- fix(quiz): block direct create/write on LMS Quiz Submission by @raizasafeel in https://github.com/frappe/lms/pull/2395
- feat: add empty states to settings (backport #2367) by @mergify[bot] in https://github.com/frappe/lms/pull/2389
- fix: system manager permissions are set properly on install by @raizasafeel in https://github.com/frappe/lms/pull/2399
- fix: system manager permissions are set properly on install (backport #2399) by @mergify[bot] in https://github.com/frappe/lms/pull/2400
- fix: batch errors are now rendered by @raizasafeel in https://github.com/frappe/lms/pull/2407
- fix(certificate): permission and progress check by @raizasafeel in https://github.com/frappe/lms/pull/2406
- fix: race condition caused duplicate course progress by @raizasafeel in https://github.com/frappe/lms/pull/2411
- fix: job application page is now visible by @raizasafeel in https://github.com/frappe/lms/pull/2413
- fix: drop member email from certified participants response by @raizasafeel in https://github.com/frappe/lms/pull/2414
- fix: mobile layout scroll by @raizasafeel in https://github.com/frappe/lms/pull/2419
- feat: progress control in settings by @raizasafeel in https://github.com/frappe/lms/pull/2426
- perf(quiz): batch question fetch, centralize question field names by @raizasafeel in https://github.com/frappe/lms/pull/2427
- fix(quiz): attempted quiz count during submission by @raizasafeel in https://github.com/frappe/lms/pull/2428
- refactor(lms): clean up course/batch UI and add typed form controls by @raizasafeel in https://github.com/frappe/lms/pull/2424
- fix(courses): tab icons on coursedetail, consistent field styling by @raizasafeel in https://github.com/frappe/lms/pull/2435
- fix(coupon): skip expiry date validation for disabled coupons by @NagariaHussain in https://github.com/frappe/lms/pull/2434
- fix: zoom live class not auto-recording by @NagariaHussain in https://github.com/frappe/lms/pull/2438
- Add ukrainian translation by @gromko in https://github.com/frappe/lms/pull/2439
- fix: scope evaluator writes to the assigned by @raizasafeel in https://github.com/frappe/lms/pull/2441
- fix: enforce member ownership on assignment submission by @raizasafeel in https://github.com/frappe/lms/pull/2440
- fix(ui): batch form layout polish and rich-text instructor bios by @raizasafeel in https://github.com/frappe/lms/pull/2442
- refactor(settings): clean up settings ui by @raizasafeel in https://github.com/frappe/lms/pull/2436
- fix: sidebar overflow in collapsed state by @Owaishk08 in https://github.com/frappe/lms/pull/2320
- feat(lesson): gate private lesson media, SCORM by @raizasafeel in https://github.com/frappe/lms/pull/2446
- feat(lesson): gate private lesson media, SCORM (backport #2446) by @mergify[bot] in https://github.com/frappe/lms/pull/2447
- fix: apply role filter to Members Load More by @raizasafeel in https://github.com/frappe/lms/pull/2448
- fix: apply role filter to Members Load More (backport #2448) by @mergify[bot] in https://github.com/frappe/lms/pull/2449
- fix: stop settings form focus rings from clipping at scroll edge by @raizasafeel in https://github.com/frappe/lms/pull/2450
- fix: ui enhancements by @raizasafeel in https://github.com/frappe/lms/pull/2451
- feat(lms): redesign the lesson editor — inline title, instructor notes, shared BlockEditor by @raizasafeel in https://github.com/frappe/lms/pull/2469
- fix: save new applicable items when editing an existing coupon by @sayali-fossist in https://github.com/frappe/lms/pull/2473
- fix: form control consistency, discussions UX, pricing validation, SCORM guards by @raizasafeel in https://github.com/frappe/lms/pull/2477
- feat: redesign lesson editor and course video, add discussions, and UI consistency pass by @raizasafeel in https://github.com/frappe/lms/pull/2482
- feat: notifications slide-over, 10-option quizzes + QuizForm redesign, dashboard tables by @raizasafeel in https://github.com/frappe/lms/pull/2484
- perf(video-watch): add (member, lesson, source) index by @raizasafeel in https://github.com/frappe/lms/pull/2491
- perf(video-watch): add (member, lesson, source) index (backport #2491) by @mergify[bot] in https://github.com/frappe/lms/pull/2492
- fix(persona): force full-width Selects on persona form by @raizasafeel in https://github.com/frappe/lms/pull/2494
- fix(editor): open the active lesson’s chapter in the outline accordion by @raizasafeel in https://github.com/frappe/lms/pull/2495
- fix: sanitize rendered HTML and restrict quiz uploads by @raizasafeel in https://github.com/frappe/lms/pull/2496
- fix(router): install shared router for standalone AssessmentPlugin mounts by @IridescentGil in https://github.com/frappe/lms/pull/2416
- fix: move video-watch-duration index patch to correct package path by @raizasafeel in https://github.com/frappe/lms/pull/2498
- feat: UI enhancements across courses, editor, outline, sidebar, quiz & batches by @raizasafeel in https://github.com/frappe/lms/pull/2502
- Merge develop into main-hotfix by @raizasafeel in https://github.com/frappe/lms/pull/2503
- Merge
main-hotfixintomainby @raizasafeel in https://github.com/frappe/lms/pull/2505 - fix(sidebar): truncate long link labels so controls are accessible in more by @raizasafeel in https://github.com/frappe/lms/pull/2508
- fix: cypress test, lesson editor autosave crash by @raizasafeel in https://github.com/frappe/lms/pull/2509
- fix(reviews): show real review dates instead of “Today” everywhere by @raizasafeel in https://github.com/frappe/lms/pull/2516
- fix(lesson-editor): harden lesson create/rename/delete flow by @raizasafeel in https://github.com/frappe/lms/pull/2519
- feat: email account setup from frontend by @raizasafeel in https://github.com/frappe/lms/pull/2518
- fix(sidebar): highlight home link on its own route by @raizasafeel in https://github.com/frappe/lms/pull/2520
- fix: send a separate reminder for recorded batch by @raizasafeel in https://github.com/frappe/lms/pull/2521
- fix(editor): remove block clipboard keyboard shortcuts by @raizasafeel in https://github.com/frappe/lms/pull/2522
- feat(persona): redesign as questionnaire stepper by @raizasafeel in https://github.com/frappe/lms/pull/2526
- fix: prose list bullet visibility by @raizasafeel in https://github.com/frappe/lms/pull/2528
- fix(evaluator): make “Add Slot” work on the availability profile by @raizasafeel in https://github.com/frappe/lms/pull/2530
- fix: contain SCORM extraction to the authorised course directory by @raizasafeel in https://github.com/frappe/lms/pull/2529
- fix: guard Attach fields in settings against non-string values by @raizasafeel in https://github.com/frappe/lms/pull/2531
- fix(cert-request): block booking evaluations for other users by @raizasafeel in https://github.com/frappe/lms/pull/2532
- fix(lesson): serve private media without the recent send_private_file by @raizasafeel in https://github.com/frappe/lms/pull/2535
- fix(lesson): preserve rich formatting when pasting HTML into the editor by @raizasafeel in https://github.com/frappe/lms/pull/2536
- fix(delete): clean up all lesson/course back-references on deletion by @raizasafeel in https://github.com/frappe/lms/pull/2537
- fix(course editor): commit chapter rename on Enter by @NagariaHussain in https://github.com/frappe/lms/pull/2542
- fix: add json guard on course lesson content by @raizasafeel in https://github.com/frappe/lms/pull/2546
- fix: add json guard on course lesson content (backport #2546) by @mergify[bot] in https://github.com/frappe/lms/pull/2549
- fix(lesson): emit images inside pasted list items as image blocks by @raizasafeel in https://github.com/frappe/lms/pull/2550
- fix(lesson): emit images inside pasted list items as image blocks (backport #2550) by @mergify[bot] in https://github.com/frappe/lms/pull/2551
- fix: resolve race condition hiding course outline for non admins by @raizasafeel in https://github.com/frappe/lms/pull/2556
- refactor: frappe-ui beta.24 migration and clean up settings by @raizasafeel in https://github.com/frappe/lms/pull/2565
- fix: fire on_update hook on enrollment progress update by @raizasafeel in https://github.com/frappe/lms/pull/2557
- fix: stop fetching the outline before the course loads by @raizasafeel in https://github.com/frappe/lms/pull/2566
- feat(persona): add ‘how did you hear about us’ question by @raizasafeel in https://github.com/frappe/lms/pull/2567
- fix: harden access-control checks by @raizasafeel in https://github.com/frappe/lms/pull/2568
- fix: miscellaneous fixes across payments, jobs, assignments, batches, and editor by @raizasafeel in https://github.com/frappe/lms/pull/2569
- fix(editor): don’t send null docname on lesson file upload by @raizasafeel in https://github.com/frappe/lms/pull/2570
New Contributors
- @Owaishk08 made their first contribution in https://github.com/frappe/lms/pull/2144
- @rathorevaibhav made their first contribution in https://github.com/frappe/lms/pull/2122
- @LeoDanielA01 made their first contribution in https://github.com/frappe/lms/pull/2189
- @jagadish-7 made their first contribution in https://github.com/frappe/lms/pull/2080
- @NuriaAmoros made their first contribution in https://github.com/frappe/lms/pull/2262
- @iamrubeng made their first contribution in https://github.com/frappe/lms/pull/2278
- @musaabhasan made their first contribution in https://github.com/frappe/lms/pull/2372
- @gromko made their first contribution in https://github.com/frappe/lms/pull/2439
- @sayali-fossist made their first contribution in https://github.com/frappe/lms/pull/2473
- @IridescentGil made their first contribution in https://github.com/frappe/lms/pull/2416
- @AryamanSharma14 made their first contribution in https://github.com/frappe/lms/pull/2515
Full Changelog: https://github.com/frappe/lms/compare/v2.45.2…v2.59.0