From baa615a0d1b2b6801eefa8a0dd8676fe1ade8e0c Mon Sep 17 00:00:00 2001
From: Dmitry Verkhoturov
Date: Tue, 10 Feb 2026 23:51:01 +0000
Subject: [PATCH 1/3] Fix NOTIFY_EMAIL_FROM plus sign encoding in mailto URLs
URL-encode e.From in mailto query parameters so that + characters
are preserved instead of being decoded as spaces. Fixes #1946
---
backend/app/notify/email.go | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/backend/app/notify/email.go b/backend/app/notify/email.go
index f72c6b56..6238e09f 100644
--- a/backend/app/notify/email.go
+++ b/backend/app/notify/email.go
@@ -168,7 +168,7 @@ func (e *Email) buildAndSendMessage(ctx context.Context, req Request, email stri
ctx,
fmt.Sprintf("mailto:%s?from=%s&unsubscribeLink=%s&subject=%s",
email,
- e.From,
+ url.QueryEscape(e.From),
url.QueryEscape(msg.unsubscribeLink),
url.QueryEscape(msg.subject),
),
@@ -203,7 +203,7 @@ func (e *Email) SendVerification(ctx context.Context, req VerificationRequest) e
ctx,
fmt.Sprintf("mailto:%s?from=%s&subject=%s",
req.Email,
- e.From,
+ url.QueryEscape(e.From),
url.QueryEscape(e.VerificationSubject),
),
msg,
From 79177e52f9b9eab94385e021e42a18f8aa9225cf Mon Sep 17 00:00:00 2001
From: Dmitry Verkhoturov
Date: Tue, 10 Feb 2026 23:51:08 +0000
Subject: [PATCH 2/3] Fix 100% CPU when EDIT_TIME=0 in image cleanup
When EditDuration is zero or negative, cleanupTTL becomes zero,
causing time.After(0) to fire immediately in a tight loop.
Block on ctx.Done() instead when edit duration is disabled. Fixes #1991
---
backend/app/store/image/image.go | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/backend/app/store/image/image.go b/backend/app/store/image/image.go
index 6339d8e1..2bfea93b 100644
--- a/backend/app/store/image/image.go
+++ b/backend/app/store/image/image.go
@@ -154,6 +154,12 @@ func (s *Service) ExtractNonProxiedPictures(commentHTML string) (ids []string) {
// Cleanup runs periodic cleanup with 1.5*ServiceParams.EditDuration. Blocking loop, should be called inside of goroutine by consumer
func (s *Service) Cleanup(ctx context.Context) {
+ if s.EditDuration <= 0 {
+ log.Printf("[INFO] pictures cleanup disabled, edit duration is %v", s.EditDuration)
+ <-ctx.Done()
+ return
+ }
+
cleanupTTL := s.EditDuration * 15 / 10 // cleanup images older than 1.5 * EditDuration
log.Printf("[INFO] start pictures cleanup, staging ttl=%v", cleanupTTL)
From 3c2679a1d574a439031d51e9f994656540225159 Mon Sep 17 00:00:00 2001
From: Dmitry Verkhoturov
Date: Tue, 10 Feb 2026 23:51:14 +0000
Subject: [PATCH 3/3] Fix hardcoded /web paths in demo template
Use REMARK_URL template variable for widget links so demo page
works with non-root path prefixes. Fixes #1996
---
frontend/apps/remark42/templates/demo.ejs | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/frontend/apps/remark42/templates/demo.ejs b/frontend/apps/remark42/templates/demo.ejs
index 09d43709..2c3f8730 100644
--- a/frontend/apps/remark42/templates/demo.ejs
+++ b/frontend/apps/remark42/templates/demo.ejs
@@ -72,11 +72,11 @@
- + Last comments widget page
+