diff --git a/docs/publish.md b/docs/publish.md index 81c4bd44..d2f027a6 100644 --- a/docs/publish.md +++ b/docs/publish.md @@ -641,7 +641,7 @@ You can format messages using [Markdown](https://www.markdownguide.org/basic-syn By default, messages sent to ntfy are rendered as plain text. To enable Markdown, set the `X-Markdown` header (or any of its aliases: `Markdown`, or `md`) to `true` (or `1` or `yes`), or set the `Content-Type` header to `text/markdown`. -As of today, **Markdown is only supported in the web app.** Here's an example of how to enable Markdown formatting: +Here's an example of how to enable Markdown formatting: === "Command line (curl)" ``` diff --git a/docs/releases.md b/docs/releases.md index 97302aca..254c92af 100644 --- a/docs/releases.md +++ b/docs/releases.md @@ -7,11 +7,48 @@ and the [ntfy Android app](https://github.com/binwiederhier/ntfy-android/release | Component | Version | Release date | |------------------|---------|--------------| | ntfy server | v2.16.0 | Jan 19, 2026 | -| ntfy Android app | v1.21.1 | Jan 6, 2025 | +| ntfy Android app | v1.22.1 | Jan 20, 2026 | | 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.22.1 +Released January 20, 2026 + +This release adds support for [updating and deleting notifications](publish.md#updating--deleting-notifications) (requires server v2.16.0), +as well as [certificate management for self-signed certs and mTLS client certificates](subscribe/phone.md#manage-certificates), +and a new connection error dialog to help [troubleshoot connection issues](subscribe/phone.md#troubleshooting). + +
+ + +
+ +
+ + + +
+ +**Features:** + +* Support for [updating and deleting notifications](publish.md#updating-deleting-notifications) + ([#303](https://github.com/binwiederhier/ntfy/issues/303), [#1536](https://github.com/binwiederhier/ntfy/pull/1536), + [ntfy-android#151](https://github.com/binwiederhier/ntfy-android/pull/151), thanks to [@wunter8](https://github.com/wunter8) + for the initial implementation) +* Support for self-signed certs and client certs for mTLS ([#215](https://github.com/binwiederhier/ntfy/issues/215), + [#530](https://github.com/binwiederhier/ntfy/issues/530), [ntfy-android#149](https://github.com/binwiederhier/ntfy-android/pull/149), + thanks to [@cyb3rko](https://github.com/cyb3rko) for reviewing) +* Connection error dialog to help diagnose connection issues + +**Bug fixes + maintenance:** + +* Use server-specific user for attachment downloads ([#1529](https://github.com/binwiederhier/ntfy/issues/1529), + thanks to [@ManInDark](https://github.com/ManInDark) for reporting and testing) +* Fix crash in sharing dialog (thanks to [@rogeliodh](https://github.com/rogeliodh)) +* Fix crash when exiting multi-delete in detail view +* Fix potential crashes with icon downloader and backuper + ## ntfy server v2.16.0 Released January 19, 2026 @@ -41,6 +78,13 @@ This is the first feature release in a long time. After all the SDK updates, fix and the framework updates, this release ships a lot of highly requested features: Sending messages through the app (WhatsApp-style), support for passing headers to your proxy, an in-app language switcher, and more. +
+ + + + +
+ If you are waiting for a feature, please 👍 the corresponding [GitHub issue](https://github.com/binwiederhier/ntfy/issues?q=is%3Aissue%20state%3Aopen%20sort%3Areactions-%2B1-desc). If you like ntfy, please consider purchasing [ntfy Pro](https://ntfy.sh/app) to support us. @@ -1621,23 +1665,4 @@ and the [ntfy Android app](https://github.com/binwiederhier/ntfy-android/release ## Not released yet -### ntfy Android app v1.22.x (UNRELEASED) - -**Features:** - -* Support for [updating and deleting notifications](publish.md#updating-deleting-notifications) - ([#303](https://github.com/binwiederhier/ntfy/issues/303), [#1536](https://github.com/binwiederhier/ntfy/pull/1536), - [ntfy-android#151](https://github.com/binwiederhier/ntfy-android/pull/151), thanks to [@wunter8](https://github.com/wunter8) - for the initial implementation) -* Support for self-signed certs and client certs for mTLS ([#215](https://github.com/binwiederhier/ntfy/issues/215), - [#530](https://github.com/binwiederhier/ntfy/issues/530), [ntfy-android#149](https://github.com/binwiederhier/ntfy-android/pull/149), - thanks to [@cyb3rko](https://github.com/cyb3rko) for reviewing) -* Connection error dialog to help diagnose connection issues - -**Bug fixes + maintenance:** - -* Use server-specific user for attachment downloads ([#1529](https://github.com/binwiederhier/ntfy/issues/1529), - thanks to [@ManInDark](https://github.com/ManInDark) for reporting and testing) -* Fix crash in sharing dialog (thanks to [@rogeliodh](https://github.com/rogeliodh)) -* Fix crash when exiting multi-delete in detail view -* Fix potential crashes with icon downloader and backuper +_Nothing here_ \ No newline at end of file diff --git a/docs/static/css/extra.css b/docs/static/css/extra.css index ceea68c0..fb44f4cc 100644 --- a/docs/static/css/extra.css +++ b/docs/static/css/extra.css @@ -92,7 +92,7 @@ figure video { } .screenshots img { - max-height: 230px; + max-height: 350px; max-width: 350px; margin: 3px; border-radius: 5px; diff --git a/docs/static/img/android-screenshot-certs-manage.jpg b/docs/static/img/android-screenshot-certs-manage.jpg new file mode 100644 index 00000000..613e9745 Binary files /dev/null and b/docs/static/img/android-screenshot-certs-manage.jpg differ diff --git a/docs/static/img/android-screenshot-certs-warning-dialog.jpg b/docs/static/img/android-screenshot-certs-warning-dialog.jpg new file mode 100644 index 00000000..e92105e9 Binary files /dev/null and b/docs/static/img/android-screenshot-certs-warning-dialog.jpg differ diff --git a/docs/static/img/android-screenshot-connection-error-dialog.jpg b/docs/static/img/android-screenshot-connection-error-dialog.jpg new file mode 100644 index 00000000..a004ad73 Binary files /dev/null and b/docs/static/img/android-screenshot-connection-error-dialog.jpg differ diff --git a/docs/static/img/android-screenshot-connection-error-warning.jpg b/docs/static/img/android-screenshot-connection-error-warning.jpg new file mode 100644 index 00000000..a019046f Binary files /dev/null and b/docs/static/img/android-screenshot-connection-error-warning.jpg differ diff --git a/docs/static/img/android-screenshot-custom-headers-add.jpg b/docs/static/img/android-screenshot-custom-headers-add.jpg new file mode 100644 index 00000000..3a1e7d89 Binary files /dev/null and b/docs/static/img/android-screenshot-custom-headers-add.jpg differ diff --git a/docs/static/img/android-screenshot-custom-headers.jpg b/docs/static/img/android-screenshot-custom-headers.jpg new file mode 100644 index 00000000..090071f9 Binary files /dev/null and b/docs/static/img/android-screenshot-custom-headers.jpg differ diff --git a/docs/static/img/android-screenshot-language-chinese.jpg b/docs/static/img/android-screenshot-language-chinese.jpg new file mode 100644 index 00000000..f31cc9cc Binary files /dev/null and b/docs/static/img/android-screenshot-language-chinese.jpg differ diff --git a/docs/static/img/android-screenshot-language-german.jpg b/docs/static/img/android-screenshot-language-german.jpg new file mode 100644 index 00000000..254f4999 Binary files /dev/null and b/docs/static/img/android-screenshot-language-german.jpg differ diff --git a/docs/static/img/android-screenshot-language-hebrew.jpg b/docs/static/img/android-screenshot-language-hebrew.jpg new file mode 100644 index 00000000..c4235666 Binary files /dev/null and b/docs/static/img/android-screenshot-language-hebrew.jpg differ diff --git a/docs/static/img/android-screenshot-language-selection.jpg b/docs/static/img/android-screenshot-language-selection.jpg new file mode 100644 index 00000000..f39befde Binary files /dev/null and b/docs/static/img/android-screenshot-language-selection.jpg differ diff --git a/docs/static/img/android-screenshot-publish-dialog.jpg b/docs/static/img/android-screenshot-publish-dialog.jpg new file mode 100644 index 00000000..6d1e2f6c Binary files /dev/null and b/docs/static/img/android-screenshot-publish-dialog.jpg differ diff --git a/docs/static/img/android-screenshot-publish-message-bar.jpg b/docs/static/img/android-screenshot-publish-message-bar.jpg new file mode 100644 index 00000000..12957400 Binary files /dev/null and b/docs/static/img/android-screenshot-publish-message-bar.jpg differ diff --git a/docs/subscribe/phone.md b/docs/subscribe/phone.md index 602a0d45..a022b2a7 100644 --- a/docs/subscribe/phone.md +++ b/docs/subscribe/phone.md @@ -102,6 +102,23 @@ notifications. Firebase is overall pretty bad at delivering messages in time, bu The ntfy Android app uses Firebase only for the main host `ntfy.sh`, and only in the Google Play flavor of the app. It won't use Firebase for any self-hosted servers, and not at all in the F-Droid flavor. +## Publishing messages +_Supported on:_ :material-android: + +The Android app allows you to **publish messages directly from the app**, without needing to use curl or any other +tool. When enabled in the settings (Settings → General → Show message bar), a **message bar** appears at the bottom +of the topic view (it's enabled by default). You can type a message and tap the send button to publish it instantly. +If the message bar is disabled, you can tap the floating action button (FAB) at the bottom right instead. + +For more options, tap the expand button next to the send button to open the full **publish dialog**. The dialog lets +you compose a full notification with all available options, including title, tags, priority, click URL, email +forwarding, delayed delivery, attachments, Markdown formatting, and phone calls. + +
+ + +
+ ## Share to topic _Supported on:_ :material-android: @@ -135,6 +152,67 @@ or to simply directly link to a topic from a mobile website. | `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!) | +## Advanced settings + +### Custom headers +_Supported on:_ :material-android: + +If your ntfy server is behind an **authenticated proxy or tunnel** (e.g., Cloudflare Access, Tailscale Funnel, or +a reverse proxy with basic auth), you can configure custom HTTP headers that will be sent with every request to +that server. You could set headers such as `Authorization`, `CF-Access-Client-Id`, or any other headers required by +your setup. To add custom headers, go to **Settings → Advanced → Custom headers**. + +
+ + +
+ +!!! warning + If you have a user configured for a server, you cannot add an `Authorization` header for that server, as ntfy + sets this header automatically. Similarly, if you have a custom `Authorization` header, you cannot add a user + for that server. + +### Manage certificates +_Supported on:_ :material-android: + +If you're running a self-hosted ntfy server with a **self-signed certificate** or need to use **mutual TLS (mTLS)** +for client authentication, you can manage certificates in the app settings. + +Go to **Settings → Advanced → Manage certificates** to: + +- **Add trusted certificates**: Import a server certificate (PEM format) to trust when connecting to your ntfy server. + This is useful for self-signed certificates that are not trusted by the Android system. +- **Add client certificates**: Import a client certificate (PKCS#12 format) for mutual TLS authentication. This + certificate will be presented to the server when connecting. + +When you subscribe to a topic on a server with an untrusted certificate, the app will show a security warning and +allow you to review and trust the certificate. + +
+ + +
+ +### Language +_Supported on:_ :material-android: + +The Android app supports many languages and uses the **system language by default**. If you'd like to use the app in +a different language than your system, you can override it in **Settings → General → Language**. + +
+ + + + +
+ +The app currently supports over 30 languages, including English, German, French, Spanish, Chinese, Japanese, and many +more. Languages with more than 80% of strings translated are shown in the language picker. + +!!! tip "Help translate ntfy" + If you'd like to help translate ntfy into your language or improve existing translations, please visit the + [ntfy Weblate project](https://hosted.weblate.org/projects/ntfy/). Contributions are very welcome! + ## Integrations ### UnifiedPush @@ -168,10 +246,13 @@ Here's an example using [MacroDroid](https://play.google.com/store/apps/details? and [Tasker](https://play.google.com/store/apps/details?id=net.dinglisch.android.taskerm), but any app that can catch broadcasts is supported: -
+
+
+ +
@@ -239,3 +320,29 @@ The following intent extras are supported when for the intent with the `io.hecke | `message` ❤️ | ✔ | *String* | `Some message` | Message body; **you must set this** | | `tags` | - | *String* | `tag1,tag2,..` | Comma-separated list of [tags](../publish.md#tags-emojis) | | `priority` | - | *String or Int (between 1-5)* | `4` | Message [priority](../publish.md#message-priority) with 1=min, 3=default and 5=max | + +## Troubleshooting + +### Connection error dialog +_Supported on:_ :material-android: + +If the app has trouble connecting to a ntfy server, a **warning icon** will appear in the app bar. Tapping it opens +the **connection error dialog**, which shows detailed information about the connection problem and helps you diagnose +the issue. + +
+ + +
+ +Common connection errors include: + +| Error | Description | +|-------|-------------| +| Connection refused | The server may be down or the address may be incorrect | +| WebSocket not supported | The server may not support WebSocket connections, or a proxy is blocking them | +| Not authorized (401/403) | Username/password may be incorrect, or access credentials have expired | +| Certificate not trusted | The server is using a self-signed certificate (see [Manage certificates](#manage-certificates)) | + +If you're having persistent connection issues, you can also check the app logs under **Settings → Advanced → Record logs** +and share them for debugging. diff --git a/tools/shrink-png.sh b/tools/shrink-png.sh new file mode 100755 index 00000000..b64ae53b --- /dev/null +++ b/tools/shrink-png.sh @@ -0,0 +1,27 @@ +#!/bin/bash +# +# Shrinks PNG files to a max height of 1200px +# Usage: ./shrink-png.sh file1.png file2.png ... +# + +MAX_HEIGHT=1200 + +if [ $# -eq 0 ]; then + echo "Usage: $0 file1.png file2.png ..." + exit 1 +fi + +for file in "$@"; do + if [ ! -f "$file" ]; then + echo "File not found: $file" + continue + fi + + height=$(identify -format "%h" "$file") + if [ "$height" -gt "$MAX_HEIGHT" ]; then + echo "Shrinking $file (${height}px -> ${MAX_HEIGHT}px)" + convert "$file" -resize "x${MAX_HEIGHT}" "$file" + else + echo "Skipping $file (${height}px <= ${MAX_HEIGHT}px)" + fi +done