From 7ba268887b7d782563ede18a4346bcf99ce306b0 Mon Sep 17 00:00:00 2001 From: Philipp Heckel Date: Thu, 2 Dec 2021 17:27:31 -0500 Subject: [PATCH] Continuation of the docs --- .gitignore | 1 + Makefile | 5 +- docs/config.md | 89 ++++++----- docs/develop.md | 64 ++++++++ docs/examples.md | 67 ++++++++ docs/install.md | 9 +- docs/{publish/index.md => publish.md} | 26 +-- docs/subscribe/api.md | 32 +++- docs/subscribe/phone.md | 6 + docs/subscribe/poll.md | 1 - docs/subscribe/since.md | 1 - mkdocs.yml | 11 +- server/index.gohtml | 217 +------------------------- server/server.go | 17 +- 14 files changed, 265 insertions(+), 281 deletions(-) rename docs/{publish/index.md => publish.md} (86%) delete mode 100644 docs/subscribe/poll.md delete mode 100644 docs/subscribe/since.md diff --git a/.gitignore b/.gitignore index c777cdf8..616f246b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ dist/ .idea/ site/ +server/docs/ *.iml diff --git a/Makefile b/Makefile index 3debf825..988dc779 100644 --- a/Makefile +++ b/Makefile @@ -88,7 +88,10 @@ staticcheck: .PHONY # Building targets -build-deps: .PHONY +docs: .PHONY + mkdocs build + +build-deps: docs which arm-linux-gnueabi-gcc || { echo "ERROR: ARMv6/v7 cross compiler not installed. On Ubuntu, run: apt install gcc-arm-linux-gnueabi"; exit 1; } which aarch64-linux-gnu-gcc || { echo "ERROR: ARM64 cross compiler not installed. On Ubuntu, run: apt install gcc-aarch64-linux-gnu"; exit 1; } diff --git a/docs/config.md b/docs/config.md index 7964b0df..56db10c3 100644 --- a/docs/config.md +++ b/docs/config.md @@ -11,34 +11,39 @@ $ ntfy 2021/11/30 19:59:08 Listening on :80 ``` -You can immediately start [publishing messages](publish/index.md), or subscribe via the [Android app](subscribe/phone.md), +You can immediately start [publishing messages](publish.md), or subscribe via the [Android app](subscribe/phone.md), [the web UI](subscribe/web.md), or simply via [curl or your favorite HTTP client](subscribe/api.md). To configure the server further, check out the [config options table](#config-options) or simply type `ntfy --help` to get a list of [command line options](#command-line-options). -## Config options -Each config options can be set in the config file `/etc/ntfy/config.yml` (e.g. `listen-http: :80`) or as a -CLI option (e.g. `--listen-http :80`. Here's a list of all available options. Alternatively, you can set an environment -variable before running the `ntfy` command (e.g. `export NTFY_LISTEN_HTTP=:80`). +## Message cache +If desired, ntfy can temporarily keep notifications in an in-memory or an on-disk cache. Caching messages for a short period +of time is important to allow [phones](subscribe/phone.md) and other devices with brittle Internet connections to be able to retrieve +notifications that they may have missed. -| Config option | Env variable | Format | Default | Description | -|---|---|---|---|---| -| `listen-http` | `NTFY_LISTEN_HTTP` | `[host]:port` | `:80` | Listen address for the HTTP web server | -| `listen-https` | `NTFY_LISTEN_HTTPS` | `[host]:port` | - | Listen address for the HTTPS web server. If set, you also need to set `key-file` and `cert-file`. | -| `key-file` | `NTFY_KEY_FILE` | *filename* | - | HTTPS/TLS private key file, only used if `listen-https` is set. | -| `cert-file` | `NTFY_CERT_FILE` | *filename* | - | HTTPS/TLS certificate file, only used if `listen-https` is set. | -| `firebase-key-file` | `NTFY_FIREBASE_KEY_FILE` | *filename* | - | If set, also publish messages to a Firebase Cloud Messaging (FCM) topic for your app. This is optional and only required to save battery when using the Android app. | -| `cache-file` | `NTFY_CACHE_FILE` | *filename* | - | If set, messages are cached in a local SQLite database instead of only in-memory. This allows for service restarts without losing messages in support of the since= parameter. | -| `cache-duration` | `NTFY_CACHE_DURATION` | *duration* | 12h | Duration for which messages will be buffered before they are deleted. This is required to support the `since=...` and `poll=1` parameter. | -| `keepalive-interval` | `NTFY_KEEPALIVE_INTERVAL` | *duration* | 30s | Interval in which keepalive messages are sent to the client. This is to prevent intermediaries closing the connection for inactivity. Note that the Android app has a hardcoded timeout at 77s, so it should be less than that. | -| `manager-interval` | `$NTFY_MANAGER_INTERVAL` | *duration* | 1m | Interval in which the manager prunes old messages, deletes topics and prints the stats. | -| `global-topic-limit` | `NTFY_GLOBAL_TOPIC_LIMIT` | *number* | 5000 | Rate limiting: Total number of topics before the server rejects new topics. | -| `visitor-subscription-limit` | `NTFY_VISITOR_SUBSCRIPTION_LIMIT` | *number* | 30 | Rate limiting: Number of subscriptions per visitor (IP address) | -| `visitor-request-limit-burst` | `NTFY_VISITOR_REQUEST_LIMIT_BURST` | *number* | 60 | Allowed GET/PUT/POST requests per second, per visitor. This setting is the initial bucket of requests each visitor has | -| `visitor-request-limit-replenish` | `NTFY_VISITOR_REQUEST_LIMIT_REPLENISH` | *duration* | 10s | Strongly related to `visitor-request-limit-burst`: The rate at which the bucket is refilled | -| `behind-proxy` | `NTFY_BEHIND_PROXY` | *bool* | false | If set, the X-Forwarded-For header is used to determine the visitor IP address instead of the remote address of the connection. | +By default, ntfy keeps messages in memory for 12 hours, which means that **cached messages do not survive an application +restart**. You can override this behavior using the following config settings: -The format for a *duration* is: `(smh)`, e.g. 30s, 20m or 1h. +* `cache-file`: if set, ntfy will store messages in a SQLite based cache (default is empty, which means in-memory cache). + **This is required if you'd like messages to be retained across restarts**. +* `cache-duration`: defines the duration for which messages are stored in the cache (default is `12h`) + +Subscribers can retrieve cached messaging using the [`poll=1` parameter](subscribe/api.md#polling), as well as the +[`since=` parameter](subscribe/api.md#since). + +## Behind a proxy (TLS, etc.) + +!!! warning + If you are running ntfy behind a proxy, you must set the `behind-proxy` flag. Otherwise all visitors are rate limited + as if they are one. + +**Rate limiting:** If you are running ntfy behind a proxy (e.g. nginx, HAproxy or Apache), you should set the `behind-proxy` +flag. This will instruct the [rate limiting](#rate-limiting) logic to use the `X-Forwarded-For` header as the primary +identifier for a visitor, as opposed to the remote IP address. If the `behind-proxy` flag is not set, all visitors will +be counted as one, because from the perspective of the ntfy server, they all share the proxy's IP address. + +**TLS/SSL:** ntfy supports HTTPS/TLS by setting the `listen-https` config option. However, if you are behind a proxy, it is +recommended that TLS/SSL termination is done by the proxy itself. ## Firebase (FCM) !!! info @@ -47,7 +52,7 @@ The format for a *duration* is: `(smh)`, e.g. 30s, 20m or 1h. [Firebase Cloud Messaging (FCM)](https://firebase.google.com/docs/cloud-messaging) is the Google approved way to send push messages to Android devices. FCM is the only method that an Android app can receive messages without having to run a -[foreground service](https://developer.android.com/guide/components/foreground-services). +[foreground service](https://developer.android.com/guide/components/foreground-services). For the main host [ntfy.sh](https://ntfy.sh), the [ntfy Android App](subscribe/phone.md) uses Firebase to send messages to the device. For other hosts, instant delivery is used and FCM is not involved. @@ -67,20 +72,6 @@ Example: firebase-key-file: "/etc/ntfy/ntfy-sh-firebase-adminsdk-ahnce-9f4d6f14b5.json" ``` -## Behind a proxy (TLS, etc.) - -!!! warning - If you are running ntfy behind a proxy, you must set the `behind-proxy` flag. Otherwise all visitors are rate limited - as if they are one. - -**Rate limiting:** If you are running ntfy behind a proxy (e.g. nginx, HAproxy or Apache), you should set the `behind-proxy` -flag. This will instruct the [rate limiting](#rate-limiting) logic to use the `X-Forwarded-For` header as the primary -identifier for a visitor, as opposed to the remote IP address. If the `behing-proxy` flag is not set, all visitors will -be counted as one, because from the perspective of the ntfy server, they all share the proxy's IP address. - -**TLS/SSL:** ntfy supports HTTPS/TLS by setting the `listen-https` config option. However, if you are behind a proxy, it is -recommended that TLS/SSL termination is done by the proxy itself. - ## Rate limiting !!! info Be aware that if you are running ntfy behind a proxy, you must set the `behind-proxy` flag. @@ -108,6 +99,30 @@ request every 10s (defined by `visitor-request-limit-replenish`) During normal usage, you shouldn't encounter this limit at all, and even if you burst a few requests shortly (e.g. when you reconnect after a connection drop), it shouldn't have any effect. +## Config options +Each config options can be set in the config file `/etc/ntfy/config.yml` (e.g. `listen-http: :80`) or as a +CLI option (e.g. `--listen-http :80`. Here's a list of all available options. Alternatively, you can set an environment +variable before running the `ntfy` command (e.g. `export NTFY_LISTEN_HTTP=:80`). + +| Config option | Env variable | Format | Default | Description | +|---|---|---|---|---| +| `listen-http` | `NTFY_LISTEN_HTTP` | `[host]:port` | `:80` | Listen address for the HTTP web server | +| `listen-https` | `NTFY_LISTEN_HTTPS` | `[host]:port` | - | Listen address for the HTTPS web server. If set, you also need to set `key-file` and `cert-file`. | +| `key-file` | `NTFY_KEY_FILE` | *filename* | - | HTTPS/TLS private key file, only used if `listen-https` is set. | +| `cert-file` | `NTFY_CERT_FILE` | *filename* | - | HTTPS/TLS certificate file, only used if `listen-https` is set. | +| `firebase-key-file` | `NTFY_FIREBASE_KEY_FILE` | *filename* | - | If set, also publish messages to a Firebase Cloud Messaging (FCM) topic for your app. This is optional and only required to save battery when using the Android app. | +| `cache-file` | `NTFY_CACHE_FILE` | *filename* | - | If set, messages are cached in a local SQLite database instead of only in-memory. This allows for service restarts without losing messages in support of the since= parameter. | +| `cache-duration` | `NTFY_CACHE_DURATION` | *duration* | 12h | Duration for which messages will be buffered before they are deleted. This is required to support the `since=...` and `poll=1` parameter. | +| `keepalive-interval` | `NTFY_KEEPALIVE_INTERVAL` | *duration* | 30s | Interval in which keepalive messages are sent to the client. This is to prevent intermediaries closing the connection for inactivity. Note that the Android app has a hardcoded timeout at 77s, so it should be less than that. | +| `manager-interval` | `$NTFY_MANAGER_INTERVAL` | *duration* | 1m | Interval in which the manager prunes old messages, deletes topics and prints the stats. | +| `global-topic-limit` | `NTFY_GLOBAL_TOPIC_LIMIT` | *number* | 5000 | Rate limiting: Total number of topics before the server rejects new topics. | +| `visitor-subscription-limit` | `NTFY_VISITOR_SUBSCRIPTION_LIMIT` | *number* | 30 | Rate limiting: Number of subscriptions per visitor (IP address) | +| `visitor-request-limit-burst` | `NTFY_VISITOR_REQUEST_LIMIT_BURST` | *number* | 60 | Allowed GET/PUT/POST requests per second, per visitor. This setting is the initial bucket of requests each visitor has | +| `visitor-request-limit-replenish` | `NTFY_VISITOR_REQUEST_LIMIT_REPLENISH` | *duration* | 10s | Strongly related to `visitor-request-limit-burst`: The rate at which the bucket is refilled | +| `behind-proxy` | `NTFY_BEHIND_PROXY` | *bool* | false | If set, the X-Forwarded-For header is used to determine the visitor IP address instead of the remote address of the connection. | + +The format for a *duration* is: `(smh)`, e.g. 30s, 20m or 1h. + ## Command line options ``` $ ntfy --help diff --git a/docs/develop.md b/docs/develop.md index 1d5b2a72..2b37b021 100644 --- a/docs/develop.md +++ b/docs/develop.md @@ -1,5 +1,69 @@ # Building ## ntfy server +To quickly build on amd64, you can use `make build-simple`: + +``` +git clone git@github.com:binwiederhier/ntfy.git +cd ntfy +make build-simple +``` + +That'll generate a statically linked binary in `dist/ntfy_linux_amd64/ntfy`. + +For all other platforms (including Docker), and for production or other snapshot builds, you should use the amazingly +awesome [GoReleaser](https://goreleaser.com/) make targets: + +``` +Build: + make build - Build + make build-snapshot - Build snapshot + make build-simple - Build (using go build, without goreleaser) + make clean - Clean build folder + +Releasing (requires goreleaser): + make release - Create a release + make release-snapshot - Create a test release +``` + +There are currently no platform-specific make targets, so they will build for all platforms (which may take a while). ## Android app +The Android app has two flavors: + +* **Google Play:** The `play` flavor includes Firebase (FCM) and requires a Firebase account +* **F-Droid:** The `fdroid` flavor does not include Firebase or Google dependencies + +First check out the repository: + +``` +git clone git@github.com:binwiederhier/ntfy-android.git +cd ntfy-android +``` + +Then either follow the steps for building with or without Firebase. + +### Building without Firebase (F-Droid flavor) +Without Firebase, you may want to still change the default `app_base_url` in [strings.xml](https://github.com/binwiederhier/ntfy-android/blob/main/app/src/main/res/values/strings.xml) +if you're self-hosting the server. Then run: +``` +# To build an unsigned .apk (app/build/outputs/apk/fdroid/*.apk) +./gradlew assembleFdroidRelease + +# To build a bundle .aab (app/fdroid/release/*.aab) +./gradlew bundleFdroidRelease +``` + +### Building with Firebase (FCM, Google Play flavor) +To build your own version with Firebase, you must: +* Create a Firebase/FCM account +* Place your account file at `app/google-services.json` +* And change `app_base_url` in [strings.xml](https://github.com/binwiederhier/ntfy-android/blob/main/app/src/main/res/values/strings.xml) +* Then run: +``` +# To build an unsigned .apk (app/build/outputs/apk/play/*.apk) +./gradlew assemblePlayRelease + +# To build a bundle .aab (app/play/release/*.aab) +./gradlew bundlePlayRelease +``` diff --git a/docs/examples.md b/docs/examples.md index df635b4e..b49d6ca1 100644 --- a/docs/examples.md +++ b/docs/examples.md @@ -1 +1,68 @@ # Examples + +There are a million ways to use ntfy, but here are some inspirations. I try to collect +examples on GitHub, so be sure to check +those out, too. + +## A long process is done: backups, copying data, pipelines, ... +I started adding notifications pretty much all of my scripts. Typically, I just chain the curl call +directly to the command I'm running. The following example will either send Laptop backup succeeded +or ⚠️ Laptop backup failed directly to my phone: + +``` +rsync -a root@laptop /backups/laptop \ + && zfs snapshot ... \ + && curl -H prio:low -d "Laptop backup succeeded" ntfy.sh/backups \ + || curl -H tags:warning -H prio:high -d "Laptop backup failed" ntfy.sh/backups +``` + +## Server-sent messages in your web app +Just as you can [subscribe to topics in the Web UI](subscribe/web.md), you can use ntfy in your own +web application. Check out the live example or just look the source of this page. + +## Notify on SSH login +Years ago my home server was broken into. That shook me hard, so every time someone logs into any machine that I +own, I now message myself. Here's an example of how to use PAM +to notify yourself on SSH login. + +=== "/etc/pam.d/sshd" + ``` + # at the end of the file + session optional pam_exec.so /usr/bin/ntfy-ssh-login.sh + ``` + +=== "/usr/bin/ntfy-ssh-login.sh" + ```bash + #!/bin/bash + if [ "${PAM_TYPE}" = "open_session" ]; then + curl \ + -H prio:high \ + -H tags:warning \ + -d "SSH login: ${PAM_USER} from ${PAM_RHOST}" \ + ntfy.sh/alerts + fi + ``` + +## Collect data from multiple machines +The other day I was running tasks on 20 servers, and I wanted to collect the interim results +as a CSV in one place. Each of the servers was publishing to a topic as the results completed (`publish-result.sh`), +and I had one central collector to grab the results as they came in (`collect-results.sh`). + +It looked something like this: + +=== "collect-results.sh" + ```bash + while read result; do + [ -n "$result" ] && echo "$result" >> results.csv + done < <(stdbuf -i0 -o0 curl -s ntfy.sh/results/raw) + ``` +=== "publish-result.sh" + ```bash + // This script was run on each of the 20 servers. It was doing heavy processing ... + + // Publish script results + curl -d "$(hostname),$count,$time" ntfy.sh/results + ``` + + + diff --git a/docs/install.md b/docs/install.md index 6da2e179..f9a38c51 100644 --- a/docs/install.md +++ b/docs/install.md @@ -1,6 +1,6 @@ # Install your own ntfy server The following steps are only required if you want to **self-host your own ntfy server**. If you just want to -[send messages using ntfy.sh](publish/index.md), you don't need to install anything. Just use `curl` +[send messages using ntfy.sh](publish.md), you don't need to install anything. Just use `curl` or your favorite HTTP client. ## General steps @@ -11,24 +11,23 @@ We support amd64, armv7 and arm64. 2. Then (optionally) edit `/etc/ntfy/config.yml` (see [configuration](config.md)) 3. Then just run it with `ntfy` (or `systemctl start ntfy` when using the deb/rpm). - ## Binaries and packages Please check out the [releases page](https://github.com/binwiederhier/ntfy/releases) for binaries and deb/rpm packages. -x86_64/amd64: +**x86_64/amd64:** ``` wget https://github.com/binwiederhier/ntfy/releases/download/v1.5.0/ntfy_1.5.0_linux_x86_64.tar.gz sudo tar -C /usr/bin -zxf ntfy_*.tar.gz ntfy ``` -armv7: +**armv7:** ``` wget https://github.com/binwiederhier/ntfy/releases/download/v1.5.0/ntfy_1.5.0_linux_armv7.tar.gz sudo tar -C /usr/bin -zxf ntfy_*.tar.gz ntfy ``` -arm64/v8: +**arm64/v8:** ``` wget https://github.com/binwiederhier/ntfy/releases/download/v1.5.0/ntfy_1.5.0_linux_arm64.tar.gz sudo tar -C /usr/bin -zxf ntfy_*.tar.gz ntfy diff --git a/docs/publish/index.md b/docs/publish.md similarity index 86% rename from docs/publish/index.md rename to docs/publish.md index 7d8d81b7..f742bc5d 100644 --- a/docs/publish/index.md +++ b/docs/publish.md @@ -41,10 +41,10 @@ Here's an example showing how to publish a simple message using a POST request: ])); ``` -If you have the [Android app](../subscribe/phone.md) installed on your phone, this will create a notification that looks like this: +If you have the [Android app](subscribe/phone.md) installed on your phone, this will create a notification that looks like this:
- ![basic notification](../static/img/basic-notification.png){ width=500 } + ![basic notification](static/img/basic-notification.png){ width=500 }
Android notification
@@ -111,7 +111,7 @@ a [title](#message-title), and [tag messages](#tags-emojis) 🥳 🎉. Here's an ```
- ![priority notification](../static/img/priority-notification.png){ width=500 } + ![priority notification](static/img/priority-notification.png){ width=500 }
Urgent notification with tags and title
@@ -165,23 +165,23 @@ you can set the `X-Title` header (or any of its aliases: `Title`, `ti`, or `t`). ```
- ![notification with title](../static/img/notification-with-title.png){ width=500 } + ![notification with title](static/img/notification-with-title.png){ width=500 }
Detail view of notification with title
## Message priority All messages have a priority, which defines how urgently your phone notifies you. You can set custom -notification sounds and vibration patterns on your phone to map to these priorities (see [Android config](../subscribe/phone.md)). +notification sounds and vibration patterns on your phone to map to these priorities (see [Android config](subscribe/phone.md)). The following priorities exist: | Priority | Icon | ID | Name | Description | |---|---|---|---|---| -| Max priority | ![min priority](../static/img/priority-5.svg) | `5` | `max`/`urgent` | Really long vibration bursts, default notification sound with a pop-over notification. | -| High priority | ![min priority](../static/img/priority-4.svg) | `4` | `high` | Long vibration burst, default notification sound with a pop-over notification. | +| Max priority | ![min priority](static/img/priority-5.svg) | `5` | `max`/`urgent` | Really long vibration bursts, default notification sound with a pop-over notification. | +| High priority | ![min priority](static/img/priority-4.svg) | `4` | `high` | Long vibration burst, default notification sound with a pop-over notification. | | **Default priority** | *(none)* | `3` | `default` | Short default vibration and sound. Default notification behavior. | -| Low priority | ![min priority](../static/img/priority-2.svg) |`2` | `low` | No vibration or sound. Notification will not visibly show up until notification drawer is pulled down. | -| Min priority | ![min priority](../static/img/priority-1.svg) | `1` | `min` | No vibration or sound. The notification will be under the fold in "Other notifications". | +| Low priority | ![min priority](static/img/priority-2.svg) |`2` | `low` | No vibration or sound. Notification will not visibly show up until notification drawer is pulled down. | +| Min priority | ![min priority](static/img/priority-1.svg) | `1` | `min` | No vibration or sound. The notification will be under the fold in "Other notifications". | You can set the priority with the header `X-Priority` (or any of its aliases: `Priority`, `prio`, or `p`). @@ -231,19 +231,19 @@ You can set the priority with the header `X-Priority` (or any of its aliases: `P ```
- ![priority notification](../static/img/priority-detail-overview.png){ width=500 } + ![priority notification](static/img/priority-detail-overview.png){ width=500 }
Detail view of priority notifications
## Tags & emojis 🥳 🎉 You can tag messages with emojis and other relevant strings: -* **Emojis**: If a tag matches an [emoji short code](../emojis.md), it'll be converted to an emoji and prepended +* **Emojis**: If a tag matches an [emoji short code](emojis.md), it'll be converted to an emoji and prepended to title or message. * **Other tags:** If a tag doesn't match, it will be listed below the notification. This feature is useful for things like warnings (⚠️, ️🚨, or 🚩), but also to simply tag messages otherwise (e.g. script -names, hostnames, etc.). Use [the emoji short code list](../emojis.md) to figure out what tags can be converted to emojis. +names, hostnames, etc.). Use [the emoji short code list](emojis.md) to figure out what tags can be converted to emojis. Here's an **excerpt of emojis** I've found very useful in alert messages: @@ -328,7 +328,7 @@ them with a comma, e.g. `tag1,tag2,tag3`. ```
- ![priority notification](../static/img/notification-with-tags.png){ width=500 } + ![priority notification](static/img/notification-with-tags.png){ width=500 }
Detail view of notifications with tags
diff --git a/docs/subscribe/api.md b/docs/subscribe/api.md index 8a77f13c..708250ad 100644 --- a/docs/subscribe/api.md +++ b/docs/subscribe/api.md @@ -1 +1,31 @@ -# Subscribe from your phone +# Subscribe via API + +## Fetching cached messages +Messages may be cached for a couple of hours (see [message caching](../config.md#message-cache)) to account for network +interruptions of subscribers. If the server has configured message caching, you can read back what you missed by using +the `since=` query parameter. It takes either a duration (e.g. `10m` or `30s`), a Unix timestamp (e.g. `1635528757`) +or `all` (all cached messages). + +``` +curl -s "ntfy.sh/mytopic/json?since=10m" +``` + +## Polling +You can also just poll for messages if you don't like the long-standing connection using the `poll=1` +query parameter. The connection will end after all available messages have been read. This parameter can be +combined with `since=` (defaults to `since=all`). + +``` +curl -s "ntfy.sh/mytopic/json?poll=1" +``` + +## Subscribing to multiple topics +It's possible to subscribe to multiple topics in one HTTP call by providing a +comma-separated list of topics in the URL. This allows you to reduce the number of connections you have to maintain: + +``` +$ curl -s ntfy.sh/mytopic1,mytopic2/json +{"id":"0OkXIryH3H","time":1637182619,"event":"open","topic":"mytopic1,mytopic2,mytopic3"} +{"id":"dzJJm7BCWs","time":1637182634,"event":"message","topic":"mytopic1","message":"for topic 1"} +{"id":"Cm02DsxUHb","time":1637182643,"event":"message","topic":"mytopic2","message":"for topic 2"} +``` diff --git a/docs/subscribe/phone.md b/docs/subscribe/phone.md index 8a77f13c..9cdc221e 100644 --- a/docs/subscribe/phone.md +++ b/docs/subscribe/phone.md @@ -1 +1,7 @@ # Subscribe from your phone +You can use the [ntfy Android App](https://play.google.com/store/apps/details?id=io.heckel.ntfy) to receive +notifications directly on your phone. Just like the server, this app is also [open source](https://github.com/binwiederhier/ntfy-android). +Since I don't have an iPhone or a Mac, I didn't make an iOS app yet. I'd be awesome if [someone else could help out](https://github.com/binwiederhier/ntfy/issues/4). + + + diff --git a/docs/subscribe/poll.md b/docs/subscribe/poll.md deleted file mode 100644 index 8a77f13c..00000000 --- a/docs/subscribe/poll.md +++ /dev/null @@ -1 +0,0 @@ -# Subscribe from your phone diff --git a/docs/subscribe/since.md b/docs/subscribe/since.md deleted file mode 100644 index 8a77f13c..00000000 --- a/docs/subscribe/since.md +++ /dev/null @@ -1 +0,0 @@ -# Subscribe from your phone diff --git a/mkdocs.yml b/mkdocs.yml index 3539e8bb..d02265b2 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -1,4 +1,5 @@ -site_name: ntfy.sh +site_dir: server/docs +site_name: ntfy site_url: https://ntfy.sh site_description: simple HTTP-based pub-sub copyright: Made with ❤️ by Philipp C. Heckel @@ -8,7 +9,6 @@ edit_uri: edit/main/docs/ theme: name: material -# custom_dir: docs/overrides language: en logo: static/img/ntfy.png favicon: static/img/favicon.png @@ -69,14 +69,11 @@ nav: - "Installation": install.md - "Configuration": config.md - "Publishing": - - "Sending messages": publish/index.md + - "Sending messages": publish.md - "Subscribing": - "From the Android/iOS app": subscribe/phone.md - "From the Web UI": subscribe/web.md - - "Using the API": - - "Basic API usage": subscribe/api.md - - "Fetching cached messages": subscribe/since.md - - "Polling": subscribe/poll.md + - "Using the API": subscribe/api.md - "Other things": - "Examples": examples.md - "Emojis 🥳 🎉": emojis.md diff --git a/server/index.gohtml b/server/index.gohtml index 7c99451d..0975d756 100644 --- a/server/index.gohtml +++ b/server/index.gohtml @@ -4,7 +4,7 @@ - ntfy.sh | simple HTTP-based pub-sub + ntfy.sh | PUT/POST push notifications to your phone @@ -24,7 +24,7 @@ - + @@ -36,7 +36,7 @@