28 April 2025
listmonk v5.0.0
Repository: @knadh/listmonk
GitHub release page: v5.0.0
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.
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
whensend_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
andcampaigns: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 withCodeMirror
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)
-
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
tov2
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)
-
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.
-
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)
-
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. -
d055cc5 3 Add support for selecting SMTP per campaign (#2290)
-
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)
-
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.
-
3d383cd 5 Make paused campaigns editable.
-
5ba0adc b Automatically switch scheduled campaigns to
draft
whensend_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. -
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.
-
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 withquery
validation. Ref: #2122. -
a129111 4 Replace broken
indent
JS lib withjs-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
-
@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