28 April 2025

listmonk v5.0.0

Repository: @knadh/listmonk

GitHub release page: v5.0.0


listmonk-logo

v5.0.0 is a major release. It features the addition of long pending features such as the visual drag-and-drop e-mail builder, per-campaign SMTP selection, and numerous other fixes and improvements.

listmonk-dashboard

What’s new?

  • Visual editor and templates

    • The much requested and awaited visual e-mail builder and template editor is now integrated, with one-click conversion between formats. Thanks to @vividvilla for the big PR integrating @usewaypoint/email-builder-js
  • Campaigns:

    • Replace CodeFlask with the more mature and robust CodeMirror for a much better code-editing experience (HTML, CSS, Javascript, Markdown) on campaigns, forms, templates,and settings UI.

    • Ability to preview campaign archive view.

    • Make paused campaigns editable and allow unscheduling with new Unschedule button.

    • UX improvement that automatically switches scheduled campaigns to draft when send_at is removed.

    • Add format/content type selection to the first screen on campaign creation.

    • Ctrl+S short for saving campaigns while working on them

  • Security:

    • Campaign viewing and management are now filtered by a user’s list permissions and now use the new new campaigns:get_all and campaigns:manage_all permissions. Important: This is a behavioural change from v4.1.0.

    • Disallow private list UUIDs on public subscriber endpoints.

    • Make OIDC provider name on the login button configurable.

    • Add get list permission check to bulk subscriber list management.

    • Proper enforcement of the subscribers:sql_query permission with SQL query analysis and table allow-listing. Addresses #2412.

  • SMTP & e-mail:

    • Name SMTP servers and select an SMTP-server per campaign.

    • Add List-Unsubscribe header to opt-in confirmation emails.

  • General UI

    • One-click Copy button on subscribers and campaigns tables for copying names and e-mails to clickboard.

    • Checkered bg on media thumbnails to visualize transparency.

  • APIs:

    • Add new search param to paginated API responses.

    • Introduce LISTMONK_ADMIN_API_USER for installation.

  • Others

    • Major cleanup and restructuring of the codebase for better maintainability.

    • Upgrade of various dependencies .

    • Many other small fixes and improvements.

How to upgrade

As always, take a backup of your database before upgrading.

Binary

Download the latest binary. Stop and replace the old binary. Run ./listmonk --upgrade. Start the app again.

Docker


# cd /directory/with/docker-compose.yml



docker-compose down

docker-compose pull && docker-compose run --rm app ./listmonk --upgrade

docker-compose up -d app db

