v5.0.0

knadh/listmonkv5.0.0Apr 28, 2025by github-actions[bot]

AI Summary

v5.0.0 is a major release introducing the visual email builder. Note: Users should upgrade to v5.0.2 for bug fixes and security improvements.

Key Highlights

  • Visual email builder and template editor with one-click conversion
  • CodeMirror for HTML, CSS, Javascript, Markdown editing
  • Per-campaign SMTP selection
  • Campaign archive view with slug support
  • OIDC authentication support
  • Multi-user permission system
  • Query caching for large databases

New Features

  • Visual email builder
  • CodeMirror editor
  • Per-campaign SMTP
  • Campaign slugs
  • OIDC auth

Full Release Notes

Skip this release and upgrade to [v5.0.2](https://github.com/knadh/listmonk/releases/tag/v5.0.2) instead for multiple fixes (UX bugs and a security fix)


## Changelog
* 3b8a8c23 Add email-builder/dist to .gitignore.
* 8902320a Update screenshot on README.
* a7085cb5 Update homepage.
* 11f52ee8 Switch migration version to v5
* 47e8f816 Default `body_source` to null instead of empty string in non-visual campaigns.
* 925cdf28 Add visual template and new permissions to docs.
* 1599957d Add and auto-translate missing i18n strings in all language packs.
* db81dc1d Remove default dummy admin notification email settings.
* 9de19ea2 Fix Codemirror Cypress tests in templates and form pages.
* 92fc6469 Update sdks.md: add client for java/kotlin (#2426)
* 81b62a4a Fix race condition in immediate campaign pause-start actions.
* d3c8eca4 Upgrade Go deps.
* 0dc29b7d Fix CSV example on the subscriber import UI.
* 953deef4 Hide 'New' and 'Save' buttons on the templates UI if there's no manage permission.
* 77913275 Make `Must` config variables non-`Must` so that the app doesn't panic on their absence.
* 8fc3d27b Merge pull request #2423 from knadh/dependabot/npm_and_yarn/frontend/email-builder/vite-5.4.18
* 3dfdf48d Merge pull request #2424 from knadh/dependabot/npm_and_yarn/frontend/email-builder/babel/runtime-7.27.0
* 12bc7986 Make OIDC provider name display on login button configurable. Closes #2211
* 88854376 Bump @babel/runtime from 7.26.0 to 7.27.0 in /frontend/email-builder
* 6707b634 Bump vite from 5.4.10 to 5.4.18 in /frontend/email-builder
* 5477c169 Merge pull request #2373 from knadh/feat-visual-editor
* ed700d7a Add a `Preview` option to the campaign archive tab. Closes #2245.
* b67fc5ea Replace `CodeFlask` code editor with `CodeMirror` on the UI.
* 53d79297 Prepare first RC.
* ffbda019 Add sample visual campaign template on install and upgrade.
* 445d7e53 Fix `clone campaign` by fetching campaign body on clone.
* 1559c55a Add visual editor Cypress tests.
* ded0fcfa Fix broken visual template cloning on the templates UI.
* dcdef8ea Add format/content type selection to campaign creation UI.
* d3da0be6 Fix `test campaign' sending wrong template for visual campaigns.
* 5207dff7 Fix visual editor change event/init/import sequences.
* 968b366b Stop fetching bodies for all campaigns and explicitly fetch for visual campaign import.
* 20e4b100 Fix DB state issues in visual campaign cloning.
* f4c0e66a Refactor 'media upload' integration in campaign visual editor.
* 3aba2b00 Fix frontend/email-builder Makefile build steps.
* 343d405b Add Ctrl+S campaign save shortcut and add Ctrl+S and F9 to richtext editor.
* e4e735e0 Update tsx formatting in email-builder.
* 503e9855 Add support for converting all types to visual editor blocks.
* f1fbadf6 Fix incorrect template states in DB in campaign creation and broken preview.
* cee2589a Move `email-builder` src from `/` to `/frontend`.
* 110345d6 Refactor and simplify state management in campaign editor.
* fca5ec5a Change visual editor UI language.
* 7786b184 Add DB migrations for visual editor.
* c1f81cfa Fix compatibility issues with `master`.
* 82e2b705 fix: Move visual-editor to iframe so that CSS styles are isolated.
* 4a524c93 feat: Integrate media selector to visual editor and add minor fixes.
* e6f08a05 feat: Inject email-builder instead of loading it as ES module
* ae982808 feat: Integrate email-builder on campaign/template editor UI and backend.
* 5a0980e5 Add on-hover one-click `Copy` button to subscribers and campaigns tables UI.
* a85e467c Add missing charset for numbers in TrackLink regex. (#2404)
* fb527008 Remove `GET /api/settings` dependency on the Lists -> Forms UI.
* b44ea0c3 Merge branch 'fix-sql-search'
* 75aad8ec Add new `search` param to paginated API response structure.
* 29591c18 Add `get` list permission check to bulk subscriber list management.
* fca8d6de Bump vite from 5.4.17 to 5.4.18 in /frontend (#2416)
* 4b805f88 Fix broken `subscribers:sql_query` permission.
* 375e3856 Bump golang.org/x/net from 0.36.0 to 0.38.0 (#2413)
* 4d8c8cde Update installation.md (#2405)
* 5971bc4a Fix Raw CSV example on import UI (#2392)
* 562e52cd Introduce `LISTMONK_ADMIN_API_USER` to `--install`. Closes #2314, #2322.
* b3e6b099 Bump vite from 5.4.15 to 5.4.17 in /frontend (#2391)
* 0826f401 Remove repetitive URL param `:id` validation and simplify handlers.
* e6d3aad0 Add ability to wait and healthcheck for backend app in Cypress settings tests.
* 78366ab7 Clean up main initialization to remove `app` interdepencies in init.
* 88489223 Remove superfluous `consts` dep in init functions by separating URL consts.
* e2f24a14 Turn `notifs` into a special stateful global singleton package, removing clunky deps.
* e327ebbb Move all HTTP handlers directly to `App` and remove the redundant in-between layer.
* b3d46a8c Refactor system notification callbacks into a new `notifs` package.
* 00c858fc Refactor all HTTP handlers and attach them to a single struct.
* 007f4de8 Fix a number of cosmetic inconsistenies across handlers and functions.
* fcf2449a Replace awkward auth user object access in handlers with an explicit func.
* 17998fbf Refactor user auth models and permission checks.
* 5c785064 Refactor superfluous list perm check middleware into standalone function.
* a271bf54 Introduce per-campaign filter permissions. Closes #2325.
* a5f8b28c Fix inconsistent behaviour in campaign scheduling on the UI.
* fbc27ae4 Refactor UI time diff display function to prefix '-' on past dates.
* 92e5d630 Fix various static-check/idiom warnings.
* b18c7ad0 Fix incorrect loading spinner on the Lists UI. Closes #1822.
* d1c964da Bump vite from 5.4.12 to 5.4.15 in /frontend (#2379)
* b8f50eaf Add support for domain allowlists in addition to blocklists. Closes #2230.
* 6efb6e76 Upgrade `smtppool` to `v2` and add support for concrete SSL options.
* e4a18dab Remove forcing unique filename on all media uploads.
* ef8f3191 Remove obsolete language key and refresh i18n files.
* 9224e344 Update i18n refresh script to remove deleted base keys from all other files.
* 5f1b6764 Remove ASCII-only restriction on media filenames. Closes #2277.
* 0be7a79d Fix broken log rendering on importer UI.
* 1b43e1a0 Add minor i18n Hungarian language pack fixes (#2375)
* 06c2f3b9 Add Nuxt.js module to Supported Libraries Lists (#2371)
* 473f9427 Add i18n Hungarian language pack fixes (#2370)
* 7d3e6e61 Fix too greedy TrackLink regex replacement. (#2355)
* 79f8b60e Updating documentation to reflect AWS Console changes (#2365)
* 625f6167 Change the docker-compose example to bind Postgres locally. Closes #2357.
* de9a8ea4 Add Bulgarian i18n translation (#2349)
* f3101316 Update Go version to v1.24.1
* d43ac107 Tidy go.mod
* f34551d2 Bump golang.org/x/net from 0.33.0 to 0.36.0 (#2348)
* 2005e7a4 Bump github.com/go-jose/go-jose/v3 from 3.0.3 to 3.0.4 (#2346)
* bc5b8175 Bump axios from 1.7.9 to 1.8.2 in /frontend (#2347)
* a9869612 Disallow private list UUIDs on public sub endpoints. Closes #2296.
* 8dc5bc29 Bump prismjs from 1.29.0 to 1.30.0 in /frontend (#2345)
* f8d07ad9 Fix DELETE list documentation. (#2335)
* 06768ba8 Fix ru i18n lang (#2330)
* e649cf6f docs: improve clarity and consistency of user-related translations (#2324)
* d3a417d1 Fix typo in function name.
* 2defef38 Refactor SMTP name to always have `email-` prefix for consistency.
* 24af0bc2 Update ca.json (#2303)
* d055cc53 Add support for selecting SMTP per campaign (#2290)
* 756e3915 Fix typos in subscribers.md (#2302)
* 61d7a9d2 Update cs-cz.json (#2293)
* 2f5ab4c6 Display filename and milliseconds in timestamp on the logs admin UI (#2280)
* ad162c25 Bump vite from 5.4.11 to 5.4.12 in /frontend (#2268)
* 86f9ad05 Add Norwegian Bokmål (no.json) i18n language pack (#2289)
* d0321baf fix: typo in callout under the settings page (#2283)
* c3069e55 Update Finnish translation (#2270)
* 672d8ffb Merge pull request #2269 from s-en-o/patch-1
* 1446fbb5 fix(static): no matching closing anchor tag
* 7153777b Merge pull request #2266 from vinitparekh17/patch-1
* 7c952e78 docs: removed duplicate line
* afa717fd Upgrade smtp-pool lib fixing non-FQDN hostnames. Closes #2146.
* ff19a34f Fix bounce meta JSON overflowing in the table on admin UI. Closes #1797.
* 0e49a4bb Merge pull request #2264 from knadh/edit-campaign
* 3d383cd5 Make paused campaigns editable.
* 5ba0adcb Automatically switch scheduled campaigns to `draft` when `send_at` date it removed.
* 61c6b7e1 Add explicit `Unschedule` button on campaign UI.
* fd31ac6f Remove redundant `send_later` param in campaign POST/PUT.
* e8fd12bd Add `List-Unsubscribe` header to opt-in confirmation mails. Closes #2224.
* 2e8a5ace Add user roles/perms documentation. Closes #2242.
* 0930a22b Add VACUUM to maintenance section in docs.
* e2aa9c53 Make media image background checkered to show transparency. Closes #2080.
* c8771562 Bump golang.org/x/net from 0.23.0 to 0.33.0 (#2253)
* a5e56c34 fix: forwardemail bounce processing invalid signature issue (#2250)
* 0878f3e6 Add Laravel SDK to Supported Libraries Lists (#2240)
* 50b296da Remove GitHub from OIDC shortcuts as it doesn't support OIDC. Closes #2235.
* b75de39f Fix elest.io image in docs (#2239)
* cb9b7985 Fix typo in de i118 (#2236)
* 62c996bc Fix typo (#2233)
* 2abc0a86 Apply minor Go code fixes (#2219)
* 98934e60 Fix outdated docker local dev suite (#2200)
* 97fde644 Make CSV (import) header fields agnostic of surrounding spaces. Closes #2189.
* 63712285 Fix schema and add migration for incorrect subscriber count (null) in materialized view.
* 5c0de6ef Fix broken sorting lists by `subscriber_count`. Closes #2151.
* 7bfbd6a8 Add `all` to subscriber deletion by query which broke with `query` validation. Ref: #2122.
* a1291114 Replace broken `indent` JS lib with `js-beautify`. Closes #2182.
* 1c33d32b Remove redundant event from bounces UI. Closes #1850.
* cb99d600 Fix loading of messengers from serverConfig on line 629 (#2187)
* 3f5bad1a Fix incorrent curl command in docs.
* fce46b21 fix: update OpenAPI specs for routes and correct docs for campaign endpoints (#2179)
* 882c49f1 Bump cross-spawn from 7.0.3 to 7.0.6 in /frontend (#2169)
* ee9677cd removes example properties from attribs property and allow additional properties (#2154)
* 1451c4b1 Improve API auth/permission docs and examples.
* 392bc872 Add curl example to subscriber import docs.
* 1198f6f3 Update release link on static site homepage.



## New Contributors
* @dylancetin made their first contribution in https://github.com/knadh/listmonk/pull/2179
* @centja1 made their first contribution in https://github.com/knadh/listmonk/pull/2187
* @flyotlin made their first contribution in https://github.com/knadh/listmonk/pull/2200
* @ANU7MADHAV made their first contribution in https://github.com/knadh/listmonk/pull/2219
* @bharatkashyap made their first contribution in https://github.com/knadh/listmonk/pull/2233
* @xelayz made their first contribution in https://github.com/knadh/listmonk/pull/2236
* @trishitchar made their first contribution in https://github.com/knadh/listmonk/pull/2239
* @theafolayan made their first contribution in https://github.com/knadh/listmonk/pull/2240
* @vinitparekh17 made their first contribution in https://github.com/knadh/listmonk/pull/2266
* @s-en-o made their first contribution in https://github.com/knadh/listmonk/pull/2269
* @mlaht made their first contribution in https://github.com/knadh/listmonk/pull/2270
* @yeskunall made their first contribution in https://github.com/knadh/listmonk/pull/2283
* @vegardgithub made their first contribution in https://github.com/knadh/listmonk/pull/2289
* @savioribeiro made their first contribution in https://github.com/knadh/listmonk/pull/2280
* @matejdivecky made their first contribution in https://github.com/knadh/listmonk/pull/2293
* @candidexmedia made their first contribution in https://github.com/knadh/listmonk/pull/2302
* @lcd1232 made their first contribution in https://github.com/knadh/listmonk/pull/2290
* @fquinto made their first contribution in https://github.com/knadh/listmonk/pull/2303
* @appleboy made their first contribution in https://github.com/knadh/listmonk/pull/2324
* @Impeck made their first contribution in https://github.com/knadh/listmonk/pull/2330
* @marcw made their first contribution in https://github.com/knadh/listmonk/pull/2335
* @listumps made their first contribution in https://github.com/knadh/listmonk/pull/2349
* @brismuth made their first contribution in https://github.com/knadh/listmonk/pull/2365
* @0xdeb made their first contribution in https://github.com/knadh/listmonk/pull/2355
* @trustedtomato made their first contribution in https://github.com/knadh/listmonk/pull/2370
* @roncallyt made their first contribution in https://github.com/knadh/listmonk/pull/2371
* @pierreneillo made their first contribution in https://github.com/knadh/listmonk/pull/2392
* @hlassiege made their first contribution in https://github.com/knadh/listmonk/pull/2426

**Full Changelog**: https://github.com/knadh/listmonk/compare/v4.1.0...v5.0.0