diff --git a/docs/config.md b/docs/config.md
index 98bcab1f..b04438e7 100644
--- a/docs/config.md
+++ b/docs/config.md
@@ -1029,6 +1029,36 @@ or the root domain:
redir @httpget https://{host}{uri}
}
```
+
+=== "ferron"
+ ``` kdl
+ // /etc/ferron.kdl
+ // Note that this config is most certainly incomplete. Please help out and let me know what's missing
+ // via Discord/Matrix or in a GitHub issue.
+ // Note: Ferron automatically handles both HTTP and WebSockets with proxy
+
+ ntfy.sh {
+ auto_tls
+ auto_tls_letsencrypt_production
+ protocols "h1" "h2" "h3"
+
+ proxy "http://127.0.0.1:2586"
+
+ // Redirect HTTP to HTTPS, but only for GET topic addresses, since we want
+ // it to work with curl without the annoying https:// prefix
+
+ no_redirect_to_https #true
+
+ condition "is_get_topic" {
+ is_equal "{method}" "GET"
+ is_regex "{path}" "^/([-_a-z0-9]{0,64}$|docs/|static/)"
+ }
+
+ if "is_get_topic" {
+ no_redirect_to_https #false
+ }
+ }
+ ```
## Firebase (FCM)
!!! info
diff --git a/docs/integrations.md b/docs/integrations.md
index fede1703..948cd758 100644
--- a/docs/integrations.md
+++ b/docs/integrations.md
@@ -181,6 +181,7 @@ I've added a ⭐ to projects or posts that have a significant following, or had
- [ntfy-heartbeat-monitor](https://codeberg.org/RockWolf/ntfy-heartbeat-monitor) - Application for implementing heartbeat monitoring/alerting by utilizing ntfy
- [ntfy-bridge](https://github.com/AlexGaudon/ntfy-bridge) - An application to bridge Discord messages (or webhooks) to ntfy.
- [ntailfy](https://github.com/leukosaima/ntailfy) - ntfy notifications when Tailscale devices connect/disconnect (Go)
+- [BRun](https://github.com/cbrake/brun) - Native Linux automation platform connecting triggers to actions without containers (Go)
## Blog + forum posts
diff --git a/docs/releases.md b/docs/releases.md
index 3f9fa7a3..74f5c9ef 100644
--- a/docs/releases.md
+++ b/docs/releases.md
@@ -4,15 +4,31 @@ and the [ntfy Android app](https://github.com/binwiederhier/ntfy-android/release
## Current stable releases
-| Component | Version | Release date |
-|------------------|---------|--------------|
-| ntfy server | v2.15.0 | Nov 16, 2025 |
-| ntfy Android app | v1.19.4 | Dec 21, 2025 |
-| ntfy iOS app | v1.3 | Nov 26, 2023 |
+| Component | Version | Release date |
+|------------------------------------------|---------|--------------|
+| ntfy server | v2.15.0 | Nov 16, 2025 |
+| ntfy Android app (_is being rolled out_) | v1.20.0 | Dec 28, 2025 |
+| ntfy iOS app | v1.3 | Nov 26, 2023 |
Please check out the release notes for [upcoming releases](#not-released-yet) below.
-### ntfy Android app v1.19.4
+## ntfy Android app v1.20.0
+Released December 28, 2025
+
+This is the last pure maintenance release for now. It'll bring all dependencies and library version to the latest version,
+and fixes some crashes. I had to drop support for about 4,000 devices (only ~200 installations), because the libraries
+themselves do not support SDK 21 anymore, which was the previous minimum SDK version (Android 5, 2014). Now the minimum
+SDK version is 26 (Android 8, 2017).
+
+**Bug fixes + maintenance:**
+
+* Updated dependencies, minimum SDK version to 26, clean up legacy code, upgrade Gradle ([ntfy-android#140](https://github.com/binwiederhier/ntfy-android/pull/140),
+ thanks to [@cyb3rko](https://github.com/cyb3rko) for the implementation)
+* Updated target SDK version to 36 (Android 8, 2017)
+* Fixed ForegroundServiceDidNotStartInTimeException ([#1520](https://github.com/binwiederhier/ntfy/issues/1520))
+* Fixed crashes with redrawing the list when temporarily muted topics expire
+
+## ntfy Android app v1.19.4
Released December 21, 2025
This release upgrades the Android app to use [Material 3](https://m3.material.io/) design components and adds the
@@ -1556,15 +1572,18 @@ and the [ntfy Android app](https://github.com/binwiederhier/ntfy-android/release
## Not released yet
-### ntfy Android app v1.20.x
-
-**Bug fixes + maintenance:**
-
-* Updated dependencies, minimum SDK version to 26, clean up legacy code, upgrade Gradle ([ntfy-android#140](https://github.com/binwiederhier/ntfy-android/pull/140),
- thanks to [@cyb3rko](https://github.com/cyb3rko) for the implementation)
-
### ntfy Android app v1.21.x
+**Features:**
+
+* Allow publishing messages through the message bar and publish dialog ([#98](https://github.com/binwiederhier/ntfy/issues/98), [ntfy-android#144](https://github.com/binwiederhier/ntfy-android/pull/144))
+* Define custom HTTP headers to support authenticated proxies, tunnels and SSO ([ntfy-android#116](https://github.com/binwiederhier/ntfy-android/issues/116), [#1018](https://github.com/binwiederhier/ntfy/issues/1018), [ntfy-android#132](https://github.com/binwiederhier/ntfy-android/pull/132), [ntfy-android#146](https://github.com/binwiederhier/ntfy-android/pull/146), thanks to [@CrazyWolf13](https://github.com/CrazyWolf13))
+* Implement UnifiedPush "raise to foreground" requirement ([ntfy-android#98](https://github.com/binwiederhier/ntfy-android/pull/98), [ntfy-android#148](https://github.com/binwiederhier/ntfy-android/pull/148), thanks to [@p1gp1g](https://github.com/p1gp1g))
+* Language selector to allow overriding the system language ([#1508](https://github.com/binwiederhier/ntfy/issues/1508), [ntfy-android#145](https://github.com/binwiederhier/ntfy-android/pull/145), thanks to [@hudsonm62](https://github.com/hudsonm62) for reporting)
+* Highlight phone numbers and email addresses in notifications ([#957](https://github.com/binwiederhier/ntfy/issues/957), [ntfy-android#71](https://github.com/binwiederhier/ntfy-android/pull/71), thanks to [@brennenputh](https://github.com/brennenputh), and [@XylenSky](https://github.com/XylenSky) for reporting)
+* Support for port and display name in [ntfy://](subscribe/phone.md#ntfy-links) links ([ntfy-android#130](https://github.com/binwiederhier/ntfy-android/pull/130), thanks to [@godovski](https://github.com/godovski))
+
**Bug fixes + maintenance:**
* Add support for (technically incorrect) 'image/jpg' MIME type ([ntfy-android#142](https://github.com/binwiederhier/ntfy-android/pull/142), thanks to [@Murilobeluco](https://github.com/Murilobeluco))
+* Unify "copy to clipboard" notifications, use Android 13 style ([ntfy-android#61](https://github.com/binwiederhier/ntfy-android/pull/61), thanks to [@thgoebel](https://github.com/thgoebel))
diff --git a/docs/subscribe/phone.md b/docs/subscribe/phone.md
index 94798f43..3015be88 100644
--- a/docs/subscribe/phone.md
+++ b/docs/subscribe/phone.md
@@ -129,10 +129,11 @@ or to simply directly link to a topic from a mobile website.
**Supported link formats:**
-| Link format | Example | Description |
-|-------------------------------------------------------------------------------|-------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
-| `ntfy:///` | `ntfy://ntfy.sh/mytopic` | Directly opens the Android app detail view for the given topic and server. Subscribes to the topic if not already subscribed. This is equivalent to the web view `https://ntfy.sh/mytopic` (HTTPS!) |
-| `ntfy:///?secure=false` | `ntfy://example.com/mytopic?secure=false` | Same as above, except that this will use HTTP instead of HTTPS as topic URL. This is equivalent to the web view `http://example.com/mytopic` (HTTP!) |
+| Link format | Example | Description |
+|---------------------------------------------------------------------------------|-------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| `ntfy:///` | `ntfy://ntfy.sh/mytopic` | Directly opens the Android app detail view for the given topic and server. Subscribes to the topic if not already subscribed. This is equivalent to the web view `https://ntfy.sh/mytopic` (HTTPS!) |
+| `ntfy:///?display=` | `ntfy://ntfy.sh/mytopic?display=My+Topic` | Same as above, but also defines a display name for the topic. |
+| `ntfy:///?secure=false` | `ntfy://example.com/mytopic?secure=false` | Same as above, except that this will use HTTP instead of HTTPS as topic URL. This is equivalent to the web view `http://example.com/mytopic` (HTTP!) |
## Integrations
diff --git a/web/public/static/langs/bg.json b/web/public/static/langs/bg.json
index 31716755..465e969b 100644
--- a/web/public/static/langs/bg.json
+++ b/web/public/static/langs/bg.json
@@ -403,5 +403,7 @@
"prefs_appearance_theme_system": "Системна (подразбирана)",
"web_push_subscription_expiring_title": "Известията временно ще бъдат спрени",
"web_push_subscription_expiring_body": "За да продължите да получавате известия, отворете ntfy",
- "action_bar_unmute_notifications": "Включване звука на известията"
+ "action_bar_unmute_notifications": "Включване звука на известията",
+ "account_tokens_table_cannot_delete_or_edit_provisioned_token": "Кодът за защита от външна система не може да бъде променян или премахван",
+ "account_basics_cannot_edit_or_delete_provisioned_user": "Потребител от външна система не може да бъде променян или премахван"
}
diff --git a/web/public/static/langs/de.json b/web/public/static/langs/de.json
index 0654483a..dc98901e 100644
--- a/web/public/static/langs/de.json
+++ b/web/public/static/langs/de.json
@@ -403,5 +403,7 @@
"web_push_subscription_expiring_body": "Öffne ntfy um weiterhin Benachrichtigungen zu erhalten",
"web_push_unknown_notification_title": "Unbekannte Benachrichtigung vom Server empfangen",
"web_push_unknown_notification_body": "Du musst möglicherweise ntfy aktualisieren, indem du die Web App öffnest",
- "prefs_notifications_web_push_enabled_description": "Benachrichtigungen werden empfangen, auch wenn die Web App nicht geöffnet ist (via Web Push)"
+ "prefs_notifications_web_push_enabled_description": "Benachrichtigungen werden empfangen, auch wenn die Web App nicht geöffnet ist (via Web Push)",
+ "account_tokens_table_cannot_delete_or_edit_provisioned_token": "Bereitgestelltes Token kann nicht bearbeitet oder gelöscht werden",
+ "account_basics_cannot_edit_or_delete_provisioned_user": "Ein bereitgestellter Benutzer kann nicht bearbeitet oder gelöscht werden"
}
diff --git a/web/public/static/langs/es.json b/web/public/static/langs/es.json
index 1d516e5d..598d271a 100644
--- a/web/public/static/langs/es.json
+++ b/web/public/static/langs/es.json
@@ -404,5 +404,7 @@
"prefs_appearance_theme_dark": "Oscuro",
"web_push_subscription_expiring_body": "Abrir ntfy para seguir recibiendo notificaciones",
"web_push_unknown_notification_title": "Notificación desconocida recibida del servidor",
- "web_push_unknown_notification_body": "Puede que necesites actualizar ntfy abriendo la aplicación web"
+ "web_push_unknown_notification_body": "Puede que necesites actualizar ntfy abriendo la aplicación web",
+ "account_basics_cannot_edit_or_delete_provisioned_user": "Un usuario provisionado no se puede editar o eliminar",
+ "account_tokens_table_cannot_delete_or_edit_provisioned_token": "No se puede editar o eliminar un token provisionado"
}
diff --git a/web/public/static/langs/et.json b/web/public/static/langs/et.json
index 8775900d..19c0c704 100644
--- a/web/public/static/langs/et.json
+++ b/web/public/static/langs/et.json
@@ -139,7 +139,7 @@
"display_name_dialog_placeholder": "Kuvatav nimi",
"publish_dialog_title_no_topic": "Avalda teavitus",
"publish_dialog_progress_uploading": "Laadin üles…",
- "publish_dialog_message_published": "Teavitus on saadetud",
+ "publish_dialog_message_published": "Teavitus on avaldatud",
"publish_dialog_emoji_picker_show": "Vali emoji",
"publish_dialog_priority_low": "Vähetähtis",
"publish_dialog_priority_default": "Vaikimisi tähtsus",
@@ -403,5 +403,7 @@
"account_upgrade_dialog_proration_info": "Summade jagamine: Kui muudad teenusepaketti paremaks, siis pead hinnavahe maksma kohe. Kui muudad teenusepaketti madalamaks, siis hinnavahe arvelt hüvituvad mõned järgmised maksed.",
"account_upgrade_dialog_reservations_warning_one": "Sinu praegune teenusepakett võimaldab senise paketiga võrreldes reserveerida vähem teemasid. Enne paketi muutmist palun esmalt kustuta vähemalt üks reserveering. Seda saad teha siin.",
"account_upgrade_dialog_reservations_warning_other": "Sinu praegune teenusepakett võimaldab senise paketiga võrreldes reserveerida vähem teemasid. Enne paketi muutmist palun esmalt kustuta vähemalt {{count}} reserveeringut. Seda saad teha siin.",
- "prefs_users_description": "Oma kaitstud teemade kasutajaid saad lisada ja eemaldada siin. Palun arvesta, et kasutajanimi ja salasõna on salvestatud veebibrauseri kohalikus andmeruumis."
+ "prefs_users_description": "Oma kaitstud teemade kasutajaid saad lisada ja eemaldada siin. Palun arvesta, et kasutajanimi ja salasõna on salvestatud veebibrauseri kohalikus andmeruumis.",
+ "account_basics_cannot_edit_or_delete_provisioned_user": "Eelsisestatud kasutajat ei saa muuta ega kustutada",
+ "account_tokens_table_cannot_delete_or_edit_provisioned_token": "Eelsisestatud tunnusluba ei saa muuta ega kustutada"
}
diff --git a/web/public/static/langs/fr.json b/web/public/static/langs/fr.json
index 572ad659..33112327 100644
--- a/web/public/static/langs/fr.json
+++ b/web/public/static/langs/fr.json
@@ -64,7 +64,7 @@
"notifications_actions_not_supported": "Cette action n'est pas supportée dans l'application web",
"notifications_actions_http_request_title": "Envoyer une requête HTTP {{method}} à {{url}}",
"publish_dialog_attachment_limits_quota_reached": "quota dépassé, {{remainingBytes}} restants",
- "publish_dialog_tags_placeholder": "Liste séparée par des virgules d'étiquettes, par ex. avertissement,backup-srv1",
+ "publish_dialog_tags_placeholder": "Liste d'étiquettes séparée par des virgules, par ex. avertissement,backup-srv1",
"publish_dialog_priority_label": "Priorité",
"publish_dialog_click_label": "URL du clic",
"publish_dialog_click_placeholder": "URL ouverte lors d'un clic sur la notification",
@@ -403,5 +403,7 @@
"web_push_subscription_expiring_title": "Les notifications seront suspendues",
"web_push_subscription_expiring_body": "Ouvrez ntfy pour continuer à recevoir les notifications",
"web_push_unknown_notification_title": "Notification inconnue reçue du serveur",
- "web_push_unknown_notification_body": "Il est possible que vous deviez mettre à jour ntfy en ouvrant l'application web"
+ "web_push_unknown_notification_body": "Il est possible que vous deviez mettre à jour ntfy en ouvrant l'application web",
+ "account_basics_cannot_edit_or_delete_provisioned_user": "Un utilisateur provisionné ne peut pas être modifié ou supprimé",
+ "account_tokens_table_cannot_delete_or_edit_provisioned_token": "Impossible de modifier ou de supprimer le jeton provisionné"
}
diff --git a/web/public/static/langs/ja.json b/web/public/static/langs/ja.json
index 3d9643e0..ebd76b54 100644
--- a/web/public/static/langs/ja.json
+++ b/web/public/static/langs/ja.json
@@ -403,5 +403,7 @@
"prefs_appearance_theme_system": "システム (既定)",
"prefs_appearance_theme_dark": "ダークモード",
"web_push_unknown_notification_title": "不明な通知を受信しました",
- "web_push_unknown_notification_body": "ウェブアプリを開いてntfyをアップデートする必要があります"
+ "web_push_unknown_notification_body": "ウェブアプリを開いてntfyをアップデートする必要があります",
+ "account_basics_cannot_edit_or_delete_provisioned_user": "自動作成されたユーザーの編集や削除はできません",
+ "account_tokens_table_cannot_delete_or_edit_provisioned_token": "自動作成されたトークンは編集や削除はできません"
}