Changelog

  • 3b8a8c2 3 Add email-builder/dist to .gitignore.

  • 8902320 a Update screenshot on README.

  • a7085cb 5 Update homepage.

  • 11f52ee 8 Switch migration version to v5

  • 47e8f81 6 Default body_source to null instead of empty string in non-visual campaigns.

  • 925cdf2 8 Add visual template and new permissions to docs.

  • 1599957 d Add and auto-translate missing i18n strings in all language packs.

  • db81dc1 d Remove default dummy admin notification email settings.

  • 9de19ea 2 Fix Codemirror Cypress tests in templates and form pages.

  • 92fc646 9 Update sdks.md: add client for java/kotlin (#2426)

  • 81b62a4 a Fix race condition in immediate campaign pause-start actions.

  • d3c8eca 4 Upgrade Go deps.

  • 0dc29b7 d Fix CSV example on the subscriber import UI.

  • 953deef 4 Hide ‘New’ and ‘Save’ buttons on the templates UI if there’s no manage permission.

  • 7791327 5 Make Must config variables non-Must so that the app doesn’t panic on their absence.

  • 8fc3d27 b Merge pull request #2423 from knadh/dependabot/npm_and_yarn/frontend/email-builder/vite-5.4.18

  • 3dfdf48 d Merge pull request #2424 from knadh/dependabot/npm_and_yarn/frontend/email-builder/babel/runtime-7.27.0

  • 12bc798 6 Make OIDC provider name display on login button configurable. Closes #2211

  • 8885437 6 Bump @babel/runtime from 7.26.0 to 7.27.0 in /frontend/email-builder

  • 6707b63 4 Bump vite from 5.4.10 to 5.4.18 in /frontend/email-builder

  • 5477c16 9 Merge pull request #2373 from knadh/feat-visual-editor

  • ed700d7 a Add a Preview option to the campaign archive tab. Closes #2245.

  • b67fc5e a Replace CodeFlask code editor with CodeMirror on the UI.

  • 53d7929 7 Prepare first RC.

  • ffbda01 9 Add sample visual campaign template on install and upgrade.

  • 445d7e5 3 Fix clone campaign by fetching campaign body on clone.

  • 1559c55 a Add visual editor Cypress tests.

  • ded0fcf a Fix broken visual template cloning on the templates UI.

  • dcdef8e a Add format/content type selection to campaign creation UI.

  • d3da0be 6 Fix `test campaign’ sending wrong template for visual campaigns.

  • 5207dff 7 Fix visual editor change event/init/import sequences.

  • 968b366 b Stop fetching bodies for all campaigns and explicitly fetch for visual campaign import.

  • 20e4b10 0 Fix DB state issues in visual campaign cloning.

  • f4c0e66 a Refactor ‘media upload’ integration in campaign visual editor.

  • 3aba2b0 0 Fix frontend/email-builder Makefile build steps.

  • 343d405 b Add Ctrl+S campaign save shortcut and add Ctrl+S and F9 to richtext editor.

  • e4e735e 0 Update tsx formatting in email-builder.

  • 503e985 5 Add support for converting all types to visual editor blocks.

  • f1fbadf 6 Fix incorrect template states in DB in campaign creation and broken preview.

  • cee2589 a Move email-builder src from / to /frontend.

  • 110345d 6 Refactor and simplify state management in campaign editor.

  • fca5ec5 a Change visual editor UI language.

  • 7786b18 4 Add DB migrations for visual editor.

  • c1f81cf a Fix compatibility issues with master.

  • 82e2b70 5 fix: Move visual-editor to iframe so that CSS styles are isolated.

  • 4a524c9 3 feat: Integrate media selector to visual editor and add minor fixes.

  • e6f08a0 5 feat: Inject email-builder instead of loading it as ES module

  • ae98280 8 feat: Integrate email-builder on campaign/template editor UI and backend.

  • 5a0980e 5 Add on-hover one-click Copy button to subscribers and campaigns tables UI.

  • a85e467 c Add missing charset for numbers in TrackLink regex. (#2404)

  • fb52700 8 Remove GET /api/settings dependency on the Lists -> Forms UI.

  • b44ea0c 3 Merge branch ‘fix-sql-search’

  • 75aad8e c Add new search param to paginated API response structure.

  • 29591c1 8 Add get list permission check to bulk subscriber list management.

  • fca8d6d e Bump vite from 5.4.17 to 5.4.18 in /frontend (#2416)

  • 4b805f8 8 Fix broken subscribers:sql_query permission.

  • 375e385 6 Bump golang.org/x/net from 0.36.0 to 0.38.0 (#2413)

  • 4d8c8cd e Update installation.md (#2405)

  • 5971bc4 a Fix Raw CSV example on import UI (#2392)

  • 562e52c d Introduce LISTMONK_ADMIN_API_USER to --install. Closes #2314, #2322.

  • b3e6b09 9 Bump vite from 5.4.15 to 5.4.17 in /frontend (#2391)

  • 0826f40 1 Remove repetitive URL param :id validation and simplify handlers.

  • e6d3aad 0 Add ability to wait and healthcheck for backend app in Cypress settings tests.

  • 78366ab 7 Clean up main initialization to remove app interdepencies in init.

  • 8848922 3 Remove superfluous consts dep in init functions by separating URL consts.

  • e2f24a1 4 Turn notifs into a special stateful global singleton package, removing clunky deps.

  • e327ebb b Move all HTTP handlers directly to App and remove the redundant in-between layer.

  • b3d46a8 c Refactor system notification callbacks into a new notifs package.

  • 00c858f c Refactor all HTTP handlers and attach them to a single struct.

  • 007f4de 8 Fix a number of cosmetic inconsistenies across handlers and functions.

  • fcf2449 a Replace awkward auth user object access in handlers with an explicit func.

  • 17998fb f Refactor user auth models and permission checks.

  • 5c78506 4 Refactor superfluous list perm check middleware into standalone function.

  • a271bf5 4 Introduce per-campaign filter permissions. Closes #2325.

  • a5f8b28 c Fix inconsistent behaviour in campaign scheduling on the UI.

  • fbc27ae 4 Refactor UI time diff display function to prefix ‘-’ on past dates.

  • 92e5d63 0 Fix various static-check/idiom warnings.

  • b18c7ad 0 Fix incorrect loading spinner on the Lists UI. Closes #1822.

  • d1c964d a Bump vite from 5.4.12 to 5.4.15 in /frontend (#2379)

  • b8f50ea f Add support for domain allowlists in addition to blocklists. Closes #2230.

  • 6efb6e7 6 Upgrade smtppool to v2 and add support for concrete SSL options.

  • e4a18da b Remove forcing unique filename on all media uploads.

  • ef8f319 1 Remove obsolete language key and refresh i18n files.

  • 9224e34 4 Update i18n refresh script to remove deleted base keys from all other files.

  • 5f1b676 4 Remove ASCII-only restriction on media filenames. Closes #2277.

  • 0be7a79 d Fix broken log rendering on importer UI.

  • 1b43e1a 0 Add minor i18n Hungarian language pack fixes (#2375)

  • 06c2f3b 9 Add Nuxt.js module to Supported Libraries Lists (#2371)

  • 473f942 7 Add i18n Hungarian language pack fixes (#2370)

  • 7d3e6e6 1 Fix too greedy TrackLink regex replacement. (#2355)

  • 79f8b60 e Updating documentation to reflect AWS Console changes (#2365)

  • 625f616 7 Change the docker-compose example to bind Postgres locally. Closes #2357.

  • de9a8ea 4 Add Bulgarian i18n translation (#2349)

  • f310131 6 Update Go version to v1.24.1

  • d43ac10 7 Tidy go.mod

  • f34551d 2 Bump golang.org/x/net from 0.33.0 to 0.36.0 (#2348)

  • 2005e7a 4 Bump github.com/go-jose/go-jose/v3 from 3.0.3 to 3.0.4 (#2346)

  • bc5b817 5 Bump axios from 1.7.9 to 1.8.2 in /frontend (#2347)

  • a986961 2 Disallow private list UUIDs on public sub endpoints. Closes #2296.

  • 8dc5bc2 9 Bump prismjs from 1.29.0 to 1.30.0 in /frontend (#2345)

  • f8d07ad 9 Fix DELETE list documentation. (#2335)

  • 06768ba 8 Fix ru i18n lang (#2330)

  • e649cf6 f docs: improve clarity and consistency of user-related translations (#2324)

  • d3a417d 1 Fix typo in function name.

  • 2defef3 8 Refactor SMTP name to always have email- prefix for consistency.

  • 24af0bc 2 Update ca.json (#2303)

  • d055cc5 3 Add support for selecting SMTP per campaign (#2290)

  • 756e391 5 Fix typos in subscribers.md (#2302)

  • 61d7a9d 2 Update cs-cz.json (#2293)

  • 2f5ab4c 6 Display filename and milliseconds in timestamp on the logs admin UI (#2280)

  • ad162c2 5 Bump vite from 5.4.11 to 5.4.12 in /frontend (#2268)

  • 86f9ad0 5 Add Norwegian BokmÃ¥l (no.json) i18n language pack (#2289)

  • d0321ba f fix: typo in callout under the settings page (#2283)

  • c3069e5 5 Update Finnish translation (#2270)

  • 672d8ff b Merge pull request #2269 from s-en-o/patch-1

  • 1446fbb 5 fix(static): no matching closing anchor tag

  • 7153777 b Merge pull request #2266 from vinitparekh17/patch-1

  • 7c952e7 8 docs: removed duplicate line

  • afa717f d Upgrade smtp-pool lib fixing non-FQDN hostnames. Closes #2146.

  • ff19a34 f Fix bounce meta JSON overflowing in the table on admin UI. Closes #1797.

  • 0e49a4b b Merge pull request #2264 from knadh/edit-campaign

  • 3d383cd 5 Make paused campaigns editable.

  • 5ba0adc b Automatically switch scheduled campaigns to draft when send_at date it removed.

  • 61c6b7e 1 Add explicit Unschedule button on campaign UI.

  • fd31ac6 f Remove redundant send_later param in campaign POST/PUT.

  • e8fd12b d Add List-Unsubscribe header to opt-in confirmation mails. Closes #2224.

  • 2e8a5ac e Add user roles/perms documentation. Closes #2242.

  • 0930a22 b Add VACUUM to maintenance section in docs.

  • e2aa9c5 3 Make media image background checkered to show transparency. Closes #2080.

  • c877156 2 Bump golang.org/x/net from 0.23.0 to 0.33.0 (#2253)

  • a5e56c3 4 fix: forwardemail bounce processing invalid signature issue (#2250)

  • 0878f3e 6 Add Laravel SDK to Supported Libraries Lists (#2240)

  • 50b296d a Remove GitHub from OIDC shortcuts as it doesn’t support OIDC. Closes #2235.

  • b75de39 f Fix elest.io image in docs (#2239)

  • cb9b798 5 Fix typo in de i118 (#2236)

  • 62c996b c Fix typo (#2233)

  • 2abc0a8 6 Apply minor Go code fixes (#2219)

  • 98934e6 0 Fix outdated docker local dev suite (#2200)

  • 97fde64 4 Make CSV (import) header fields agnostic of surrounding spaces. Closes #2189.

  • 6371228 5 Fix schema and add migration for incorrect subscriber count (null) in materialized view.

  • 5c0de6e f Fix broken sorting lists by subscriber_count. Closes #2151.

  • 7bfbd6a 8 Add all to subscriber deletion by query which broke with query validation. Ref: #2122.

  • a129111 4 Replace broken indent JS lib with js-beautify. Closes #2182.

  • 1c33d32 b Remove redundant event from bounces UI. Closes #1850.

  • cb99d60 0 Fix loading of messengers from serverConfig on line 629 (#2187)

  • 3f5bad1 a Fix incorrent curl command in docs.

  • fce46b2 1 fix: update OpenAPI specs for routes and correct docs for campaign endpoints (#2179)

  • 882c49f 1 Bump cross-spawn from 7.0.3 to 7.0.6 in /frontend (#2169)

  • ee9677c d removes example properties from attribs property and allow additional properties (#2154)

  • 1451c4b 1 Improve API auth/permission docs and examples.

  • 392bc87 2 Add curl example to subscriber import docs.

  • 1198f6f 3 Update release link on static site homepage.

New Contributors

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