diff --git a/CHANGELOG.md b/CHANGELOG.md
new file mode 100644
index 0000000..cb4ed54
--- /dev/null
+++ b/CHANGELOG.md
@@ -0,0 +1,23 @@
+# Easy IRL Stream
+
+## v1.1.0 — Update Check, Watermark & SSL Fix
+
+### New Features
+- **Mandatory update check** — The plugin now checks for updates on startup. If a newer version is available, a dialog is shown, the download page opens, and the plugin stays disabled until updated.
+- **Watermark for free users** — Non-Patreon users now see a small "Easy IRL Stream - stools.cc" watermark in the bottom-right corner of the video. Patreon supporters get it removed automatically.
+
+### Bug Fixes
+- **Fixed SSL connect errors** — API calls to `stools.cc` failed with "SSL connect error" because libcurl (built with OpenSSL) couldn't find CA certificates on Windows. Added `CURLSSLOPT_NATIVE_CA` to all curl calls so OpenSSL uses the Windows certificate store.
+
+---
+
+## v1.0.1 — Bug Fixes & Improvements
+
+### Bug Fixes
+- **Fixed HTTPS webhooks** — Webhooks to `https://` URLs were silently failing because the plugin used raw TCP sockets without TLS. Replaced with libcurl, which properly handles HTTPS, and added connect/request timeouts to prevent hangs.
+- **Fixed shared decoder counters** — Debug counters for video packets/frames were shared across all source instances (static variables). They are now per-source and reset on each new connection.
+- **Fixed SRT streamid not applied** — The `streamid` setting was loaded from the remote config but never actually appended to the SRT listener URL. It is now included when set.
+
+### Improvements
+- **Enriched webhook payload** — Webhook POST body now includes `bitrate_kbps`, `uptime_sec`, `video_width`, `video_height`, and `video_codec` alongside the existing `event`, `source`, and `timestamp` fields.
+- **IP addresses in Stream Monitor** — The monitor dock now shows your local (LAN) and external (WAN) IP at the bottom, so you don't have to open the Help dialog to check them.
diff --git a/CMakeLists.txt b/CMakeLists.txt
index c9e7a38..584ffff 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -22,6 +22,7 @@ add_library(easy-irl-stream MODULE
src/webhook.c
src/srtla-server.c
src/remote-settings.c
+ src/watermark.c
src/obfuscation.cpp
src/help-dialog.cpp
src/stats-dialog.cpp
diff --git a/src/help-dialog.cpp b/src/help-dialog.cpp
index 1a22408..5134423 100644
--- a/src/help-dialog.cpp
+++ b/src/help-dialog.cpp
@@ -56,6 +56,8 @@ struct HelpStrings {
const char *srtla_step4;
const char *faq_q7;
const char *faq_a7;
+ const char *faq_q8;
+ const char *faq_a8;
};
static const HelpStrings LANG_DE = {
@@ -135,6 +137,11 @@ static const HelpStrings LANG_DE = {
"der die Pakete entgegennimmt und an den internen SRT-Server weiterleitet.
"
"Standard-Ports: SRTLA = UDP 5000, SRT = UDP 9000
"
"Wichtig: In Moblin den SRTLA-Port (5000) angeben, nicht den SRT-Port (9000)!",
+ "Was ist das Wasserzeichen im Video?",
+ "In der kostenlosen Version wird Easy IRL Stream – stools.cc "
+ "unten rechts im Bild eingeblendet. Als "
+ "Patreon-Unterstützer "
+ "wird das Wasserzeichen automatisch entfernt.",
};
static const HelpStrings LANG_EN = {
@@ -212,6 +219,11 @@ static const HelpStrings LANG_EN = {
"receives the packets and forwards them to the internal SRT server.
"
"Default ports: SRTLA = UDP 5000, SRT = UDP 9000
"
"Important: In Moblin, enter the SRTLA port (5000), not the SRT port (9000)!",
+ "What is the watermark in the video?",
+ "The free version shows Easy IRL Stream – stools.cc "
+ "in the bottom-right corner of the video. "
+ "Patreon supporters "
+ "get the watermark removed automatically.",
};
static QString build_html(const char *local_ip, const char *external_ip,
@@ -307,6 +319,7 @@ static QString build_html(const char *local_ip, const char *external_ip,
+ QString("