Spaces:
Paused
Paused
Upload folder using huggingface_hub
Browse files- app.py +188 -0
- docs-ntfy-sh-20250924.md +87 -0
- docs-ntfy-sh-config-20250924.md +0 -0
- docs-ntfy-sh-emojis-20250924.md +1828 -0
- docs-ntfy-sh-faq-20250924.md +105 -0
- docs-ntfy-sh-install-20250924.md +618 -0
- docs-ntfy-sh-integrations-20250924.md +321 -0
- docs-ntfy-sh-known-issues-20250924.md +48 -0
- docs-ntfy-sh-publish-20250924.md +1329 -0
- docs-ntfy-sh-publish-template-functions-20250924.md +1418 -0
- docs-ntfy-sh-releases-20250924.md +0 -0
- docs-ntfy-sh-subscribe-api-20250924.md +414 -0
- docs-ntfy-sh-subscribe-cli-20250924.md +308 -0
- docs-ntfy-sh-subscribe-phone-20250924.md +176 -0
- docs-ntfy-sh-subscribe-pwa-20250924.md +58 -0
- docs-ntfy-sh-subscribe-web-20250924.md +68 -0
- docs-ntfy-sh-troubleshooting-20250924.md +44 -0
- requirements.txt +19 -0
app.py
ADDED
|
@@ -0,0 +1,188 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import gradio as gr
|
| 2 |
+
import torch
|
| 3 |
+
import spaces
|
| 4 |
+
import os
|
| 5 |
+
from transformers import AutoModelForCausalLM, AutoTokenizer, TextIteratorStreamer
|
| 6 |
+
from threading import Thread
|
| 7 |
+
from langchain.text_splitter import RecursiveCharacterTextSplitter
|
| 8 |
+
from langchain_huggingface import HuggingFaceEmbeddings
|
| 9 |
+
from langchain_community.vectorstores import FAISS
|
| 10 |
+
from langchain_community.document_loaders import DirectoryLoader, TextLoader
|
| 11 |
+
|
| 12 |
+
# --- 1. Model and Tokenizer Loading ---
|
| 13 |
+
print("Initializing model and tokenizer...")
|
| 14 |
+
model_name = "gitglubber/Ntfy"
|
| 15 |
+
|
| 16 |
+
try:
|
| 17 |
+
tokenizer = AutoTokenizer.from_pretrained(model_name)
|
| 18 |
+
model = AutoModelForCausalLM.from_pretrained(
|
| 19 |
+
model_name,
|
| 20 |
+
torch_dtype="auto",
|
| 21 |
+
device_map="auto" if torch.cuda.is_available() else "cpu"
|
| 22 |
+
)
|
| 23 |
+
print(f"Model and tokenizer loaded successfully on {'GPU' if torch.cuda.is_available() else 'CPU'}.")
|
| 24 |
+
except Exception as e:
|
| 25 |
+
print(f"Error loading model: {e}")
|
| 26 |
+
raise
|
| 27 |
+
|
| 28 |
+
# --- 2. RAG Knowledge Base Setup (from Directory) ---
|
| 29 |
+
print("Setting up RAG knowledge base from directory...")
|
| 30 |
+
|
| 31 |
+
try:
|
| 32 |
+
# Look for .md files in the current directory
|
| 33 |
+
current_dir = './'
|
| 34 |
+
|
| 35 |
+
# Load all .md files from the current directory only (not subdirectories)
|
| 36 |
+
loader = DirectoryLoader(current_dir, glob="*.md", loader_cls=TextLoader)
|
| 37 |
+
documents = loader.load()
|
| 38 |
+
|
| 39 |
+
# If no .md files found, create a default one
|
| 40 |
+
if not documents:
|
| 41 |
+
print("No .md files found in current directory. Creating default knowledge base.")
|
| 42 |
+
with open('./default.md', 'w') as f:
|
| 43 |
+
f.write("# Default Knowledge Base\nNo additional documentation found.")
|
| 44 |
+
# Load the newly created file
|
| 45 |
+
loader = DirectoryLoader(current_dir, glob="*.md", loader_cls=TextLoader)
|
| 46 |
+
documents = loader.load()
|
| 47 |
+
|
| 48 |
+
if not documents:
|
| 49 |
+
print("No documents found in knowledge base directory.")
|
| 50 |
+
# Create a minimal document to prevent errors
|
| 51 |
+
from langchain.schema import Document
|
| 52 |
+
documents = [Document(page_content="No additional documentation available.", metadata={"source": "default"})]
|
| 53 |
+
|
| 54 |
+
# Split the documents into chunks
|
| 55 |
+
text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=150)
|
| 56 |
+
docs = text_splitter.split_documents(documents)
|
| 57 |
+
|
| 58 |
+
# Create embeddings - force CPU to avoid ZeroGPU device conflicts
|
| 59 |
+
embedding_model_name = "sentence-transformers/all-MiniLM-L6-v2"
|
| 60 |
+
model_kwargs = {'device': 'cpu'} # Force CPU for embeddings to avoid device conflicts
|
| 61 |
+
embeddings = HuggingFaceEmbeddings(
|
| 62 |
+
model_name=embedding_model_name,
|
| 63 |
+
model_kwargs=model_kwargs
|
| 64 |
+
)
|
| 65 |
+
|
| 66 |
+
# Create a FAISS vector store from the documents
|
| 67 |
+
vector_store = FAISS.from_documents(docs, embeddings)
|
| 68 |
+
retriever = vector_store.as_retriever()
|
| 69 |
+
|
| 70 |
+
print(f"RAG knowledge base created successfully from {len(documents)} document(s).")
|
| 71 |
+
except Exception as e:
|
| 72 |
+
print(f"Error setting up knowledge base: {e}")
|
| 73 |
+
raise
|
| 74 |
+
|
| 75 |
+
|
| 76 |
+
# --- 3. System Message ---
|
| 77 |
+
system_message = """You are an expert technical assistant for ntfy, a publish-subscribe notification service.
|
| 78 |
+
Your purpose is to provide users with accurate, clear, and helpful information about the ntfy project.
|
| 79 |
+
You will be provided with relevant context from the ntfy documentation to help you answer the user's question. Prioritize this information in your response.
|
| 80 |
+
Always structure your answers for clarity using Markdown (lists, bold text, code blocks).
|
| 81 |
+
If the provided context does not contain the answer, state that the information is not available in the documentation.
|
| 82 |
+
Stick strictly to the topic of ntfy.
|
| 83 |
+
**Fun Facts** to keep in mind:
|
| 84 |
+
wunter8 is a mod on the discord - he is the most active member.
|
| 85 |
+
binwiederhier is the owner/ developer of the project.
|
| 86 |
+
The official github link is - https://github.com/binwiederhier/ntfy.
|
| 87 |
+
**End Fun facts**
|
| 88 |
+
|
| 89 |
+
**Common Question:**
|
| 90 |
+
Question: Why aren't my IOS push notifications working?
|
| 91 |
+
Answer: These are the things you need to do to get iOS push notifications to work:
|
| 92 |
+
open a browser to the web app of your ntfy instance and copy the URL (including "http://" or "https://", your domain or IP address, and any ports, and excluding any trailing slashes)
|
| 93 |
+
put the URL you copied in the ntfy base-url config in server.yml or NTFY_BASE_URL in env variables
|
| 94 |
+
put the URL you copied in the default server URL setting in the iOS ntfy app
|
| 95 |
+
set upstream-base-url in server.yml or NTFY_UPSTREAM_BASE_URL in env variables to "https://ntfy.sh/" (without a trailing slash)
|
| 96 |
+
|
| 97 |
+
server.yml configuration - is solved by reading the config knowledge_base doc
|
| 98 |
+
"""
|
| 99 |
+
|
| 100 |
+
|
| 101 |
+
# --- 4. Gradio Interface with RAG and Streaming ---
|
| 102 |
+
with gr.Blocks(fill_height=True, theme=gr.themes.Soft()) as demo:
|
| 103 |
+
gr.Markdown("# NTFY Expert Chat Bot (with RAG)")
|
| 104 |
+
chatbot = gr.Chatbot(
|
| 105 |
+
[],
|
| 106 |
+
elem_id="chatbot",
|
| 107 |
+
bubble_full_width=False,
|
| 108 |
+
avatar_images=(None, "https://docs.ntfy.sh/static/img/ntfy.png"),
|
| 109 |
+
scale=1
|
| 110 |
+
)
|
| 111 |
+
msg = gr.Textbox(label="Input", scale=0, placeholder="Ask me a question about ntfy...")
|
| 112 |
+
clear = gr.Button("Clear")
|
| 113 |
+
|
| 114 |
+
@spaces.GPU(duration=120) if torch.cuda.is_available() else lambda x: x
|
| 115 |
+
def respond(message, chat_history):
|
| 116 |
+
"""
|
| 117 |
+
Gradio response function that uses RAG and streams model output.
|
| 118 |
+
"""
|
| 119 |
+
if not message.strip():
|
| 120 |
+
yield "", chat_history
|
| 121 |
+
return
|
| 122 |
+
|
| 123 |
+
chat_history.append((message, ""))
|
| 124 |
+
yield "", chat_history
|
| 125 |
+
|
| 126 |
+
# --- RAG: Retrieve relevant context ---
|
| 127 |
+
retrieved_docs = retriever.get_relevant_documents(message)
|
| 128 |
+
context = "\n\n".join([doc.page_content for doc in retrieved_docs])
|
| 129 |
+
|
| 130 |
+
# --- Prepare model input with context ---
|
| 131 |
+
rag_prompt = f"""Use the following context to answer the user's question.
|
| 132 |
+
|
| 133 |
+
**Context:**
|
| 134 |
+
---
|
| 135 |
+
{context}
|
| 136 |
+
---
|
| 137 |
+
|
| 138 |
+
**User Question:** {message}
|
| 139 |
+
"""
|
| 140 |
+
messages = [{"role": "system", "content": system_message}]
|
| 141 |
+
# Add previous user/assistant messages for conversation history
|
| 142 |
+
for user_msg, assistant_msg in chat_history[:-1]:
|
| 143 |
+
messages.append({"role": "user", "content": user_msg})
|
| 144 |
+
if assistant_msg is not None:
|
| 145 |
+
messages.append({"role": "assistant", "content": assistant_msg})
|
| 146 |
+
# Add the new RAG-enhanced prompt
|
| 147 |
+
messages.append({"role": "user", "content": rag_prompt})
|
| 148 |
+
|
| 149 |
+
|
| 150 |
+
text = tokenizer.apply_chat_template(
|
| 151 |
+
messages,
|
| 152 |
+
tokenize=False,
|
| 153 |
+
add_generation_prompt=True,
|
| 154 |
+
)
|
| 155 |
+
model_inputs = tokenizer([text], return_tensors="pt").to(model.device)
|
| 156 |
+
|
| 157 |
+
# --- Setup the streamer and generation thread ---
|
| 158 |
+
streamer = TextIteratorStreamer(
|
| 159 |
+
tokenizer,
|
| 160 |
+
skip_prompt=True,
|
| 161 |
+
skip_special_tokens=True
|
| 162 |
+
)
|
| 163 |
+
generation_kwargs = dict(
|
| 164 |
+
**model_inputs,
|
| 165 |
+
streamer=streamer,
|
| 166 |
+
max_new_tokens=8192,
|
| 167 |
+
do_sample=True,
|
| 168 |
+
top_p=0.95,
|
| 169 |
+
top_k=50,
|
| 170 |
+
temperature=0.7,
|
| 171 |
+
)
|
| 172 |
+
thread = Thread(target=model.generate, kwargs=generation_kwargs)
|
| 173 |
+
thread.start()
|
| 174 |
+
|
| 175 |
+
# --- Yield tokens as they become available ---
|
| 176 |
+
bot_response = ""
|
| 177 |
+
for new_text in streamer:
|
| 178 |
+
bot_response += new_text
|
| 179 |
+
chat_history[-1] = (message, bot_response)
|
| 180 |
+
yield "", chat_history
|
| 181 |
+
|
| 182 |
+
# Wire up the Gradio components
|
| 183 |
+
msg.submit(respond, [msg, chatbot], [msg, chatbot])
|
| 184 |
+
clear.click(lambda: [], None, chatbot, queue=False)
|
| 185 |
+
|
| 186 |
+
# Launch the app
|
| 187 |
+
demo.queue().launch(debug=True)
|
| 188 |
+
|
docs-ntfy-sh-20250924.md
ADDED
|
@@ -0,0 +1,87 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
Title: ntfy
|
| 2 |
+
|
| 3 |
+
URL Source: https://docs.ntfy.sh/
|
| 4 |
+
|
| 5 |
+
Published Time: Wed, 24 Sep 2025 02:52:16 GMT
|
| 6 |
+
|
| 7 |
+
Markdown Content:
|
| 8 |
+
Getting started[¶](https://docs.ntfy.sh/#getting-started "Permanent link")
|
| 9 |
+
--------------------------------------------------------------------------
|
| 10 |
+
|
| 11 |
+
ntfy lets you **send push notifications to your phone or desktop via scripts from any computer**, using simple HTTP PUT or POST requests. I use it to notify myself when scripts fail, or long-running commands complete.
|
| 12 |
+
|
| 13 |
+
Step 1: Get the app[¶](https://docs.ntfy.sh/#step-1-get-the-app "Permanent link")
|
| 14 |
+
---------------------------------------------------------------------------------
|
| 15 |
+
|
| 16 |
+
[](https://play.google.com/store/apps/details?id=io.heckel.ntfy)[](https://f-droid.org/en/packages/io.heckel.ntfy/)[](https://apps.apple.com/us/app/ntfy/id1625396347)
|
| 17 |
+
|
| 18 |
+
To [receive notifications on your phone](https://docs.ntfy.sh/subscribe/phone/), install the app, either via Google Play, App Store or F-Droid. Once installed, open it and subscribe to a topic of your choosing. Topics don't have to explicitly be created, so just pick a name and use it later when you [publish a message](https://docs.ntfy.sh/publish/). Note that **topic names are public, so it's wise to choose something that cannot be guessed easily.**
|
| 19 |
+
|
| 20 |
+
For this guide, we'll just use `mytopic` as our topic name:
|
| 21 |
+
|
| 22 |
+

|
| 23 |
+
|
| 24 |
+
Creating/adding your first topic
|
| 25 |
+
|
| 26 |
+
That's it. After you tap "Subscribe", the app is listening for new messages on that topic.
|
| 27 |
+
|
| 28 |
+
Step 2: Send a message[¶](https://docs.ntfy.sh/#step-2-send-a-message "Permanent link")
|
| 29 |
+
---------------------------------------------------------------------------------------
|
| 30 |
+
|
| 31 |
+
Now let's [send a message](https://docs.ntfy.sh/publish/) to our topic. It's easy in every language, since we're just using HTTP PUT/POST, or with the [ntfy CLI](https://docs.ntfy.sh/install/). The message is in the request body. Here's an example showing how to publish a simple message using a POST request:
|
| 32 |
+
|
| 33 |
+
Command line (curl) ntfy CLI HTTP JavaScript Go Python PHP
|
| 34 |
+
|
| 35 |
+
```
|
| 36 |
+
curl -d "Backup successful 😀" ntfy.sh/mytopic
|
| 37 |
+
```
|
| 38 |
+
|
| 39 |
+
```
|
| 40 |
+
ntfy publish mytopic "Backup successful 😀"
|
| 41 |
+
```
|
| 42 |
+
|
| 43 |
+
```
|
| 44 |
+
POST /mytopic HTTP/1.1
|
| 45 |
+
Host: ntfy.sh
|
| 46 |
+
|
| 47 |
+
Backup successful 😀
|
| 48 |
+
```
|
| 49 |
+
|
| 50 |
+
```
|
| 51 |
+
fetch('https://ntfy.sh/mytopic', {
|
| 52 |
+
method: 'POST', // PUT works too
|
| 53 |
+
body: 'Backup successful 😀'
|
| 54 |
+
})
|
| 55 |
+
```
|
| 56 |
+
|
| 57 |
+
```
|
| 58 |
+
http.Post("https://ntfy.sh/mytopic", "text/plain",
|
| 59 |
+
strings.NewReader("Backup successful 😀"))
|
| 60 |
+
```
|
| 61 |
+
|
| 62 |
+
```
|
| 63 |
+
requests.post("https://ntfy.sh/mytopic",
|
| 64 |
+
data="Backup successful 😀".encode(encoding='utf-8'))
|
| 65 |
+
```
|
| 66 |
+
|
| 67 |
+
```
|
| 68 |
+
file_get_contents('https://ntfy.sh/mytopic', false, stream_context_create([
|
| 69 |
+
'http' => [
|
| 70 |
+
'method' => 'POST', // PUT also works
|
| 71 |
+
'header' => 'Content-Type: text/plain',
|
| 72 |
+
'content' => 'Backup successful 😀'
|
| 73 |
+
]
|
| 74 |
+
]));
|
| 75 |
+
```
|
| 76 |
+
|
| 77 |
+
This will create a notification that looks like this:
|
| 78 |
+
|
| 79 |
+

|
| 80 |
+
|
| 81 |
+
Android notification
|
| 82 |
+
|
| 83 |
+
That's it. You're all set. Go play and read the rest of the docs. I highly recommend reading at least the page on [publishing messages](https://docs.ntfy.sh/publish/), as well as the detailed page on the [Android/iOS app](https://docs.ntfy.sh/subscribe/phone/).
|
| 84 |
+
|
| 85 |
+
Here's another video showing the entire process:
|
| 86 |
+
|
| 87 |
+
Sending push notifications to your Android phone
|
docs-ntfy-sh-config-20250924.md
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
docs-ntfy-sh-emojis-20250924.md
ADDED
|
@@ -0,0 +1,1828 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
Title: Emojis 🥳 🎉 - ntfy
|
| 2 |
+
|
| 3 |
+
URL Source: https://docs.ntfy.sh/emojis
|
| 4 |
+
|
| 5 |
+
Markdown Content:
|
| 6 |
+
Emoji reference[¶](https://docs.ntfy.sh/emojis#emoji-reference "Permanent link")
|
| 7 |
+
--------------------------------------------------------------------------------
|
| 8 |
+
|
| 9 |
+
You can [tag messages](https://docs.ntfy.sh/publish/#tags-emojis) with emojis 🥳 🎉 and other relevant strings. Matching tags are automatically converted to emojis. This is a reference of all supported emojis. To learn more about the feature, please refer to the [tagging and emojis page](https://docs.ntfy.sh/publish/#tags-emojis).
|
| 10 |
+
|
| 11 |
+
| Tag | Emoji |
|
| 12 |
+
| --- | --- |
|
| 13 |
+
| `grinning` | 😀 |
|
| 14 |
+
| `smiley` | 😃 |
|
| 15 |
+
| `smile` | 😄 |
|
| 16 |
+
| `grin` | 😁 |
|
| 17 |
+
| `laughing` | 😆 |
|
| 18 |
+
| `sweat_smile` | 😅 |
|
| 19 |
+
| `rofl` | 🤣 |
|
| 20 |
+
| `joy` | 😂 |
|
| 21 |
+
| `slightly_smiling_face` | 🙂 |
|
| 22 |
+
| `upside_down_face` | 🙃 |
|
| 23 |
+
| `wink` | 😉 |
|
| 24 |
+
| `blush` | 😊 |
|
| 25 |
+
| `innocent` | 😇 |
|
| 26 |
+
| `smiling_face_with_three_hearts` | 🥰 |
|
| 27 |
+
| `heart_eyes` | 😍 |
|
| 28 |
+
| `star_struck` | 🤩 |
|
| 29 |
+
| `kissing_heart` | 😘 |
|
| 30 |
+
| `kissing` | 😗 |
|
| 31 |
+
| `relaxed` | ☺️ |
|
| 32 |
+
| `kissing_closed_eyes` | 😚 |
|
| 33 |
+
| `kissing_smiling_eyes` | 😙 |
|
| 34 |
+
| `smiling_face_with_tear` | 🥲 |
|
| 35 |
+
| `yum` | 😋 |
|
| 36 |
+
| `stuck_out_tongue` | 😛 |
|
| 37 |
+
| `stuck_out_tongue_winking_eye` | 😜 |
|
| 38 |
+
| `zany_face` | 🤪 |
|
| 39 |
+
| `stuck_out_tongue_closed_eyes` | 😝 |
|
| 40 |
+
| `money_mouth_face` | 🤑 |
|
| 41 |
+
| `hugs` | 🤗 |
|
| 42 |
+
| `hand_over_mouth` | 🤭 |
|
| 43 |
+
| `shushing_face` | 🤫 |
|
| 44 |
+
| `thinking` | 🤔 |
|
| 45 |
+
| `zipper_mouth_face` | 🤐 |
|
| 46 |
+
| `raised_eyebrow` | 🤨 |
|
| 47 |
+
| `neutral_face` | 😐 |
|
| 48 |
+
| `expressionless` | 😑 |
|
| 49 |
+
| `no_mouth` | 😶 |
|
| 50 |
+
| `face_in_clouds` | 😶🌫️ |
|
| 51 |
+
| `smirk` | 😏 |
|
| 52 |
+
| `unamused` | 😒 |
|
| 53 |
+
| `roll_eyes` | 🙄 |
|
| 54 |
+
| `grimacing` | 😬 |
|
| 55 |
+
| `face_exhaling` | 😮💨 |
|
| 56 |
+
| `lying_face` | 🤥 |
|
| 57 |
+
| `relieved` | 😌 |
|
| 58 |
+
| `pensive` | 😔 |
|
| 59 |
+
| `sleepy` | 😪 |
|
| 60 |
+
| `drooling_face` | 🤤 |
|
| 61 |
+
| `sleeping` | 😴 |
|
| 62 |
+
| `mask` | 😷 |
|
| 63 |
+
| `face_with_thermometer` | 🤒 |
|
| 64 |
+
| `face_with_head_bandage` | 🤕 |
|
| 65 |
+
| `nauseated_face` | 🤢 |
|
| 66 |
+
| `vomiting_face` | 🤮 |
|
| 67 |
+
| `sneezing_face` | 🤧 |
|
| 68 |
+
| `hot_face` | 🥵 |
|
| 69 |
+
| `cold_face` | 🥶 |
|
| 70 |
+
| `woozy_face` | 🥴 |
|
| 71 |
+
| `dizzy_face` | 😵 |
|
| 72 |
+
| `face_with_spiral_eyes` | 😵💫 |
|
| 73 |
+
| `exploding_head` | 🤯 |
|
| 74 |
+
| `cowboy_hat_face` | 🤠 |
|
| 75 |
+
| `partying_face` | 🥳 |
|
| 76 |
+
| `disguised_face` | 🥸 |
|
| 77 |
+
| `sunglasses` | 😎 |
|
| 78 |
+
| `nerd_face` | 🤓 |
|
| 79 |
+
| `monocle_face` | 🧐 |
|
| 80 |
+
| `confused` | 😕 |
|
| 81 |
+
| `worried` | 😟 |
|
| 82 |
+
| `slightly_frowning_face` | 🙁 |
|
| 83 |
+
| `frowning_face` | ☹️ |
|
| 84 |
+
| `open_mouth` | 😮 |
|
| 85 |
+
| `hushed` | 😯 |
|
| 86 |
+
| `astonished` | 😲 |
|
| 87 |
+
| `flushed` | 😳 |
|
| 88 |
+
| `pleading_face` | 🥺 |
|
| 89 |
+
| `frowning` | 😦 |
|
| 90 |
+
| `anguished` | 😧 |
|
| 91 |
+
| `fearful` | 😨 |
|
| 92 |
+
| `cold_sweat` | 😰 |
|
| 93 |
+
| `disappointed_relieved` | 😥 |
|
| 94 |
+
| `cry` | 😢 |
|
| 95 |
+
| `sob` | 😭 |
|
| 96 |
+
| `scream` | 😱 |
|
| 97 |
+
| `confounded` | 😖 |
|
| 98 |
+
| `persevere` | 😣 |
|
| 99 |
+
| `disappointed` | 😞 |
|
| 100 |
+
| `sweat` | 😓 |
|
| 101 |
+
| `weary` | 😩 |
|
| 102 |
+
| `tired_face` | 😫 |
|
| 103 |
+
| `yawning_face` | 🥱 |
|
| 104 |
+
| `triumph` | 😤 |
|
| 105 |
+
| `rage` | 😡 |
|
| 106 |
+
| `angry` | 😠 |
|
| 107 |
+
| `cursing_face` | 🤬 |
|
| 108 |
+
| `smiling_imp` | 😈 |
|
| 109 |
+
| `imp` | 👿 |
|
| 110 |
+
| `skull` | 💀 |
|
| 111 |
+
| `skull_and_crossbones` | ☠️ |
|
| 112 |
+
| `hankey` | 💩 |
|
| 113 |
+
| `clown_face` | 🤡 |
|
| 114 |
+
| `japanese_ogre` | 👹 |
|
| 115 |
+
| `japanese_goblin` | 👺 |
|
| 116 |
+
| `ghost` | 👻 |
|
| 117 |
+
| `alien` | 👽 |
|
| 118 |
+
| `space_invader` | 👾 |
|
| 119 |
+
| `robot` | 🤖 |
|
| 120 |
+
| `smiley_cat` | 😺 |
|
| 121 |
+
| `smile_cat` | 😸 |
|
| 122 |
+
| `joy_cat` | 😹 |
|
| 123 |
+
| `heart_eyes_cat` | 😻 |
|
| 124 |
+
| `smirk_cat` | 😼 |
|
| 125 |
+
| `kissing_cat` | 😽 |
|
| 126 |
+
| `scream_cat` | 🙀 |
|
| 127 |
+
| `crying_cat_face` | 😿 |
|
| 128 |
+
| `pouting_cat` | 😾 |
|
| 129 |
+
| `see_no_evil` | 🙈 |
|
| 130 |
+
| `hear_no_evil` | 🙉 |
|
| 131 |
+
| `speak_no_evil` | 🙊 |
|
| 132 |
+
| `kiss` | 💋 |
|
| 133 |
+
| `love_letter` | 💌 |
|
| 134 |
+
| `cupid` | 💘 |
|
| 135 |
+
| `gift_heart` | 💝 |
|
| 136 |
+
| `sparkling_heart` | 💖 |
|
| 137 |
+
| `heartpulse` | 💗 |
|
| 138 |
+
| `heartbeat` | 💓 |
|
| 139 |
+
| `revolving_hearts` | 💞 |
|
| 140 |
+
| `two_hearts` | 💕 |
|
| 141 |
+
| `heart_decoration` | 💟 |
|
| 142 |
+
| `heavy_heart_exclamation` | ❣️ |
|
| 143 |
+
| `broken_heart` | 💔 |
|
| 144 |
+
| `heart_on_fire` | ❤️🔥 |
|
| 145 |
+
| `mending_heart` | ❤️🩹 |
|
| 146 |
+
| `heart` | ❤️ |
|
| 147 |
+
| `orange_heart` | 🧡 |
|
| 148 |
+
| `yellow_heart` | 💛 |
|
| 149 |
+
| `green_heart` | 💚 |
|
| 150 |
+
| `blue_heart` | 💙 |
|
| 151 |
+
| `purple_heart` | 💜 |
|
| 152 |
+
| `brown_heart` | 🤎 |
|
| 153 |
+
| `black_heart` | 🖤 |
|
| 154 |
+
| `white_heart` | 🤍 |
|
| 155 |
+
| `100` | 💯 |
|
| 156 |
+
| `anger` | 💢 |
|
| 157 |
+
| `boom` | 💥 |
|
| 158 |
+
| `dizzy` | 💫 |
|
| 159 |
+
| `sweat_drops` | 💦 |
|
| 160 |
+
| `dash` | 💨 |
|
| 161 |
+
| `hole` | 🕳️ |
|
| 162 |
+
| `bomb` | 💣 |
|
| 163 |
+
| `speech_balloon` | 💬 |
|
| 164 |
+
| `eye_speech_bubble` | 👁️🗨️ |
|
| 165 |
+
| `left_speech_bubble` | 🗨️ |
|
| 166 |
+
| `right_anger_bubble` | 🗯️ |
|
| 167 |
+
| `thought_balloon` | 💭 |
|
| 168 |
+
| `zzz` | 💤 |
|
| 169 |
+
| `wave` | 👋 |
|
| 170 |
+
| `raised_back_of_hand` | 🤚 |
|
| 171 |
+
| `raised_hand_with_fingers_splayed` | 🖐️ |
|
| 172 |
+
| `hand` | ✋ |
|
| 173 |
+
| `vulcan_salute` | 🖖 |
|
| 174 |
+
| `ok_hand` | 👌 |
|
| 175 |
+
| `pinched_fingers` | 🤌 |
|
| 176 |
+
| `pinching_hand` | 🤏 |
|
| 177 |
+
| `v` | ✌️ |
|
| 178 |
+
| `crossed_fingers` | 🤞 |
|
| 179 |
+
| `love_you_gesture` | 🤟 |
|
| 180 |
+
| `metal` | 🤘 |
|
| 181 |
+
| `call_me_hand` | 🤙 |
|
| 182 |
+
| `point_left` | 👈 |
|
| 183 |
+
| `point_right` | 👉 |
|
| 184 |
+
| `point_up_2` | 👆 |
|
| 185 |
+
| `middle_finger` | 🖕 |
|
| 186 |
+
| `point_down` | 👇 |
|
| 187 |
+
| `point_up` | ☝️ |
|
| 188 |
+
| `+1` | 👍 |
|
| 189 |
+
| `-1` | 👎 |
|
| 190 |
+
| `fist_raised` | ✊ |
|
| 191 |
+
| `fist_oncoming` | 👊 |
|
| 192 |
+
| `fist_left` | 🤛 |
|
| 193 |
+
| `fist_right` | 🤜 |
|
| 194 |
+
| `clap` | 👏 |
|
| 195 |
+
| `raised_hands` | 🙌 |
|
| 196 |
+
| `open_hands` | 👐 |
|
| 197 |
+
| `palms_up_together` | 🤲 |
|
| 198 |
+
| `handshake` | 🤝 |
|
| 199 |
+
| `pray` | 🙏 |
|
| 200 |
+
| `writing_hand` | ✍️ |
|
| 201 |
+
| `nail_care` | 💅 |
|
| 202 |
+
| `selfie` | 🤳 |
|
| 203 |
+
| `muscle` | 💪 |
|
| 204 |
+
| `mechanical_arm` | 🦾 |
|
| 205 |
+
| `mechanical_leg` | 🦿 |
|
| 206 |
+
| `leg` | 🦵 |
|
| 207 |
+
| `foot` | 🦶 |
|
| 208 |
+
| `ear` | 👂 |
|
| 209 |
+
| `ear_with_hearing_aid` | 🦻 |
|
| 210 |
+
| `nose` | 👃 |
|
| 211 |
+
| `brain` | 🧠 |
|
| 212 |
+
| `anatomical_heart` | 🫀 |
|
| 213 |
+
| `lungs` | 🫁 |
|
| 214 |
+
| `tooth` | 🦷 |
|
| 215 |
+
| `bone` | 🦴 |
|
| 216 |
+
| `eyes` | 👀 |
|
| 217 |
+
| `eye` | 👁️ |
|
| 218 |
+
| `tongue` | 👅 |
|
| 219 |
+
| `lips` | 👄 |
|
| 220 |
+
| `baby` | 👶 |
|
| 221 |
+
| `child` | 🧒 |
|
| 222 |
+
| `boy` | 👦 |
|
| 223 |
+
| `girl` | 👧 |
|
| 224 |
+
| `adult` | 🧑 |
|
| 225 |
+
| `blond_haired_person` | 👱 |
|
| 226 |
+
| `man` | 👨 |
|
| 227 |
+
| `bearded_person` | 🧔 |
|
| 228 |
+
| `man_beard` | 🧔♂️ |
|
| 229 |
+
| `woman_beard` | 🧔♀️ |
|
| 230 |
+
| `red_haired_man` | 👨🦰 |
|
| 231 |
+
| `curly_haired_man` | 👨🦱 |
|
| 232 |
+
| `white_haired_man` | 👨🦳 |
|
| 233 |
+
| `bald_man` | 👨🦲 |
|
| 234 |
+
| `woman` | 👩 |
|
| 235 |
+
| `red_haired_woman` | 👩🦰 |
|
| 236 |
+
| `person_red_hair` | 🧑🦰 |
|
| 237 |
+
| `curly_haired_woman` | 👩🦱 |
|
| 238 |
+
| `person_curly_hair` | 🧑🦱 |
|
| 239 |
+
| `white_haired_woman` | 👩🦳 |
|
| 240 |
+
| `person_white_hair` | 🧑🦳 |
|
| 241 |
+
| `bald_woman` | 👩🦲 |
|
| 242 |
+
| `person_bald` | 🧑🦲 |
|
| 243 |
+
| `blond_haired_woman` | 👱♀️ |
|
| 244 |
+
| `blond_haired_man` | 👱♂️ |
|
| 245 |
+
| `older_adult` | 🧓 |
|
| 246 |
+
| `older_man` | 👴 |
|
| 247 |
+
| `older_woman` | 👵 |
|
| 248 |
+
| `frowning_person` | 🙍 |
|
| 249 |
+
| `frowning_man` | 🙍♂️ |
|
| 250 |
+
| `frowning_woman` | 🙍♀️ |
|
| 251 |
+
| `pouting_face` | 🙎 |
|
| 252 |
+
| `pouting_man` | 🙎♂️ |
|
| 253 |
+
| `pouting_woman` | 🙎♀️ |
|
| 254 |
+
| `no_good` | 🙅 |
|
| 255 |
+
| `no_good_man` | 🙅♂️ |
|
| 256 |
+
| `no_good_woman` | 🙅♀️ |
|
| 257 |
+
| `ok_person` | 🙆 |
|
| 258 |
+
| `ok_man` | 🙆♂️ |
|
| 259 |
+
| `ok_woman` | 🙆♀️ |
|
| 260 |
+
| `tipping_hand_person` | 💁 |
|
| 261 |
+
| `tipping_hand_man` | 💁♂️ |
|
| 262 |
+
| `tipping_hand_woman` | 💁♀️ |
|
| 263 |
+
| `raising_hand` | 🙋 |
|
| 264 |
+
| `raising_hand_man` | 🙋♂️ |
|
| 265 |
+
| `raising_hand_woman` | 🙋♀️ |
|
| 266 |
+
| `deaf_person` | 🧏 |
|
| 267 |
+
| `deaf_man` | 🧏♂️ |
|
| 268 |
+
| `deaf_woman` | 🧏♀️ |
|
| 269 |
+
| `bow` | 🙇 |
|
| 270 |
+
| `bowing_man` | 🙇♂️ |
|
| 271 |
+
| `bowing_woman` | 🙇♀️ |
|
| 272 |
+
| `facepalm` | 🤦 |
|
| 273 |
+
| `man_facepalming` | 🤦♂️ |
|
| 274 |
+
| `woman_facepalming` | 🤦♀️ |
|
| 275 |
+
| `shrug` | 🤷 |
|
| 276 |
+
| `man_shrugging` | 🤷♂️ |
|
| 277 |
+
| `woman_shrugging` | 🤷♀️ |
|
| 278 |
+
| `health_worker` | 🧑⚕️ |
|
| 279 |
+
| `man_health_worker` | 👨⚕️ |
|
| 280 |
+
| `woman_health_worker` | 👩⚕️ |
|
| 281 |
+
| `student` | 🧑🎓 |
|
| 282 |
+
| `man_student` | 👨🎓 |
|
| 283 |
+
| `woman_student` | 👩🎓 |
|
| 284 |
+
| `teacher` | 🧑🏫 |
|
| 285 |
+
| `man_teacher` | 👨🏫 |
|
| 286 |
+
| `woman_teacher` | 👩🏫 |
|
| 287 |
+
| `judge` | 🧑⚖️ |
|
| 288 |
+
| `man_judge` | 👨⚖️ |
|
| 289 |
+
| `woman_judge` | 👩⚖️ |
|
| 290 |
+
| `farmer` | 🧑🌾 |
|
| 291 |
+
| `man_farmer` | 👨🌾 |
|
| 292 |
+
| `woman_farmer` | 👩🌾 |
|
| 293 |
+
| `cook` | 🧑🍳 |
|
| 294 |
+
| `man_cook` | 👨🍳 |
|
| 295 |
+
| `woman_cook` | 👩🍳 |
|
| 296 |
+
| `mechanic` | 🧑🔧 |
|
| 297 |
+
| `man_mechanic` | 👨🔧 |
|
| 298 |
+
| `woman_mechanic` | 👩🔧 |
|
| 299 |
+
| `factory_worker` | 🧑🏭 |
|
| 300 |
+
| `man_factory_worker` | 👨🏭 |
|
| 301 |
+
| `woman_factory_worker` | 👩🏭 |
|
| 302 |
+
| `office_worker` | 🧑💼 |
|
| 303 |
+
| `man_office_worker` | 👨💼 |
|
| 304 |
+
| `woman_office_worker` | 👩💼 |
|
| 305 |
+
| `scientist` | 🧑🔬 |
|
| 306 |
+
| `man_scientist` | 👨🔬 |
|
| 307 |
+
| `woman_scientist` | 👩🔬 |
|
| 308 |
+
| `technologist` | 🧑💻 |
|
| 309 |
+
| `man_technologist` | 👨💻 |
|
| 310 |
+
| `woman_technologist` | 👩💻 |
|
| 311 |
+
| `singer` | 🧑🎤 |
|
| 312 |
+
| `man_singer` | 👨🎤 |
|
| 313 |
+
| `woman_singer` | 👩🎤 |
|
| 314 |
+
| `artist` | 🧑🎨 |
|
| 315 |
+
| `man_artist` | 👨🎨 |
|
| 316 |
+
| `woman_artist` | 👩🎨 |
|
| 317 |
+
| `pilot` | 🧑✈️ |
|
| 318 |
+
| `man_pilot` | 👨✈️ |
|
| 319 |
+
| `woman_pilot` | 👩✈️ |
|
| 320 |
+
| `astronaut` | 🧑🚀 |
|
| 321 |
+
| `man_astronaut` | 👨🚀 |
|
| 322 |
+
| `woman_astronaut` | 👩🚀 |
|
| 323 |
+
| `firefighter` | 🧑🚒 |
|
| 324 |
+
| `man_firefighter` | 👨🚒 |
|
| 325 |
+
| `woman_firefighter` | 👩🚒 |
|
| 326 |
+
| `police_officer` | 👮 |
|
| 327 |
+
| `policeman` | 👮♂️ |
|
| 328 |
+
| `policewoman` | 👮♀️ |
|
| 329 |
+
| `detective` | 🕵️ |
|
| 330 |
+
| `male_detective` | 🕵️♂️ |
|
| 331 |
+
| `female_detective` | 🕵️♀️ |
|
| 332 |
+
| `guard` | 💂 |
|
| 333 |
+
| `guardsman` | 💂♂️ |
|
| 334 |
+
| `guardswoman` | 💂♀️ |
|
| 335 |
+
| `ninja` | 🥷 |
|
| 336 |
+
| `construction_worker` | 👷 |
|
| 337 |
+
| `construction_worker_man` | 👷♂️ |
|
| 338 |
+
| `construction_worker_woman` | 👷♀️ |
|
| 339 |
+
| `prince` | 🤴 |
|
| 340 |
+
| `princess` | 👸 |
|
| 341 |
+
| `person_with_turban` | 👳 |
|
| 342 |
+
| `man_with_turban` | 👳♂️ |
|
| 343 |
+
| `woman_with_turban` | 👳♀️ |
|
| 344 |
+
| `man_with_gua_pi_mao` | 👲 |
|
| 345 |
+
| `woman_with_headscarf` | 🧕 |
|
| 346 |
+
| `person_in_tuxedo` | 🤵 |
|
| 347 |
+
| `man_in_tuxedo` | 🤵♂️ |
|
| 348 |
+
| `woman_in_tuxedo` | 🤵♀️ |
|
| 349 |
+
| `person_with_veil` | 👰 |
|
| 350 |
+
| `man_with_veil` | 👰♂️ |
|
| 351 |
+
| `woman_with_veil` | 👰♀️ |
|
| 352 |
+
| `pregnant_woman` | 🤰 |
|
| 353 |
+
| `breast_feeding` | 🤱 |
|
| 354 |
+
| `woman_feeding_baby` | 👩🍼 |
|
| 355 |
+
| `man_feeding_baby` | 👨🍼 |
|
| 356 |
+
| `person_feeding_baby` | 🧑🍼 |
|
| 357 |
+
| `angel` | 👼 |
|
| 358 |
+
| `santa` | 🎅 |
|
| 359 |
+
| `mrs_claus` | 🤶 |
|
| 360 |
+
| `mx_claus` | 🧑🎄 |
|
| 361 |
+
| `superhero` | 🦸 |
|
| 362 |
+
| `superhero_man` | 🦸♂️ |
|
| 363 |
+
| `superhero_woman` | 🦸♀️ |
|
| 364 |
+
| `supervillain` | 🦹 |
|
| 365 |
+
| `supervillain_man` | 🦹♂️ |
|
| 366 |
+
| `supervillain_woman` | 🦹♀️ |
|
| 367 |
+
| `mage` | 🧙 |
|
| 368 |
+
| `mage_man` | 🧙♂️ |
|
| 369 |
+
| `mage_woman` | 🧙♀️ |
|
| 370 |
+
| `fairy` | 🧚 |
|
| 371 |
+
| `fairy_man` | 🧚♂️ |
|
| 372 |
+
| `fairy_woman` | 🧚♀️ |
|
| 373 |
+
| `vampire` | 🧛 |
|
| 374 |
+
| `vampire_man` | 🧛♂️ |
|
| 375 |
+
| `vampire_woman` | 🧛♀️ |
|
| 376 |
+
| `merperson` | 🧜 |
|
| 377 |
+
| `merman` | 🧜♂️ |
|
| 378 |
+
| `mermaid` | 🧜♀️ |
|
| 379 |
+
| `elf` | 🧝 |
|
| 380 |
+
| `elf_man` | 🧝♂️ |
|
| 381 |
+
| `elf_woman` | 🧝♀️ |
|
| 382 |
+
| `genie` | 🧞 |
|
| 383 |
+
| `genie_man` | 🧞♂️ |
|
| 384 |
+
| `genie_woman` | 🧞♀️ |
|
| 385 |
+
| `zombie` | 🧟 |
|
| 386 |
+
| `zombie_man` | 🧟♂️ |
|
| 387 |
+
| `zombie_woman` | 🧟♀️ |
|
| 388 |
+
| `massage` | 💆 |
|
| 389 |
+
| `massage_man` | 💆♂️ |
|
| 390 |
+
| `massage_woman` | 💆♀️ |
|
| 391 |
+
| `haircut` | 💇 |
|
| 392 |
+
| `haircut_man` | 💇♂️ |
|
| 393 |
+
| `haircut_woman` | 💇♀️ |
|
| 394 |
+
| `walking` | 🚶 |
|
| 395 |
+
| `walking_man` | 🚶♂️ |
|
| 396 |
+
| `walking_woman` | 🚶♀️ |
|
| 397 |
+
| `standing_person` | 🧍 |
|
| 398 |
+
| `standing_man` | 🧍♂️ |
|
| 399 |
+
| `standing_woman` | 🧍♀️ |
|
| 400 |
+
| `kneeling_person` | 🧎 |
|
| 401 |
+
| `kneeling_man` | 🧎♂️ |
|
| 402 |
+
| `kneeling_woman` | 🧎♀️ |
|
| 403 |
+
| `person_with_probing_cane` | 🧑🦯 |
|
| 404 |
+
| `man_with_probing_cane` | 👨🦯 |
|
| 405 |
+
| `woman_with_probing_cane` | 👩🦯 |
|
| 406 |
+
| `person_in_motorized_wheelchair` | 🧑🦼 |
|
| 407 |
+
| `man_in_motorized_wheelchair` | 👨🦼 |
|
| 408 |
+
| `woman_in_motorized_wheelchair` | 👩🦼 |
|
| 409 |
+
| `person_in_manual_wheelchair` | 🧑🦽 |
|
| 410 |
+
| `man_in_manual_wheelchair` | 👨🦽 |
|
| 411 |
+
| `woman_in_manual_wheelchair` | 👩🦽 |
|
| 412 |
+
| `runner` | 🏃 |
|
| 413 |
+
| `running_man` | 🏃♂️ |
|
| 414 |
+
| `running_woman` | 🏃♀️ |
|
| 415 |
+
| `woman_dancing` | 💃 |
|
| 416 |
+
| `man_dancing` | 🕺 |
|
| 417 |
+
| `business_suit_levitating` | 🕴️ |
|
| 418 |
+
| `dancers` | 👯 |
|
| 419 |
+
| `dancing_men` | 👯♂️ |
|
| 420 |
+
| `dancing_women` | 👯♀️ |
|
| 421 |
+
| `sauna_person` | 🧖 |
|
| 422 |
+
| `sauna_man` | 🧖♂️ |
|
| 423 |
+
| `sauna_woman` | 🧖♀️ |
|
| 424 |
+
| `climbing` | 🧗 |
|
| 425 |
+
| `climbing_man` | 🧗♂️ |
|
| 426 |
+
| `climbing_woman` | 🧗♀️ |
|
| 427 |
+
| `person_fencing` | 🤺 |
|
| 428 |
+
| `horse_racing` | 🏇 |
|
| 429 |
+
| `skier` | ⛷️ |
|
| 430 |
+
| `snowboarder` | 🏂 |
|
| 431 |
+
| `golfing` | 🏌️ |
|
| 432 |
+
| `golfing_man` | 🏌️♂️ |
|
| 433 |
+
| `golfing_woman` | 🏌️♀️ |
|
| 434 |
+
| `surfer` | 🏄 |
|
| 435 |
+
| `surfing_man` | 🏄♂️ |
|
| 436 |
+
| `surfing_woman` | 🏄♀️ |
|
| 437 |
+
| `rowboat` | 🚣 |
|
| 438 |
+
| `rowing_man` | 🚣♂️ |
|
| 439 |
+
| `rowing_woman` | 🚣♀️ |
|
| 440 |
+
| `swimmer` | 🏊 |
|
| 441 |
+
| `swimming_man` | 🏊♂️ |
|
| 442 |
+
| `swimming_woman` | 🏊♀️ |
|
| 443 |
+
| `bouncing_ball_person` | ⛹️ |
|
| 444 |
+
| `bouncing_ball_man` | ⛹️♂️ |
|
| 445 |
+
| `bouncing_ball_woman` | ⛹️♀️ |
|
| 446 |
+
| `weight_lifting` | 🏋️ |
|
| 447 |
+
| `weight_lifting_man` | 🏋️♂️ |
|
| 448 |
+
| `weight_lifting_woman` | 🏋️♀️ |
|
| 449 |
+
| `bicyclist` | 🚴 |
|
| 450 |
+
| `biking_man` | 🚴♂️ |
|
| 451 |
+
| `biking_woman` | 🚴♀️ |
|
| 452 |
+
| `mountain_bicyclist` | 🚵 |
|
| 453 |
+
| `mountain_biking_man` | 🚵♂️ |
|
| 454 |
+
| `mountain_biking_woman` | 🚵♀️ |
|
| 455 |
+
| `cartwheeling` | 🤸 |
|
| 456 |
+
| `man_cartwheeling` | 🤸♂️ |
|
| 457 |
+
| `woman_cartwheeling` | 🤸♀️ |
|
| 458 |
+
| `wrestling` | 🤼 |
|
| 459 |
+
| `men_wrestling` | 🤼♂️ |
|
| 460 |
+
| `women_wrestling` | 🤼♀️ |
|
| 461 |
+
| `water_polo` | 🤽 |
|
| 462 |
+
| `man_playing_water_polo` | 🤽♂️ |
|
| 463 |
+
| `woman_playing_water_polo` | 🤽♀️ |
|
| 464 |
+
| `handball_person` | 🤾 |
|
| 465 |
+
| `man_playing_handball` | 🤾♂️ |
|
| 466 |
+
| `woman_playing_handball` | 🤾♀️ |
|
| 467 |
+
| `juggling_person` | 🤹 |
|
| 468 |
+
| `man_juggling` | 🤹♂️ |
|
| 469 |
+
| `woman_juggling` | 🤹♀️ |
|
| 470 |
+
| `lotus_position` | 🧘 |
|
| 471 |
+
| `lotus_position_man` | 🧘♂️ |
|
| 472 |
+
| `lotus_position_woman` | 🧘♀️ |
|
| 473 |
+
| `bath` | 🛀 |
|
| 474 |
+
| `sleeping_bed` | 🛌 |
|
| 475 |
+
| `people_holding_hands` | 🧑🤝🧑 |
|
| 476 |
+
| `two_women_holding_hands` | 👭 |
|
| 477 |
+
| `couple` | 👫 |
|
| 478 |
+
| `two_men_holding_hands` | 👬 |
|
| 479 |
+
| `couplekiss` | 💏 |
|
| 480 |
+
| `couplekiss_man_woman` | 👩❤️💋👨 |
|
| 481 |
+
| `couplekiss_man_man` | 👨❤️💋👨 |
|
| 482 |
+
| `couplekiss_woman_woman` | 👩❤️💋👩 |
|
| 483 |
+
| `couple_with_heart` | 💑 |
|
| 484 |
+
| `couple_with_heart_woman_man` | 👩❤️👨 |
|
| 485 |
+
| `couple_with_heart_man_man` | 👨❤️👨 |
|
| 486 |
+
| `couple_with_heart_woman_woman` | 👩❤️👩 |
|
| 487 |
+
| `family` | 👪 |
|
| 488 |
+
| `family_man_woman_boy` | 👨👩👦 |
|
| 489 |
+
| `family_man_woman_girl` | 👨👩👧 |
|
| 490 |
+
| `family_man_woman_girl_boy` | 👨👩👧👦 |
|
| 491 |
+
| `family_man_woman_boy_boy` | 👨👩👦👦 |
|
| 492 |
+
| `family_man_woman_girl_girl` | 👨👩👧👧 |
|
| 493 |
+
| `family_man_man_boy` | 👨👨👦 |
|
| 494 |
+
| `family_man_man_girl` | 👨👨👧 |
|
| 495 |
+
| `family_man_man_girl_boy` | 👨👨👧👦 |
|
| 496 |
+
| `family_man_man_boy_boy` | 👨👨👦👦 |
|
| 497 |
+
| `family_man_man_girl_girl` | 👨👨👧👧 |
|
| 498 |
+
| `family_woman_woman_boy` | 👩👩👦 |
|
| 499 |
+
| `family_woman_woman_girl` | 👩👩👧 |
|
| 500 |
+
| `family_woman_woman_girl_boy` | 👩👩👧👦 |
|
| 501 |
+
| `family_woman_woman_boy_boy` | 👩👩👦👦 |
|
| 502 |
+
| `family_woman_woman_girl_girl` | 👩👩👧👧 |
|
| 503 |
+
| `family_man_boy` | 👨👦 |
|
| 504 |
+
| `family_man_boy_boy` | 👨👦👦 |
|
| 505 |
+
| `family_man_girl` | 👨👧 |
|
| 506 |
+
| `family_man_girl_boy` | 👨👧👦 |
|
| 507 |
+
| `family_man_girl_girl` | 👨👧👧 |
|
| 508 |
+
| `family_woman_boy` | 👩👦 |
|
| 509 |
+
| `family_woman_boy_boy` | 👩👦👦 |
|
| 510 |
+
| `family_woman_girl` | 👩👧 |
|
| 511 |
+
| `family_woman_girl_boy` | 👩👧👦 |
|
| 512 |
+
| `family_woman_girl_girl` | 👩👧👧 |
|
| 513 |
+
| `speaking_head` | 🗣️ |
|
| 514 |
+
| `bust_in_silhouette` | 👤 |
|
| 515 |
+
| `busts_in_silhouette` | 👥 |
|
| 516 |
+
| `people_hugging` | 🫂 |
|
| 517 |
+
| `footprints` | 👣 |
|
| 518 |
+
| `monkey_face` | 🐵 |
|
| 519 |
+
| `monkey` | 🐒 |
|
| 520 |
+
| `gorilla` | 🦍 |
|
| 521 |
+
| `orangutan` | 🦧 |
|
| 522 |
+
| `dog` | 🐶 |
|
| 523 |
+
| `dog2` | 🐕 |
|
| 524 |
+
| `guide_dog` | 🦮 |
|
| 525 |
+
| `service_dog` | 🐕🦺 |
|
| 526 |
+
| `poodle` | 🐩 |
|
| 527 |
+
| `wolf` | 🐺 |
|
| 528 |
+
| `fox_face` | 🦊 |
|
| 529 |
+
| `raccoon` | 🦝 |
|
| 530 |
+
| `cat` | 🐱 |
|
| 531 |
+
| `cat2` | 🐈 |
|
| 532 |
+
| `black_cat` | 🐈⬛ |
|
| 533 |
+
| `lion` | 🦁 |
|
| 534 |
+
| `tiger` | 🐯 |
|
| 535 |
+
| `tiger2` | 🐅 |
|
| 536 |
+
| `leopard` | 🐆 |
|
| 537 |
+
| `horse` | 🐴 |
|
| 538 |
+
| `racehorse` | 🐎 |
|
| 539 |
+
| `unicorn` | 🦄 |
|
| 540 |
+
| `zebra` | 🦓 |
|
| 541 |
+
| `deer` | 🦌 |
|
| 542 |
+
| `bison` | 🦬 |
|
| 543 |
+
| `cow` | 🐮 |
|
| 544 |
+
| `ox` | 🐂 |
|
| 545 |
+
| `water_buffalo` | 🐃 |
|
| 546 |
+
| `cow2` | 🐄 |
|
| 547 |
+
| `pig` | 🐷 |
|
| 548 |
+
| `pig2` | 🐖 |
|
| 549 |
+
| `boar` | 🐗 |
|
| 550 |
+
| `pig_nose` | 🐽 |
|
| 551 |
+
| `ram` | 🐏 |
|
| 552 |
+
| `sheep` | 🐑 |
|
| 553 |
+
| `goat` | 🐐 |
|
| 554 |
+
| `dromedary_camel` | 🐪 |
|
| 555 |
+
| `camel` | 🐫 |
|
| 556 |
+
| `llama` | 🦙 |
|
| 557 |
+
| `giraffe` | 🦒 |
|
| 558 |
+
| `elephant` | 🐘 |
|
| 559 |
+
| `mammoth` | 🦣 |
|
| 560 |
+
| `rhinoceros` | 🦏 |
|
| 561 |
+
| `hippopotamus` | 🦛 |
|
| 562 |
+
| `mouse` | 🐭 |
|
| 563 |
+
| `mouse2` | 🐁 |
|
| 564 |
+
| `rat` | 🐀 |
|
| 565 |
+
| `hamster` | 🐹 |
|
| 566 |
+
| `rabbit` | 🐰 |
|
| 567 |
+
| `rabbit2` | 🐇 |
|
| 568 |
+
| `chipmunk` | 🐿️ |
|
| 569 |
+
| `beaver` | 🦫 |
|
| 570 |
+
| `hedgehog` | 🦔 |
|
| 571 |
+
| `bat` | 🦇 |
|
| 572 |
+
| `bear` | 🐻 |
|
| 573 |
+
| `polar_bear` | 🐻❄️ |
|
| 574 |
+
| `koala` | 🐨 |
|
| 575 |
+
| `panda_face` | 🐼 |
|
| 576 |
+
| `sloth` | 🦥 |
|
| 577 |
+
| `otter` | 🦦 |
|
| 578 |
+
| `skunk` | 🦨 |
|
| 579 |
+
| `kangaroo` | 🦘 |
|
| 580 |
+
| `badger` | 🦡 |
|
| 581 |
+
| `feet` | 🐾 |
|
| 582 |
+
| `turkey` | 🦃 |
|
| 583 |
+
| `chicken` | 🐔 |
|
| 584 |
+
| `rooster` | 🐓 |
|
| 585 |
+
| `hatching_chick` | 🐣 |
|
| 586 |
+
| `baby_chick` | 🐤 |
|
| 587 |
+
| `hatched_chick` | 🐥 |
|
| 588 |
+
| `bird` | 🐦 |
|
| 589 |
+
| `penguin` | 🐧 |
|
| 590 |
+
| `dove` | 🕊️ |
|
| 591 |
+
| `eagle` | 🦅 |
|
| 592 |
+
| `duck` | 🦆 |
|
| 593 |
+
| `swan` | 🦢 |
|
| 594 |
+
| `owl` | 🦉 |
|
| 595 |
+
| `dodo` | 🦤 |
|
| 596 |
+
| `feather` | 🪶 |
|
| 597 |
+
| `flamingo` | 🦩 |
|
| 598 |
+
| `peacock` | 🦚 |
|
| 599 |
+
| `parrot` | 🦜 |
|
| 600 |
+
| `frog` | 🐸 |
|
| 601 |
+
| `crocodile` | 🐊 |
|
| 602 |
+
| `turtle` | 🐢 |
|
| 603 |
+
| `lizard` | 🦎 |
|
| 604 |
+
| `snake` | 🐍 |
|
| 605 |
+
| `dragon_face` | 🐲 |
|
| 606 |
+
| `dragon` | 🐉 |
|
| 607 |
+
| `sauropod` | 🦕 |
|
| 608 |
+
| `t-rex` | 🦖 |
|
| 609 |
+
| `whale` | 🐳 |
|
| 610 |
+
| `whale2` | 🐋 |
|
| 611 |
+
| `dolphin` | 🐬 |
|
| 612 |
+
| `seal` | 🦭 |
|
| 613 |
+
| `fish` | 🐟 |
|
| 614 |
+
| `tropical_fish` | 🐠 |
|
| 615 |
+
| `blowfish` | 🐡 |
|
| 616 |
+
| `shark` | 🦈 |
|
| 617 |
+
| `octopus` | 🐙 || Tag | Emoji |
|
| 618 |
+
| --- | --- |
|
| 619 |
+
| `octopus` | 🐙 |
|
| 620 |
+
| `shell` | 🐚 |
|
| 621 |
+
| `snail` | 🐌 |
|
| 622 |
+
| `butterfly` | 🦋 |
|
| 623 |
+
| `bug` | 🐛 |
|
| 624 |
+
| `ant` | 🐜 |
|
| 625 |
+
| `bee` | 🐝 |
|
| 626 |
+
| `beetle` | 🪲 |
|
| 627 |
+
| `lady_beetle` | 🐞 |
|
| 628 |
+
| `cricket` | 🦗 |
|
| 629 |
+
| `cockroach` | 🪳 |
|
| 630 |
+
| `spider` | 🕷️ |
|
| 631 |
+
| `spider_web` | 🕸️ |
|
| 632 |
+
| `scorpion` | 🦂 |
|
| 633 |
+
| `mosquito` | 🦟 |
|
| 634 |
+
| `fly` | 🪰 |
|
| 635 |
+
| `worm` | 🪱 |
|
| 636 |
+
| `microbe` | 🦠 |
|
| 637 |
+
| `bouquet` | 💐 |
|
| 638 |
+
| `cherry_blossom` | 🌸 |
|
| 639 |
+
| `white_flower` | 💮 |
|
| 640 |
+
| `rosette` | 🏵️ |
|
| 641 |
+
| `rose` | 🌹 |
|
| 642 |
+
| `wilted_flower` | 🥀 |
|
| 643 |
+
| `hibiscus` | 🌺 |
|
| 644 |
+
| `sunflower` | 🌻 |
|
| 645 |
+
| `blossom` | 🌼 |
|
| 646 |
+
| `tulip` | 🌷 |
|
| 647 |
+
| `seedling` | 🌱 |
|
| 648 |
+
| `potted_plant` | 🪴 |
|
| 649 |
+
| `evergreen_tree` | 🌲 |
|
| 650 |
+
| `deciduous_tree` | 🌳 |
|
| 651 |
+
| `palm_tree` | 🌴 |
|
| 652 |
+
| `cactus` | 🌵 |
|
| 653 |
+
| `ear_of_rice` | 🌾 |
|
| 654 |
+
| `herb` | 🌿 |
|
| 655 |
+
| `shamrock` | ☘️ |
|
| 656 |
+
| `four_leaf_clover` | 🍀 |
|
| 657 |
+
| `maple_leaf` | 🍁 |
|
| 658 |
+
| `fallen_leaf` | 🍂 |
|
| 659 |
+
| `leaves` | 🍃 |
|
| 660 |
+
| `grapes` | 🍇 |
|
| 661 |
+
| `melon` | 🍈 |
|
| 662 |
+
| `watermelon` | 🍉 |
|
| 663 |
+
| `tangerine` | 🍊 |
|
| 664 |
+
| `lemon` | 🍋 |
|
| 665 |
+
| `banana` | 🍌 |
|
| 666 |
+
| `pineapple` | 🍍 |
|
| 667 |
+
| `mango` | 🥭 |
|
| 668 |
+
| `apple` | 🍎 |
|
| 669 |
+
| `green_apple` | 🍏 |
|
| 670 |
+
| `pear` | 🍐 |
|
| 671 |
+
| `peach` | 🍑 |
|
| 672 |
+
| `cherries` | 🍒 |
|
| 673 |
+
| `strawberry` | 🍓 |
|
| 674 |
+
| `blueberries` | 🫐 |
|
| 675 |
+
| `kiwi_fruit` | 🥝 |
|
| 676 |
+
| `tomato` | 🍅 |
|
| 677 |
+
| `olive` | 🫒 |
|
| 678 |
+
| `coconut` | 🥥 |
|
| 679 |
+
| `avocado` | 🥑 |
|
| 680 |
+
| `eggplant` | 🍆 |
|
| 681 |
+
| `potato` | 🥔 |
|
| 682 |
+
| `carrot` | 🥕 |
|
| 683 |
+
| `corn` | 🌽 |
|
| 684 |
+
| `hot_pepper` | 🌶️ |
|
| 685 |
+
| `bell_pepper` | 🫑 |
|
| 686 |
+
| `cucumber` | 🥒 |
|
| 687 |
+
| `leafy_green` | 🥬 |
|
| 688 |
+
| `broccoli` | 🥦 |
|
| 689 |
+
| `garlic` | 🧄 |
|
| 690 |
+
| `onion` | 🧅 |
|
| 691 |
+
| `mushroom` | 🍄 |
|
| 692 |
+
| `peanuts` | 🥜 |
|
| 693 |
+
| `chestnut` | 🌰 |
|
| 694 |
+
| `bread` | 🍞 |
|
| 695 |
+
| `croissant` | 🥐 |
|
| 696 |
+
| `baguette_bread` | 🥖 |
|
| 697 |
+
| `flatbread` | 🫓 |
|
| 698 |
+
| `pretzel` | 🥨 |
|
| 699 |
+
| `bagel` | 🥯 |
|
| 700 |
+
| `pancakes` | 🥞 |
|
| 701 |
+
| `waffle` | 🧇 |
|
| 702 |
+
| `cheese` | 🧀 |
|
| 703 |
+
| `meat_on_bone` | 🍖 |
|
| 704 |
+
| `poultry_leg` | 🍗 |
|
| 705 |
+
| `cut_of_meat` | 🥩 |
|
| 706 |
+
| `bacon` | 🥓 |
|
| 707 |
+
| `hamburger` | 🍔 |
|
| 708 |
+
| `fries` | 🍟 |
|
| 709 |
+
| `pizza` | 🍕 |
|
| 710 |
+
| `hotdog` | 🌭 |
|
| 711 |
+
| `sandwich` | 🥪 |
|
| 712 |
+
| `taco` | 🌮 |
|
| 713 |
+
| `burrito` | 🌯 |
|
| 714 |
+
| `tamale` | 🫔 |
|
| 715 |
+
| `stuffed_flatbread` | 🥙 |
|
| 716 |
+
| `falafel` | 🧆 |
|
| 717 |
+
| `egg` | 🥚 |
|
| 718 |
+
| `fried_egg` | 🍳 |
|
| 719 |
+
| `shallow_pan_of_food` | 🥘 |
|
| 720 |
+
| `stew` | 🍲 |
|
| 721 |
+
| `fondue` | 🫕 |
|
| 722 |
+
| `bowl_with_spoon` | 🥣 |
|
| 723 |
+
| `green_salad` | 🥗 |
|
| 724 |
+
| `popcorn` | 🍿 |
|
| 725 |
+
| `butter` | 🧈 |
|
| 726 |
+
| `salt` | 🧂 |
|
| 727 |
+
| `canned_food` | 🥫 |
|
| 728 |
+
| `bento` | 🍱 |
|
| 729 |
+
| `rice_cracker` | 🍘 |
|
| 730 |
+
| `rice_ball` | 🍙 |
|
| 731 |
+
| `rice` | 🍚 |
|
| 732 |
+
| `curry` | 🍛 |
|
| 733 |
+
| `ramen` | 🍜 |
|
| 734 |
+
| `spaghetti` | 🍝 |
|
| 735 |
+
| `sweet_potato` | 🍠 |
|
| 736 |
+
| `oden` | 🍢 |
|
| 737 |
+
| `sushi` | 🍣 |
|
| 738 |
+
| `fried_shrimp` | 🍤 |
|
| 739 |
+
| `fish_cake` | 🍥 |
|
| 740 |
+
| `moon_cake` | 🥮 |
|
| 741 |
+
| `dango` | 🍡 |
|
| 742 |
+
| `dumpling` | 🥟 |
|
| 743 |
+
| `fortune_cookie` | 🥠 |
|
| 744 |
+
| `takeout_box` | 🥡 |
|
| 745 |
+
| `crab` | 🦀 |
|
| 746 |
+
| `lobster` | 🦞 |
|
| 747 |
+
| `shrimp` | 🦐 |
|
| 748 |
+
| `squid` | 🦑 |
|
| 749 |
+
| `oyster` | 🦪 |
|
| 750 |
+
| `icecream` | 🍦 |
|
| 751 |
+
| `shaved_ice` | 🍧 |
|
| 752 |
+
| `ice_cream` | 🍨 |
|
| 753 |
+
| `doughnut` | 🍩 |
|
| 754 |
+
| `cookie` | 🍪 |
|
| 755 |
+
| `birthday` | 🎂 |
|
| 756 |
+
| `cake` | 🍰 |
|
| 757 |
+
| `cupcake` | 🧁 |
|
| 758 |
+
| `pie` | 🥧 |
|
| 759 |
+
| `chocolate_bar` | 🍫 |
|
| 760 |
+
| `candy` | 🍬 |
|
| 761 |
+
| `lollipop` | 🍭 |
|
| 762 |
+
| `custard` | 🍮 |
|
| 763 |
+
| `honey_pot` | 🍯 |
|
| 764 |
+
| `baby_bottle` | 🍼 |
|
| 765 |
+
| `milk_glass` | 🥛 |
|
| 766 |
+
| `coffee` | ☕ |
|
| 767 |
+
| `teapot` | 🫖 |
|
| 768 |
+
| `tea` | 🍵 |
|
| 769 |
+
| `sake` | 🍶 |
|
| 770 |
+
| `champagne` | 🍾 |
|
| 771 |
+
| `wine_glass` | 🍷 |
|
| 772 |
+
| `cocktail` | 🍸 |
|
| 773 |
+
| `tropical_drink` | 🍹 |
|
| 774 |
+
| `beer` | 🍺 |
|
| 775 |
+
| `beers` | 🍻 |
|
| 776 |
+
| `clinking_glasses` | 🥂 |
|
| 777 |
+
| `tumbler_glass` | 🥃 |
|
| 778 |
+
| `cup_with_straw` | 🥤 |
|
| 779 |
+
| `bubble_tea` | 🧋 |
|
| 780 |
+
| `beverage_box` | 🧃 |
|
| 781 |
+
| `mate` | 🧉 |
|
| 782 |
+
| `ice_cube` | 🧊 |
|
| 783 |
+
| `chopsticks` | 🥢 |
|
| 784 |
+
| `plate_with_cutlery` | 🍽️ |
|
| 785 |
+
| `fork_and_knife` | 🍴 |
|
| 786 |
+
| `spoon` | 🥄 |
|
| 787 |
+
| `hocho` | 🔪 |
|
| 788 |
+
| `amphora` | 🏺 |
|
| 789 |
+
| `earth_africa` | 🌍 |
|
| 790 |
+
| `earth_americas` | 🌎 |
|
| 791 |
+
| `earth_asia` | 🌏 |
|
| 792 |
+
| `globe_with_meridians` | 🌐 |
|
| 793 |
+
| `world_map` | 🗺️ |
|
| 794 |
+
| `japan` | 🗾 |
|
| 795 |
+
| `compass` | 🧭 |
|
| 796 |
+
| `mountain_snow` | 🏔️ |
|
| 797 |
+
| `mountain` | ⛰️ |
|
| 798 |
+
| `volcano` | 🌋 |
|
| 799 |
+
| `mount_fuji` | 🗻 |
|
| 800 |
+
| `camping` | 🏕️ |
|
| 801 |
+
| `beach_umbrella` | 🏖️ |
|
| 802 |
+
| `desert` | 🏜️ |
|
| 803 |
+
| `desert_island` | 🏝️ |
|
| 804 |
+
| `national_park` | 🏞️ |
|
| 805 |
+
| `stadium` | 🏟️ |
|
| 806 |
+
| `classical_building` | 🏛️ |
|
| 807 |
+
| `building_construction` | 🏗️ |
|
| 808 |
+
| `bricks` | 🧱 |
|
| 809 |
+
| `rock` | 🪨 |
|
| 810 |
+
| `wood` | 🪵 |
|
| 811 |
+
| `hut` | 🛖 |
|
| 812 |
+
| `houses` | 🏘️ |
|
| 813 |
+
| `derelict_house` | 🏚️ |
|
| 814 |
+
| `house` | 🏠 |
|
| 815 |
+
| `house_with_garden` | 🏡 |
|
| 816 |
+
| `office` | 🏢 |
|
| 817 |
+
| `post_office` | 🏣 |
|
| 818 |
+
| `european_post_office` | 🏤 |
|
| 819 |
+
| `hospital` | 🏥 |
|
| 820 |
+
| `bank` | 🏦 |
|
| 821 |
+
| `hotel` | 🏨 |
|
| 822 |
+
| `love_hotel` | 🏩 |
|
| 823 |
+
| `convenience_store` | 🏪 |
|
| 824 |
+
| `school` | 🏫 |
|
| 825 |
+
| `department_store` | 🏬 |
|
| 826 |
+
| `factory` | 🏭 |
|
| 827 |
+
| `japanese_castle` | 🏯 |
|
| 828 |
+
| `european_castle` | 🏰 |
|
| 829 |
+
| `wedding` | 💒 |
|
| 830 |
+
| `tokyo_tower` | 🗼 |
|
| 831 |
+
| `statue_of_liberty` | 🗽 |
|
| 832 |
+
| `church` | ⛪ |
|
| 833 |
+
| `mosque` | 🕌 |
|
| 834 |
+
| `hindu_temple` | 🛕 |
|
| 835 |
+
| `synagogue` | 🕍 |
|
| 836 |
+
| `shinto_shrine` | ⛩️ |
|
| 837 |
+
| `kaaba` | 🕋 |
|
| 838 |
+
| `fountain` | ⛲ |
|
| 839 |
+
| `tent` | ⛺ |
|
| 840 |
+
| `foggy` | 🌁 |
|
| 841 |
+
| `night_with_stars` | 🌃 |
|
| 842 |
+
| `cityscape` | 🏙️ |
|
| 843 |
+
| `sunrise_over_mountains` | 🌄 |
|
| 844 |
+
| `sunrise` | 🌅 |
|
| 845 |
+
| `city_sunset` | 🌆 |
|
| 846 |
+
| `city_sunrise` | 🌇 |
|
| 847 |
+
| `bridge_at_night` | 🌉 |
|
| 848 |
+
| `hotsprings` | ♨️ |
|
| 849 |
+
| `carousel_horse` | 🎠 |
|
| 850 |
+
| `ferris_wheel` | 🎡 |
|
| 851 |
+
| `roller_coaster` | 🎢 |
|
| 852 |
+
| `barber` | 💈 |
|
| 853 |
+
| `circus_tent` | 🎪 |
|
| 854 |
+
| `steam_locomotive` | 🚂 |
|
| 855 |
+
| `railway_car` | 🚃 |
|
| 856 |
+
| `bullettrain_side` | 🚄 |
|
| 857 |
+
| `bullettrain_front` | 🚅 |
|
| 858 |
+
| `train2` | 🚆 |
|
| 859 |
+
| `metro` | 🚇 |
|
| 860 |
+
| `light_rail` | 🚈 |
|
| 861 |
+
| `station` | 🚉 |
|
| 862 |
+
| `tram` | 🚊 |
|
| 863 |
+
| `monorail` | 🚝 |
|
| 864 |
+
| `mountain_railway` | 🚞 |
|
| 865 |
+
| `train` | 🚋 |
|
| 866 |
+
| `bus` | 🚌 |
|
| 867 |
+
| `oncoming_bus` | 🚍 |
|
| 868 |
+
| `trolleybus` | 🚎 |
|
| 869 |
+
| `minibus` | 🚐 |
|
| 870 |
+
| `ambulance` | 🚑 |
|
| 871 |
+
| `fire_engine` | 🚒 |
|
| 872 |
+
| `police_car` | 🚓 |
|
| 873 |
+
| `oncoming_police_car` | 🚔 |
|
| 874 |
+
| `taxi` | 🚕 |
|
| 875 |
+
| `oncoming_taxi` | 🚖 |
|
| 876 |
+
| `car` | 🚗 |
|
| 877 |
+
| `oncoming_automobile` | 🚘 |
|
| 878 |
+
| `blue_car` | 🚙 |
|
| 879 |
+
| `pickup_truck` | 🛻 |
|
| 880 |
+
| `truck` | 🚚 |
|
| 881 |
+
| `articulated_lorry` | 🚛 |
|
| 882 |
+
| `tractor` | 🚜 |
|
| 883 |
+
| `racing_car` | 🏎️ |
|
| 884 |
+
| `motorcycle` | 🏍️ |
|
| 885 |
+
| `motor_scooter` | 🛵 |
|
| 886 |
+
| `manual_wheelchair` | 🦽 |
|
| 887 |
+
| `motorized_wheelchair` | 🦼 |
|
| 888 |
+
| `auto_rickshaw` | 🛺 |
|
| 889 |
+
| `bike` | 🚲 |
|
| 890 |
+
| `kick_scooter` | 🛴 |
|
| 891 |
+
| `skateboard` | 🛹 |
|
| 892 |
+
| `roller_skate` | 🛼 |
|
| 893 |
+
| `busstop` | 🚏 |
|
| 894 |
+
| `motorway` | 🛣️ |
|
| 895 |
+
| `railway_track` | 🛤️ |
|
| 896 |
+
| `oil_drum` | 🛢️ |
|
| 897 |
+
| `fuelpump` | ⛽ |
|
| 898 |
+
| `rotating_light` | 🚨 |
|
| 899 |
+
| `traffic_light` | 🚥 |
|
| 900 |
+
| `vertical_traffic_light` | 🚦 |
|
| 901 |
+
| `stop_sign` | 🛑 |
|
| 902 |
+
| `construction` | ���� |
|
| 903 |
+
| `anchor` | ⚓ |
|
| 904 |
+
| `boat` | ⛵ |
|
| 905 |
+
| `canoe` | 🛶 |
|
| 906 |
+
| `speedboat` | 🚤 |
|
| 907 |
+
| `passenger_ship` | 🛳️ |
|
| 908 |
+
| `ferry` | ⛴️ |
|
| 909 |
+
| `motor_boat` | 🛥️ |
|
| 910 |
+
| `ship` | 🚢 |
|
| 911 |
+
| `airplane` | ✈️ |
|
| 912 |
+
| `small_airplane` | 🛩️ |
|
| 913 |
+
| `flight_departure` | 🛫 |
|
| 914 |
+
| `flight_arrival` | 🛬 |
|
| 915 |
+
| `parachute` | 🪂 |
|
| 916 |
+
| `seat` | 💺 |
|
| 917 |
+
| `helicopter` | 🚁 |
|
| 918 |
+
| `suspension_railway` | 🚟 |
|
| 919 |
+
| `mountain_cableway` | 🚠 |
|
| 920 |
+
| `aerial_tramway` | 🚡 |
|
| 921 |
+
| `artificial_satellite` | 🛰️ |
|
| 922 |
+
| `rocket` | 🚀 |
|
| 923 |
+
| `flying_saucer` | 🛸 |
|
| 924 |
+
| `bellhop_bell` | 🛎️ |
|
| 925 |
+
| `luggage` | 🧳 |
|
| 926 |
+
| `hourglass` | ⌛ |
|
| 927 |
+
| `hourglass_flowing_sand` | ⏳ |
|
| 928 |
+
| `watch` | ⌚ |
|
| 929 |
+
| `alarm_clock` | ⏰ |
|
| 930 |
+
| `stopwatch` | ⏱️ |
|
| 931 |
+
| `timer_clock` | ⏲️ |
|
| 932 |
+
| `mantelpiece_clock` | 🕰️ |
|
| 933 |
+
| `clock12` | 🕛 |
|
| 934 |
+
| `clock1230` | 🕧 |
|
| 935 |
+
| `clock1` | 🕐 |
|
| 936 |
+
| `clock130` | 🕜 |
|
| 937 |
+
| `clock2` | 🕑 |
|
| 938 |
+
| `clock230` | 🕝 |
|
| 939 |
+
| `clock3` | 🕒 |
|
| 940 |
+
| `clock330` | 🕞 |
|
| 941 |
+
| `clock4` | 🕓 |
|
| 942 |
+
| `clock430` | 🕟 |
|
| 943 |
+
| `clock5` | 🕔 |
|
| 944 |
+
| `clock530` | 🕠 |
|
| 945 |
+
| `clock6` | 🕕 |
|
| 946 |
+
| `clock630` | 🕡 |
|
| 947 |
+
| `clock7` | 🕖 |
|
| 948 |
+
| `clock730` | 🕢 |
|
| 949 |
+
| `clock8` | 🕗 |
|
| 950 |
+
| `clock830` | 🕣 |
|
| 951 |
+
| `clock9` | 🕘 |
|
| 952 |
+
| `clock930` | 🕤 |
|
| 953 |
+
| `clock10` | 🕙 |
|
| 954 |
+
| `clock1030` | 🕥 |
|
| 955 |
+
| `clock11` | 🕚 |
|
| 956 |
+
| `clock1130` | 🕦 |
|
| 957 |
+
| `new_moon` | 🌑 |
|
| 958 |
+
| `waxing_crescent_moon` | 🌒 |
|
| 959 |
+
| `first_quarter_moon` | 🌓 |
|
| 960 |
+
| `moon` | 🌔 |
|
| 961 |
+
| `full_moon` | 🌕 |
|
| 962 |
+
| `waning_gibbous_moon` | 🌖 |
|
| 963 |
+
| `last_quarter_moon` | 🌗 |
|
| 964 |
+
| `waning_crescent_moon` | 🌘 |
|
| 965 |
+
| `crescent_moon` | 🌙 |
|
| 966 |
+
| `new_moon_with_face` | 🌚 |
|
| 967 |
+
| `first_quarter_moon_with_face` | 🌛 |
|
| 968 |
+
| `last_quarter_moon_with_face` | 🌜 |
|
| 969 |
+
| `thermometer` | 🌡️ |
|
| 970 |
+
| `sunny` | ☀️ |
|
| 971 |
+
| `full_moon_with_face` | 🌝 |
|
| 972 |
+
| `sun_with_face` | 🌞 |
|
| 973 |
+
| `ringed_planet` | 🪐 |
|
| 974 |
+
| `star` | ⭐ |
|
| 975 |
+
| `star2` | 🌟 |
|
| 976 |
+
| `stars` | 🌠 |
|
| 977 |
+
| `milky_way` | 🌌 |
|
| 978 |
+
| `cloud` | ☁️ |
|
| 979 |
+
| `partly_sunny` | ⛅ |
|
| 980 |
+
| `cloud_with_lightning_and_rain` | ⛈️ |
|
| 981 |
+
| `sun_behind_small_cloud` | 🌤️ |
|
| 982 |
+
| `sun_behind_large_cloud` | 🌥️ |
|
| 983 |
+
| `sun_behind_rain_cloud` | 🌦️ |
|
| 984 |
+
| `cloud_with_rain` | 🌧️ |
|
| 985 |
+
| `cloud_with_snow` | 🌨️ |
|
| 986 |
+
| `cloud_with_lightning` | 🌩️ |
|
| 987 |
+
| `tornado` | 🌪️ |
|
| 988 |
+
| `fog` | 🌫️ |
|
| 989 |
+
| `wind_face` | 🌬️ |
|
| 990 |
+
| `cyclone` | 🌀 |
|
| 991 |
+
| `rainbow` | 🌈 |
|
| 992 |
+
| `closed_umbrella` | 🌂 |
|
| 993 |
+
| `open_umbrella` | ☂️ |
|
| 994 |
+
| `umbrella` | ☔ |
|
| 995 |
+
| `parasol_on_ground` | ⛱️ |
|
| 996 |
+
| `zap` | ⚡ |
|
| 997 |
+
| `snowflake` | ❄️ |
|
| 998 |
+
| `snowman_with_snow` | ☃️ |
|
| 999 |
+
| `snowman` | ⛄ |
|
| 1000 |
+
| `comet` | ☄️ |
|
| 1001 |
+
| `fire` | 🔥 |
|
| 1002 |
+
| `droplet` | 💧 |
|
| 1003 |
+
| `ocean` | 🌊 |
|
| 1004 |
+
| `jack_o_lantern` | 🎃 |
|
| 1005 |
+
| `christmas_tree` | 🎄 |
|
| 1006 |
+
| `fireworks` | 🎆 |
|
| 1007 |
+
| `sparkler` | 🎇 |
|
| 1008 |
+
| `firecracker` | 🧨 |
|
| 1009 |
+
| `sparkles` | ✨ |
|
| 1010 |
+
| `balloon` | 🎈 |
|
| 1011 |
+
| `tada` | 🎉 |
|
| 1012 |
+
| `confetti_ball` | 🎊 |
|
| 1013 |
+
| `tanabata_tree` | 🎋 |
|
| 1014 |
+
| `bamboo` | 🎍 |
|
| 1015 |
+
| `dolls` | 🎎 |
|
| 1016 |
+
| `flags` | 🎏 |
|
| 1017 |
+
| `wind_chime` | 🎐 |
|
| 1018 |
+
| `rice_scene` | 🎑 |
|
| 1019 |
+
| `red_envelope` | 🧧 |
|
| 1020 |
+
| `ribbon` | 🎀 |
|
| 1021 |
+
| `gift` | 🎁 |
|
| 1022 |
+
| `reminder_ribbon` | 🎗️ |
|
| 1023 |
+
| `tickets` | 🎟️ |
|
| 1024 |
+
| `ticket` | 🎫 |
|
| 1025 |
+
| `medal_military` | 🎖️ |
|
| 1026 |
+
| `trophy` | 🏆 |
|
| 1027 |
+
| `medal_sports` | 🏅 |
|
| 1028 |
+
| `1st_place_medal` | 🥇 |
|
| 1029 |
+
| `2nd_place_medal` | 🥈 |
|
| 1030 |
+
| `3rd_place_medal` | 🥉 |
|
| 1031 |
+
| `soccer` | ⚽ |
|
| 1032 |
+
| `baseball` | ⚾ |
|
| 1033 |
+
| `softball` | 🥎 |
|
| 1034 |
+
| `basketball` | 🏀 |
|
| 1035 |
+
| `volleyball` | 🏐 |
|
| 1036 |
+
| `football` | 🏈 |
|
| 1037 |
+
| `rugby_football` | 🏉 |
|
| 1038 |
+
| `tennis` | 🎾 |
|
| 1039 |
+
| `flying_disc` | 🥏 |
|
| 1040 |
+
| `bowling` | 🎳 |
|
| 1041 |
+
| `cricket_game` | 🏏 |
|
| 1042 |
+
| `field_hockey` | 🏑 |
|
| 1043 |
+
| `ice_hockey` | 🏒 |
|
| 1044 |
+
| `lacrosse` | 🥍 |
|
| 1045 |
+
| `ping_pong` | 🏓 |
|
| 1046 |
+
| `badminton` | 🏸 |
|
| 1047 |
+
| `boxing_glove` | 🥊 |
|
| 1048 |
+
| `martial_arts_uniform` | 🥋 |
|
| 1049 |
+
| `goal_net` | 🥅 |
|
| 1050 |
+
| `golf` | ⛳ |
|
| 1051 |
+
| `ice_skate` | ⛸️ |
|
| 1052 |
+
| `fishing_pole_and_fish` | 🎣 |
|
| 1053 |
+
| `diving_mask` | 🤿 |
|
| 1054 |
+
| `running_shirt_with_sash` | 🎽 |
|
| 1055 |
+
| `ski` | 🎿 |
|
| 1056 |
+
| `sled` | 🛷 |
|
| 1057 |
+
| `curling_stone` | 🥌 |
|
| 1058 |
+
| `dart` | 🎯 |
|
| 1059 |
+
| `yo_yo` | 🪀 |
|
| 1060 |
+
| `kite` | 🪁 |
|
| 1061 |
+
| `8ball` | 🎱 |
|
| 1062 |
+
| `crystal_ball` | 🔮 |
|
| 1063 |
+
| `magic_wand` | 🪄 |
|
| 1064 |
+
| `nazar_amulet` | 🧿 |
|
| 1065 |
+
| `video_game` | 🎮 |
|
| 1066 |
+
| `joystick` | 🕹️ |
|
| 1067 |
+
| `slot_machine` | 🎰 |
|
| 1068 |
+
| `game_die` | 🎲 |
|
| 1069 |
+
| `jigsaw` | 🧩 |
|
| 1070 |
+
| `teddy_bear` | 🧸 |
|
| 1071 |
+
| `pinata` | 🪅 |
|
| 1072 |
+
| `nesting_dolls` | 🪆 |
|
| 1073 |
+
| `spades` | ♠️ |
|
| 1074 |
+
| `hearts` | ♥️ |
|
| 1075 |
+
| `diamonds` | ♦️ |
|
| 1076 |
+
| `clubs` | ♣️ |
|
| 1077 |
+
| `chess_pawn` | ♟️ |
|
| 1078 |
+
| `black_joker` | 🃏 |
|
| 1079 |
+
| `mahjong` | 🀄 |
|
| 1080 |
+
| `flower_playing_cards` | 🎴 |
|
| 1081 |
+
| `performing_arts` | 🎭 |
|
| 1082 |
+
| `framed_picture` | 🖼️ |
|
| 1083 |
+
| `art` | 🎨 |
|
| 1084 |
+
| `thread` | 🧵 |
|
| 1085 |
+
| `sewing_needle` | 🪡 |
|
| 1086 |
+
| `yarn` | 🧶 |
|
| 1087 |
+
| `knot` | 🪢 |
|
| 1088 |
+
| `eyeglasses` | 👓 |
|
| 1089 |
+
| `dark_sunglasses` | 🕶️ |
|
| 1090 |
+
| `goggles` | 🥽 |
|
| 1091 |
+
| `lab_coat` | 🥼 |
|
| 1092 |
+
| `safety_vest` | 🦺 |
|
| 1093 |
+
| `necktie` | 👔 |
|
| 1094 |
+
| `shirt` | 👕 |
|
| 1095 |
+
| `jeans` | 👖 |
|
| 1096 |
+
| `scarf` | 🧣 |
|
| 1097 |
+
| `gloves` | 🧤 |
|
| 1098 |
+
| `coat` | 🧥 |
|
| 1099 |
+
| `socks` | 🧦 |
|
| 1100 |
+
| `dress` | 👗 |
|
| 1101 |
+
| `kimono` | 👘 |
|
| 1102 |
+
| `sari` | 🥻 |
|
| 1103 |
+
| `one_piece_swimsuit` | 🩱 |
|
| 1104 |
+
| `swim_brief` | 🩲 |
|
| 1105 |
+
| `shorts` | 🩳 |
|
| 1106 |
+
| `bikini` | 👙 |
|
| 1107 |
+
| `womans_clothes` | 👚 |
|
| 1108 |
+
| `purse` | 👛 |
|
| 1109 |
+
| `handbag` | 👜 |
|
| 1110 |
+
| `pouch` | 👝 |
|
| 1111 |
+
| `shopping` | 🛍️ |
|
| 1112 |
+
| `school_satchel` | 🎒 |
|
| 1113 |
+
| `thong_sandal` | 🩴 |
|
| 1114 |
+
| `mans_shoe` | 👞 |
|
| 1115 |
+
| `athletic_shoe` | 👟 |
|
| 1116 |
+
| `hiking_boot` | 🥾 |
|
| 1117 |
+
| `flat_shoe` | 🥿 |
|
| 1118 |
+
| `high_heel` | 👠 |
|
| 1119 |
+
| `sandal` | 👡 |
|
| 1120 |
+
| `ballet_shoes` | 🩰 |
|
| 1121 |
+
| `boot` | 👢 |
|
| 1122 |
+
| `crown` | 👑 |
|
| 1123 |
+
| `womans_hat` | 👒 |
|
| 1124 |
+
| `tophat` | 🎩 |
|
| 1125 |
+
| `mortar_board` | 🎓 |
|
| 1126 |
+
| `billed_cap` | 🧢 |
|
| 1127 |
+
| `military_helmet` | 🪖 |
|
| 1128 |
+
| `rescue_worker_helmet` | ⛑️ |
|
| 1129 |
+
| `prayer_beads` | 📿 |
|
| 1130 |
+
| `lipstick` | 💄 |
|
| 1131 |
+
| `ring` | 💍 |
|
| 1132 |
+
| `gem` | 💎 |
|
| 1133 |
+
| `mute` | 🔇 |
|
| 1134 |
+
| `speaker` | 🔈 |
|
| 1135 |
+
| `sound` | 🔉 |
|
| 1136 |
+
| `loud_sound` | 🔊 |
|
| 1137 |
+
| `loudspeaker` | 📢 |
|
| 1138 |
+
| `mega` | 📣 |
|
| 1139 |
+
| `postal_horn` | 📯 |
|
| 1140 |
+
| `bell` | 🔔 |
|
| 1141 |
+
| `no_bell` | 🔕 |
|
| 1142 |
+
| `musical_score` | 🎼 |
|
| 1143 |
+
| `musical_note` | 🎵 |
|
| 1144 |
+
| `notes` | 🎶 |
|
| 1145 |
+
| `studio_microphone` | 🎙️ |
|
| 1146 |
+
| `level_slider` | 🎚️ |
|
| 1147 |
+
| `control_knobs` | 🎛️ |
|
| 1148 |
+
| `microphone` | 🎤 |
|
| 1149 |
+
| `headphones` | 🎧 |
|
| 1150 |
+
| `radio` | 📻 |
|
| 1151 |
+
| `saxophone` | 🎷 |
|
| 1152 |
+
| `accordion` | 🪗 |
|
| 1153 |
+
| `guitar` | 🎸 |
|
| 1154 |
+
| `musical_keyboard` | 🎹 |
|
| 1155 |
+
| `trumpet` | 🎺 |
|
| 1156 |
+
| `violin` | 🎻 |
|
| 1157 |
+
| `banjo` | 🪕 |
|
| 1158 |
+
| `drum` | 🥁 |
|
| 1159 |
+
| `long_drum` | 🪘 |
|
| 1160 |
+
| `iphone` | 📱 |
|
| 1161 |
+
| `calling` | 📲 |
|
| 1162 |
+
| `phone` | ☎️ |
|
| 1163 |
+
| `telephone_receiver` | 📞 |
|
| 1164 |
+
| `pager` | 📟 |
|
| 1165 |
+
| `fax` | 📠 |
|
| 1166 |
+
| `battery` | 🔋 |
|
| 1167 |
+
| `electric_plug` | 🔌 |
|
| 1168 |
+
| `computer` | 💻 |
|
| 1169 |
+
| `desktop_computer` | 🖥️ |
|
| 1170 |
+
| `printer` | 🖨️ |
|
| 1171 |
+
| `keyboard` | ⌨️ |
|
| 1172 |
+
| `computer_mouse` | 🖱️ |
|
| 1173 |
+
| `trackball` | 🖲️ |
|
| 1174 |
+
| `minidisc` | 💽 |
|
| 1175 |
+
| `floppy_disk` | 💾 |
|
| 1176 |
+
| `cd` | 💿 |
|
| 1177 |
+
| `dvd` | 📀 |
|
| 1178 |
+
| `abacus` | 🧮 |
|
| 1179 |
+
| `movie_camera` | 🎥 |
|
| 1180 |
+
| `film_strip` | 🎞️ |
|
| 1181 |
+
| `film_projector` | 📽️ |
|
| 1182 |
+
| `clapper` | 🎬 |
|
| 1183 |
+
| `tv` | 📺 |
|
| 1184 |
+
| `camera` | 📷 |
|
| 1185 |
+
| `camera_flash` | 📸 |
|
| 1186 |
+
| `video_camera` | 📹 |
|
| 1187 |
+
| `vhs` | 📼 |
|
| 1188 |
+
| `mag` | 🔍 |
|
| 1189 |
+
| `mag_right` | 🔎 |
|
| 1190 |
+
| `candle` | 🕯️ |
|
| 1191 |
+
| `bulb` | 💡 |
|
| 1192 |
+
| `flashlight` | 🔦 |
|
| 1193 |
+
| `izakaya_lantern` | 🏮 |
|
| 1194 |
+
| `diya_lamp` | 🪔 |
|
| 1195 |
+
| `notebook_with_decorative_cover` | 📔 |
|
| 1196 |
+
| `closed_book` | 📕 |
|
| 1197 |
+
| `book` | 📖 |
|
| 1198 |
+
| `green_book` | 📗 |
|
| 1199 |
+
| `blue_book` | 📘 |
|
| 1200 |
+
| `orange_book` | 📙 |
|
| 1201 |
+
| `books` | 📚 |
|
| 1202 |
+
| `notebook` | 📓 |
|
| 1203 |
+
| `ledger` | 📒 |
|
| 1204 |
+
| `page_with_curl` | 📃 |
|
| 1205 |
+
| `scroll` | 📜 |
|
| 1206 |
+
| `page_facing_up` | 📄 |
|
| 1207 |
+
| `newspaper` | 📰 |
|
| 1208 |
+
| `newspaper_roll` | 🗞️ |
|
| 1209 |
+
| `bookmark_tabs` | 📑 |
|
| 1210 |
+
| `bookmark` | 🔖 |
|
| 1211 |
+
| `label` | 🏷️ |
|
| 1212 |
+
| `moneybag` | 💰 |
|
| 1213 |
+
| `coin` | 🪙 |
|
| 1214 |
+
| `yen` | 💴 |
|
| 1215 |
+
| `dollar` | 💵 |
|
| 1216 |
+
| `euro` | 💶 |
|
| 1217 |
+
| `pound` | 💷 |
|
| 1218 |
+
| `money_with_wings` | 💸 |
|
| 1219 |
+
| `credit_card` | 💳 |
|
| 1220 |
+
| `receipt` | 🧾 |
|
| 1221 |
+
| `chart` | 💹 |
|
| 1222 |
+
| `envelope` | ✉️ |
|
| 1223 |
+
| `email` | 📧 || Tag | Emoji |
|
| 1224 |
+
| --- | --- |
|
| 1225 |
+
| `email` | 📧 |
|
| 1226 |
+
| `incoming_envelope` | 📨 |
|
| 1227 |
+
| `envelope_with_arrow` | 📩 |
|
| 1228 |
+
| `outbox_tray` | 📤 |
|
| 1229 |
+
| `inbox_tray` | 📥 |
|
| 1230 |
+
| `package` | 📦 |
|
| 1231 |
+
| `mailbox` | 📫 |
|
| 1232 |
+
| `mailbox_closed` | 📪 |
|
| 1233 |
+
| `mailbox_with_mail` | 📬 |
|
| 1234 |
+
| `mailbox_with_no_mail` | 📭 |
|
| 1235 |
+
| `postbox` | 📮 |
|
| 1236 |
+
| `ballot_box` | 🗳️ |
|
| 1237 |
+
| `pencil2` | ✏️ |
|
| 1238 |
+
| `black_nib` | ✒️ |
|
| 1239 |
+
| `fountain_pen` | 🖋️ |
|
| 1240 |
+
| `pen` | 🖊️ |
|
| 1241 |
+
| `paintbrush` | 🖌️ |
|
| 1242 |
+
| `crayon` | 🖍️ |
|
| 1243 |
+
| `memo` | 📝 |
|
| 1244 |
+
| `briefcase` | 💼 |
|
| 1245 |
+
| `file_folder` | 📁 |
|
| 1246 |
+
| `open_file_folder` | 📂 |
|
| 1247 |
+
| `card_index_dividers` | 🗂️ |
|
| 1248 |
+
| `date` | 📅 |
|
| 1249 |
+
| `calendar` | 📆 |
|
| 1250 |
+
| `spiral_notepad` | 🗒️ |
|
| 1251 |
+
| `spiral_calendar` | 🗓️ |
|
| 1252 |
+
| `card_index` | 📇 |
|
| 1253 |
+
| `chart_with_upwards_trend` | 📈 |
|
| 1254 |
+
| `chart_with_downwards_trend` | 📉 |
|
| 1255 |
+
| `bar_chart` | 📊 |
|
| 1256 |
+
| `clipboard` | 📋 |
|
| 1257 |
+
| `pushpin` | 📌 |
|
| 1258 |
+
| `round_pushpin` | 📍 |
|
| 1259 |
+
| `paperclip` | 📎 |
|
| 1260 |
+
| `paperclips` | 🖇️ |
|
| 1261 |
+
| `straight_ruler` | 📏 |
|
| 1262 |
+
| `triangular_ruler` | 📐 |
|
| 1263 |
+
| `scissors` | ✂️ |
|
| 1264 |
+
| `card_file_box` | 🗃️ |
|
| 1265 |
+
| `file_cabinet` | 🗄️ |
|
| 1266 |
+
| `wastebasket` | 🗑️ |
|
| 1267 |
+
| `lock` | 🔒 |
|
| 1268 |
+
| `unlock` | 🔓 |
|
| 1269 |
+
| `lock_with_ink_pen` | 🔏 |
|
| 1270 |
+
| `closed_lock_with_key` | 🔐 |
|
| 1271 |
+
| `key` | 🔑 |
|
| 1272 |
+
| `old_key` | 🗝️ |
|
| 1273 |
+
| `hammer` | 🔨 |
|
| 1274 |
+
| `axe` | 🪓 |
|
| 1275 |
+
| `pick` | ⛏️ |
|
| 1276 |
+
| `hammer_and_pick` | ⚒️ |
|
| 1277 |
+
| `hammer_and_wrench` | 🛠️ |
|
| 1278 |
+
| `dagger` | 🗡️ |
|
| 1279 |
+
| `crossed_swords` | ⚔️ |
|
| 1280 |
+
| `gun` | 🔫 |
|
| 1281 |
+
| `boomerang` | 🪃 |
|
| 1282 |
+
| `bow_and_arrow` | 🏹 |
|
| 1283 |
+
| `shield` | 🛡️ |
|
| 1284 |
+
| `carpentry_saw` | 🪚 |
|
| 1285 |
+
| `wrench` | 🔧 |
|
| 1286 |
+
| `screwdriver` | 🪛 |
|
| 1287 |
+
| `nut_and_bolt` | 🔩 |
|
| 1288 |
+
| `gear` | ⚙️ |
|
| 1289 |
+
| `clamp` | 🗜️ |
|
| 1290 |
+
| `balance_scale` | ⚖️ |
|
| 1291 |
+
| `probing_cane` | 🦯 |
|
| 1292 |
+
| `link` | 🔗 |
|
| 1293 |
+
| `chains` | ⛓️ |
|
| 1294 |
+
| `hook` | 🪝 |
|
| 1295 |
+
| `toolbox` | 🧰 |
|
| 1296 |
+
| `magnet` | 🧲 |
|
| 1297 |
+
| `ladder` | 🪜 |
|
| 1298 |
+
| `alembic` | ⚗️ |
|
| 1299 |
+
| `test_tube` | 🧪 |
|
| 1300 |
+
| `petri_dish` | 🧫 |
|
| 1301 |
+
| `dna` | 🧬 |
|
| 1302 |
+
| `microscope` | 🔬 |
|
| 1303 |
+
| `telescope` | 🔭 |
|
| 1304 |
+
| `satellite` | 📡 |
|
| 1305 |
+
| `syringe` | 💉 |
|
| 1306 |
+
| `drop_of_blood` | 🩸 |
|
| 1307 |
+
| `pill` | 💊 |
|
| 1308 |
+
| `adhesive_bandage` | 🩹 |
|
| 1309 |
+
| `stethoscope` | 🩺 |
|
| 1310 |
+
| `door` | 🚪 |
|
| 1311 |
+
| `elevator` | 🛗 |
|
| 1312 |
+
| `mirror` | 🪞 |
|
| 1313 |
+
| `window` | 🪟 |
|
| 1314 |
+
| `bed` | 🛏️ |
|
| 1315 |
+
| `couch_and_lamp` | 🛋️ |
|
| 1316 |
+
| `chair` | 🪑 |
|
| 1317 |
+
| `toilet` | 🚽 |
|
| 1318 |
+
| `plunger` | 🪠 |
|
| 1319 |
+
| `shower` | 🚿 |
|
| 1320 |
+
| `bathtub` | 🛁 |
|
| 1321 |
+
| `mouse_trap` | 🪤 |
|
| 1322 |
+
| `razor` | 🪒 |
|
| 1323 |
+
| `lotion_bottle` | 🧴 |
|
| 1324 |
+
| `safety_pin` | 🧷 |
|
| 1325 |
+
| `broom` | 🧹 |
|
| 1326 |
+
| `basket` | 🧺 |
|
| 1327 |
+
| `roll_of_paper` | 🧻 |
|
| 1328 |
+
| `bucket` | 🪣 |
|
| 1329 |
+
| `soap` | 🧼 |
|
| 1330 |
+
| `toothbrush` | 🪥 |
|
| 1331 |
+
| `sponge` | 🧽 |
|
| 1332 |
+
| `fire_extinguisher` | 🧯 |
|
| 1333 |
+
| `shopping_cart` | 🛒 |
|
| 1334 |
+
| `smoking` | 🚬 |
|
| 1335 |
+
| `coffin` | ⚰️ |
|
| 1336 |
+
| `headstone` | 🪦 |
|
| 1337 |
+
| `funeral_urn` | ⚱️ |
|
| 1338 |
+
| `moyai` | 🗿 |
|
| 1339 |
+
| `placard` | 🪧 |
|
| 1340 |
+
| `atm` | 🏧 |
|
| 1341 |
+
| `put_litter_in_its_place` | 🚮 |
|
| 1342 |
+
| `potable_water` | 🚰 |
|
| 1343 |
+
| `wheelchair` | ♿ |
|
| 1344 |
+
| `mens` | 🚹 |
|
| 1345 |
+
| `womens` | 🚺 |
|
| 1346 |
+
| `restroom` | 🚻 |
|
| 1347 |
+
| `baby_symbol` | 🚼 |
|
| 1348 |
+
| `wc` | 🚾 |
|
| 1349 |
+
| `passport_control` | 🛂 |
|
| 1350 |
+
| `customs` | 🛃 |
|
| 1351 |
+
| `baggage_claim` | 🛄 |
|
| 1352 |
+
| `left_luggage` | 🛅 |
|
| 1353 |
+
| `warning` | ⚠️ |
|
| 1354 |
+
| `children_crossing` | 🚸 |
|
| 1355 |
+
| `no_entry` | ⛔ |
|
| 1356 |
+
| `no_entry_sign` | 🚫 |
|
| 1357 |
+
| `no_bicycles` | 🚳 |
|
| 1358 |
+
| `no_smoking` | 🚭 |
|
| 1359 |
+
| `do_not_litter` | 🚯 |
|
| 1360 |
+
| `non-potable_water` | 🚱 |
|
| 1361 |
+
| `no_pedestrians` | 🚷 |
|
| 1362 |
+
| `no_mobile_phones` | 📵 |
|
| 1363 |
+
| `underage` | 🔞 |
|
| 1364 |
+
| `radioactive` | ☢️ |
|
| 1365 |
+
| `biohazard` | ☣️ |
|
| 1366 |
+
| `arrow_up` | ⬆️ |
|
| 1367 |
+
| `arrow_upper_right` | ↗️ |
|
| 1368 |
+
| `arrow_right` | ➡️ |
|
| 1369 |
+
| `arrow_lower_right` | ↘️ |
|
| 1370 |
+
| `arrow_down` | ⬇️ |
|
| 1371 |
+
| `arrow_lower_left` | ↙️ |
|
| 1372 |
+
| `arrow_left` | ⬅️ |
|
| 1373 |
+
| `arrow_upper_left` | ↖️ |
|
| 1374 |
+
| `arrow_up_down` | ↕️ |
|
| 1375 |
+
| `left_right_arrow` | ↔️ |
|
| 1376 |
+
| `leftwards_arrow_with_hook` | ↩️ |
|
| 1377 |
+
| `arrow_right_hook` | ↪️ |
|
| 1378 |
+
| `arrow_heading_up` | ⤴️ |
|
| 1379 |
+
| `arrow_heading_down` | ⤵️ |
|
| 1380 |
+
| `arrows_clockwise` | 🔃 |
|
| 1381 |
+
| `arrows_counterclockwise` | 🔄 |
|
| 1382 |
+
| `back` | 🔙 |
|
| 1383 |
+
| `end` | 🔚 |
|
| 1384 |
+
| `on` | 🔛 |
|
| 1385 |
+
| `soon` | 🔜 |
|
| 1386 |
+
| `top` | 🔝 |
|
| 1387 |
+
| `place_of_worship` | 🛐 |
|
| 1388 |
+
| `atom_symbol` | ⚛️ |
|
| 1389 |
+
| `om` | 🕉️ |
|
| 1390 |
+
| `star_of_david` | ✡️ |
|
| 1391 |
+
| `wheel_of_dharma` | ☸️ |
|
| 1392 |
+
| `yin_yang` | ☯️ |
|
| 1393 |
+
| `latin_cross` | ✝️ |
|
| 1394 |
+
| `orthodox_cross` | ☦️ |
|
| 1395 |
+
| `star_and_crescent` | ☪️ |
|
| 1396 |
+
| `peace_symbol` | ☮️ |
|
| 1397 |
+
| `menorah` | 🕎 |
|
| 1398 |
+
| `six_pointed_star` | 🔯 |
|
| 1399 |
+
| `aries` | ♈ |
|
| 1400 |
+
| `taurus` | ♉ |
|
| 1401 |
+
| `gemini` | ♊ |
|
| 1402 |
+
| `cancer` | ♋ |
|
| 1403 |
+
| `leo` | ♌ |
|
| 1404 |
+
| `virgo` | ♍ |
|
| 1405 |
+
| `libra` | ♎ |
|
| 1406 |
+
| `scorpius` | ♏ |
|
| 1407 |
+
| `sagittarius` | ♐ |
|
| 1408 |
+
| `capricorn` | ♑ |
|
| 1409 |
+
| `aquarius` | ♒ |
|
| 1410 |
+
| `pisces` | ♓ |
|
| 1411 |
+
| `ophiuchus` | ⛎ |
|
| 1412 |
+
| `twisted_rightwards_arrows` | 🔀 |
|
| 1413 |
+
| `repeat` | 🔁 |
|
| 1414 |
+
| `repeat_one` | 🔂 |
|
| 1415 |
+
| `arrow_forward` | ▶️ |
|
| 1416 |
+
| `fast_forward` | ⏩ |
|
| 1417 |
+
| `next_track_button` | ⏭️ |
|
| 1418 |
+
| `play_or_pause_button` | ⏯️ |
|
| 1419 |
+
| `arrow_backward` | ◀️ |
|
| 1420 |
+
| `rewind` | ⏪ |
|
| 1421 |
+
| `previous_track_button` | ⏮️ |
|
| 1422 |
+
| `arrow_up_small` | 🔼 |
|
| 1423 |
+
| `arrow_double_up` | ⏫ |
|
| 1424 |
+
| `arrow_down_small` | 🔽 |
|
| 1425 |
+
| `arrow_double_down` | ⏬ |
|
| 1426 |
+
| `pause_button` | ⏸️ |
|
| 1427 |
+
| `stop_button` | ⏹️ |
|
| 1428 |
+
| `record_button` | ⏺️ |
|
| 1429 |
+
| `eject_button` | ⏏️ |
|
| 1430 |
+
| `cinema` | 🎦 |
|
| 1431 |
+
| `low_brightness` | 🔅 |
|
| 1432 |
+
| `high_brightness` | 🔆 |
|
| 1433 |
+
| `signal_strength` | 📶 |
|
| 1434 |
+
| `vibration_mode` | 📳 |
|
| 1435 |
+
| `mobile_phone_off` | 📴 |
|
| 1436 |
+
| `female_sign` | ♀️ |
|
| 1437 |
+
| `male_sign` | ♂️ |
|
| 1438 |
+
| `transgender_symbol` | ⚧️ |
|
| 1439 |
+
| `heavy_multiplication_x` | ✖️ |
|
| 1440 |
+
| `heavy_plus_sign` | ➕ |
|
| 1441 |
+
| `heavy_minus_sign` | ➖ |
|
| 1442 |
+
| `heavy_division_sign` | ➗ |
|
| 1443 |
+
| `infinity` | ♾️ |
|
| 1444 |
+
| `bangbang` | ‼️ |
|
| 1445 |
+
| `interrobang` | ⁉️ |
|
| 1446 |
+
| `question` | ❓ |
|
| 1447 |
+
| `grey_question` | ❔ |
|
| 1448 |
+
| `grey_exclamation` | ❕ |
|
| 1449 |
+
| `exclamation` | ❗ |
|
| 1450 |
+
| `wavy_dash` | 〰️ |
|
| 1451 |
+
| `currency_exchange` | 💱 |
|
| 1452 |
+
| `heavy_dollar_sign` | 💲 |
|
| 1453 |
+
| `medical_symbol` | ⚕️ |
|
| 1454 |
+
| `recycle` | ♻️ |
|
| 1455 |
+
| `fleur_de_lis` | ⚜️ |
|
| 1456 |
+
| `trident` | 🔱 |
|
| 1457 |
+
| `name_badge` | 📛 |
|
| 1458 |
+
| `beginner` | 🔰 |
|
| 1459 |
+
| `o` | ⭕ |
|
| 1460 |
+
| `white_check_mark` | ✅ |
|
| 1461 |
+
| `ballot_box_with_check` | ☑️ |
|
| 1462 |
+
| `heavy_check_mark` | ✔️ |
|
| 1463 |
+
| `x` | ❌ |
|
| 1464 |
+
| `negative_squared_cross_mark` | ❎ |
|
| 1465 |
+
| `curly_loop` | ➰ |
|
| 1466 |
+
| `loop` | ➿ |
|
| 1467 |
+
| `part_alternation_mark` | 〽️ |
|
| 1468 |
+
| `eight_spoked_asterisk` | ✳️ |
|
| 1469 |
+
| `eight_pointed_black_star` | ✴️ |
|
| 1470 |
+
| `sparkle` | ❇️ |
|
| 1471 |
+
| `copyright` | ©️ |
|
| 1472 |
+
| `registered` | ®️ |
|
| 1473 |
+
| `tm` | ™️ |
|
| 1474 |
+
| `hash` | #️⃣ |
|
| 1475 |
+
| `asterisk` | *️⃣ |
|
| 1476 |
+
| `zero` | 0️⃣ |
|
| 1477 |
+
| `one` | 1️⃣ |
|
| 1478 |
+
| `two` | 2️⃣ |
|
| 1479 |
+
| `three` | 3️⃣ |
|
| 1480 |
+
| `four` | 4️⃣ |
|
| 1481 |
+
| `five` | 5️⃣ |
|
| 1482 |
+
| `six` | 6️⃣ |
|
| 1483 |
+
| `seven` | 7️⃣ |
|
| 1484 |
+
| `eight` | 8️⃣ |
|
| 1485 |
+
| `nine` | 9️⃣ |
|
| 1486 |
+
| `keycap_ten` | 🔟 |
|
| 1487 |
+
| `capital_abcd` | 🔠 |
|
| 1488 |
+
| `abcd` | 🔡 |
|
| 1489 |
+
| `1234` | 🔢 |
|
| 1490 |
+
| `symbols` | 🔣 |
|
| 1491 |
+
| `abc` | 🔤 |
|
| 1492 |
+
| `a` | 🅰️ |
|
| 1493 |
+
| `ab` | 🆎 |
|
| 1494 |
+
| `b` | 🅱️ |
|
| 1495 |
+
| `cl` | 🆑 |
|
| 1496 |
+
| `cool` | 🆒 |
|
| 1497 |
+
| `free` | 🆓 |
|
| 1498 |
+
| `information_source` | ℹ️ |
|
| 1499 |
+
| `id` | 🆔 |
|
| 1500 |
+
| `m` | Ⓜ️ |
|
| 1501 |
+
| `new` | 🆕 |
|
| 1502 |
+
| `ng` | 🆖 |
|
| 1503 |
+
| `o2` | 🅾️ |
|
| 1504 |
+
| `ok` | 🆗 |
|
| 1505 |
+
| `parking` | 🅿️ |
|
| 1506 |
+
| `sos` | 🆘 |
|
| 1507 |
+
| `up` | 🆙 |
|
| 1508 |
+
| `vs` | 🆚 |
|
| 1509 |
+
| `koko` | 🈁 |
|
| 1510 |
+
| `sa` | 🈂��� |
|
| 1511 |
+
| `u6708` | 🈷️ |
|
| 1512 |
+
| `u6709` | 🈶 |
|
| 1513 |
+
| `u6307` | 🈯 |
|
| 1514 |
+
| `ideograph_advantage` | 🉐 |
|
| 1515 |
+
| `u5272` | 🈹 |
|
| 1516 |
+
| `u7121` | 🈚 |
|
| 1517 |
+
| `u7981` | 🈲 |
|
| 1518 |
+
| `accept` | 🉑 |
|
| 1519 |
+
| `u7533` | 🈸 |
|
| 1520 |
+
| `u5408` | 🈴 |
|
| 1521 |
+
| `u7a7a` | 🈳 |
|
| 1522 |
+
| `congratulations` | ㊗️ |
|
| 1523 |
+
| `secret` | ㊙️ |
|
| 1524 |
+
| `u55b6` | 🈺 |
|
| 1525 |
+
| `u6e80` | 🈵 |
|
| 1526 |
+
| `red_circle` | 🔴 |
|
| 1527 |
+
| `orange_circle` | 🟠 |
|
| 1528 |
+
| `yellow_circle` | 🟡 |
|
| 1529 |
+
| `green_circle` | 🟢 |
|
| 1530 |
+
| `large_blue_circle` | 🔵 |
|
| 1531 |
+
| `purple_circle` | 🟣 |
|
| 1532 |
+
| `brown_circle` | 🟤 |
|
| 1533 |
+
| `black_circle` | ⚫ |
|
| 1534 |
+
| `white_circle` | ⚪ |
|
| 1535 |
+
| `red_square` | 🟥 |
|
| 1536 |
+
| `orange_square` | 🟧 |
|
| 1537 |
+
| `yellow_square` | 🟨 |
|
| 1538 |
+
| `green_square` | 🟩 |
|
| 1539 |
+
| `blue_square` | 🟦 |
|
| 1540 |
+
| `purple_square` | 🟪 |
|
| 1541 |
+
| `brown_square` | 🟫 |
|
| 1542 |
+
| `black_large_square` | ⬛ |
|
| 1543 |
+
| `white_large_square` | ⬜ |
|
| 1544 |
+
| `black_medium_square` | ◼️ |
|
| 1545 |
+
| `white_medium_square` | ◻️ |
|
| 1546 |
+
| `black_medium_small_square` | ◾ |
|
| 1547 |
+
| `white_medium_small_square` | ◽ |
|
| 1548 |
+
| `black_small_square` | ▪️ |
|
| 1549 |
+
| `white_small_square` | ▫️ |
|
| 1550 |
+
| `large_orange_diamond` | 🔶 |
|
| 1551 |
+
| `large_blue_diamond` | 🔷 |
|
| 1552 |
+
| `small_orange_diamond` | 🔸 |
|
| 1553 |
+
| `small_blue_diamond` | 🔹 |
|
| 1554 |
+
| `small_red_triangle` | 🔺 |
|
| 1555 |
+
| `small_red_triangle_down` | 🔻 |
|
| 1556 |
+
| `diamond_shape_with_a_dot_inside` | 💠 |
|
| 1557 |
+
| `radio_button` | 🔘 |
|
| 1558 |
+
| `white_square_button` | 🔳 |
|
| 1559 |
+
| `black_square_button` | 🔲 |
|
| 1560 |
+
| `checkered_flag` | 🏁 |
|
| 1561 |
+
| `triangular_flag_on_post` | 🚩 |
|
| 1562 |
+
| `crossed_flags` | 🎌 |
|
| 1563 |
+
| `black_flag` | 🏴 |
|
| 1564 |
+
| `white_flag` | 🏳️ |
|
| 1565 |
+
| `rainbow_flag` | 🏳️🌈 |
|
| 1566 |
+
| `transgender_flag` | 🏳️⚧️ |
|
| 1567 |
+
| `pirate_flag` | 🏴☠️ |
|
| 1568 |
+
| `ascension_island` | 🇦🇨 |
|
| 1569 |
+
| `andorra` | 🇦🇩 |
|
| 1570 |
+
| `united_arab_emirates` | 🇦🇪 |
|
| 1571 |
+
| `afghanistan` | 🇦🇫 |
|
| 1572 |
+
| `antigua_barbuda` | 🇦🇬 |
|
| 1573 |
+
| `anguilla` | 🇦🇮 |
|
| 1574 |
+
| `albania` | 🇦🇱 |
|
| 1575 |
+
| `armenia` | 🇦🇲 |
|
| 1576 |
+
| `angola` | 🇦🇴 |
|
| 1577 |
+
| `antarctica` | 🇦🇶 |
|
| 1578 |
+
| `argentina` | 🇦🇷 |
|
| 1579 |
+
| `american_samoa` | 🇦🇸 |
|
| 1580 |
+
| `austria` | 🇦🇹 |
|
| 1581 |
+
| `australia` | 🇦🇺 |
|
| 1582 |
+
| `aruba` | 🇦🇼 |
|
| 1583 |
+
| `aland_islands` | 🇦🇽 |
|
| 1584 |
+
| `azerbaijan` | 🇦🇿 |
|
| 1585 |
+
| `bosnia_herzegovina` | 🇧🇦 |
|
| 1586 |
+
| `barbados` | 🇧🇧 |
|
| 1587 |
+
| `bangladesh` | 🇧🇩 |
|
| 1588 |
+
| `belgium` | 🇧🇪 |
|
| 1589 |
+
| `burkina_faso` | 🇧🇫 |
|
| 1590 |
+
| `bulgaria` | 🇧🇬 |
|
| 1591 |
+
| `bahrain` | 🇧🇭 |
|
| 1592 |
+
| `burundi` | 🇧🇮 |
|
| 1593 |
+
| `benin` | 🇧🇯 |
|
| 1594 |
+
| `st_barthelemy` | 🇧🇱 |
|
| 1595 |
+
| `bermuda` | 🇧🇲 |
|
| 1596 |
+
| `brunei` | 🇧🇳 |
|
| 1597 |
+
| `bolivia` | 🇧🇴 |
|
| 1598 |
+
| `caribbean_netherlands` | 🇧🇶 |
|
| 1599 |
+
| `brazil` | 🇧🇷 |
|
| 1600 |
+
| `bahamas` | 🇧🇸 |
|
| 1601 |
+
| `bhutan` | 🇧🇹 |
|
| 1602 |
+
| `bouvet_island` | 🇧🇻 |
|
| 1603 |
+
| `botswana` | 🇧🇼 |
|
| 1604 |
+
| `belarus` | 🇧🇾 |
|
| 1605 |
+
| `belize` | 🇧🇿 |
|
| 1606 |
+
| `canada` | 🇨🇦 |
|
| 1607 |
+
| `cocos_islands` | 🇨🇨 |
|
| 1608 |
+
| `congo_kinshasa` | 🇨🇩 |
|
| 1609 |
+
| `central_african_republic` | 🇨🇫 |
|
| 1610 |
+
| `congo_brazzaville` | 🇨🇬 |
|
| 1611 |
+
| `switzerland` | 🇨🇭 |
|
| 1612 |
+
| `cote_divoire` | 🇨🇮 |
|
| 1613 |
+
| `cook_islands` | 🇨🇰 |
|
| 1614 |
+
| `chile` | 🇨🇱 |
|
| 1615 |
+
| `cameroon` | 🇨🇲 |
|
| 1616 |
+
| `cn` | 🇨🇳 |
|
| 1617 |
+
| `colombia` | 🇨🇴 |
|
| 1618 |
+
| `clipperton_island` | 🇨🇵 |
|
| 1619 |
+
| `costa_rica` | 🇨🇷 |
|
| 1620 |
+
| `cuba` | 🇨🇺 |
|
| 1621 |
+
| `cape_verde` | 🇨🇻 |
|
| 1622 |
+
| `curacao` | 🇨🇼 |
|
| 1623 |
+
| `christmas_island` | 🇨🇽 |
|
| 1624 |
+
| `cyprus` | 🇨🇾 |
|
| 1625 |
+
| `czech_republic` | 🇨🇿 |
|
| 1626 |
+
| `de` | 🇩🇪 |
|
| 1627 |
+
| `diego_garcia` | 🇩🇬 |
|
| 1628 |
+
| `djibouti` | 🇩🇯 |
|
| 1629 |
+
| `denmark` | 🇩🇰 |
|
| 1630 |
+
| `dominica` | 🇩🇲 |
|
| 1631 |
+
| `dominican_republic` | 🇩🇴 |
|
| 1632 |
+
| `algeria` | 🇩🇿 |
|
| 1633 |
+
| `ceuta_melilla` | 🇪🇦 |
|
| 1634 |
+
| `ecuador` | 🇪🇨 |
|
| 1635 |
+
| `estonia` | 🇪🇪 |
|
| 1636 |
+
| `egypt` | 🇪🇬 |
|
| 1637 |
+
| `western_sahara` | 🇪🇭 |
|
| 1638 |
+
| `eritrea` | 🇪🇷 |
|
| 1639 |
+
| `es` | 🇪🇸 |
|
| 1640 |
+
| `ethiopia` | 🇪🇹 |
|
| 1641 |
+
| `eu` | 🇪🇺 |
|
| 1642 |
+
| `finland` | 🇫🇮 |
|
| 1643 |
+
| `fiji` | 🇫🇯 |
|
| 1644 |
+
| `falkland_islands` | 🇫🇰 |
|
| 1645 |
+
| `micronesia` | 🇫🇲 |
|
| 1646 |
+
| `faroe_islands` | 🇫🇴 |
|
| 1647 |
+
| `fr` | 🇫🇷 |
|
| 1648 |
+
| `gabon` | 🇬🇦 |
|
| 1649 |
+
| `gb` | 🇬🇧 |
|
| 1650 |
+
| `grenada` | 🇬🇩 |
|
| 1651 |
+
| `georgia` | 🇬🇪 |
|
| 1652 |
+
| `french_guiana` | 🇬🇫 |
|
| 1653 |
+
| `guernsey` | 🇬🇬 |
|
| 1654 |
+
| `ghana` | 🇬🇭 |
|
| 1655 |
+
| `gibraltar` | 🇬🇮 |
|
| 1656 |
+
| `greenland` | 🇬🇱 |
|
| 1657 |
+
| `gambia` | 🇬🇲 |
|
| 1658 |
+
| `guinea` | 🇬🇳 |
|
| 1659 |
+
| `guadeloupe` | 🇬🇵 |
|
| 1660 |
+
| `equatorial_guinea` | 🇬🇶 |
|
| 1661 |
+
| `greece` | 🇬🇷 |
|
| 1662 |
+
| `south_georgia_south_sandwich_islands` | 🇬🇸 |
|
| 1663 |
+
| `guatemala` | 🇬🇹 |
|
| 1664 |
+
| `guam` | 🇬🇺 |
|
| 1665 |
+
| `guinea_bissau` | 🇬🇼 |
|
| 1666 |
+
| `guyana` | 🇬🇾 |
|
| 1667 |
+
| `hong_kong` | 🇭🇰 |
|
| 1668 |
+
| `heard_mcdonald_islands` | 🇭🇲 |
|
| 1669 |
+
| `honduras` | 🇭🇳 |
|
| 1670 |
+
| `croatia` | 🇭🇷 |
|
| 1671 |
+
| `haiti` | 🇭🇹 |
|
| 1672 |
+
| `hungary` | 🇭🇺 |
|
| 1673 |
+
| `canary_islands` | 🇮🇨 |
|
| 1674 |
+
| `indonesia` | 🇮🇩 |
|
| 1675 |
+
| `ireland` | 🇮🇪 |
|
| 1676 |
+
| `israel` | 🇮🇱 |
|
| 1677 |
+
| `isle_of_man` | 🇮🇲 |
|
| 1678 |
+
| `india` | 🇮🇳 |
|
| 1679 |
+
| `british_indian_ocean_territory` | 🇮🇴 |
|
| 1680 |
+
| `iraq` | 🇮🇶 |
|
| 1681 |
+
| `iran` | 🇮🇷 |
|
| 1682 |
+
| `iceland` | 🇮🇸 |
|
| 1683 |
+
| `it` | 🇮🇹 |
|
| 1684 |
+
| `jersey` | 🇯🇪 |
|
| 1685 |
+
| `jamaica` | 🇯🇲 |
|
| 1686 |
+
| `jordan` | 🇯🇴 |
|
| 1687 |
+
| `jp` | 🇯🇵 |
|
| 1688 |
+
| `kenya` | 🇰🇪 |
|
| 1689 |
+
| `kyrgyzstan` | 🇰🇬 |
|
| 1690 |
+
| `cambodia` | 🇰🇭 |
|
| 1691 |
+
| `kiribati` | 🇰🇮 |
|
| 1692 |
+
| `comoros` | 🇰🇲 |
|
| 1693 |
+
| `st_kitts_nevis` | 🇰🇳 |
|
| 1694 |
+
| `north_korea` | 🇰🇵 |
|
| 1695 |
+
| `kr` | 🇰🇷 |
|
| 1696 |
+
| `kuwait` | 🇰🇼 |
|
| 1697 |
+
| `cayman_islands` | 🇰🇾 |
|
| 1698 |
+
| `kazakhstan` | 🇰🇿 |
|
| 1699 |
+
| `laos` | 🇱🇦 |
|
| 1700 |
+
| `lebanon` | 🇱🇧 |
|
| 1701 |
+
| `st_lucia` | 🇱🇨 |
|
| 1702 |
+
| `liechtenstein` | 🇱🇮 |
|
| 1703 |
+
| `sri_lanka` | 🇱🇰 |
|
| 1704 |
+
| `liberia` | 🇱🇷 |
|
| 1705 |
+
| `lesotho` | 🇱🇸 |
|
| 1706 |
+
| `lithuania` | 🇱🇹 |
|
| 1707 |
+
| `luxembourg` | 🇱🇺 |
|
| 1708 |
+
| `latvia` | 🇱🇻 |
|
| 1709 |
+
| `libya` | 🇱🇾 |
|
| 1710 |
+
| `morocco` | 🇲🇦 |
|
| 1711 |
+
| `monaco` | 🇲🇨 |
|
| 1712 |
+
| `moldova` | 🇲🇩 |
|
| 1713 |
+
| `montenegro` | 🇲🇪 |
|
| 1714 |
+
| `st_martin` | 🇲🇫 |
|
| 1715 |
+
| `madagascar` | 🇲🇬 |
|
| 1716 |
+
| `marshall_islands` | 🇲🇭 |
|
| 1717 |
+
| `macedonia` | 🇲🇰 |
|
| 1718 |
+
| `mali` | 🇲🇱 |
|
| 1719 |
+
| `myanmar` | 🇲🇲 |
|
| 1720 |
+
| `mongolia` | 🇲🇳 |
|
| 1721 |
+
| `macau` | 🇲🇴 |
|
| 1722 |
+
| `northern_mariana_islands` | 🇲🇵 |
|
| 1723 |
+
| `martinique` | 🇲🇶 |
|
| 1724 |
+
| `mauritania` | 🇲🇷 |
|
| 1725 |
+
| `montserrat` | 🇲🇸 |
|
| 1726 |
+
| `malta` | 🇲🇹 |
|
| 1727 |
+
| `mauritius` | 🇲🇺 |
|
| 1728 |
+
| `maldives` | 🇲🇻 |
|
| 1729 |
+
| `malawi` | 🇲🇼 |
|
| 1730 |
+
| `mexico` | 🇲🇽 |
|
| 1731 |
+
| `malaysia` | 🇲🇾 |
|
| 1732 |
+
| `mozambique` | 🇲🇿 |
|
| 1733 |
+
| `namibia` | 🇳🇦 |
|
| 1734 |
+
| `new_caledonia` | 🇳🇨 |
|
| 1735 |
+
| `niger` | 🇳🇪 |
|
| 1736 |
+
| `norfolk_island` | 🇳🇫 |
|
| 1737 |
+
| `nigeria` | 🇳🇬 |
|
| 1738 |
+
| `nicaragua` | 🇳🇮 |
|
| 1739 |
+
| `netherlands` | 🇳🇱 |
|
| 1740 |
+
| `norway` | 🇳🇴 |
|
| 1741 |
+
| `nepal` | 🇳🇵 |
|
| 1742 |
+
| `nauru` | 🇳🇷 |
|
| 1743 |
+
| `niue` | 🇳🇺 |
|
| 1744 |
+
| `new_zealand` | 🇳🇿 |
|
| 1745 |
+
| `oman` | 🇴🇲 |
|
| 1746 |
+
| `panama` | 🇵🇦 |
|
| 1747 |
+
| `peru` | 🇵🇪 |
|
| 1748 |
+
| `french_polynesia` | 🇵🇫 |
|
| 1749 |
+
| `papua_new_guinea` | 🇵🇬 |
|
| 1750 |
+
| `philippines` | 🇵🇭 |
|
| 1751 |
+
| `pakistan` | 🇵🇰 |
|
| 1752 |
+
| `poland` | 🇵🇱 |
|
| 1753 |
+
| `st_pierre_miquelon` | 🇵🇲 |
|
| 1754 |
+
| `pitcairn_islands` | 🇵🇳 |
|
| 1755 |
+
| `puerto_rico` | 🇵🇷 |
|
| 1756 |
+
| `palestinian_territories` | 🇵🇸 |
|
| 1757 |
+
| `portugal` | 🇵🇹 |
|
| 1758 |
+
| `palau` | 🇵🇼 |
|
| 1759 |
+
| `paraguay` | 🇵🇾 |
|
| 1760 |
+
| `qatar` | 🇶🇦 |
|
| 1761 |
+
| `reunion` | 🇷🇪 |
|
| 1762 |
+
| `romania` | 🇷🇴 |
|
| 1763 |
+
| `serbia` | 🇷🇸 |
|
| 1764 |
+
| `ru` | 🇷🇺 |
|
| 1765 |
+
| `rwanda` | 🇷🇼 |
|
| 1766 |
+
| `saudi_arabia` | 🇸🇦 |
|
| 1767 |
+
| `solomon_islands` | 🇸🇧 |
|
| 1768 |
+
| `seychelles` | 🇸🇨 |
|
| 1769 |
+
| `sudan` | 🇸🇩 |
|
| 1770 |
+
| `sweden` | 🇸🇪 |
|
| 1771 |
+
| `singapore` | 🇸🇬 |
|
| 1772 |
+
| `st_helena` | 🇸🇭 |
|
| 1773 |
+
| `slovenia` | 🇸🇮 |
|
| 1774 |
+
| `svalbard_jan_mayen` | 🇸🇯 |
|
| 1775 |
+
| `slovakia` | 🇸🇰 |
|
| 1776 |
+
| `sierra_leone` | 🇸🇱 |
|
| 1777 |
+
| `san_marino` | 🇸🇲 |
|
| 1778 |
+
| `senegal` | 🇸🇳 |
|
| 1779 |
+
| `somalia` | 🇸🇴 |
|
| 1780 |
+
| `suriname` | 🇸🇷 |
|
| 1781 |
+
| `south_sudan` | 🇸🇸 |
|
| 1782 |
+
| `sao_tome_principe` | 🇸🇹 |
|
| 1783 |
+
| `el_salvador` | 🇸🇻 |
|
| 1784 |
+
| `sint_maarten` | 🇸🇽 |
|
| 1785 |
+
| `syria` | 🇸🇾 |
|
| 1786 |
+
| `swaziland` | 🇸🇿 |
|
| 1787 |
+
| `tristan_da_cunha` | 🇹🇦 |
|
| 1788 |
+
| `turks_caicos_islands` | 🇹🇨 |
|
| 1789 |
+
| `chad` | 🇹🇩 |
|
| 1790 |
+
| `french_southern_territories` | 🇹🇫 |
|
| 1791 |
+
| `togo` | 🇹🇬 |
|
| 1792 |
+
| `thailand` | 🇹🇭 |
|
| 1793 |
+
| `tajikistan` | 🇹🇯 |
|
| 1794 |
+
| `tokelau` | 🇹🇰 |
|
| 1795 |
+
| `timor_leste` | 🇹🇱 |
|
| 1796 |
+
| `turkmenistan` | 🇹🇲 |
|
| 1797 |
+
| `tunisia` | 🇹🇳 |
|
| 1798 |
+
| `tonga` | 🇹🇴 |
|
| 1799 |
+
| `tr` | 🇹🇷 |
|
| 1800 |
+
| `trinidad_tobago` | 🇹🇹 |
|
| 1801 |
+
| `tuvalu` | 🇹🇻 |
|
| 1802 |
+
| `taiwan` | 🇹🇼 |
|
| 1803 |
+
| `tanzania` | 🇹🇿 |
|
| 1804 |
+
| `ukraine` | 🇺🇦 |
|
| 1805 |
+
| `uganda` | 🇺🇬 |
|
| 1806 |
+
| `us_outlying_islands` | 🇺🇲 |
|
| 1807 |
+
| `united_nations` | 🇺🇳 |
|
| 1808 |
+
| `us` | 🇺🇸 |
|
| 1809 |
+
| `uruguay` | 🇺🇾 |
|
| 1810 |
+
| `uzbekistan` | 🇺🇿 |
|
| 1811 |
+
| `vatican_city` | 🇻🇦 |
|
| 1812 |
+
| `st_vincent_grenadines` | 🇻🇨 |
|
| 1813 |
+
| `venezuela` | 🇻🇪 |
|
| 1814 |
+
| `british_virgin_islands` | 🇻🇬 |
|
| 1815 |
+
| `us_virgin_islands` | 🇻🇮 |
|
| 1816 |
+
| `vietnam` | 🇻🇳 |
|
| 1817 |
+
| `vanuatu` | 🇻🇺 |
|
| 1818 |
+
| `wallis_futuna` | 🇼🇫 |
|
| 1819 |
+
| `samoa` | 🇼🇸 |
|
| 1820 |
+
| `kosovo` | 🇽🇰 |
|
| 1821 |
+
| `yemen` | 🇾🇪 |
|
| 1822 |
+
| `mayotte` | 🇾🇹 |
|
| 1823 |
+
| `south_africa` | 🇿🇦 |
|
| 1824 |
+
| `zambia` | 🇿🇲 |
|
| 1825 |
+
| `zimbabwe` | 🇿🇼 |
|
| 1826 |
+
| `england` | 🏴 |
|
| 1827 |
+
| `scotland` | 🏴 |
|
| 1828 |
+
| `wales` | 🏴 |
|
docs-ntfy-sh-faq-20250924.md
ADDED
|
@@ -0,0 +1,105 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
Title: FAQs - ntfy
|
| 2 |
+
|
| 3 |
+
URL Source: https://docs.ntfy.sh/faq
|
| 4 |
+
|
| 5 |
+
Markdown Content:
|
| 6 |
+
Frequently asked questions (FAQ)[¶](https://docs.ntfy.sh/faq#frequently-asked-questions-faq "Permanent link")
|
| 7 |
+
-------------------------------------------------------------------------------------------------------------
|
| 8 |
+
|
| 9 |
+
Isn't this like ...?[¶](https://docs.ntfy.sh/faq#isnt-this-like "Permanent link")
|
| 10 |
+
---------------------------------------------------------------------------------
|
| 11 |
+
|
| 12 |
+
Who knows. I didn't do a lot of research before making this. It was fun making it.
|
| 13 |
+
|
| 14 |
+
Can I use this in my app? Will it stay free?[¶](https://docs.ntfy.sh/faq#can-i-use-this-in-my-app-will-it-stay-free "Permanent link")
|
| 15 |
+
-------------------------------------------------------------------------------------------------------------------------------------
|
| 16 |
+
|
| 17 |
+
Yes. As long as you don't abuse it, it'll be available and free of charge. While I will always allow usage of the ntfy.sh server without signup and free of charge, I may also offer paid plans in the future.
|
| 18 |
+
|
| 19 |
+
What are the uptime guarantees?[¶](https://docs.ntfy.sh/faq#what-are-the-uptime-guarantees "Permanent link")
|
| 20 |
+
------------------------------------------------------------------------------------------------------------
|
| 21 |
+
|
| 22 |
+
Best effort.
|
| 23 |
+
|
| 24 |
+
ntfy currently runs on a single DigitalOcean droplet, without any scale out strategy or redundancies. When the time comes, I'll add scale out features, but for now it is what it is.
|
| 25 |
+
|
| 26 |
+
In the first year of its life, and to this day (Dec'22), ntfy had **no outages** that I can remember. Other than short blips and some HTTP 500 spikes, it has been rock solid.
|
| 27 |
+
|
| 28 |
+
There is a [status page](https://ntfy.statuspage.io/) which is updated based on some automated checks via the amazingly awesome [healthchecks.io](https://healthchecks.io/) (_no affiliation, just a fan_).
|
| 29 |
+
|
| 30 |
+
What happens if there are multiple subscribers to the same topic?[¶](https://docs.ntfy.sh/faq#what-happens-if-there-are-multiple-subscribers-to-the-same-topic "Permanent link")
|
| 31 |
+
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
| 32 |
+
|
| 33 |
+
As per usual with pub-sub, all subscribers receive notifications if they are subscribed to a topic.
|
| 34 |
+
|
| 35 |
+
Will you know what topics exist, can you spy on me?[¶](https://docs.ntfy.sh/faq#will-you-know-what-topics-exist-can-you-spy-on-me "Permanent link")
|
| 36 |
+
---------------------------------------------------------------------------------------------------------------------------------------------------
|
| 37 |
+
|
| 38 |
+
If you don't trust me or your messages are sensitive, run your own server. It's open source. That said, the logs do contain topic names and IP addresses, but I don't use them for anything other than troubleshooting and rate limiting. Messages are cached for the duration configured in `server.yml` (12h by default) to facilitate service restarts, message polling and to overcome client network disruptions.
|
| 39 |
+
|
| 40 |
+
Can I self-host it?[¶](https://docs.ntfy.sh/faq#can-i-self-host-it "Permanent link")
|
| 41 |
+
------------------------------------------------------------------------------------
|
| 42 |
+
|
| 43 |
+
Yes. The server (including this Web UI) can be self-hosted, and the Android/iOS app supports adding topics from your own server as well. Check out the [install instructions](https://docs.ntfy.sh/install/).
|
| 44 |
+
|
| 45 |
+
Is Firebase used?[¶](https://docs.ntfy.sh/faq#is-firebase-used "Permanent link")
|
| 46 |
+
--------------------------------------------------------------------------------
|
| 47 |
+
|
| 48 |
+
In addition to caching messages locally and delivering them to long-polling subscribers, all messages are also published to Firebase Cloud Messaging (FCM) (if `FirebaseKeyFile` is set, which it is on ntfy.sh). This is to facilitate notifications on Android.
|
| 49 |
+
|
| 50 |
+
If you do not care for Firebase, I suggest you install the [F-Droid version](https://f-droid.org/en/packages/io.heckel.ntfy/) of the app and [self-host your own ntfy server](https://docs.ntfy.sh/install/).
|
| 51 |
+
|
| 52 |
+
How much battery does the Android app use?[¶](https://docs.ntfy.sh/faq#how-much-battery-does-the-android-app-use "Permanent link")
|
| 53 |
+
----------------------------------------------------------------------------------------------------------------------------------
|
| 54 |
+
|
| 55 |
+
If you use the ntfy.sh server, and you don't use the [instant delivery](https://docs.ntfy.sh/subscribe/phone/#instant-delivery) feature, the Android/iOS app uses no additional battery, since Firebase Cloud Messaging (FCM) is used. If you use your own server, or you use _instant delivery_ (Android only), or install from F-droid ([which does not support FCM](https://f-droid.org/docs/Inclusion_Policy/)), the app has to maintain a constant connection to the server, which consumes about 0-1% of battery in 17h of use (on my phone). There has been a ton of testing and improvement around this. I think it's pretty decent now.
|
| 56 |
+
|
| 57 |
+
Paid plans? I thought it was open source?[¶](https://docs.ntfy.sh/faq#paid-plans-i-thought-it-was-open-source "Permanent link")
|
| 58 |
+
-------------------------------------------------------------------------------------------------------------------------------
|
| 59 |
+
|
| 60 |
+
All of ntfy will remain open source, with a free software license (Apache 2.0 and GPLv2). If you'd like to self-host, you can (and should do that). The paid plans I am offering are for people that do not want to self-host, and/or need higher limits.
|
| 61 |
+
|
| 62 |
+
What is instant delivery?[¶](https://docs.ntfy.sh/faq#what-is-instant-delivery "Permanent link")
|
| 63 |
+
------------------------------------------------------------------------------------------------
|
| 64 |
+
|
| 65 |
+
[Instant delivery](https://docs.ntfy.sh/subscribe/phone/#instant-delivery) is a feature in the Android app. If turned on, the app maintains a constant connection to the server and listens for incoming notifications. This consumes additional battery (see above), but delivers notifications instantly.
|
| 66 |
+
|
| 67 |
+
Can you implement feature X?[¶](https://docs.ntfy.sh/faq#can-you-implement-feature-x "Permanent link")
|
| 68 |
+
------------------------------------------------------------------------------------------------------
|
| 69 |
+
|
| 70 |
+
Yes, maybe. Check out [existing GitHub issues](https://github.com/binwiederhier/ntfy/issues) to see if somebody else had the same idea before you, or file a new issue. I'll likely get back to you within a few days.
|
| 71 |
+
|
| 72 |
+
I'm having issues with iOS, can you help? The iOS app is behind compared to the Android app, can you fix that?[¶](https://docs.ntfy.sh/faq#im-having-issues-with-ios-can-you-help-the-ios-app-is-behind-compared-to-the-android-app-can-you-fix-that "Permanent link")
|
| 73 |
+
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
| 74 |
+
|
| 75 |
+
The iOS is very bare bones and quite frankly a little buggy. I wanted to get something out the door to make the iOS users happy, but halfway through I got frustrated with iOS development and paused development. I will eventually get back to it, or hopefully, somebody else will come along and help out. Please review the [known issues](https://docs.ntfy.sh/known-issues/) for details.
|
| 76 |
+
|
| 77 |
+
Can I disable the web app? Can I protect it with a login screen?[¶](https://docs.ntfy.sh/faq#can-i-disable-the-web-app-can-i-protect-it-with-a-login-screen "Permanent link")
|
| 78 |
+
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
| 79 |
+
|
| 80 |
+
The web app is a static website without a backend (other than the ntfy API). All data is stored locally in the browser cache and local storage. That means it does not need to be protected with a login screen, and it poses no additional security risk. So technically, it does not need to be disabled.
|
| 81 |
+
|
| 82 |
+
However, if you still want to disable it, you can do so with the `web-root: disable` option in the `server.yml` file.
|
| 83 |
+
|
| 84 |
+
Think of the ntfy web app like an Android/iOS app. It is freely available and accessible to anyone, yet useless without a proper backend. So as long as you secure your backend with ACLs, exposing the ntfy web app to the Internet is harmless.
|
| 85 |
+
|
| 86 |
+
If topic names are public, could I not just brute force them?[¶](https://docs.ntfy.sh/faq#if-topic-names-are-public-could-i-not-just-brute-force-them "Permanent link")
|
| 87 |
+
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
| 88 |
+
|
| 89 |
+
If you don't have [ACLs set up](https://docs.ntfy.sh/config/#access-control), the topic name is your password, it says so everywhere. If you choose a easy-to-guess/dumb topic name, people will be able to guess it. If you choose a randomly generated topic name, the topic is as good as a good password.
|
| 90 |
+
|
| 91 |
+
As for brute forcing: It's not possible to brute force a ntfy server for very long, as you'll get quickly rate limited. In the default configuration, you'll be able to do 60 requests as a burst, and then 1 request per 10 seconds. Assuming you choose a random 10 digit topic name using only A-Z, a-z, 0-9, _ and -, there are 64^10 possible topic names. Even if you could do hundreds of requests per seconds (which you cannot), it would take many years to brute force a topic name.
|
| 92 |
+
|
| 93 |
+
For ntfy.sh, there's even a fail2ban in place which will ban your IP pretty quickly.
|
| 94 |
+
|
| 95 |
+
Where can I donate?[¶](https://docs.ntfy.sh/faq#where-can-i-donate "Permanent link")
|
| 96 |
+
------------------------------------------------------------------------------------
|
| 97 |
+
|
| 98 |
+
I have just very recently started accepting donations via [GitHub Sponsors](https://github.com/sponsors/binwiederhier). I would be humbled if you helped me carry the server and developer account costs. Even small donations are very much appreciated.
|
| 99 |
+
|
| 100 |
+
Can I email you? Can I DM you on Discord/Matrix?[¶](https://docs.ntfy.sh/faq#can-i-email-you-can-i-dm-you-on-discordmatrix "Permanent link")
|
| 101 |
+
--------------------------------------------------------------------------------------------------------------------------------------------
|
| 102 |
+
|
| 103 |
+
While I love chatting on [Discord](https://discord.gg/cT7ECsZj9w), [Matrix](https://matrix.to/#/#ntfy-space:matrix.org), [Lemmy](https://discuss.ntfy.sh/c/ntfy), or [GitHub](https://github.com/binwiederhier/ntfy/issues), I generally **do not respond to emails about ntfy or direct messages** about ntfy, unless you are paying for a [ntfy Pro](https://ntfy.sh/#pricing) plan, or you are inquiring about business opportunities.
|
| 104 |
+
|
| 105 |
+
I am sorry, but answering individual questions about ntfy on a 1-on-1 basis is not scalable. Answering your questions in the above-mentioned forums benefits others, since I can link to the discussion at a later point in time, or other users may be able to help out. I hope you understand.
|
docs-ntfy-sh-install-20250924.md
ADDED
|
@@ -0,0 +1,618 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
Title: Installation - ntfy
|
| 2 |
+
|
| 3 |
+
URL Source: https://docs.ntfy.sh/install
|
| 4 |
+
|
| 5 |
+
Published Time: Wed, 24 Sep 2025 02:52:16 GMT
|
| 6 |
+
|
| 7 |
+
Markdown Content:
|
| 8 |
+
Installing ntfy[¶](https://docs.ntfy.sh/install#installing-ntfy "Permanent link")
|
| 9 |
+
---------------------------------------------------------------------------------
|
| 10 |
+
|
| 11 |
+
The `ntfy` CLI allows you to [publish messages](https://docs.ntfy.sh/publish/), [subscribe to topics](https://docs.ntfy.sh/subscribe/cli/) as well as to self-host your own ntfy server. It's all pretty straight forward. Just install the binary, package or Docker image, configure it and run it. Just like any other software. No fuzz.
|
| 12 |
+
|
| 13 |
+
Info
|
| 14 |
+
|
| 15 |
+
The following steps are only required if you want to **self-host your own ntfy server or you want to use the ntfy CLI**. If you just want to [send messages using ntfy.sh](https://docs.ntfy.sh/publish/), you don't need to install anything. You can just use `curl`.
|
| 16 |
+
|
| 17 |
+
General steps[¶](https://docs.ntfy.sh/install#general-steps "Permanent link")
|
| 18 |
+
-----------------------------------------------------------------------------
|
| 19 |
+
|
| 20 |
+
The ntfy server comes as a statically linked binary and is shipped as tarball, deb/rpm packages and as a Docker image. We support amd64, armv7 and arm64.
|
| 21 |
+
|
| 22 |
+
1. Install ntfy using one of the methods described below
|
| 23 |
+
2. Then (optionally) edit `/etc/ntfy/server.yml` for the server (Linux only, see [configuration](https://docs.ntfy.sh/config/) or [sample server.yml](https://github.com/binwiederhier/ntfy/blob/main/server/server.yml))
|
| 24 |
+
3. Or (optionally) create/edit `~/.config/ntfy/client.yml` (for the non-root user), `~/Library/Application Support/ntfy/client.yml` (for the macOS non-root user), or `/etc/ntfy/client.yml` (for the root user), see [sample client.yml](https://github.com/binwiederhier/ntfy/blob/main/client/client.yml))
|
| 25 |
+
|
| 26 |
+
To run the ntfy server, then just run `ntfy serve` (or `systemctl start ntfy` when using the deb/rpm). To send messages, use `ntfy publish`. To subscribe to topics, use `ntfy subscribe` (see [subscribing via CLI](https://docs.ntfy.sh/subscribe/cli/) for details).
|
| 27 |
+
|
| 28 |
+
If you like tutorials, check out [Kris Occhipinti's ntfy install guide](https://www.youtube.com/watch?v=bZzqrX05mNU) on YouTube, or [Alex's Docker-based setup guide](https://blog.alexsguardian.net/posts/2023/09/12/selfhosting-ntfy/). Both are great resources to get started. _I am not affiliated with Kris or Alex, I just liked their video/post._
|
| 29 |
+
|
| 30 |
+
Linux binaries[¶](https://docs.ntfy.sh/install#linux-binaries "Permanent link")
|
| 31 |
+
-------------------------------------------------------------------------------
|
| 32 |
+
|
| 33 |
+
Please check out the [releases page](https://github.com/binwiederhier/ntfy/releases) for binaries and deb/rpm packages.
|
| 34 |
+
|
| 35 |
+
x86_64/amd64 armv6 armv7/armhf arm64
|
| 36 |
+
|
| 37 |
+
```
|
| 38 |
+
wget https://github.com/binwiederhier/ntfy/releases/download/v2.14.0/ntfy_2.14.0_linux_amd64.tar.gz
|
| 39 |
+
tar zxvf ntfy_2.14.0_linux_amd64.tar.gz
|
| 40 |
+
sudo cp -a ntfy_2.14.0_linux_amd64/ntfy /usr/local/bin/ntfy
|
| 41 |
+
sudo mkdir /etc/ntfy && sudo cp ntfy_2.14.0_linux_amd64/{client,server}/*.yml /etc/ntfy
|
| 42 |
+
sudo ntfy serve
|
| 43 |
+
```
|
| 44 |
+
|
| 45 |
+
```
|
| 46 |
+
wget https://github.com/binwiederhier/ntfy/releases/download/v2.14.0/ntfy_2.14.0_linux_armv6.tar.gz
|
| 47 |
+
tar zxvf ntfy_2.14.0_linux_armv6.tar.gz
|
| 48 |
+
sudo cp -a ntfy_2.14.0_linux_armv6/ntfy /usr/bin/ntfy
|
| 49 |
+
sudo mkdir /etc/ntfy && sudo cp ntfy_2.14.0_linux_armv6/{client,server}/*.yml /etc/ntfy
|
| 50 |
+
sudo ntfy serve
|
| 51 |
+
```
|
| 52 |
+
|
| 53 |
+
```
|
| 54 |
+
wget https://github.com/binwiederhier/ntfy/releases/download/v2.14.0/ntfy_2.14.0_linux_armv7.tar.gz
|
| 55 |
+
tar zxvf ntfy_2.14.0_linux_armv7.tar.gz
|
| 56 |
+
sudo cp -a ntfy_2.14.0_linux_armv7/ntfy /usr/bin/ntfy
|
| 57 |
+
sudo mkdir /etc/ntfy && sudo cp ntfy_2.14.0_linux_armv7/{client,server}/*.yml /etc/ntfy
|
| 58 |
+
sudo ntfy serve
|
| 59 |
+
```
|
| 60 |
+
|
| 61 |
+
```
|
| 62 |
+
wget https://github.com/binwiederhier/ntfy/releases/download/v2.14.0/ntfy_2.14.0_linux_arm64.tar.gz
|
| 63 |
+
tar zxvf ntfy_2.14.0_linux_arm64.tar.gz
|
| 64 |
+
sudo cp -a ntfy_2.14.0_linux_arm64/ntfy /usr/bin/ntfy
|
| 65 |
+
sudo mkdir /etc/ntfy && sudo cp ntfy_2.14.0_linux_arm64/{client,server}/*.yml /etc/ntfy
|
| 66 |
+
sudo ntfy serve
|
| 67 |
+
```
|
| 68 |
+
|
| 69 |
+
Debian/Ubuntu repository[¶](https://docs.ntfy.sh/install#debianubuntu-repository "Permanent link")
|
| 70 |
+
--------------------------------------------------------------------------------------------------
|
| 71 |
+
|
| 72 |
+
Info
|
| 73 |
+
|
| 74 |
+
As of September 2025, **the official ntfy.sh Debian/Ubuntu repository has moved to [archive.ntfy.sh](https://archive.ntfy.sh/apt)**. The old repository [archive.heckel.io](https://archive.heckel.io/apt) is still available for now, but will likely go away soon. I suspect I will phase it out some time in early 2026.
|
| 75 |
+
|
| 76 |
+
Installation via Debian/Ubuntu repository (fingerprint `55BA 774A 6F5E E674 31E4 6B7C CFDB 962D 4F1E C4AF`):
|
| 77 |
+
|
| 78 |
+
x86_64/amd64 armv7/armhf arm64
|
| 79 |
+
|
| 80 |
+
```
|
| 81 |
+
sudo mkdir -p /etc/apt/keyrings
|
| 82 |
+
sudo curl -L -o /etc/apt/keyrings/ntfy.gpg https://archive.ntfy.sh/apt/keyring.gpg
|
| 83 |
+
sudo apt install apt-transport-https
|
| 84 |
+
echo "deb [arch=amd64 signed-by=/etc/apt/keyrings/ntfy.gpg] https://archive.ntfy.sh/apt stable main" \
|
| 85 |
+
| sudo tee /etc/apt/sources.list.d/ntfy.list
|
| 86 |
+
sudo apt update
|
| 87 |
+
sudo apt install ntfy
|
| 88 |
+
sudo systemctl enable ntfy
|
| 89 |
+
sudo systemctl start ntfy
|
| 90 |
+
```
|
| 91 |
+
|
| 92 |
+
```
|
| 93 |
+
sudo mkdir -p /etc/apt/keyrings
|
| 94 |
+
sudo curl -L -o /etc/apt/keyrings/ntfy.gpg https://archive.ntfy.sh/apt/keyring.gpg
|
| 95 |
+
sudo apt install apt-transport-https
|
| 96 |
+
echo "deb [arch=armhf signed-by=/etc/apt/keyrings/ntfy.gpg] https://archive.ntfy.sh/apt stable main" \
|
| 97 |
+
| sudo tee /etc/apt/sources.list.d/ntfy.list
|
| 98 |
+
sudo apt update
|
| 99 |
+
sudo apt install ntfy
|
| 100 |
+
sudo systemctl enable ntfy
|
| 101 |
+
sudo systemctl start ntfy
|
| 102 |
+
```
|
| 103 |
+
|
| 104 |
+
```
|
| 105 |
+
sudo mkdir -p /etc/apt/keyrings
|
| 106 |
+
sudo curl -L -o /etc/apt/keyrings/ntfy.gpg https://archive.ntfy.sh/apt/keyring.gpg
|
| 107 |
+
sudo apt install apt-transport-https
|
| 108 |
+
echo "deb [arch=arm64 signed-by=/etc/apt/keyrings/ntfy.gpg] https://archive.ntfy.sh/apt stable main" \
|
| 109 |
+
| sudo tee /etc/apt/sources.list.d/ntfy.list
|
| 110 |
+
sudo apt update
|
| 111 |
+
sudo apt install ntfy
|
| 112 |
+
sudo systemctl enable ntfy
|
| 113 |
+
sudo systemctl start ntfy
|
| 114 |
+
```
|
| 115 |
+
|
| 116 |
+
Manually installing the .deb file:
|
| 117 |
+
|
| 118 |
+
x86_64/amd64 armv6 armv7/armhf arm64
|
| 119 |
+
|
| 120 |
+
```
|
| 121 |
+
wget https://github.com/binwiederhier/ntfy/releases/download/v2.14.0/ntfy_2.14.0_linux_amd64.deb
|
| 122 |
+
sudo dpkg -i ntfy_*.deb
|
| 123 |
+
sudo systemctl enable ntfy
|
| 124 |
+
sudo systemctl start ntfy
|
| 125 |
+
```
|
| 126 |
+
|
| 127 |
+
```
|
| 128 |
+
wget https://github.com/binwiederhier/ntfy/releases/download/v2.14.0/ntfy_2.14.0_linux_armv6.deb
|
| 129 |
+
sudo dpkg -i ntfy_*.deb
|
| 130 |
+
sudo systemctl enable ntfy
|
| 131 |
+
sudo systemctl start ntfy
|
| 132 |
+
```
|
| 133 |
+
|
| 134 |
+
```
|
| 135 |
+
wget https://github.com/binwiederhier/ntfy/releases/download/v2.14.0/ntfy_2.14.0_linux_armv7.deb
|
| 136 |
+
sudo dpkg -i ntfy_*.deb
|
| 137 |
+
sudo systemctl enable ntfy
|
| 138 |
+
sudo systemctl start ntfy
|
| 139 |
+
```
|
| 140 |
+
|
| 141 |
+
```
|
| 142 |
+
wget https://github.com/binwiederhier/ntfy/releases/download/v2.14.0/ntfy_2.14.0_linux_arm64.deb
|
| 143 |
+
sudo dpkg -i ntfy_*.deb
|
| 144 |
+
sudo systemctl enable ntfy
|
| 145 |
+
sudo systemctl start ntfy
|
| 146 |
+
```
|
| 147 |
+
|
| 148 |
+
Fedora/RHEL/CentOS[¶](https://docs.ntfy.sh/install#fedorarhelcentos "Permanent link")
|
| 149 |
+
-------------------------------------------------------------------------------------
|
| 150 |
+
|
| 151 |
+
x86_64/amd64 armv6 armv7/armhf arm64
|
| 152 |
+
|
| 153 |
+
```
|
| 154 |
+
sudo rpm -ivh https://github.com/binwiederhier/ntfy/releases/download/v2.14.0/ntfy_2.14.0_linux_amd64.rpm
|
| 155 |
+
sudo systemctl enable ntfy
|
| 156 |
+
sudo systemctl start ntfy
|
| 157 |
+
```
|
| 158 |
+
|
| 159 |
+
```
|
| 160 |
+
sudo rpm -ivh https://github.com/binwiederhier/ntfy/releases/download/v2.14.0/ntfy_2.14.0_linux_armv6.rpm
|
| 161 |
+
sudo systemctl enable ntfy
|
| 162 |
+
sudo systemctl start ntfy
|
| 163 |
+
```
|
| 164 |
+
|
| 165 |
+
```
|
| 166 |
+
sudo rpm -ivh https://github.com/binwiederhier/ntfy/releases/download/v2.14.0/ntfy_2.14.0_linux_armv7.rpm
|
| 167 |
+
sudo systemctl enable ntfy
|
| 168 |
+
sudo systemctl start ntfy
|
| 169 |
+
```
|
| 170 |
+
|
| 171 |
+
```
|
| 172 |
+
sudo rpm -ivh https://github.com/binwiederhier/ntfy/releases/download/v2.14.0/ntfy_2.14.0_linux_arm64.rpm
|
| 173 |
+
sudo systemctl enable ntfy
|
| 174 |
+
sudo systemctl start ntfy
|
| 175 |
+
```
|
| 176 |
+
|
| 177 |
+
Arch Linux[¶](https://docs.ntfy.sh/install#arch-linux "Permanent link")
|
| 178 |
+
-----------------------------------------------------------------------
|
| 179 |
+
|
| 180 |
+
ntfy can be installed using an [AUR package](https://aur.archlinux.org/packages/ntfysh-bin/). You can use an [AUR helper](https://wiki.archlinux.org/title/AUR_helpers) like `paru`, `yay` or others to download, build and install ntfy and keep it up to date.
|
| 181 |
+
|
| 182 |
+
```
|
| 183 |
+
paru -S ntfysh-bin
|
| 184 |
+
```
|
| 185 |
+
|
| 186 |
+
Alternatively, run the following commands to install ntfy manually:
|
| 187 |
+
|
| 188 |
+
```
|
| 189 |
+
curl https://aur.archlinux.org/cgit/aur.git/snapshot/ntfysh-bin.tar.gz | tar xzv
|
| 190 |
+
cd ntfysh-bin
|
| 191 |
+
makepkg -si
|
| 192 |
+
```
|
| 193 |
+
|
| 194 |
+
NixOS / Nix[¶](https://docs.ntfy.sh/install#nixos-nix "Permanent link")
|
| 195 |
+
-----------------------------------------------------------------------
|
| 196 |
+
|
| 197 |
+
ntfy is packaged in nixpkgs as `ntfy-sh`. It can be installed by adding the package name to the configuration file and calling `nixos-rebuild`. Alternatively, the following command can be used to install ntfy in the current user environment:
|
| 198 |
+
|
| 199 |
+
```
|
| 200 |
+
nix-env -iA ntfy-sh
|
| 201 |
+
```
|
| 202 |
+
|
| 203 |
+
NixOS also supports [declarative setup of the ntfy server](https://search.nixos.org/options?channel=unstable&show=services.ntfy-sh.enable&from=0&size=50&sort=relevance&type=packages&query=ntfy).
|
| 204 |
+
|
| 205 |
+
macOS[¶](https://docs.ntfy.sh/install#macos "Permanent link")
|
| 206 |
+
-------------------------------------------------------------
|
| 207 |
+
|
| 208 |
+
The [ntfy CLI](https://docs.ntfy.sh/subscribe/cli/) (`ntfy publish` and `ntfy subscribe` only) is supported on macOS as well. To install, please [download the tarball](https://github.com/binwiederhier/ntfy/releases/download/v2.14.0/ntfy_2.14.0_darwin_all.tar.gz), extract it and place it somewhere in your `PATH` (e.g. `/usr/local/bin/ntfy`).
|
| 209 |
+
|
| 210 |
+
If run as `root`, ntfy will look for its config at `/etc/ntfy/client.yml`. For all other users, it'll look for it at `~/Library/Application Support/ntfy/client.yml` (sample included in the tarball).
|
| 211 |
+
|
| 212 |
+
```
|
| 213 |
+
curl -L https://github.com/binwiederhier/ntfy/releases/download/v2.14.0/ntfy_2.14.0_darwin_all.tar.gz > ntfy_2.14.0_darwin_all.tar.gz
|
| 214 |
+
tar zxvf ntfy_2.14.0_darwin_all.tar.gz
|
| 215 |
+
sudo cp -a ntfy_2.14.0_darwin_all/ntfy /usr/local/bin/ntfy
|
| 216 |
+
mkdir ~/Library/Application\ Support/ntfy
|
| 217 |
+
cp ntfy_2.14.0_darwin_all/client/client.yml ~/Library/Application\ Support/ntfy/client.yml
|
| 218 |
+
ntfy --help
|
| 219 |
+
```
|
| 220 |
+
|
| 221 |
+
Info
|
| 222 |
+
|
| 223 |
+
Only the ntfy CLI is supported on macOS. ntfy server is currently not supported, but you can build and run it for development as well. Check out the [build instructions](https://docs.ntfy.sh/develop/) for details.
|
| 224 |
+
|
| 225 |
+
Homebrew[¶](https://docs.ntfy.sh/install#homebrew "Permanent link")
|
| 226 |
+
-------------------------------------------------------------------
|
| 227 |
+
|
| 228 |
+
To install the [ntfy CLI](https://docs.ntfy.sh/subscribe/cli/) (`ntfy publish` and `ntfy subscribe` only) via Homebrew (Linux and macOS), simply run:
|
| 229 |
+
|
| 230 |
+
```
|
| 231 |
+
brew install ntfy
|
| 232 |
+
```
|
| 233 |
+
|
| 234 |
+
Windows[¶](https://docs.ntfy.sh/install#windows "Permanent link")
|
| 235 |
+
-----------------------------------------------------------------
|
| 236 |
+
|
| 237 |
+
The [ntfy CLI](https://docs.ntfy.sh/subscribe/cli/) (`ntfy publish` and `ntfy subscribe` only) is supported on Windows as well. To install, please [download the latest ZIP](https://github.com/binwiederhier/ntfy/releases/download/v2.14.0/ntfy_2.14.0_windows_amd64.zip), extract it and place the `ntfy.exe` binary somewhere in your `%Path%`.
|
| 238 |
+
|
| 239 |
+
The default path for the client config file is at `%AppData%\ntfy\client.yml` (not created automatically, sample in the ZIP file).
|
| 240 |
+
|
| 241 |
+
Also available in [Scoop's](https://scoop.sh/) Main repository:
|
| 242 |
+
|
| 243 |
+
`scoop install ntfy`
|
| 244 |
+
|
| 245 |
+
Info
|
| 246 |
+
|
| 247 |
+
There is currently no installer for Windows, and the binary is not signed. If this is desired, please create a [GitHub issue](https://github.com/binwiederhier/ntfy/issues) to let me know.
|
| 248 |
+
|
| 249 |
+
Docker[¶](https://docs.ntfy.sh/install#docker "Permanent link")
|
| 250 |
+
---------------------------------------------------------------
|
| 251 |
+
|
| 252 |
+
The [ntfy image](https://hub.docker.com/r/binwiederhier/ntfy) is available for amd64, armv6, armv7 and arm64. It should be pretty straight forward to use.
|
| 253 |
+
|
| 254 |
+
The server exposes its web UI and the API on port 80, so you need to expose that in Docker. To use the persistent [message cache](https://docs.ntfy.sh/config/#message-cache), you also need to map a volume to `/var/cache/ntfy`. To change other settings, you should map `/etc/ntfy`, so you can edit `/etc/ntfy/server.yml`.
|
| 255 |
+
|
| 256 |
+
Info
|
| 257 |
+
|
| 258 |
+
Note that the Docker image **does not contain a `/etc/ntfy/server.yml` file**. If you'd like to use a config file, please manually create one outside the image and map it as a volume, e.g. via `-v /etc/ntfy:/etc/ntfy`. You may use the [`server.yml` file on GitHub](https://github.com/binwiederhier/ntfy/blob/main/server/server.yml) as a template.
|
| 259 |
+
|
| 260 |
+
Basic usage (no cache or additional config):
|
| 261 |
+
|
| 262 |
+
```
|
| 263 |
+
docker run -p 80:80 -it binwiederhier/ntfy serve
|
| 264 |
+
```
|
| 265 |
+
|
| 266 |
+
With persistent cache (configured as command line arguments):
|
| 267 |
+
|
| 268 |
+
```
|
| 269 |
+
docker run \
|
| 270 |
+
-v /var/cache/ntfy:/var/cache/ntfy \
|
| 271 |
+
-p 80:80 \
|
| 272 |
+
-it \
|
| 273 |
+
binwiederhier/ntfy \
|
| 274 |
+
serve \
|
| 275 |
+
--cache-file /var/cache/ntfy/cache.db
|
| 276 |
+
```
|
| 277 |
+
|
| 278 |
+
With other config options, timezone, and non-root user (configured via `/etc/ntfy/server.yml`, see [configuration](https://docs.ntfy.sh/config/) for details):
|
| 279 |
+
|
| 280 |
+
```
|
| 281 |
+
docker run \
|
| 282 |
+
-v /etc/ntfy:/etc/ntfy \
|
| 283 |
+
-e TZ=UTC \
|
| 284 |
+
-p 80:80 \
|
| 285 |
+
-u UID:GID \
|
| 286 |
+
-it \
|
| 287 |
+
binwiederhier/ntfy \
|
| 288 |
+
serve
|
| 289 |
+
```
|
| 290 |
+
|
| 291 |
+
Using docker-compose with non-root user and healthchecks enabled:
|
| 292 |
+
|
| 293 |
+
```
|
| 294 |
+
services:
|
| 295 |
+
ntfy:
|
| 296 |
+
image: binwiederhier/ntfy
|
| 297 |
+
container_name: ntfy
|
| 298 |
+
command:
|
| 299 |
+
- serve
|
| 300 |
+
environment:
|
| 301 |
+
- TZ=UTC # optional: set desired timezone
|
| 302 |
+
user: UID:GID # optional: replace with your own user/group or uid/gid
|
| 303 |
+
volumes:
|
| 304 |
+
- /var/cache/ntfy:/var/cache/ntfy
|
| 305 |
+
- /etc/ntfy:/etc/ntfy
|
| 306 |
+
ports:
|
| 307 |
+
- 80:80
|
| 308 |
+
healthcheck: # optional: remember to adapt the host:port to your environment
|
| 309 |
+
test: ["CMD-SHELL", "wget -q --tries=1 http://localhost:80/v1/health -O - | grep -Eo '\"healthy\"\\s*:\\s*true' || exit 1"]
|
| 310 |
+
interval: 60s
|
| 311 |
+
timeout: 10s
|
| 312 |
+
retries: 3
|
| 313 |
+
start_period: 40s
|
| 314 |
+
restart: unless-stopped
|
| 315 |
+
```
|
| 316 |
+
|
| 317 |
+
If using a non-root user when running the docker version, be sure to chown the server.yml, user.db, and cache.db files and attachments directory to the same uid/gid.
|
| 318 |
+
|
| 319 |
+
Alternatively, you may wish to build a customized Docker image that can be run with fewer command-line arguments and without delivering the configuration file separately.
|
| 320 |
+
|
| 321 |
+
```
|
| 322 |
+
FROM binwiederhier/ntfy
|
| 323 |
+
COPY server.yml /etc/ntfy/server.yml
|
| 324 |
+
ENTRYPOINT ["ntfy", "serve"]
|
| 325 |
+
```
|
| 326 |
+
|
| 327 |
+
This image can be pushed to a container registry and shipped independently. All that's needed when running it is mapping ntfy's port to a host port.
|
| 328 |
+
Kubernetes[¶](https://docs.ntfy.sh/install#kubernetes "Permanent link")
|
| 329 |
+
-----------------------------------------------------------------------
|
| 330 |
+
|
| 331 |
+
The setup for Kubernetes is very similar to that for Docker, and requires a fairly minimal deployment or pod definition to function. There are a few options to mix and match, including a deployment without a cache file, a stateful set with a persistent cache, and a standalone unmanned pod.
|
| 332 |
+
|
| 333 |
+
deployment stateful set pod
|
| 334 |
+
|
| 335 |
+
```
|
| 336 |
+
apiVersion: apps/v1
|
| 337 |
+
kind: Deployment
|
| 338 |
+
metadata:
|
| 339 |
+
name: ntfy
|
| 340 |
+
spec:
|
| 341 |
+
selector:
|
| 342 |
+
matchLabels:
|
| 343 |
+
app: ntfy
|
| 344 |
+
template:
|
| 345 |
+
metadata:
|
| 346 |
+
labels:
|
| 347 |
+
app: ntfy
|
| 348 |
+
spec:
|
| 349 |
+
containers:
|
| 350 |
+
- name: ntfy
|
| 351 |
+
image: binwiederhier/ntfy
|
| 352 |
+
args: ["serve"]
|
| 353 |
+
resources:
|
| 354 |
+
limits:
|
| 355 |
+
memory: "128Mi"
|
| 356 |
+
cpu: "500m"
|
| 357 |
+
ports:
|
| 358 |
+
- containerPort: 80
|
| 359 |
+
name: http
|
| 360 |
+
volumeMounts:
|
| 361 |
+
- name: config
|
| 362 |
+
mountPath: "/etc/ntfy"
|
| 363 |
+
readOnly: true
|
| 364 |
+
volumes:
|
| 365 |
+
- name: config
|
| 366 |
+
configMap:
|
| 367 |
+
name: ntfy
|
| 368 |
+
---
|
| 369 |
+
# Basic service for port 80
|
| 370 |
+
apiVersion: v1
|
| 371 |
+
kind: Service
|
| 372 |
+
metadata:
|
| 373 |
+
name: ntfy
|
| 374 |
+
spec:
|
| 375 |
+
selector:
|
| 376 |
+
app: ntfy
|
| 377 |
+
ports:
|
| 378 |
+
- port: 80
|
| 379 |
+
targetPort: 80
|
| 380 |
+
```
|
| 381 |
+
|
| 382 |
+
```
|
| 383 |
+
apiVersion: apps/v1
|
| 384 |
+
kind: StatefulSet
|
| 385 |
+
metadata:
|
| 386 |
+
name: ntfy
|
| 387 |
+
spec:
|
| 388 |
+
selector:
|
| 389 |
+
matchLabels:
|
| 390 |
+
app: ntfy
|
| 391 |
+
serviceName: ntfy
|
| 392 |
+
template:
|
| 393 |
+
metadata:
|
| 394 |
+
labels:
|
| 395 |
+
app: ntfy
|
| 396 |
+
spec:
|
| 397 |
+
containers:
|
| 398 |
+
- name: ntfy
|
| 399 |
+
image: binwiederhier/ntfy
|
| 400 |
+
args: ["serve", "--cache-file", "/var/cache/ntfy/cache.db"]
|
| 401 |
+
ports:
|
| 402 |
+
- containerPort: 80
|
| 403 |
+
name: http
|
| 404 |
+
volumeMounts:
|
| 405 |
+
- name: config
|
| 406 |
+
mountPath: "/etc/ntfy"
|
| 407 |
+
readOnly: true
|
| 408 |
+
- name: cache
|
| 409 |
+
mountPath: "/var/cache/ntfy"
|
| 410 |
+
volumes:
|
| 411 |
+
- name: config
|
| 412 |
+
configMap:
|
| 413 |
+
name: ntfy
|
| 414 |
+
volumeClaimTemplates:
|
| 415 |
+
- metadata:
|
| 416 |
+
name: cache
|
| 417 |
+
spec:
|
| 418 |
+
accessModes: [ "ReadWriteOnce" ]
|
| 419 |
+
resources:
|
| 420 |
+
requests:
|
| 421 |
+
storage: 1Gi
|
| 422 |
+
```
|
| 423 |
+
|
| 424 |
+
```
|
| 425 |
+
apiVersion: v1
|
| 426 |
+
kind: Pod
|
| 427 |
+
metadata:
|
| 428 |
+
labels:
|
| 429 |
+
app: ntfy
|
| 430 |
+
spec:
|
| 431 |
+
containers:
|
| 432 |
+
- name: ntfy
|
| 433 |
+
image: binwiederhier/ntfy
|
| 434 |
+
args: ["serve"]
|
| 435 |
+
resources:
|
| 436 |
+
limits:
|
| 437 |
+
memory: "128Mi"
|
| 438 |
+
cpu: "500m"
|
| 439 |
+
ports:
|
| 440 |
+
- containerPort: 80
|
| 441 |
+
name: http
|
| 442 |
+
volumeMounts:
|
| 443 |
+
- name: config
|
| 444 |
+
mountPath: "/etc/ntfy"
|
| 445 |
+
readOnly: true
|
| 446 |
+
volumes:
|
| 447 |
+
- name: config
|
| 448 |
+
configMap:
|
| 449 |
+
name: ntfy
|
| 450 |
+
```
|
| 451 |
+
|
| 452 |
+
Configuration is relatively straightforward. As an example, a minimal configuration is provided.
|
| 453 |
+
|
| 454 |
+
resource definition from-file
|
| 455 |
+
|
| 456 |
+
```
|
| 457 |
+
apiVersion: v1
|
| 458 |
+
kind: ConfigMap
|
| 459 |
+
metadata:
|
| 460 |
+
name: ntfy
|
| 461 |
+
data:
|
| 462 |
+
server.yml: |
|
| 463 |
+
# Template: https://github.com/binwiederhier/ntfy/blob/main/server/server.yml
|
| 464 |
+
base-url: https://ntfy.sh
|
| 465 |
+
```
|
| 466 |
+
|
| 467 |
+
```
|
| 468 |
+
kubectl create configmap ntfy --from-file=server.yml
|
| 469 |
+
```
|
| 470 |
+
|
| 471 |
+
Kustomize[¶](https://docs.ntfy.sh/install#kustomize "Permanent link")
|
| 472 |
+
---------------------------------------------------------------------
|
| 473 |
+
|
| 474 |
+
ntfy can be deployed in a Kubernetes cluster with [Kustomize](https://github.com/kubernetes-sigs/kustomize), a tool used to customize Kubernetes objects using a `kustomization.yaml` file.
|
| 475 |
+
|
| 476 |
+
1. Create new folder - `ntfy`
|
| 477 |
+
2. Add all files listed below
|
| 478 |
+
1. `kustomization.yaml` - stores all configmaps and resources used in a deployment
|
| 479 |
+
2. `ntfy-deployment.yaml` - define deployment type and its parameters
|
| 480 |
+
3. `ntfy-pvc.yaml` - describes how [persistent volumes](https://kubernetes.io/docs/concepts/storage/persistent-volumes/) will be created
|
| 481 |
+
4. `ntfy-svc.yaml` - expose application to the internal kubernetes network
|
| 482 |
+
5. `ntfy-ingress.yaml` - expose service to outside the network using [ingress controller](https://kubernetes.io/docs/concepts/services-networking/ingress-controllers/)
|
| 483 |
+
6. `server.yaml` - simple server configuration
|
| 484 |
+
|
| 485 |
+
3. Replace **TESTNAMESPACE** within `kustomization.yaml` with designated namespace
|
| 486 |
+
4. Replace **ntfy.test** within `ntfy-ingress.yaml` with desired DNS name
|
| 487 |
+
5. Apply configuration to cluster set in current context:
|
| 488 |
+
|
| 489 |
+
```
|
| 490 |
+
kubectl apply -k /ntfy
|
| 491 |
+
```
|
| 492 |
+
|
| 493 |
+
kustomization.yaml ntfy-deployment.yaml ntfy-pvc.yaml ntfy-svc.yaml ntfy-ingress.yaml server.yml
|
| 494 |
+
|
| 495 |
+
```
|
| 496 |
+
apiVersion: kustomize.config.k8s.io/v1beta1
|
| 497 |
+
kind: Kustomization
|
| 498 |
+
resources:
|
| 499 |
+
- ntfy-deployment.yaml # deployment definition
|
| 500 |
+
- ntfy-svc.yaml # service connecting pods to cluster network
|
| 501 |
+
- ntfy-pvc.yaml # pvc used to store cache and attachment
|
| 502 |
+
- ntfy-ingress.yaml # ingress definition
|
| 503 |
+
configMapGenerator: # will parse config from raw config to configmap,it allows for dynamic reload of application if additional app is deployed ie https://github.com/stakater/Reloader
|
| 504 |
+
- name: server-config
|
| 505 |
+
files:
|
| 506 |
+
- server.yml
|
| 507 |
+
namespace: TESTNAMESPACE # select namespace for whole application
|
| 508 |
+
```
|
| 509 |
+
|
| 510 |
+
```
|
| 511 |
+
apiVersion: apps/v1
|
| 512 |
+
kind: Deployment
|
| 513 |
+
metadata:
|
| 514 |
+
name: ntfy-deployment
|
| 515 |
+
labels:
|
| 516 |
+
app: ntfy-deployment
|
| 517 |
+
spec:
|
| 518 |
+
revisionHistoryLimit: 1
|
| 519 |
+
replicas: 1
|
| 520 |
+
selector:
|
| 521 |
+
matchLabels:
|
| 522 |
+
app: ntfy-pod
|
| 523 |
+
template:
|
| 524 |
+
metadata:
|
| 525 |
+
labels:
|
| 526 |
+
app: ntfy-pod
|
| 527 |
+
spec:
|
| 528 |
+
containers:
|
| 529 |
+
- name: ntfy
|
| 530 |
+
image: binwiederhier/ntfy:v1.28.0 # set deployed version
|
| 531 |
+
args: ["serve"]
|
| 532 |
+
env: #example of adjustments made in environmental variables
|
| 533 |
+
- name: TZ # set timezone
|
| 534 |
+
value: XXXXXXX
|
| 535 |
+
- name: NTFY_DEBUG # enable/disable debug
|
| 536 |
+
value: "false"
|
| 537 |
+
- name: NTFY_LOG_LEVEL # adjust log level
|
| 538 |
+
value: INFO
|
| 539 |
+
- name: NTFY_BASE_URL # add base url
|
| 540 |
+
value: XXXXXXXXXX
|
| 541 |
+
ports:
|
| 542 |
+
- containerPort: 80
|
| 543 |
+
name: http-ntfy
|
| 544 |
+
resources:
|
| 545 |
+
limits:
|
| 546 |
+
memory: 300Mi
|
| 547 |
+
cpu: 200m
|
| 548 |
+
requests:
|
| 549 |
+
cpu: 150m
|
| 550 |
+
memory: 150Mi
|
| 551 |
+
volumeMounts:
|
| 552 |
+
- mountPath: /etc/ntfy
|
| 553 |
+
subPath: server.yml
|
| 554 |
+
name: config-volume # generated vie configMapGenerator from kustomization file
|
| 555 |
+
- mountPath: /var/cache/ntfy
|
| 556 |
+
name: cache-volume #cache volume mounted to persistent volume
|
| 557 |
+
volumes:
|
| 558 |
+
- name: config-volume
|
| 559 |
+
configMap: # uses configmap generator to parse server.yml to configmap
|
| 560 |
+
name: server-config
|
| 561 |
+
- name: cache-volume
|
| 562 |
+
persistentVolumeClaim: # stores /cache/ntfy in defined pv
|
| 563 |
+
claimName: ntfy-pvc
|
| 564 |
+
```
|
| 565 |
+
|
| 566 |
+
```
|
| 567 |
+
apiVersion: v1
|
| 568 |
+
kind: PersistentVolumeClaim
|
| 569 |
+
metadata:
|
| 570 |
+
name: ntfy-pvc
|
| 571 |
+
spec:
|
| 572 |
+
accessModes:
|
| 573 |
+
- ReadWriteOnce
|
| 574 |
+
storageClassName: local-path # adjust storage if needed
|
| 575 |
+
resources:
|
| 576 |
+
requests:
|
| 577 |
+
storage: 1Gi
|
| 578 |
+
```
|
| 579 |
+
|
| 580 |
+
```
|
| 581 |
+
apiVersion: v1
|
| 582 |
+
kind: Service
|
| 583 |
+
metadata:
|
| 584 |
+
name: ntfy-svc
|
| 585 |
+
spec:
|
| 586 |
+
type: ClusterIP
|
| 587 |
+
selector:
|
| 588 |
+
app: ntfy-pod
|
| 589 |
+
ports:
|
| 590 |
+
- name: http-ntfy-out
|
| 591 |
+
protocol: TCP
|
| 592 |
+
port: 80
|
| 593 |
+
targetPort: http-ntfy
|
| 594 |
+
```
|
| 595 |
+
|
| 596 |
+
```
|
| 597 |
+
apiVersion: networking.k8s.io/v1
|
| 598 |
+
kind: Ingress
|
| 599 |
+
metadata:
|
| 600 |
+
name: ntfy-ingress
|
| 601 |
+
spec:
|
| 602 |
+
rules:
|
| 603 |
+
- host: ntfy.test #select own
|
| 604 |
+
http:
|
| 605 |
+
paths:
|
| 606 |
+
- path: /
|
| 607 |
+
pathType: Prefix
|
| 608 |
+
backend:
|
| 609 |
+
service:
|
| 610 |
+
name: ntfy-svc
|
| 611 |
+
port:
|
| 612 |
+
number: 80
|
| 613 |
+
```
|
| 614 |
+
|
| 615 |
+
```
|
| 616 |
+
cache-file: "/var/cache/ntfy/cache.db"
|
| 617 |
+
attachment-cache-dir: "/var/cache/ntfy/attachments"
|
| 618 |
+
```
|
docs-ntfy-sh-integrations-20250924.md
ADDED
|
@@ -0,0 +1,321 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
Title: Integrations + projects - ntfy
|
| 2 |
+
|
| 3 |
+
URL Source: https://docs.ntfy.sh/integrations
|
| 4 |
+
|
| 5 |
+
Markdown Content:
|
| 6 |
+
There are quite a few projects that work with ntfy, integrate ntfy, or have been built around ntfy. It's super exciting to see what you guys have come up with. Feel free to [create a pull request on GitHub](https://github.com/binwiederhier/ntfy/issues) to add your own project here.
|
| 7 |
+
|
| 8 |
+
I've added a ⭐ to projects or posts that have a significant following, or had a lot of interaction by the community.
|
| 9 |
+
|
| 10 |
+
Table of Contents[¶](https://docs.ntfy.sh/integrations#table-of-contents "Permanent link")
|
| 11 |
+
------------------------------------------------------------------------------------------
|
| 12 |
+
|
| 13 |
+
* [Official integrations](https://docs.ntfy.sh/integrations#official-integrations)
|
| 14 |
+
* [Integration via HTTP/SMTP/etc.](https://docs.ntfy.sh/integrations#integration-via-httpsmtpetc)
|
| 15 |
+
* [UnifiedPush integrations](https://docs.ntfy.sh/integrations#unifiedpush-integrations)
|
| 16 |
+
* [Libraries](https://docs.ntfy.sh/integrations#libraries)
|
| 17 |
+
* [CLIs + GUIs](https://docs.ntfy.sh/integrations#clis-guis)
|
| 18 |
+
* [Projects + scripts](https://docs.ntfy.sh/integrations#projects-scripts)
|
| 19 |
+
* [Blog + forum posts](https://docs.ntfy.sh/integrations#blog-forum-posts)
|
| 20 |
+
* [Alternative ntfy servers](https://docs.ntfy.sh/integrations#alternative-ntfy-servers)
|
| 21 |
+
|
| 22 |
+
Official integrations[¶](https://docs.ntfy.sh/integrations#official-integrations "Permanent link")
|
| 23 |
+
--------------------------------------------------------------------------------------------------
|
| 24 |
+
|
| 25 |
+
* [changedetection.io](https://changedetection.io/) ⭐ - Website change detection and notification
|
| 26 |
+
* [Home Assistant](https://www.home-assistant.io/integrations/ntfy) ⭐ - Home Assistant is an open-source platform for automating and controlling smart home devices.
|
| 27 |
+
* [Healthchecks.io](https://healthchecks.io/) ⭐ - Online service for monitoring regularly running tasks such as cron jobs
|
| 28 |
+
* [Apprise](https://github.com/caronc/apprise/wiki/Notify_ntfy) ⭐ - Push notifications that work with just about every platform
|
| 29 |
+
* [Uptime Kuma](https://uptime.kuma.pet/) ⭐ - A self-hosted monitoring tool
|
| 30 |
+
* [Robusta](https://docs.robusta.dev/master/catalog/sinks/webhook.html) ⭐ - open source platform for Kubernetes troubleshooting
|
| 31 |
+
* [borgmatic](https://torsion.org/borgmatic/docs/how-to/monitor-your-backups/#third-party-monitoring-services) ⭐ - configuration-driven backup software for servers and workstations
|
| 32 |
+
* [Radarr](https://radarr.video/) ⭐ - Movie collection manager for Usenet and BitTorrent users
|
| 33 |
+
* [Sonarr](https://sonarr.tv/) ⭐ - PVR for Usenet and BitTorrent users
|
| 34 |
+
* [Gatus](https://gatus.io/) ⭐ - Automated service health dashboard
|
| 35 |
+
* [Automatisch](https://automatisch.io/) ⭐ - Open source Zapier alternative / workflow automation tool
|
| 36 |
+
* [FlexGet](https://flexget.com/Plugins/Notifiers/ntfysh) ⭐ - Multipurpose automation tool for all of your media
|
| 37 |
+
* [Shoutrrr](https://containrrr.dev/shoutrrr/v0.8/services/ntfy/) ⭐ - Notification library for gophers and their furry friends.
|
| 38 |
+
* [Netdata](https://learn.netdata.cloud/docs/alerts-and-notifications/notifications/agent-alert-notifications/ntfy) ⭐ - Real-time performance monitoring
|
| 39 |
+
* [Deployer](https://github.com/deployphp/deployer) ⭐ - PHP deployment tool
|
| 40 |
+
* [Scrt.link](https://scrt.link/) - Share a secret
|
| 41 |
+
* [Platypush](https://docs.platypush.tech/platypush/plugins/ntfy.html) - Automation platform aimed to run on any device that can run Python
|
| 42 |
+
* [diun](https://crazymax.dev/diun/) - Docker Image Update Notifier
|
| 43 |
+
* [Cloudron](https://www.cloudron.io/store/sh.ntfy.cloudronapp.html) - Platform that makes it easy to manage web apps on your server
|
| 44 |
+
* [Xitoring](https://xitoring.com/docs/notifications/notification-roles/ntfy/) - Server and Uptime monitoring
|
| 45 |
+
* [HetrixTools](https://docs.hetrixtools.com/ntfy-sh-notifications/) - Uptime monitoring
|
| 46 |
+
* [EasyMorph](https://help.easymorph.com/doku.php?id=transformations:sendntfymessage) - Visual data transformation and automation tool
|
| 47 |
+
* [Monibot](https://monibot.io/) - Monibot monitors your websites, servers and applications and notifies you if something goes wrong.
|
| 48 |
+
* [Miniflux](https://miniflux.app/docs/ntfy.html) - Minimalist and opinionated feed reader
|
| 49 |
+
* [Beszel](https://beszel.dev/guide/notifications/ntfy) - Server monitoring platform
|
| 50 |
+
|
| 51 |
+
Integration via HTTP/SMTP/etc.[¶](https://docs.ntfy.sh/integrations#integration-via-httpsmtpetc "Permanent link")
|
| 52 |
+
-----------------------------------------------------------------------------------------------------------------
|
| 53 |
+
|
| 54 |
+
* [Watchtower](https://containrrr.dev/watchtower/) ⭐ - Automating Docker container base image updates (see [integration example](https://docs.ntfy.sh/examples/#watchtower-shoutrrr))
|
| 55 |
+
* [Jellyfin](https://jellyfin.org/) ⭐ - The Free Software Media System (see [integration example](https://docs.ntfy.sh/examples/))
|
| 56 |
+
* [Overseerr](https://docs.overseerr.dev/using-overseerr/notifications/webhooks) ⭐ - a request management and media discovery tool for Plex (see [integration example](https://docs.ntfy.sh/examples/#jellyseerroverseerr-webhook))
|
| 57 |
+
* [Tautulli](https://github.com/Tautulli/Tautulli) ⭐ - Monitoring and tracking tool for Plex (integration [via webhook](https://github.com/Tautulli/Tautulli/wiki/Notification-Agents-Guide#webhook))
|
| 58 |
+
* [Mailrise](https://github.com/YoRyan/mailrise) - An SMTP gateway (integration via [Apprise](https://github.com/caronc/apprise/wiki/Notify_ntfy))
|
| 59 |
+
* [Proxmox-Ntfy](https://github.com/qtsone/proxmox-ntfy) - Python script that monitors Proxmox tasks and sends notifications using the Ntfy service.
|
| 60 |
+
* [Scrutiny](https://github.com/AnalogJ/scrutiny) - WebUI for smartd S.M.A.R.T monitoring. Scrutiny includes shoutrrr/ntfy integration ([see integration README](https://github.com/AnalogJ/scrutiny?tab=readme-ov-file#notifications))
|
| 61 |
+
* [UptimeObserver](https://uptimeobserver.com/) - Uptime Monitoring tool for Websites, APIs, SSL Certificates, DNS, Domain Names and Ports. [Integration Guide](https://support.uptimeobserver.com/integrations/ntfy/)
|
| 62 |
+
|
| 63 |
+
[UnifiedPush](https://unifiedpush.org/users/apps/) integrations[¶](https://docs.ntfy.sh/integrations#unifiedpush-integrations "Permanent link")
|
| 64 |
+
-----------------------------------------------------------------------------------------------------------------------------------------------
|
| 65 |
+
|
| 66 |
+
* [Element](https://f-droid.org/packages/im.vector.app/) ⭐ - Matrix client
|
| 67 |
+
* [SchildiChat](https://schildi.chat/android/) ⭐ - Matrix client
|
| 68 |
+
* [Tusky](https://tusky.app/) ⭐ - Fediverse client
|
| 69 |
+
* [Fedilab](https://fedilab.app/) - Fediverse client
|
| 70 |
+
* [FindMyDevice](https://gitlab.com/Nulide/findmydevice/) - Find your Device with an SMS or online with the help of FMDServer
|
| 71 |
+
* [Tox Push Message App](https://github.com/zoff99/tox_push_msg_app) - Tox Push Message App
|
| 72 |
+
|
| 73 |
+
Libraries[¶](https://docs.ntfy.sh/integrations#libraries "Permanent link")
|
| 74 |
+
--------------------------------------------------------------------------
|
| 75 |
+
|
| 76 |
+
* [ntfy-php-library](https://github.com/VerifiedJoseph/ntfy-php-library) - PHP library for sending messages using a ntfy server (PHP)
|
| 77 |
+
* [ntfy-notifier](https://github.com/DAcodedBEAT/ntfy-notifier) - Symfony Notifier integration for ntfy (PHP)
|
| 78 |
+
* [ntfpy](https://github.com/Nevalicjus/ntfpy) - API Wrapper for ntfy.sh (Python)
|
| 79 |
+
* [pyntfy](https://github.com/DP44/pyntfy) - A module for interacting with ntfy notifications (Python)
|
| 80 |
+
* [vntfy](https://github.com/lmangani/vntfy) - Barebone V client for ntfy (V)
|
| 81 |
+
* [ntfy-middleman](https://github.com/nachotp/ntfy-middleman) - Wraps APIs and send notifications using ntfy.sh on schedule (Python)
|
| 82 |
+
* [ntfy-dotnet](https://github.com/nwithan8/ntfy-dotnet) - .NET client library to interact with a ntfy server (C# / .NET)
|
| 83 |
+
* [node-ntfy-publish](https://github.com/cityssm/node-ntfy-publish) - A Node package to publish notifications to an ntfy server (Node)
|
| 84 |
+
* [ntfy](https://github.com/jonocarroll/ntfy) - Wraps the ntfy API with pipe-friendly tooling (R)
|
| 85 |
+
* [ntfy-for-delphi](https://github.com/hazzelnuts/ntfy-for-delphi) - A friendly library to push instant notifications ntfy (Delphi)
|
| 86 |
+
* [ntfy](https://github.com/ffflorian/ntfy) - Send notifications over ntfy (JS)
|
| 87 |
+
* [ntfy_dart](https://github.com/jr1221/ntfy_dart) - Dart wrapper around the ntfy API (Dart)
|
| 88 |
+
* [gotfy](https://github.com/AnthonyHewins/gotfy) - A Go wrapper for the ntfy API (Go)
|
| 89 |
+
* [symfony/ntfy-notifier](https://symfony.com/components/NtfyNotifier) ⭐ - Symfony Notifier integration for ntfy (PHP)
|
| 90 |
+
* [ntfy-java](https://github.com/MaheshBabu11/ntfy-java/) - A Java package to interact with a ntfy server (Java)
|
| 91 |
+
* [aiontfy](https://github.com/tr4nt0r/aiontfy) - Asynchronous client library for publishing and subscribing to ntfy (Python)
|
| 92 |
+
|
| 93 |
+
CLIs + GUIs[¶](https://docs.ntfy.sh/integrations#clis-guis "Permanent link")
|
| 94 |
+
----------------------------------------------------------------------------
|
| 95 |
+
|
| 96 |
+
* [ntfy.sh.sh](https://github.com/mininmobile/ntfy.sh.sh) - Run scripts on ntfy.sh events
|
| 97 |
+
* [ntfy-desktop](https://codeberg.org/zvava/ntfy-desktop) - Cross-platform desktop application for ntfy
|
| 98 |
+
* [ntfy-desktop](https://github.com/Aetherinox/ntfy-desktop) - Desktop client for Windows, Linux, and MacOS with push notifications
|
| 99 |
+
* [ntfy svelte front-end](https://github.com/novatorem/Ntfy) - Front-end built with svelte
|
| 100 |
+
* [wio-ntfy-ticker](https://github.com/nachotp/wio-ntfy-ticker) - Ticker display for a ntfy.sh topic
|
| 101 |
+
* [ntfysh-windows](https://github.com/lucas-bortoli/ntfysh-windows) - A ntfy client for Windows Desktop
|
| 102 |
+
* [ntfyr](https://github.com/haxwithaxe/ntfyr) - A simple commandline tool to send notifications to ntfy
|
| 103 |
+
* [ntfy.py](https://github.com/ioqy/ntfy-client-python) - ntfy.py is a simple nfty.sh client for sending notifications
|
| 104 |
+
* [wlzntfy](https://github.com/Walzen-Group/ntfy-toaster) - A minimalistic, receive-only toast notification client for Windows 11
|
| 105 |
+
* [Ntfy_CSV_Reminders](https://github.com/thiswillbeyourgithub/Ntfy_CSV_Reminders) - A Python tool that sends random-timing phone notifications for recurring tasks by using daily probability checks based on CSV-defined frequencies.
|
| 106 |
+
* [Daily Fact Ntfy](https://github.com/thiswillbeyourgithub/Daily_Fact_Ntfy) - Generate [llm](https://github.com/simonw/llm) generated fact every day about any topic you're interested in.
|
| 107 |
+
* [ntfyexec](https://github.com/alecthomas/ntfyexec) - Send a notification through ntfy.sh if a command fails
|
| 108 |
+
* [Ntfy Desktop](https://github.com/emmaexe/ntfyDesktop) - Fully featured desktop client for Linux, built with Qt and C++.
|
| 109 |
+
|
| 110 |
+
Projects + scripts[¶](https://docs.ntfy.sh/integrations#projects-scripts "Permanent link")
|
| 111 |
+
------------------------------------------------------------------------------------------
|
| 112 |
+
|
| 113 |
+
* [Grafana-to-ntfy](https://github.com/kittyandrew/grafana-to-ntfy) - Grafana-to-ntfy alerts channel (Rust)
|
| 114 |
+
* [Grafana-ntfy-webhook-integration](https://github.com/academo/grafana-alerting-ntfy-webhook-integration) - Integrates Grafana alerts webhooks (Go)
|
| 115 |
+
* [Grafana-to-ntfy](https://gitlab.com/Saibe1111/grafana-to-ntfy) - Grafana-to-ntfy alerts channel (Node Js)
|
| 116 |
+
* [ntfy-long-zsh-command](https://github.com/robfox92/ntfy-long-zsh-command) - Notifies you once a long-running command completes (zsh)
|
| 117 |
+
* [ntfy-shellscripts](https://github.com/nickexyz/ntfy-shellscripts) - A few scripts for the ntfy project (Shell)
|
| 118 |
+
* [alertmanager-ntfy-relay](https://github.com/therobbielee/alertmanager-ntfy-relay) - ntfy.sh relay for Alertmanager (Go)
|
| 119 |
+
* [QuickStatus](https://github.com/corneliusroot/QuickStatus) - A shell script to alert to any immediate problems upon login (Shell)
|
| 120 |
+
* [ntfy.el](https://github.com/shombando/ntfy) - Send notifications from Emacs (Emacs)
|
| 121 |
+
* [backup-projects](https://gist.github.com/anthonyaxenov/826ba65abbabd5b00196bc3e6af76002) - Stupidly simple backup script for own projects (Shell)
|
| 122 |
+
* [grav-plugin-whistleblower](https://github.com/Himmlisch-Studios/grav-plugin-whistleblower) - Grav CMS plugin to get notifications via ntfy (PHP)
|
| 123 |
+
* [ntfy-server-status](https://github.com/filip2cz/ntfy-server-status) - Checking if server is online and reporting through ntfy (C)
|
| 124 |
+
* [ntfy.sh *arr script](https://github.com/agent-squirrel/nfty-arr-script) - Quick and hacky script to get sonarr/radarr to notify the ntfy.sh service (Shell)
|
| 125 |
+
* [website-watcher](https://github.com/muety/website-watcher) - A small tool to watch websites for changes (with XPath support) (Python)
|
| 126 |
+
* [siteeagle](https://github.com/tpanum/siteeagle) - A small Python script to monitor websites and notify changes (Python)
|
| 127 |
+
* [send_to_phone](https://github.com/whipped-cream/send_to_phone) - Scripts to upload a file to Transfer.sh and ping ntfy with the download link (Python)
|
| 128 |
+
* [ntfy Discord bot](https://github.com/R0dn3yS/ntfy-bot) - WIP ntfy discord bot (TypeScript)
|
| 129 |
+
* [ntfy Discord bot](https://github.com/binwiederhier/ntfy-bot) - ntfy Discord bot (Go)
|
| 130 |
+
* [ntfy Discord bot](https://github.com/jr1221/ntfy_discord_bot) - An advanced modal-based bot for interacting with the ntfy.sh API (Dart)
|
| 131 |
+
* [Bettarr Notifications](https://github.com/NiNiyas/Bettarr-Notifications) - Better Notifications for Sonarr and Radarr (Python)
|
| 132 |
+
* [Notify me the intruders](https://github.com/nothingbutlucas/notify_me_the_intruders) - Notify you if they are intruders or new connections on your network (Shell)
|
| 133 |
+
* [Send GitHub Action to ntfy](https://github.com/NiNiyas/ntfy-action) - Send GitHub Action workflow notifications to ntfy (JS)
|
| 134 |
+
* [aTable/ntfy alertmanager bridge](https://github.com/aTable/ntfy_alertmanager_bridge) - Basic alertmanager bridge to ntfy (JS)
|
| 135 |
+
* [~xenrox/ntfy-alertmanager](https://hub.xenrox.net/~xenrox/ntfy-alertmanager) - A bridge between ntfy and Alertmanager (Go)
|
| 136 |
+
* [pinpox/alertmanager-ntfy](https://github.com/pinpox/alertmanager-ntfy) - Relay prometheus alertmanager alerts to ntfy (Go)
|
| 137 |
+
* [alexbakker/alertmanager-ntfy](https://github.com/alexbakker/alertmanager-ntfy) - Service that forwards Prometheus Alertmanager notifications to ntfy (Go)
|
| 138 |
+
* [restreamchat2ntfy](https://github.com/kurohuku7/restreamchat2ntfy) - Send restream.io chat to ntfy to check on the Meta Quest (JS)
|
| 139 |
+
* [k8s-ntfy-deployment-service](https://github.com/Christian42/k8s-ntfy-deployment-service) - Automatic Kubernetes (k8s) ntfy deployment
|
| 140 |
+
* [huginn-global-entry-notif](https://github.com/kylezoa/huginn-global-entry-notif) - Checks CBP API for available appointments with Huginn (JSON)
|
| 141 |
+
* [ntfyer](https://github.com/KikyTokamuro/ntfyer) - Sending various information to your ntfy topic by time (TypeScript)
|
| 142 |
+
* [git-simple-notifier](https://github.com/plamenjm/git-simple-notifier) - Script running git-log, checking for new repositories (Shell)
|
| 143 |
+
* [ntfy-to-slack](https://github.com/ozskywalker/ntfy-to-slack) - Tool to subscribe to a ntfy topic and send the messages to a Slack webhook (Go)
|
| 144 |
+
* [ansible-ntfy](https://github.com/jpmens/ansible-ntfy) - Ansible action plugin to post JSON messages to ntfy (Python)
|
| 145 |
+
* [ntfy-notification-channel](https://github.com/wijourdil/ntfy-notification-channel) - Laravel Notification channel for ntfy (PHP)
|
| 146 |
+
* [ntfy_on_a_chip](https://github.com/gergepalfi/ntfy_on_a_chip) - ESP8266 and ESP32 client code to communicate with ntfy
|
| 147 |
+
* [ntfy-sdk](https://github.com/yukibtc/ntfy-sdk) - ntfy client library to send notifications (Rust)
|
| 148 |
+
* [ntfy_ynh](https://github.com/YunoHost-Apps/ntfy_ynh) - ntfy app for YunoHost
|
| 149 |
+
* [woodpecker-ntfy](https://codeberg.org/l-x/woodpecker-ntfy)- Woodpecker CI plugin for sending ntfy notfication from a pipeline (Go)
|
| 150 |
+
* [drone-ntfy](https://github.com/Clortox/drone-ntfy) - Drone.io plugin for sending ntfy notifications from a pipeline (Shell)
|
| 151 |
+
* [ignition-ntfy-module](https://github.com/Kyvis-Labs/ignition-ntfy-module) - Adds support for sending notifications via a ntfy server to Ignition (Java)
|
| 152 |
+
* [maubot-ntfy](https://gitlab.com/999eagle/maubot-ntfy) - Matrix bot to subscribe to ntfy topics and send messages to Matrix (Python)
|
| 153 |
+
* [ntfy-wrapper](https://github.com/vict0rsch/ntfy-wrapper) - Wrapper around ntfy (Python)
|
| 154 |
+
* [nodebb-plugin-ntfy](https://github.com/NodeBB/nodebb-plugin-ntfy) - Push notifications for NodeBB forums
|
| 155 |
+
* [n8n-ntfy](https://github.com/raghavanand98/n8n-ntfy.sh) - n8n community node that lets you use ntfy in your workflows
|
| 156 |
+
* [nlog-ntfy](https://github.com/MichelMichels/nlog-ntfy) - Send NLog messages over ntfy (C# / .NET / NLog)
|
| 157 |
+
* [helm-charts](https://github.com/sarab97/helm-charts) - Helm charts of some of the selfhosted services, incl. ntfy
|
| 158 |
+
* [ntfy_ansible_role](https://github.com/stevenengland/ntfy_ansible_role) (on [Ansible Galaxy](https://galaxy.ansible.com/stevenengland/ntfy)) - Ansible role to install ntfy
|
| 159 |
+
* [easy2ntfy](https://github.com/chromoxdor/easy2ntfy) - Gateway for ESPeasy to receive commands through ntfy and using easyfetch (HTML/JS)
|
| 160 |
+
* [ntfy_lite](https://github.com/MPI-IS/ntfy_lite) - Minimalist python API for pushing ntfy notifications (Python)
|
| 161 |
+
* [notify](https://github.com/guanguans/notify) - 推送通知 (PHP)
|
| 162 |
+
* [zpool-events](https://github.com/maglar0/zpool-events) - Notify on ZFS pool events (Python)
|
| 163 |
+
* [ntfyd](https://github.com/joachimschmidt557/ntfyd) - ntfy desktop daemon (Zig)
|
| 164 |
+
* [ntfy-browser](https://github.com/johman10/ntfy-browser) - browser extension to receive notifications without having the page open (TypeScript)
|
| 165 |
+
* [ntfy-electron](https://github.com/xdpirate/ntfy-electron) - Electron wrapper for the ntfy web app (JS)
|
| 166 |
+
* [systemd-ntfy-poweronoff](https://github.com/stendler/systemd-ntfy-poweronoff) - Systemd services to send notifications on system startup, shutdown and service failure
|
| 167 |
+
* [msgdrop](https://github.com/jbrubake/msgdrop) - Send and receive encrypted messages (Bash)
|
| 168 |
+
* [vigilant](https://github.com/VerifiedJoseph/vigilant) - Monitor RSS/ATOM and JSON feeds, and send push notifications on new entries (PHP)
|
| 169 |
+
* [ansible-role-ntfy-alertmanager](https://github.com/bleetube/ansible-role-ntfy-alertmanager) - Ansible role to install xenrox/ntfy-alertmanager
|
| 170 |
+
* [NtfyMe-Blender](https://github.com/NotNanook/NtfyMe-Blender) - Blender addon to send notifications to NtfyMe (Python)
|
| 171 |
+
* [ntfy-ios-url-share](https://www.icloud.com/shortcuts/be8a7f49530c45f79733cfe3e41887e6) - An iOS shortcut that lets you share URLs easily and quickly.
|
| 172 |
+
* [ntfy-ios-filesharing](https://www.icloud.com/shortcuts/fe948d151b2e4ae08fb2f9d6b27d680b) - An iOS shortcut that lets you share files from your share feed to a topic of your choice.
|
| 173 |
+
* [systemd-ntfy](https://hackage.haskell.org/package/systemd-ntfy) - monitor a set of systemd services an send a notification to ntfy.sh whenever their status changes
|
| 174 |
+
* [RouterOS Scripts](https://git.eworm.de/cgit/routeros-scripts/about/) - a collection of scripts for MikroTik RouterOS
|
| 175 |
+
* [ntfy-android-builder](https://github.com/TheBlusky/ntfy-android-builder) - Script for building ntfy-android with custom Firebase configuration (Docker/Shell)
|
| 176 |
+
* [jetspotter](https://github.com/vvanouytsel/jetspotter) - send notifications when planes are spotted near you (Go)
|
| 177 |
+
* [monitoring_ntfy](https://www.drupal.org/project/monitoring_ntfy) - Drupal monitoring Ntfy.sh integration (PHP/Drupal)
|
| 178 |
+
* [Notify](https://flathub.org/apps/com.ranfdev.Notify) - Native GTK4 client for ntfy (Rust)
|
| 179 |
+
* [notify-via-ntfy](https://exchange.checkmk.com/p/notify-via-ntfy) - Checkmk plugin to send notifications via ntfy (Python)
|
| 180 |
+
* [ntfy-java](https://github.com/MaheshBabu11/ntfy-java/) - A Java package to interact with a ntfy server (Java)
|
| 181 |
+
* [container-update-check](https://github.com/stendler/container-update-check) - Scripts to check and notify if a podman or docker container image can be updated (Podman/Shell)
|
| 182 |
+
* [ignition-combustion-template](https://github.com/stendler/ignition-combustion-template) - Templates and scripts to generate a configuration to automatically setup a system on first boot. Including systemd-ntfy-poweronoff (Shell)
|
| 183 |
+
* [ntfy-run](https://github.com/quantum5/ntfy-run) - Tool to run a command, capture its output, and send it to ntfy (Rust)
|
| 184 |
+
* [Clipboard IO](https://github.com/jim3692/clipboard-io) - End to end encrypted clipboard
|
| 185 |
+
* [ntfy-me-mcp](https://github.com/gitmotion/ntfy-me-mcp) - An ntfy MCP server for sending/fetching ntfy notifications to your self-hosted ntfy server from AI Agents (supports secure token auth & more - use with npx or docker!) (Node/Typescript)
|
| 186 |
+
* [InvaderInformant](https://github.com/patricksthannon/InvaderInformant) - Script for Mac OS systems that monitors new or dropped connections to your network using ntfy (Shell)
|
| 187 |
+
* [NtfyPwsh](https://github.com/ptmorris1/NtfyPwsh) - PowerShell module to help send messages to ntfy (PowerShell)
|
| 188 |
+
* [ntfyrr](https://github.com/leukosaima/ntfyrr) - Currently an Overseerr webhook notification to ntfy helper service.
|
| 189 |
+
* [ntfy for Sandstorm](https://apps.sandstorm.io/app/c6rk81r4qk6dm3k04x1kxmyccqewhh4npuxeyg1xrpfypn2ddy0h) - ntfy app for the Sandstorm platform
|
| 190 |
+
* [ntfy-heartbeat-monitor](https://codeberg.org/RockWolf/ntfy-heartbeat-monitor) - Application for implementing heartbeat monitoring/alerting by utilizing ntfy
|
| 191 |
+
* [ntfy-bridge](https://github.com/AlexGaudon/ntfy-bridge) - An application to bridge Discord messages (or webhooks) to ntfy.
|
| 192 |
+
|
| 193 |
+
Blog + forum posts[¶](https://docs.ntfy.sh/integrations#blog-forum-posts "Permanent link")
|
| 194 |
+
------------------------------------------------------------------------------------------
|
| 195 |
+
|
| 196 |
+
* [Device notifications via HTTP with ntfy](https://alistairshepherd.uk/writing/ntfy/) - alistairshepherd.uk - 6/2025
|
| 197 |
+
* [Notifications about (almost) anything with ntfy.sh](https://hamatti.org/posts/notifications-about-almost-anything-with-ntfy-sh/) - hamatti.org - 6/2025
|
| 198 |
+
* [I set up a self-hosted notification service for everything, and I'll never look back](https://www.xda-developers.com/set-up-self-hosted-notification-service/) ⭐ - xda-developers.com - 5/2025
|
| 199 |
+
* [How to Set Up Ntfy: Self-Hosted Push Notifications Made Easy](https://www.youtube.com/watch?v=wDJDiAYZ3H0) - youtube.com (sass drew) - 1/2025
|
| 200 |
+
* [The NTFY is a game-changer FREE solution for IT people](https://www.youtube.com/watch?v=NtlztHT-sRw) - youtube.com (Valters Tech Turf) - 1/2025
|
| 201 |
+
* [Notify: A Powerful Tool for Real-Time Notifications (ntfy.sh)](https://www.youtube.com/watch?v=XXTTeVfGBz0) - youtube.com (LinuxCloudHacks) - 12/2025
|
| 202 |
+
* [Push notifications with ntfy and n8n](https://www.youtube.com/watch?v=DKG1R3xYvwQ) - youtube.com (Oskar) - 10/2024
|
| 203 |
+
* [Setup ntfy for selfhosted notifications with Cloudflare Tunnel](https://medium.com/@svenvanginkel/setup-ntfy-for-selfhosted-notifications-with-cloudflare-tunnel-e342f470177d) - medium.com (Sven van Ginkel) - 10/2024
|
| 204 |
+
* [Self-Host NTFY - How It Works & Easy Setup Guide](https://www.youtube.com/watch?v=79wHc_jfrJE) ⭐ - youtube.com (Techdox)- 9/2024
|
| 205 |
+
* [ntfy / Emacs Lisp](https://speechcode.com/blog/ntfy/) - speechcode.com - 3/2024
|
| 206 |
+
* [Boost Your Productivity with ntfy.sh: The Ultimate Notification Tool for Command-Line Users](https://dev.to/archetypal/boost-your-productivity-with-ntfysh-the-ultimate-notification-tool-for-command-line-users-iil) - dev.to - 3/2024
|
| 207 |
+
* [Nextcloud Talk (F-Droid version) notifications using ntfy (ntfy.sh)](https://www.youtube.com/watch?v=0a6PpfN5PD8) - youtube.com - 2/2024
|
| 208 |
+
* [ZFS and SMART Warnings via Ntfy](https://rair.dev/zfs-smart-ntfy/) - rair.dev - 2/2024
|
| 209 |
+
* [Automating Security Camera Notifications With Home Assistant and Ntfy](https://runtimeterror.dev/automating-camera-notifications-home-assistant-ntfy/) ⭐ - runtimeterror.dev - 2/2024
|
| 210 |
+
* [Ntfy: self-hosted notification service](https://medium.com/@williamdonze/ntfy-self-hosted-notification-service-0f3eada6e657) ⭐ - williamdonze.medium.com - 1/2024
|
| 211 |
+
* [Let’s Supercharge Snowflake Alerts with Cool ntfy Open-source Notifications!](https://sarathi-data-ml-cloud.medium.com/lets-supercharge-snowflake-alerts-with-cool-ntfy-open-source-notifications-296da442c331) - sarathi-data-ml-cloud.medium.com - 1/2024
|
| 212 |
+
* [Setting up NTFY with Ngnix-Proxy-Manager, authentication and Ansible notifications](https://random-it-blog.de/rocky-linux/setting-up-ntfy-with-ngnix-proxy-manager-authentication-and-ansible-notifications/) - random-it-blog.de - 12/2023
|
| 213 |
+
* [Introducing the Monitoring Ntfy.sh Integration Module: Real-time Notifications for Drupal Monitoring](https://cyberschorsch.dev/drupal/introducing-monitoring-ntfysh-integration-module-real-time-notifications-drupal-monitoring) - cyberschorsch.dev - 11/2023
|
| 214 |
+
* [How to install Ntfy.sh on CasaOS using BigBearCasaOS](https://www.youtube.com/watch?v=wSWhtSNwTd8) - youtube.com - 10/2023
|
| 215 |
+
* [Podman Update Notifications via Ntfy](https://rair.dev/podman-update-notifications-ntfy/) - rair.dev - 9/2023
|
| 216 |
+
* [Easy Push Notifications With ntfy.sh](https://runtimeterror.dev/easy-push-notifications-with-ntfy/) ⭐ - runtimeterror.dev - 9/2023
|
| 217 |
+
* [Ntfy: Your Ultimate Push Notification Powerhouse!](https://kkamalesh117.medium.com/ntfy-your-ultimate-push-notification-powerhouse-1968c070f1d1) - kkamalesh117.medium.com - 9/2023
|
| 218 |
+
* [Installing Self Host NTFY On Linux Using Docker Container](https://www.pinoylinux.org/topicsplus/containers/installing-self-host-ntfy-on-linux-using-docker-container/) - pinoylinux.org - 9/2023
|
| 219 |
+
* [Homelab Notifications with ntfy](https://blog.alexsguardian.net/posts/2023/09/12/selfhosting-ntfy/) ⭐ - alexsguardian.net - 9/2023
|
| 220 |
+
* [Why NTFY is the Ultimate Push Notification Tool for Your Needs](https://osintph.medium.com/why-ntfy-is-the-ultimate-push-notification-tool-for-your-needs-e767421c84c5) - osintph.medium.com - 9/2023
|
| 221 |
+
* [Supercharge Your Alerts: Ntfy — The Ultimate Push Notification Solution](https://medium.com/spring-boot/supercharge-your-alerts-ntfy-the-ultimate-push-notification-solution-a3dda79651fe) - spring-boot.medium.com - 9/2023
|
| 222 |
+
* [Deploy Ntfy using Docker](https://www.linkedin.com/pulse/deploy-ntfy-mohamed-sharfy/) - linkedin.com - 9/2023
|
| 223 |
+
* [Send Notifications With Ntfy for New WordPress Posts](https://www.activepieces.com/blog/ntfy-notifications-for-wordpress-new-posts) - activepieces.com - 9/2023
|
| 224 |
+
* [Get Ntfy Notifications About New Zendesk Ticket](https://www.activepieces.com/blog/ntfy-notifications-about-new-zendesk-tickets) - activepieces.com - 9/2023
|
| 225 |
+
* [Set reminder for recurring events using ntfy & Cron](https://www.youtube.com/watch?v=J3O4aQ-EcYk) - youtube.com - 9/2023
|
| 226 |
+
* [ntfy - Installation and full configuration setup](https://www.youtube.com/watch?v=QMy14rGmpFI) - youtube.com - 9/2023
|
| 227 |
+
* [How to install Ntfy.sh on Portainer / Docker Compose](https://www.youtube.com/watch?v=utD9GNbAwyg) - youtube.com - 9/2023
|
| 228 |
+
* [ntfy - Push-Benachrichtigungen // Push Notifications](https://www.youtube.com/watch?v=LE3vRPPqZOU) - youtube.com - 9/2023
|
| 229 |
+
* [Podman Update Notifications via Ntfy](https://rair.dev/podman-upadte-notifications-ntfy/) - rair.dev - 9/2023
|
| 230 |
+
* [How to Send Alerts From Raspberry Pi Pico W to a Phone or Tablet](https://www.tomshardware.com/how-to/send-alerts-raspberry-pi-pico-w-to-mobile-device) - tomshardware.com - 8/2023
|
| 231 |
+
* [NetworkChunk - how did I NOT know about this?](https://www.youtube.com/watch?v=poDIT2ruQ9M) ⭐ - youtube.com - 8/2023
|
| 232 |
+
* [NTFY - Command-Line Notifications](https://academy.networkchuck.com/blog/ntfy/) - academy.networkchuck.com - 8/2023
|
| 233 |
+
* [Open Source Push Notifications! Get notified of any event you can imagine. Triggers abound!](https://www.youtube.com/watch?v=WJgwWXt79pE) ⭐ - youtube.com - 8/2023
|
| 234 |
+
* [How to install and self host an Ntfy server on Linux](https://linuxconfig.org/how-to-install-and-self-host-an-ntfy-server-on-linux) - linuxconfig.org - 7/2023
|
| 235 |
+
* [Basic website monitoring using cronjobs and ntfy.sh](https://burkhardt.dev/2023/website-monitoring-cron-ntfy/) - burkhardt.dev - 6/2023
|
| 236 |
+
* [Pingdom alternative in one line of curl through ntfy.sh](https://piqoni.bearblog.dev/uptime-monitoring-in-one-line-of-curl/) - bearblog.dev - 6/2023
|
| 237 |
+
* [#OpenSourceDiscovery 78: ntfy.sh](https://opensourcedisc.substack.com/p/opensourcediscovery-78-ntfysh) - opensourcedisc.substack.com - 6/2023
|
| 238 |
+
* [ntfy: des notifications instantanées](https://blogmotion.fr/diy/ntfy-notification-push-domotique-20708) - blogmotion.fr - 5/2023
|
| 239 |
+
* [桌面通知:ntfy](https://www.cnblogs.com/xueweihan/archive/2023/05/04/17370060.html) - cnblogs.com - 5/2023
|
| 240 |
+
* [ntfy.sh - Open source push notifications via PUT/POST](https://lobste.rs/s/5drapz/ntfy_sh_open_source_push_notifications) - lobste.rs - 5/2023
|
| 241 |
+
* [Install ntfy Inside Docker Container in Linux](https://lindevs.com/install-ntfy-inside-docker-container-in-linux) - lindevs.com - 4/2023
|
| 242 |
+
* [ntfy.sh](https://neo-sahara.com/wp/2023/03/25/ntfy-sh/) - neo-sahara.com - 3/2023
|
| 243 |
+
* [Using Ntfy to send and receive push notifications - Samuel Rosa de Oliveria - Delphicon 2023](https://www.youtube.com/watch?v=feu0skpI9QI) - youtube.com - 3/2023
|
| 244 |
+
* [ntfy: własny darmowy system powiadomień](https://sprawdzone.it/ntfy-wlasny-darmowy-system-powiadomien/) - sprawdzone.it - 3/2023
|
| 245 |
+
* [Deploying ntfy on railway](https://www.youtube.com/watch?v=auJICXtxoNA) - youtube.com - 3/2023
|
| 246 |
+
* [Start-Job,Variables, and ntfy.sh](https://klingele.dev/2023/03/01/start-jobvariables-and-ntfy-sh/) - klingele.dev - 3/2023
|
| 247 |
+
* [enviar notificaciones automáticas usando ntfy.sh](https://osiux.com/2023-02-15-send-automatic-notifications-using-ntfy.html) - osiux.com - 2/2023
|
| 248 |
+
* [Carnet IP动态解析以及通过ntfy推送IP信息](https://blog.wslll.cn/index.php/archives/201/) - blog.wslll.cn - 2/2023
|
| 249 |
+
* [Open-Source-Brieftaube: ntfy verschickt Push-Meldungen auf Smartphone und PC](https://www.heise.de/news/Open-Source-Brieftaube-ntfy-verschickt-Push-Meldungen-auf-Smartphone-und-PC-7521583.html) ⭐ - heise.de - 2/2023
|
| 250 |
+
* [Video: Simple Push Notifications ntfy](https://www.youtube.com/watch?v=u9EcWrsjE20) ⭐ - youtube.com - 2/2023
|
| 251 |
+
* [Use ntfy.sh with Home Assistant](https://diecknet.de/en/2023/02/12/ntfy-sh-with-homeassistant/) - diecknet.de - 2/2023
|
| 252 |
+
* [On installe Ntfy sur Synology Docker](https://www.maison-et-domotique.com/140356-serveur-notification-jeedom-ntfy-synology-docker/) - maison-et-domotique.co - 1/2023
|
| 253 |
+
* [January 2023 Developer Update](https://community.nodebb.org/topic/16908/january-2023-developer-update) - nodebb.org - 1/2023
|
| 254 |
+
* [Comment envoyer des notifications push sur votre téléphone facilement et gratuitement?](https://korben.info/notifications-push-telephone.html) - 1/2023
|
| 255 |
+
* [UnifiedPush: a decentralized, open-source push notification protocol](https://f-droid.org/en/2022/12/18/unifiedpush.html) ⭐ - 12/2022
|
| 256 |
+
* [ntfy setup instructions](https://docs.benjamin-altpeter.de/network/vms/1001029-ntfy/) - benjamin-altpeter.de - 12/2022
|
| 257 |
+
* [Ntfy Self-Hosted Push Notifications](https://lachlanlife.net/posts/2022-12-ntfy/) - lachlanlife.net - 12/2022
|
| 258 |
+
* [NTFY - système de notification hyper simple et complet](https://www.youtube.com/watch?v=UieZYWVVgA4) - youtube.com - 12/2022
|
| 259 |
+
* [ntfy.sh](https://paramdeo.com/til/ntfy-sh) - paramdeo.com - 11/2022
|
| 260 |
+
* [Using ntfy to warn me when my computer is discharging](https://ulysseszh.github.io/programming/2022/11/28/ntfy-warn-discharge.html) - ulysseszh.github.io - 11/2022
|
| 261 |
+
* [Enabling SSH Login Notifications using Ntfy](https://paramdeo.com/blog/enabling-ssh-login-notifications-using-ntfy) - paramdeo.com - 11/2022
|
| 262 |
+
* [ntfy - Push Notification Service](https://dizzytech.de/posts/ntfy/) - dizzytech.de - 11/2022
|
| 263 |
+
* [Console #132](https://console.substack.com/p/console-132) ⭐ - console.substack.com - 11/2022
|
| 264 |
+
* [How to make my phone buzz*](https://evbogue.com/howtomakemyphonebuzz) - evbogue.com - 11/2022
|
| 265 |
+
* [MeshCentral - Ntfy Push Notifications](https://www.youtube.com/watch?v=wyE4rtUd4Bg) - youtube.com - 11/2022
|
| 266 |
+
* [Changelog | Tracking layoffs, tech worker demand still high, ntfy, ...](https://changelog.com/news/tracking-layoffs-tech-worker-demand-still-high-ntfy-devenv-markdoc-mike-bifulco-Y1jW) ⭐ - changelog.com - 11/2022
|
| 267 |
+
* [Pointer | Issue #367](https://www.pointer.io/archives/a9495a2a6f/) - pointer.io - 11/2022
|
| 268 |
+
* [Envie Push Notifications por POST (de graça e sem cadastro)](https://www.tabnews.com.br/filipedeschamps/envie-push-notifications-por-post-de-graca-e-sem-cadastro) - tabnews.com.br - 11/2022
|
| 269 |
+
* [Push Notifications for KDE](https://volkerkrause.eu/2022/11/12/kde-unifiedpush-push-notifications.html) - volkerkrause.eu - 11/2022
|
| 270 |
+
* [TLDR Newsletter Daily Update 2022-11-09](https://tldr.tech/tech/newsletter/2022-11-09) ⭐ - tldr.tech - 11/2022
|
| 271 |
+
* [Ntfy.sh – Send push notifications to your phone via PUT/POST](https://news.ycombinator.com/item?id=33517944) ⭐ - news.ycombinator.com - 11/2022
|
| 272 |
+
* [Ntfy et Jeedom : un plugin](https://lunarok-domotique.com/2022/11/ntfy-et-jeedom/) - lunarok-domotique.com - 11/2022
|
| 273 |
+
* [Crea tu propio servidor de notificaciones con Ntfy](https://blog.parravidales.es/crea-tu-propio-servidor-de-notificaciones-con-ntfy/) - blog.parravidales.es - 11/2022
|
| 274 |
+
* [unRAID Notifications with ntfy.sh](https://lder.dev/posts/ntfy-Notifications-With-unRAID/) - lder.dev - 10/2022
|
| 275 |
+
* [Zero-cost push notifications to your phone or desktop via PUT/POST](https://lobste.rs/s/41dq13/zero_cost_push_notifications_your_phone) - lobste.rs - 10/2022
|
| 276 |
+
* [A nifty push notification system: ntfy](https://jpmens.net/2022/10/30/a-nifty-push-notification-system-ntfy/) - jpmens.net - 10/2022
|
| 277 |
+
* [Alarmanlage der dritten Art (YouTube video)](https://www.youtube.com/watch?v=altb5QLHbaU&feature=youtu.be) - youtube.com - 10/2022
|
| 278 |
+
* [Neue Services: Ntfy, TikTok und RustDesk](https://adminforge.de/tools/neue-services-ntfy-tiktok-und-rustdesk/) - adminforge.de - 9/2022
|
| 279 |
+
* [Ntfy, le service de notifications qu’il vous faut](https://www.cachem.fr/ntfy-le-service-de-notifications-quil-vous-faut/) - cachem.fr - 9/2022
|
| 280 |
+
* [NAS Synology et notifications avec ntfy](https://www.cachem.fr/synology-notifications-ntfy/) - cachem.fr - 9/2022
|
| 281 |
+
* [Self hosted Mobile Push Notifications using NTFY | Thejesh GN](https://thejeshgn.com/2022/08/23/self-hosted-mobile-push-notifications-using-ntfy/) - thejeshgn.com - 8/2022
|
| 282 |
+
* [Fedora Magazine | 4 cool new projects to try in Copr](https://fedoramagazine.org/4-cool-new-projects-to-try-in-copr-for-august-2022/) - fedoramagazine.org - 8/2022
|
| 283 |
+
* [Docker로 오픈소스 푸시알람 프로젝트 ntfy.sh 설치 및 사용하기.(Feat. Uptimekuma)](https://svrforum.com/svr/398979) - svrforum.com - 8/2022
|
| 284 |
+
* [Easy notifications from R](https://sometimesir.com/posts/easy-notifications-from-r/) - sometimesir.com - 6/2022
|
| 285 |
+
* [ntfy is finally coming to iOS, and Matrix/UnifiedPush gateway support](https://www.reddit.com/r/selfhosted/comments/vdzvxi/ntfy_is_finally_coming_to_ios_with_full/) ⭐ - reddit.com - 6/2022
|
| 286 |
+
* [Install guide (with Docker)](https://chowdera.com/2022/150/202205301257379077.html) - chowdera.com - 5/2022
|
| 287 |
+
* [无需注册的通知服务ntfy](https://blog.csdn.net/wbsu2004/article/details/125040247) - blog.csdn.net - 5/2022
|
| 288 |
+
* [Updated review post (Jan-Lukas Else)](https://jlelse.blog/thoughts/2022/04/ntfy) - jlelse.blog - 4/2022
|
| 289 |
+
* [Using ntfy and Tasker together](https://lachlanlife.net/posts/2022-04-tasker-ntfy/) - lachlanlife.net - 4/2022
|
| 290 |
+
* [Reddit feature update post](https://www.reddit.com/r/selfhosted/comments/uetlso/ntfy_is_a_tool_to_send_push_notifications_to_your/) ⭐ - reddit.com - 4/2022
|
| 291 |
+
* [無料で簡単に通知の送受信ができつつオープンソースでセルフホストも可能な「ntfy」を使ってみた](https://gigazine.net/news/20220404-ntfy-push-notification/) - gigazine.net - 4/2022
|
| 292 |
+
* [Pocketmags ntfy review](https://pocketmags.com/us/linux-format-magazine/march-2022/articles/1104187/ntfy) - pocketmags.com - 3/2022
|
| 293 |
+
* [Reddit web app release post](https://www.reddit.com/r/selfhosted/comments/tc0p0u/say_hello_to_the_brand_new_ntfysh_web_app_push/) ⭐ - reddit.com- 3/2022
|
| 294 |
+
* [Lemmy post (Jakob)](https://lemmy.eus/post/15541) - lemmy.eus - 1/2022
|
| 295 |
+
* [Reddit UnifiedPush release post](https://www.reddit.com/r/selfhosted/comments/s5jylf/my_open_source_notification_android_app_and/) ⭐ - reddit.com - 1/2022
|
| 296 |
+
* [ntfy: send notifications from your computer to your phone](https://rs1.es/tutorials/2022/01/19/ntfy-send-notifications-phone.html) - rs1.es - 1/2022
|
| 297 |
+
* [Short ntfy review (Jan-Lukas Else)](https://jlelse.blog/links/2021/12/ntfy-sh) - jlelse.blog - 12/2021
|
| 298 |
+
* [Free MacroDroid webhook alternative (FrameXX)](https://www.macrodroidforum.com/index.php?threads/ntfy-sh-free-macrodroid-webhook-alternative.1505/) - macrodroidforum.com - 12/2021
|
| 299 |
+
* [ntfy otro sistema de notificaciones pub-sub simple basado en HTTP](https://ugeek.github.io/blog/post/2021-11-05-ntfy-sh-otro-sistema-de-notificaciones-pub-sub-simple-basado-en-http.html) - ugeek.github.io - 11/2021
|
| 300 |
+
* [Show HN: A tool to send push notifications to your phone, written in Go](https://news.ycombinator.com/item?id=29715464) ⭐ - news.ycombinator.com - 12/2021
|
| 301 |
+
* [Reddit selfhostable post](https://www.reddit.com/r/selfhosted/comments/qxlsm9/my_open_source_notification_android_app_and/) ⭐ - reddit.com - 11/2021
|
| 302 |
+
* [ntfy on The Canary in the Cage Podcast](https://odysee.com/@TheCanaryInTheCage:b/The-Canary-in-the-Cage-Episode-42:1?r=4gitYjTacQqPEjf22874USecDQYJ5y5E&t=3062) - odysee.com - 1/2025
|
| 303 |
+
* [NtfyPwsh - A PowerShell Module to Send Ntfy Messages](https://ptmorris1.github.io/posts/NtfyPwsh/) - github.io - 5/2025
|
| 304 |
+
|
| 305 |
+
Alternative ntfy servers[¶](https://docs.ntfy.sh/integrations#alternative-ntfy-servers "Permanent link")
|
| 306 |
+
--------------------------------------------------------------------------------------------------------
|
| 307 |
+
|
| 308 |
+
Here's a list of public ntfy servers. As of right now, there is only one official server. The others are provided by the ntfy community. Thanks to everyone running a public server. **You guys rock!**
|
| 309 |
+
|
| 310 |
+
| URL | Country |
|
| 311 |
+
| --- | --- |
|
| 312 |
+
| [ntfy.sh](https://ntfy.sh/) (_Official_) | 🇺🇸 United States |
|
| 313 |
+
| [ntfy.tedomum.net](https://ntfy.tedomum.net/) | 🇫🇷 France |
|
| 314 |
+
| [ntfy.jae.fi](https://ntfy.jae.fi/) | 🇫🇮 Finland |
|
| 315 |
+
| [ntfy.adminforge.de](https://ntfy.adminforge.de/) | 🇩🇪 Germany |
|
| 316 |
+
| [ntfy.envs.net](https://ntfy.envs.net/) | 🇩🇪 Germany |
|
| 317 |
+
| [ntfy.mzte.de](https://ntfy.mzte.de/) | 🇩🇪 Germany |
|
| 318 |
+
| [ntfy.hostux.net](https://ntfy.hostux.net/) | 🇫🇷 France |
|
| 319 |
+
| [ntfy.fossman.de](https://ntfy.fossman.de/) | 🇩🇪 Germany |
|
| 320 |
+
|
| 321 |
+
Please be aware that **server operators can log your messages**. The project also cannot guarantee the reliability and uptime of third party servers, so use of each server is **at your own discretion**.
|
docs-ntfy-sh-known-issues-20250924.md
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
Title: Known issues - ntfy
|
| 2 |
+
|
| 3 |
+
URL Source: https://docs.ntfy.sh/known-issues
|
| 4 |
+
|
| 5 |
+
Markdown Content:
|
| 6 |
+
This is an incomplete list of known issues with the ntfy server, web app, Android app, and iOS app. You can find a complete list [on GitHub](https://github.com/binwiederhier/ntfy/labels/%F0%9F%AA%B2%20bug), but I thought it may be helpful to have the prominent ones here to link to.
|
| 7 |
+
|
| 8 |
+
iOS app not refreshing (see [#267](https://github.com/binwiederhier/ntfy/issues/267))[¶](https://docs.ntfy.sh/known-issues#ios-app-not-refreshing-see-267 "Permanent link")
|
| 9 |
+
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
| 10 |
+
|
| 11 |
+
For some (many?) users, the iOS app is not refreshing the view when new notifications come in. Until you manually swipe down, you do not see the newly arrived messages, even though the popup appeared before.
|
| 12 |
+
|
| 13 |
+
This is caused by some weirdness between the Notification Service Extension (NSE), SwiftUI and Core Data. I am entirely clueless on how to fix it, sadly, as it is ephemeral and not clear to me what is causing it.
|
| 14 |
+
|
| 15 |
+
Please send experienced iOS developers my way to help me figure this out.
|
| 16 |
+
|
| 17 |
+
iOS app not receiving notifications (anymore)[¶](https://docs.ntfy.sh/known-issues#ios-app-not-receiving-notifications-anymore "Permanent link")
|
| 18 |
+
------------------------------------------------------------------------------------------------------------------------------------------------
|
| 19 |
+
|
| 20 |
+
If notifications do not show up at all anymore, there are a few causes for it (that I know of):
|
| 21 |
+
|
| 22 |
+
**Firebase+APNS are being weird and buggy**:
|
| 23 |
+
|
| 24 |
+
If this is the case, usually it helps to **remove the topic/subscription and re-add it**. That will force Firebase to re-subscribe to the Firebase topic.
|
| 25 |
+
|
| 26 |
+
**Self-hosted only: No `upstream-base-url` set, or `base-url` mismatch**:
|
| 27 |
+
|
| 28 |
+
To make self-hosted servers work with the iOS app, I had to do some horrible things (see [iOS instant notifications](https://docs.ntfy.sh/config/#ios-instant-notifications) for details). Be sure that in your selfhosted server:
|
| 29 |
+
|
| 30 |
+
* Set `upstream-base-url: "https://ntfy.sh"` (**not your own hostname!**)
|
| 31 |
+
* Ensure that the URL you set in `base-url`**matches exactly** what you set the Default Server in iOS to
|
| 32 |
+
|
| 33 |
+
iOS app seeing "New message", but not real message content[¶](https://docs.ntfy.sh/known-issues#ios-app-seeing-new-message-but-not-real-message-content "Permanent link")
|
| 34 |
+
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
| 35 |
+
|
| 36 |
+
If you see `New message` notifications on iOS, your iPhone can likely not talk to your self-hosted server. Be sure that your iOS device and your ntfy server are either on the same network, or that your phone can actually reach the server.
|
| 37 |
+
|
| 38 |
+
Turn on tracing/debugging on the server (via `log-level: trace` or `log-level: debug`, see [troubleshooting](https://docs.ntfy.sh/troubleshooting/)), and read docs on [iOS instant notifications](https://docs.ntfy.sh/config/#ios-instant-notifications).
|
| 39 |
+
|
| 40 |
+
Safari does not play sounds for web push notifications[¶](https://docs.ntfy.sh/known-issues#safari-does-not-play-sounds-for-web-push-notifications "Permanent link")
|
| 41 |
+
--------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
| 42 |
+
|
| 43 |
+
Safari does not support playing sounds for web push notifications, and treats them all as silent. This will be fixed with iOS 17 / Safari 17, which will be released later in 2023.
|
| 44 |
+
|
| 45 |
+
PWA on iOS sometimes crashes with an IndexedDB error (see [#787](https://github.com/binwiederhier/ntfy/issues/787))[¶](https://docs.ntfy.sh/known-issues#pwa-on-ios-sometimes-crashes-with-an-indexeddb-error-see-787 "Permanent link")
|
| 46 |
+
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
| 47 |
+
|
| 48 |
+
When resuming the installed PWA from the background, it sometimes crashes with an error from IndexedDB/Dexie, due to a [WebKit bug](https://bugs.webkit.org/show_bug.cgi?id=197050). A reload will fix it until a permanent fix is found.
|
docs-ntfy-sh-publish-20250924.md
ADDED
|
@@ -0,0 +1,1329 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
Title: Sending messages - ntfy
|
| 2 |
+
|
| 3 |
+
URL Source: https://docs.ntfy.sh/publish
|
| 4 |
+
|
| 5 |
+
Markdown Content:
|
| 6 |
+
Skip to content
|
| 7 |
+
If you like ntfy, please consider sponsoring me via GitHub Sponsors or Liberapay , or subscribing to ntfy Pro.
|
| 8 |
+
ntfy
|
| 9 |
+
Sending messages
|
| 10 |
+
|
| 11 |
+
Initializing search
|
| 12 |
+
binwiederhier/ntfy
|
| 13 |
+
ntfy
|
| 14 |
+
Getting started
|
| 15 |
+
Publishing
|
| 16 |
+
Publishing
|
| 17 |
+
Sending messages
|
| 18 |
+
Table of contents
|
| 19 |
+
Message title
|
| 20 |
+
Message priority
|
| 21 |
+
Tags & emojis 🥳 🎉
|
| 22 |
+
Markdown formatting
|
| 23 |
+
Scheduled delivery
|
| 24 |
+
Webhooks (publish via GET)
|
| 25 |
+
Message templating
|
| 26 |
+
Pre-defined templates
|
| 27 |
+
Custom templates
|
| 28 |
+
Inline templating
|
| 29 |
+
Template syntax
|
| 30 |
+
Template functions
|
| 31 |
+
Publish as JSON
|
| 32 |
+
Action buttons
|
| 33 |
+
Defining actions
|
| 34 |
+
Using a header
|
| 35 |
+
Using a JSON array
|
| 36 |
+
Open website/app
|
| 37 |
+
Send Android broadcast
|
| 38 |
+
Send HTTP request
|
| 39 |
+
Click action
|
| 40 |
+
Attachments
|
| 41 |
+
Attach local file
|
| 42 |
+
Attach file from a URL
|
| 43 |
+
Icons
|
| 44 |
+
E-mail notifications
|
| 45 |
+
E-mail publishing
|
| 46 |
+
Phone calls
|
| 47 |
+
Authentication
|
| 48 |
+
Username + password
|
| 49 |
+
Access tokens
|
| 50 |
+
Query param
|
| 51 |
+
Advanced features
|
| 52 |
+
Message caching
|
| 53 |
+
Disable Firebase
|
| 54 |
+
UnifiedPush
|
| 55 |
+
Matrix Gateway
|
| 56 |
+
Public topics
|
| 57 |
+
Limitations
|
| 58 |
+
List of all parameters
|
| 59 |
+
Subscribing
|
| 60 |
+
Subscribing
|
| 61 |
+
From your phone
|
| 62 |
+
From the Web app
|
| 63 |
+
From the Desktop
|
| 64 |
+
From the CLI
|
| 65 |
+
Using the API
|
| 66 |
+
Self-hosting
|
| 67 |
+
Self-hosting
|
| 68 |
+
Installation
|
| 69 |
+
Configuration
|
| 70 |
+
Other things
|
| 71 |
+
Other things
|
| 72 |
+
FAQs
|
| 73 |
+
Examples
|
| 74 |
+
Integrations + projects
|
| 75 |
+
Release notes
|
| 76 |
+
Emojis 🥳 🎉
|
| 77 |
+
Template functions
|
| 78 |
+
Troubleshooting
|
| 79 |
+
Known issues
|
| 80 |
+
Deprecation notices
|
| 81 |
+
Development
|
| 82 |
+
Privacy policy
|
| 83 |
+
Publishing¶
|
| 84 |
+
|
| 85 |
+
Publishing messages can be done via HTTP PUT/POST or via the ntfy CLI. Topics are created on the fly by subscribing or publishing to them. Because there is no sign-up, the topic is essentially a password, so pick something that's not easily guessable.
|
| 86 |
+
|
| 87 |
+
Here's an example showing how to publish a simple message using a POST request:
|
| 88 |
+
|
| 89 |
+
Command line (curl)
|
| 90 |
+
ntfy CLI
|
| 91 |
+
HTTP
|
| 92 |
+
JavaScript
|
| 93 |
+
Go
|
| 94 |
+
PowerShell
|
| 95 |
+
Python
|
| 96 |
+
PHP
|
| 97 |
+
curl -d "Backup successful 😀" ntfy.sh/mytopic
|
| 98 |
+
|
| 99 |
+
|
| 100 |
+
If you have the Android app installed on your phone, this will create a notification that looks like this:
|
| 101 |
+
|
| 102 |
+
Android notification
|
| 103 |
+
|
| 104 |
+
There are more features related to publishing messages: You can set a notification priority, a title, and tag messages 🥳 🎉. Here's an example that uses some of them at together:
|
| 105 |
+
|
| 106 |
+
Command line (curl)
|
| 107 |
+
ntfy CLI
|
| 108 |
+
HTTP
|
| 109 |
+
JavaScript
|
| 110 |
+
Go
|
| 111 |
+
PowerShell
|
| 112 |
+
Python
|
| 113 |
+
PHP
|
| 114 |
+
curl \
|
| 115 |
+
-H "Title: Unauthorized access detected" \
|
| 116 |
+
-H "Priority: urgent" \
|
| 117 |
+
-H "Tags: warning,skull" \
|
| 118 |
+
-d "Remote access to phils-laptop detected. Act right away." \
|
| 119 |
+
ntfy.sh/phil_alerts
|
| 120 |
+
|
| 121 |
+
|
| 122 |
+
Urgent notification with tags and title
|
| 123 |
+
|
| 124 |
+
You can also do multi-line messages. Here's an example using a click action, an action button, an external image attachment and email publishing:
|
| 125 |
+
|
| 126 |
+
Command line (curl)
|
| 127 |
+
ntfy CLI
|
| 128 |
+
HTTP
|
| 129 |
+
JavaScript
|
| 130 |
+
Go
|
| 131 |
+
PowerShell
|
| 132 |
+
Python
|
| 133 |
+
PHP
|
| 134 |
+
curl \
|
| 135 |
+
-H "Click: https://home.nest.com/" \
|
| 136 |
+
-H "Attach: https://nest.com/view/yAxkasd.jpg" \
|
| 137 |
+
-H "Actions: http, Open door, https://api.nest.com/open/yAxkasd, clear=true" \
|
| 138 |
+
-H "Email: [email protected]" \
|
| 139 |
+
-d "There's someone at the door. 🐶
|
| 140 |
+
|
| 141 |
+
Please check if it's a good boy or a hooman.
|
| 142 |
+
Doggies have been known to ring the doorbell." \
|
| 143 |
+
ntfy.sh/mydoorbell
|
| 144 |
+
|
| 145 |
+
|
| 146 |
+
Notification using a click action, a user action, with an external image attachment and forwarded via email
|
| 147 |
+
Message title¶
|
| 148 |
+
|
| 149 |
+
Supported on:
|
| 150 |
+
|
| 151 |
+
|
| 152 |
+
|
| 153 |
+
The notification title is typically set to the topic short URL (e.g. ntfy.sh/mytopic). To override the title, you can set the X-Title header (or any of its aliases: Title, ti, or t).
|
| 154 |
+
|
| 155 |
+
Command line (curl)
|
| 156 |
+
ntfy CLI
|
| 157 |
+
HTTP
|
| 158 |
+
JavaScript
|
| 159 |
+
Go
|
| 160 |
+
PowerShell
|
| 161 |
+
Python
|
| 162 |
+
PHP
|
| 163 |
+
curl -H "X-Title: Dogs are better than cats" -d "Oh my ..." ntfy.sh/controversial
|
| 164 |
+
curl -H "Title: Dogs are better than cats" -d "Oh my ..." ntfy.sh/controversial
|
| 165 |
+
curl -H "t: Dogs are better than cats" -d "Oh my ..." ntfy.sh/controversial
|
| 166 |
+
|
| 167 |
+
|
| 168 |
+
Detail view of notification with title
|
| 169 |
+
|
| 170 |
+
Info
|
| 171 |
+
|
| 172 |
+
ntfy supports UTF-8 in HTTP headers, but not every library or programming language does. If non-ASCII characters are causing issues for you in the title (i.e. you're seeing ? symbols), you may also encode any header (including the title) as RFC 2047, e.g. =?UTF-8?B?8J+HqfCfh6o=?= (base64), or =?UTF-8?Q?=C3=84pfel?= (quoted-printable).
|
| 173 |
+
|
| 174 |
+
Message priority¶
|
| 175 |
+
|
| 176 |
+
Supported on:
|
| 177 |
+
|
| 178 |
+
|
| 179 |
+
|
| 180 |
+
All messages have a priority, which defines how urgently your phone notifies you. On Android, you can set custom notification sounds and vibration patterns on your phone to map to these priorities (see Android config).
|
| 181 |
+
|
| 182 |
+
The following priorities exist:
|
| 183 |
+
|
| 184 |
+
Priority Icon ID Name Description
|
| 185 |
+
Max priority 5 max/urgent Really long vibration bursts, default notification sound with a pop-over notification.
|
| 186 |
+
High priority 4 high Long vibration burst, default notification sound with a pop-over notification.
|
| 187 |
+
Default priority (none) 3 default Short default vibration and sound. Default notification behavior.
|
| 188 |
+
Low priority 2 low No vibration or sound. Notification will not visibly show up until notification drawer is pulled down.
|
| 189 |
+
Min priority 1 min No vibration or sound. The notification will be under the fold in "Other notifications".
|
| 190 |
+
|
| 191 |
+
You can set the priority with the header X-Priority (or any of its aliases: Priority, prio, or p).
|
| 192 |
+
|
| 193 |
+
Command line (curl)
|
| 194 |
+
ntfy CLI
|
| 195 |
+
HTTP
|
| 196 |
+
JavaScript
|
| 197 |
+
Go
|
| 198 |
+
PowerShell
|
| 199 |
+
Python
|
| 200 |
+
PHP
|
| 201 |
+
curl -H "X-Priority: 5" -d "An urgent message" ntfy.sh/phil_alerts
|
| 202 |
+
curl -H "Priority: low" -d "Low priority message" ntfy.sh/phil_alerts
|
| 203 |
+
curl -H p:4 -d "A high priority message" ntfy.sh/phil_alerts
|
| 204 |
+
|
| 205 |
+
|
| 206 |
+
Detail view of priority notifications
|
| 207 |
+
Tags & emojis 🥳 🎉¶
|
| 208 |
+
|
| 209 |
+
Supported on:
|
| 210 |
+
|
| 211 |
+
|
| 212 |
+
|
| 213 |
+
You can tag messages with emojis and other relevant strings:
|
| 214 |
+
|
| 215 |
+
Emojis: If a tag matches an emoji short code, it'll be converted to an emoji and prepended to title or message.
|
| 216 |
+
Other tags: If a tag doesn't match, it will be listed below the notification.
|
| 217 |
+
|
| 218 |
+
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 to figure out what tags can be converted to emojis. Here's an excerpt of emojis I've found very useful in alert messages:
|
| 219 |
+
|
| 220 |
+
Tag Emoji
|
| 221 |
+
+1 👍
|
| 222 |
+
partying_face 🥳
|
| 223 |
+
tada 🎉
|
| 224 |
+
heavy_check_mark ✔️
|
| 225 |
+
loudspeaker 📢
|
| 226 |
+
... ... Tag Emoji
|
| 227 |
+
-1 👎️
|
| 228 |
+
warning ⚠️
|
| 229 |
+
rotating_light ️🚨
|
| 230 |
+
triangular_flag_on_post 🚩
|
| 231 |
+
skull 💀
|
| 232 |
+
... ... Tag Emoji
|
| 233 |
+
facepalm 🤦
|
| 234 |
+
no_entry ⛔
|
| 235 |
+
no_entry_sign 🚫
|
| 236 |
+
cd 💿
|
| 237 |
+
computer 💻
|
| 238 |
+
... ...
|
| 239 |
+
|
| 240 |
+
You can set tags with the X-Tags header (or any of its aliases: Tags, tag, or ta). Specify multiple tags by separating them with a comma, e.g. tag1,tag2,tag3.
|
| 241 |
+
|
| 242 |
+
Command line (curl)
|
| 243 |
+
ntfy CLI
|
| 244 |
+
HTTP
|
| 245 |
+
JavaScript
|
| 246 |
+
Go
|
| 247 |
+
PowerShell
|
| 248 |
+
Python
|
| 249 |
+
PHP
|
| 250 |
+
curl -H "X-Tags: warning,mailsrv13,daily-backup" -d "Backup of mailsrv13 failed" ntfy.sh/backups
|
| 251 |
+
curl -H "Tags: horse,unicorn" -d "Unicorns are just horses with unique horns" ntfy.sh/backups
|
| 252 |
+
curl -H ta:dog -d "Dogs are awesome" ntfy.sh/backups
|
| 253 |
+
|
| 254 |
+
|
| 255 |
+
Detail view of notifications with tags
|
| 256 |
+
|
| 257 |
+
Info
|
| 258 |
+
|
| 259 |
+
ntfy supports UTF-8 in HTTP headers, but not every library or programming language does. If non-ASCII characters are causing issues for you in the title (i.e. you're seeing ? symbols), you may also encode the tags header or individual tags as RFC 2047, e.g. tag1,=?UTF-8?B?8J+HqfCfh6o=?= (base64), or =?UTF-8?Q?=C3=84pfel?=,tag2 (quoted-printable).
|
| 260 |
+
|
| 261 |
+
Markdown formatting¶
|
| 262 |
+
|
| 263 |
+
Supported on:
|
| 264 |
+
|
| 265 |
+
You can format messages using Markdown 🤩. That means you can use bold text, italicized text, links, images, and more. Supported Markdown features (web app only for now):
|
| 266 |
+
|
| 267 |
+
Emphasis such as bold (**bold**), italics (*italics*)
|
| 268 |
+
Links ([some tool](https://ntfy.sh))
|
| 269 |
+
Images ()
|
| 270 |
+
Code blocks (```code blocks```) and inline code (`inline code`)
|
| 271 |
+
Headings (# headings, ## headings, etc.)
|
| 272 |
+
Lists (- lists, 1. lists, etc.)
|
| 273 |
+
Blockquotes (> blockquotes)
|
| 274 |
+
Horizontal rules (---)
|
| 275 |
+
|
| 276 |
+
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:
|
| 277 |
+
|
| 278 |
+
Command line (curl)
|
| 279 |
+
ntfy CLI
|
| 280 |
+
HTTP
|
| 281 |
+
JavaScript
|
| 282 |
+
Go
|
| 283 |
+
PowerShell
|
| 284 |
+
Python
|
| 285 |
+
PHP
|
| 286 |
+
curl \
|
| 287 |
+
-d "Look ma, **bold text**, *italics*, ..." \
|
| 288 |
+
-H "Markdown: yes" \
|
| 289 |
+
ntfy.sh/mytopic
|
| 290 |
+
|
| 291 |
+
|
| 292 |
+
Here's what that looks like in the web app:
|
| 293 |
+
|
| 294 |
+
Markdown formatting in the web app
|
| 295 |
+
Scheduled delivery¶
|
| 296 |
+
|
| 297 |
+
Supported on:
|
| 298 |
+
|
| 299 |
+
|
| 300 |
+
|
| 301 |
+
You can delay the delivery of messages and let ntfy send them at a later date. This can be used to send yourself reminders or even to execute commands at a later date (if your subscriber acts on messages).
|
| 302 |
+
|
| 303 |
+
Usage is pretty straight forward. You can set the delivery time using the X-Delay header (or any of its aliases: Delay, X-At, At, X-In or In), either by specifying a Unix timestamp (e.g. 1639194738), a duration (e.g. 30m, 3h, 2 days), or a natural language time string (e.g. 10am, 8:30pm, tomorrow, 3pm, Tuesday, 7am, and more).
|
| 304 |
+
|
| 305 |
+
As of today, the minimum delay you can set is 10 seconds and the maximum delay is 3 days. This can be configured with the message-delay-limit option).
|
| 306 |
+
|
| 307 |
+
For the purposes of message caching, scheduled messages are kept in the cache until 12 hours after they were delivered (or whatever the server-side cache duration is set to). For instance, if a message is scheduled to be delivered in 3 days, it'll remain in the cache for 3 days and 12 hours. Also note that naturally, turning off server-side caching is not possible in combination with this feature.
|
| 308 |
+
|
| 309 |
+
Command line (curl)
|
| 310 |
+
ntfy CLI
|
| 311 |
+
HTTP
|
| 312 |
+
JavaScript
|
| 313 |
+
Go
|
| 314 |
+
PowerShell
|
| 315 |
+
Python
|
| 316 |
+
PHP
|
| 317 |
+
curl -H "At: tomorrow, 10am" -d "Good morning" ntfy.sh/hello
|
| 318 |
+
curl -H "In: 30min" -d "It's 30 minutes later now" ntfy.sh/reminder
|
| 319 |
+
curl -H "Delay: 1639194738" -d "Unix timestamps are awesome" ntfy.sh/itsaunixsystem
|
| 320 |
+
|
| 321 |
+
|
| 322 |
+
Here are a few examples (assuming today's date is 12/10/2021, 9am, Eastern Time Zone):
|
| 323 |
+
|
| 324 |
+
Delay/At/In header Message will be delivered at Explanation
|
| 325 |
+
30m 12/10/2021, 9:30am 30 minutes from now
|
| 326 |
+
2 hours 12/10/2021, 11:30am 2 hours from now
|
| 327 |
+
1 day 12/11/2021, 9am 24 hours from now
|
| 328 |
+
10am 12/10/2021, 10am Today at 10am (same day, because it's only 9am)
|
| 329 |
+
8am 12/11/2021, 8am Tomorrow at 8am (because it's 9am already)
|
| 330 |
+
1639152000 12/10/2021, 11am (EST) Today at 11am (EST)
|
| 331 |
+
Webhooks (publish via GET)¶
|
| 332 |
+
|
| 333 |
+
Supported on:
|
| 334 |
+
|
| 335 |
+
|
| 336 |
+
|
| 337 |
+
In addition to using PUT/POST, you can also send to topics via simple HTTP GET requests. This makes it easy to use a ntfy topic as a webhook, or if your client has limited HTTP support.
|
| 338 |
+
|
| 339 |
+
To send messages via HTTP GET, simply call the /publish endpoint (or its aliases /send and /trigger). Without any arguments, this will send the message triggered to the topic. However, you can provide all arguments that are also supported as HTTP headers as URL-encoded arguments. Be sure to check the list of all supported parameters and headers for details.
|
| 340 |
+
|
| 341 |
+
For instance, assuming your topic is mywebhook, you can simply call /mywebhook/trigger to send a message (aka trigger the webhook):
|
| 342 |
+
|
| 343 |
+
Command line (curl)
|
| 344 |
+
ntfy CLI
|
| 345 |
+
HTTP
|
| 346 |
+
JavaScript
|
| 347 |
+
Go
|
| 348 |
+
PowerShell
|
| 349 |
+
Python
|
| 350 |
+
PHP
|
| 351 |
+
curl ntfy.sh/mywebhook/trigger
|
| 352 |
+
|
| 353 |
+
|
| 354 |
+
To add a custom message, simply append the message= URL parameter. And of course you can set the message priority, the message title, and tags as well. For a full list of possible parameters, check the list of supported parameters and headers.
|
| 355 |
+
|
| 356 |
+
Here's an example with a custom message, tags and a priority:
|
| 357 |
+
|
| 358 |
+
Command line (curl)
|
| 359 |
+
ntfy CLI
|
| 360 |
+
HTTP
|
| 361 |
+
JavaScript
|
| 362 |
+
Go
|
| 363 |
+
PowerShell
|
| 364 |
+
Python
|
| 365 |
+
PHP
|
| 366 |
+
curl "ntfy.sh/mywebhook/publish?message=Webhook+triggered&priority=high&tags=warning,skull"
|
| 367 |
+
|
| 368 |
+
Message templating¶
|
| 369 |
+
|
| 370 |
+
Supported on:
|
| 371 |
+
|
| 372 |
+
|
| 373 |
+
|
| 374 |
+
Templating lets you format a JSON message body into human-friendly message and title text using Go templates (see tutorials here, here, and here). This is specifically useful when combined with webhooks from services such as GitHub, Grafana, Alertmanager, or other services that emit JSON webhooks.
|
| 375 |
+
|
| 376 |
+
Instead of using a separate bridge program to parse the webhook body into the format ntfy expects, you can include a templated message and/or a templated title which will be populated based on the fields of the webhook body (so long as the webhook body is valid JSON).
|
| 377 |
+
|
| 378 |
+
You can enable templating by setting the X-Template header (or its aliases Template or tpl, or the query parameter ?template=...):
|
| 379 |
+
|
| 380 |
+
Pre-defined template files: Setting the X-Template header or query parameter to a pre-defined template name (one of github, grafana, or alertmanager, such as ?template=github) will use the built-in template with that name. See pre-defined templates for more details.
|
| 381 |
+
Custom template files: Setting the X-Template header or query parameter to a custom template name (e.g. ?template=myapp) will use a custom template file from the template directory (defaults to /etc/ntfy/templates, can be overridden with template-dir). See custom templates for more details.
|
| 382 |
+
Inline templating: Setting the X-Template header or query parameter to yes or 1 (e.g. ?template=yes) will enable inline templating, which means that the message and/or title will be parsed as a Go template. See inline templating for more details.
|
| 383 |
+
|
| 384 |
+
To learn the basics of Go's templating language, please see template syntax.
|
| 385 |
+
|
| 386 |
+
Pre-defined templates¶
|
| 387 |
+
|
| 388 |
+
When X-Template: <name> (aliases: Template: <name>, Tpl: <name>) or ?template=<name> is set, ntfy will transform the message and/or title based on one of the built-in pre-defined templates.
|
| 389 |
+
|
| 390 |
+
The following pre-defined templates are available:
|
| 391 |
+
|
| 392 |
+
github: Formats a subset of GitHub webhook payloads (PRs, issues, new star, new watcher, new comment). See github.yml.
|
| 393 |
+
grafana: Formats Grafana webhook payloads (firing/resolved alerts). See grafana.yml.
|
| 394 |
+
alertmanager: Formats Alertmanager webhook payloads (firing/resolved alerts). See alertmanager.yml.
|
| 395 |
+
|
| 396 |
+
To override the pre-defined templates, you can place a file with the same name in the template directory (defaults to /etc/ntfy/templates, can be overridden with template-dir). See custom templates for more details.
|
| 397 |
+
|
| 398 |
+
Here's an example of how to use the pre-defined github template:
|
| 399 |
+
|
| 400 |
+
First, configure the webhook in GitHub to send a webhook to your ntfy topic, e.g. https://ntfy.sh/mytopic?template=github.
|
| 401 |
+
|
| 402 |
+
GitHub webhook configuration
|
| 403 |
+
|
| 404 |
+
After that, when GitHub publishes a JSON webhook to the topic, ntfy will transform it according to the template rules and you'll receive notifications in the ntfy app. Here's an example for when somebody stars your repository:
|
| 405 |
+
|
| 406 |
+
Receiving a webhook, formatted using the pre-defined "github" template
|
| 407 |
+
Custom templates¶
|
| 408 |
+
|
| 409 |
+
To define your own custom templates, place a template file in the template directory (defaults to /etc/ntfy/templates, can be overridden with template-dir) and set the X-Template header or query parameter to the name of the template file (without the .yml extension).
|
| 410 |
+
|
| 411 |
+
For example, if you have a template file /etc/ntfy/templates/myapp.yml, you can set the header X-Template: myapp or the query parameter ?template=myapp to use it.
|
| 412 |
+
|
| 413 |
+
Template files must have the .yml (not: .yaml!) extension and must be formatted as YAML. They may contain title and message keys, which are interpreted as Go templates.
|
| 414 |
+
|
| 415 |
+
Here's an example custom template:
|
| 416 |
+
|
| 417 |
+
Custom template (/etc/ntfy/templates/myapp.yml)
|
| 418 |
+
title: |
|
| 419 |
+
{{- if eq .status "firing" }}
|
| 420 |
+
{{- if gt .percent 90.0 }}🚨 Critical alert
|
| 421 |
+
{{- else }}⚠️ Alert{{- end }}
|
| 422 |
+
{{- else if eq .status "resolved" }}
|
| 423 |
+
✅ Alert resolved
|
| 424 |
+
{{- end }}
|
| 425 |
+
message: |
|
| 426 |
+
Status: {{ .status }}
|
| 427 |
+
Type: {{ .type | upper }} ({{ .percent }}%)
|
| 428 |
+
Server: {{ .server }}
|
| 429 |
+
|
| 430 |
+
|
| 431 |
+
Once you have the template file in place, you can send the payload to your topic using the X-Template header or query parameter:
|
| 432 |
+
|
| 433 |
+
Command line (curl)
|
| 434 |
+
ntfy CLI
|
| 435 |
+
HTTP
|
| 436 |
+
JavaScript
|
| 437 |
+
Go
|
| 438 |
+
PowerShell
|
| 439 |
+
Python
|
| 440 |
+
PHP
|
| 441 |
+
echo '{"status":"firing","type":"cpu","server":"ntfy.sh","percent":99}' | \
|
| 442 |
+
curl -sT- "https://ntfy.example.com/mytopic?template=myapp"
|
| 443 |
+
|
| 444 |
+
|
| 445 |
+
Which will result in a notification that looks like this:
|
| 446 |
+
|
| 447 |
+
JSON webhook, transformed using a custom template
|
| 448 |
+
Inline templating¶
|
| 449 |
+
|
| 450 |
+
When X-Template: yes (aliases: Template: yes, Tpl: yes) or ?template=yes is set, you can use Go templates in the message and title fields of your webhook payload.
|
| 451 |
+
|
| 452 |
+
Inline templates are most useful for templated one-off messages, or if you do not control the ntfy server (e.g., if you're using ntfy.sh). Consider using pre-defined templates or custom templates instead, if you control the ntfy server, as templates are much easier to maintain.
|
| 453 |
+
|
| 454 |
+
Here's an example for a Grafana alert:
|
| 455 |
+
|
| 456 |
+
Grafana webhook, formatted using templates
|
| 457 |
+
|
| 458 |
+
This was sent using the following templates and payloads
|
| 459 |
+
|
| 460 |
+
Message template
|
| 461 |
+
Title template
|
| 462 |
+
Encoded webhook URL
|
| 463 |
+
Grafana-sent payload
|
| 464 |
+
{{range .alerts}}
|
| 465 |
+
{{.annotations.summary}}
|
| 466 |
+
|
| 467 |
+
Values:
|
| 468 |
+
{{range $k,$v := .values}}
|
| 469 |
+
- {{$k}}={{$v}}
|
| 470 |
+
{{end}}
|
| 471 |
+
{{end}}
|
| 472 |
+
|
| 473 |
+
|
| 474 |
+
Here's an easier example with a shorter JSON payload:
|
| 475 |
+
|
| 476 |
+
Command line (curl)
|
| 477 |
+
HTTP
|
| 478 |
+
JavaScript
|
| 479 |
+
Go
|
| 480 |
+
PowerShell
|
| 481 |
+
Python
|
| 482 |
+
PHP
|
| 483 |
+
# To use { and } in the URL without encoding, we need to turn off
|
| 484 |
+
# curl's globbing using --globoff
|
| 485 |
+
|
| 486 |
+
curl \
|
| 487 |
+
--globoff \
|
| 488 |
+
-d '{"hostname": "phil-pc", "error": {"level": "severe", "desc": "Disk has run out of space"}}' \
|
| 489 |
+
'ntfy.sh/mytopic?tpl=yes&t={{.hostname}}:+A+{{.error.level}}+error+has+occurred&m=Error+message:+{{.error.desc}}'
|
| 490 |
+
|
| 491 |
+
|
| 492 |
+
This example uses the message/m and title/t query parameters, but obviously this also works with the corresponding Message/Title headers. It will send a notification with a title phil-pc: A severe error has occurred and a message Error message: Disk has run out of space.
|
| 493 |
+
|
| 494 |
+
Template syntax¶
|
| 495 |
+
|
| 496 |
+
ntfy uses Go templates for its templates, which is arguably one of the most powerful, yet also one of the worst templating languages out there.
|
| 497 |
+
|
| 498 |
+
You can use the following features in your templates:
|
| 499 |
+
|
| 500 |
+
Variables, e.g. {{.alert.title}} or An error occurred: {{.error.desc}}
|
| 501 |
+
Conditionals (if/else, e.g. {{if eq .action "opened"}}..{{else}}..{{end}}, see example)
|
| 502 |
+
Loops (e.g. {{range .errors}}..{{end}}, see example)
|
| 503 |
+
|
| 504 |
+
A good way to experiment with Go templates is the Go Template Playground. It is highly recommended to test your templates there first (example for Grafana alert).
|
| 505 |
+
|
| 506 |
+
Template functions¶
|
| 507 |
+
|
| 508 |
+
ntfy supports a subset of the Sprig template functions (originally copied from Sprig, thank you to the Sprig developers 🙏). This is useful for advanced message templating and for transforming the data provided through the JSON payload.
|
| 509 |
+
|
| 510 |
+
Below are the functions that are available to use inside your message/title templates.
|
| 511 |
+
|
| 512 |
+
String Functions: trim, trunc, substr, plural, etc.
|
| 513 |
+
String List Functions: splitList, sortAlpha, etc.
|
| 514 |
+
Integer Math Functions: add, max, mul, etc.
|
| 515 |
+
Integer List Functions: until, untilStep
|
| 516 |
+
Float Math Functions: maxf, minf
|
| 517 |
+
Date Functions: now, date, etc.
|
| 518 |
+
Defaults Functions: default, empty, coalesce, fromJSON, toJSON, toPrettyJSON, toRawJSON, ternary
|
| 519 |
+
Encoding Functions: b64enc, b64dec, etc.
|
| 520 |
+
Lists and List Functions: list, first, uniq, etc.
|
| 521 |
+
Dictionaries and Dict Functions: get, set, dict, hasKey, pluck, dig, etc.
|
| 522 |
+
Type Conversion Functions: atoi, int64, toString, etc.
|
| 523 |
+
Path and Filepath Functions: base, dir, ext, clean, isAbs, osBase, osDir, osExt, osClean, osIsAbs
|
| 524 |
+
Flow Control Functions: fail
|
| 525 |
+
Advanced Functions
|
| 526 |
+
Reflection: typeOf, kindIs, typeIsLike, etc.
|
| 527 |
+
Cryptographic and Security Functions: sha256sum, etc.
|
| 528 |
+
URL: urlParse, urlJoin
|
| 529 |
+
Publish as JSON¶
|
| 530 |
+
|
| 531 |
+
Supported on:
|
| 532 |
+
|
| 533 |
+
|
| 534 |
+
|
| 535 |
+
For some integrations with other tools (e.g. Jellyfin, overseerr), adding custom headers to HTTP requests may be tricky or impossible, so ntfy also allows publishing the entire message as JSON in the request body.
|
| 536 |
+
|
| 537 |
+
To publish as JSON, simple PUT/POST the JSON object directly to the ntfy root URL. The message format is described below the example.
|
| 538 |
+
|
| 539 |
+
Info
|
| 540 |
+
|
| 541 |
+
To publish as JSON, you must PUT/POST to the ntfy root URL, not to the topic URL. Be sure to check that you're POST-ing to https://ntfy.sh/ (correct), and not to https://ntfy.sh/mytopic (incorrect).
|
| 542 |
+
|
| 543 |
+
Here's an example using most supported parameters. Check the table below for a complete list. The topic parameter is the only required one:
|
| 544 |
+
|
| 545 |
+
Command line (curl)
|
| 546 |
+
HTTP
|
| 547 |
+
JavaScript
|
| 548 |
+
Go
|
| 549 |
+
PowerShell
|
| 550 |
+
Python
|
| 551 |
+
PHP
|
| 552 |
+
curl ntfy.sh \
|
| 553 |
+
-d '{
|
| 554 |
+
"topic": "mytopic",
|
| 555 |
+
"message": "Disk space is low at 5.1 GB",
|
| 556 |
+
"title": "Low disk space alert",
|
| 557 |
+
"tags": ["warning","cd"],
|
| 558 |
+
"priority": 4,
|
| 559 |
+
"attach": "https://filesrv.lan/space.jpg",
|
| 560 |
+
"filename": "diskspace.jpg",
|
| 561 |
+
"click": "https://homecamera.lan/xasds1h2xsSsa/",
|
| 562 |
+
"actions": [{ "action": "view", "label": "Admin panel", "url": "https://filesrv.lan/admin" }]
|
| 563 |
+
}'
|
| 564 |
+
|
| 565 |
+
|
| 566 |
+
The JSON message format closely mirrors the format of the message you can consume when you subscribe via the API (see JSON message format for details), but is not exactly identical. Here's an overview of all the supported fields:
|
| 567 |
+
|
| 568 |
+
Field Required Type Example Description
|
| 569 |
+
topic ✔️ string topic1 Target topic name
|
| 570 |
+
message - string Some message Message body; set to triggered if empty or not passed
|
| 571 |
+
title - string Some title Message title
|
| 572 |
+
tags - string array ["tag1","tag2"] List of tags that may or not map to emojis
|
| 573 |
+
priority - int (one of: 1, 2, 3, 4, or 5) 4 Message priority with 1=min, 3=default and 5=max
|
| 574 |
+
actions - JSON array (see action buttons) Custom user action buttons for notifications
|
| 575 |
+
click - URL https://example.com Website opened when notification is clicked
|
| 576 |
+
attach - URL https://example.com/file.jpg URL of an attachment, see attach via URL
|
| 577 |
+
markdown - bool true Set to true if the message is Markdown-formatted
|
| 578 |
+
icon - string https://example.com/icon.png URL to use as notification icon
|
| 579 |
+
filename - string file.jpg File name of the attachment
|
| 580 |
+
delay - string 30min, 9am Timestamp or duration for delayed delivery
|
| 581 |
+
email - e-mail address [email protected] E-mail address for e-mail notifications
|
| 582 |
+
call - phone number or 'yes' +1222334444 or yes Phone number to use for voice call
|
| 583 |
+
Action buttons¶
|
| 584 |
+
|
| 585 |
+
Supported on:
|
| 586 |
+
|
| 587 |
+
|
| 588 |
+
|
| 589 |
+
You can add action buttons to notifications to allow yourself to react to a notification directly. This is incredibly useful and has countless applications.
|
| 590 |
+
|
| 591 |
+
You can control your home appliances (open/close garage door, change temperature on thermostat, ...), react to common monitoring alerts (clear logs when disk is full, ...), and many other things. The sky is the limit.
|
| 592 |
+
|
| 593 |
+
As of today, the following actions are supported:
|
| 594 |
+
|
| 595 |
+
view: Opens a website or app when the action button is tapped
|
| 596 |
+
broadcast: Sends an Android broadcast intent when the action button is tapped (only supported on Android)
|
| 597 |
+
http: Sends HTTP POST/GET/PUT request when the action button is tapped
|
| 598 |
+
|
| 599 |
+
Here's an example of what a notification with actions can look like:
|
| 600 |
+
|
| 601 |
+
Notification with two user actions
|
| 602 |
+
Defining actions¶
|
| 603 |
+
|
| 604 |
+
You can define up to three user actions in your notifications, using either of the following methods:
|
| 605 |
+
|
| 606 |
+
In the X-Actions header, using a simple comma-separated format
|
| 607 |
+
As a JSON array in the actions key, when publishing as JSON
|
| 608 |
+
Using a header¶
|
| 609 |
+
|
| 610 |
+
To define actions using the X-Actions header (or any of its aliases: Actions, Action), use the following format:
|
| 611 |
+
|
| 612 |
+
Header format (long)
|
| 613 |
+
Header format (short)
|
| 614 |
+
action=<action1>, label=<label1>, paramN=... [; action=<action2>, label=<label2>, ...]
|
| 615 |
+
|
| 616 |
+
|
| 617 |
+
Multiple actions are separated by a semicolon (;), and key/value pairs are separated by commas (,). Values may be quoted with double quotes (") or single quotes (') if the value itself contains commas or semicolons.
|
| 618 |
+
|
| 619 |
+
The action= and label= prefix are optional in all actions, and the url= prefix is optional in the view and http action. The only limitation of this format is that depending on your language/library, UTF-8 characters may not work. If they don't, use the JSON array format instead.
|
| 620 |
+
|
| 621 |
+
As an example, here's how you can create the above notification using this format. Refer to the view action and http action section for details on the specific actions:
|
| 622 |
+
|
| 623 |
+
Command line (curl)
|
| 624 |
+
ntfy CLI
|
| 625 |
+
HTTP
|
| 626 |
+
JavaScript
|
| 627 |
+
Go
|
| 628 |
+
PowerShell
|
| 629 |
+
Python
|
| 630 |
+
PHP
|
| 631 |
+
body='{"temperature": 65}'
|
| 632 |
+
curl \
|
| 633 |
+
-d "You left the house. Turn down the A/C?" \
|
| 634 |
+
-H "Actions: view, Open portal, https://home.nest.com/, clear=true; \
|
| 635 |
+
http, Turn down, https://api.nest.com/, body='$body'" \
|
| 636 |
+
ntfy.sh/myhome
|
| 637 |
+
|
| 638 |
+
|
| 639 |
+
Info
|
| 640 |
+
|
| 641 |
+
ntfy supports UTF-8 in HTTP headers, but not every library or programming language does. If non-ASCII characters are causing issues for you in the title (i.e. you're seeing ? symbols), you may also encode any header (including actions) as RFC 2047, e.g. =?UTF-8?B?8J+HqfCfh6o=?= (base64), or =?UTF-8?Q?=C3=84pfel?= (quoted-printable).
|
| 642 |
+
|
| 643 |
+
Using a JSON array¶
|
| 644 |
+
|
| 645 |
+
Alternatively, the same actions can be defined as JSON array, if the notification is defined as part of the JSON body (see publish as JSON):
|
| 646 |
+
|
| 647 |
+
Command line (curl)
|
| 648 |
+
ntfy CLI
|
| 649 |
+
HTTP
|
| 650 |
+
JavaScript
|
| 651 |
+
Go
|
| 652 |
+
PowerShell
|
| 653 |
+
Python
|
| 654 |
+
PHP
|
| 655 |
+
curl ntfy.sh \
|
| 656 |
+
-d '{
|
| 657 |
+
"topic": "myhome",
|
| 658 |
+
"message": "You left the house. Turn down the A/C?",
|
| 659 |
+
"actions": [
|
| 660 |
+
{
|
| 661 |
+
"action": "view",
|
| 662 |
+
"label": "Open portal",
|
| 663 |
+
"url": "https://home.nest.com/",
|
| 664 |
+
"clear": true
|
| 665 |
+
},
|
| 666 |
+
{
|
| 667 |
+
"action": "http",
|
| 668 |
+
"label": "Turn down",
|
| 669 |
+
"url": "https://api.nest.com/",
|
| 670 |
+
"body": "{\"temperature\": 65}"
|
| 671 |
+
}
|
| 672 |
+
]
|
| 673 |
+
}'
|
| 674 |
+
|
| 675 |
+
|
| 676 |
+
The required/optional fields for each action depend on the type of the action itself. Please refer to view action, broadcast action, and http action for details.
|
| 677 |
+
|
| 678 |
+
Open website/app¶
|
| 679 |
+
|
| 680 |
+
Supported on:
|
| 681 |
+
|
| 682 |
+
|
| 683 |
+
|
| 684 |
+
The view action opens a website or app when the action button is tapped, e.g. a browser, a Google Maps location, or even a deep link into Twitter or a show ntfy topic. How exactly the action is handled depends on how Android and your desktop browser treat the links. Normally it'll just open a link in the browser.
|
| 685 |
+
|
| 686 |
+
Examples:
|
| 687 |
+
|
| 688 |
+
http:// or https:// will open your browser (or an app if it registered for a URL)
|
| 689 |
+
mailto: links will open your mail app, e.g. mailto:[email protected]
|
| 690 |
+
geo: links will open Google Maps, e.g. geo:0,0?q=1600+Amphitheatre+Parkway,+Mountain+View,+CA
|
| 691 |
+
ntfy:// links will open ntfy (see ntfy:// links), e.g. ntfy://ntfy.sh/stats
|
| 692 |
+
twitter:// links will open Twitter, e.g. twitter://user?screen_name=..
|
| 693 |
+
...
|
| 694 |
+
|
| 695 |
+
Here's an example using the X-Actions header:
|
| 696 |
+
|
| 697 |
+
Command line (curl)
|
| 698 |
+
ntfy CLI
|
| 699 |
+
HTTP
|
| 700 |
+
JavaScript
|
| 701 |
+
Go
|
| 702 |
+
PowerShell
|
| 703 |
+
Python
|
| 704 |
+
PHP
|
| 705 |
+
curl \
|
| 706 |
+
-d "Somebody retweeted your tweet." \
|
| 707 |
+
-H "Actions: view, Open Twitter, https://twitter.com/binwiederhier/status/1467633927951163392" \
|
| 708 |
+
ntfy.sh/myhome
|
| 709 |
+
|
| 710 |
+
|
| 711 |
+
And the same example using JSON publishing:
|
| 712 |
+
|
| 713 |
+
Command line (curl)
|
| 714 |
+
ntfy CLI
|
| 715 |
+
HTTP
|
| 716 |
+
JavaScript
|
| 717 |
+
Go
|
| 718 |
+
PowerShell
|
| 719 |
+
Python
|
| 720 |
+
PHP
|
| 721 |
+
curl ntfy.sh \
|
| 722 |
+
-d '{
|
| 723 |
+
"topic": "myhome",
|
| 724 |
+
"message": "Somebody retweeted your tweet.",
|
| 725 |
+
"actions": [
|
| 726 |
+
{
|
| 727 |
+
"action": "view",
|
| 728 |
+
"label": "Open Twitter",
|
| 729 |
+
"url": "https://twitter.com/binwiederhier/status/1467633927951163392"
|
| 730 |
+
}
|
| 731 |
+
]
|
| 732 |
+
}'
|
| 733 |
+
|
| 734 |
+
|
| 735 |
+
The view action supports the following fields:
|
| 736 |
+
|
| 737 |
+
Field Required Type Default Example Description
|
| 738 |
+
action ✔️ string - view Action type (must be view)
|
| 739 |
+
label ✔️ string - Turn on light Label of the action button in the notification
|
| 740 |
+
url ✔️ URL - https://example.com URL to open when action is tapped
|
| 741 |
+
clear -️ boolean false true Clear notification after action button is tapped
|
| 742 |
+
Send Android broadcast¶
|
| 743 |
+
|
| 744 |
+
Supported on:
|
| 745 |
+
|
| 746 |
+
The broadcast action sends an Android broadcast intent when the action button is tapped. This allows integration into automation apps such as MacroDroid or Tasker, which basically means you can do everything your phone is capable of. Examples include taking pictures, launching/killing apps, change device settings, write/read files, etc.
|
| 747 |
+
|
| 748 |
+
By default, the intent action io.heckel.ntfy.USER_ACTION is broadcast, though this can be changed with the intent parameter (see below). To send extras, use the extras parameter. Currently, only string extras are supported.
|
| 749 |
+
|
| 750 |
+
Info
|
| 751 |
+
|
| 752 |
+
If you have no idea what this is, check out the automation apps section, which shows how to integrate Tasker and MacroDroid with screenshots. The action button integration is identical, except that you have to use the intent action io.heckel.ntfy.USER_ACTION instead.
|
| 753 |
+
|
| 754 |
+
Here's an example using the X-Actions header:
|
| 755 |
+
|
| 756 |
+
Command line (curl)
|
| 757 |
+
ntfy CLI
|
| 758 |
+
HTTP
|
| 759 |
+
JavaScript
|
| 760 |
+
Go
|
| 761 |
+
PowerShell
|
| 762 |
+
Python
|
| 763 |
+
PHP
|
| 764 |
+
curl \
|
| 765 |
+
-d "Your wife requested you send a picture of yourself." \
|
| 766 |
+
-H "Actions: broadcast, Take picture, extras.cmd=pic, extras.camera=front" \
|
| 767 |
+
ntfy.sh/wifey
|
| 768 |
+
|
| 769 |
+
|
| 770 |
+
And the same example using JSON publishing:
|
| 771 |
+
|
| 772 |
+
Command line (curl)
|
| 773 |
+
ntfy CLI
|
| 774 |
+
HTTP
|
| 775 |
+
JavaScript
|
| 776 |
+
Go
|
| 777 |
+
PowerShell
|
| 778 |
+
Python
|
| 779 |
+
PHP
|
| 780 |
+
curl ntfy.sh \
|
| 781 |
+
-d '{
|
| 782 |
+
"topic": "wifey",
|
| 783 |
+
"message": "Your wife requested you send a picture of yourself.",
|
| 784 |
+
"actions": [
|
| 785 |
+
{
|
| 786 |
+
"action": "broadcast",
|
| 787 |
+
"label": "Take picture",
|
| 788 |
+
"extras": {
|
| 789 |
+
"cmd": "pic",
|
| 790 |
+
"camera": "front"
|
| 791 |
+
}
|
| 792 |
+
}
|
| 793 |
+
]
|
| 794 |
+
}'
|
| 795 |
+
|
| 796 |
+
|
| 797 |
+
The broadcast action supports the following fields:
|
| 798 |
+
|
| 799 |
+
Field Required Type Default Example Description
|
| 800 |
+
action ✔️ string - broadcast Action type (must be broadcast)
|
| 801 |
+
label ✔️ string - Turn on light Label of the action button in the notification
|
| 802 |
+
intent -️ string io.heckel.ntfy.USER_ACTION com.example.AN_INTENT Android intent name, default is io.heckel.ntfy.USER_ACTION
|
| 803 |
+
extras -️ map of strings - see above Android intent extras. Currently, only string extras are supported. When publishing as JSON, extras are passed as a map. When the simple format is used, use extras.<param>=<value>.
|
| 804 |
+
clear -️ boolean false true Clear notification after action button is tapped
|
| 805 |
+
Send HTTP request¶
|
| 806 |
+
|
| 807 |
+
Supported on:
|
| 808 |
+
|
| 809 |
+
|
| 810 |
+
|
| 811 |
+
The http action sends a HTTP request when the action button is tapped. You can use this to trigger REST APIs for whatever systems you have, e.g. opening the garage door, or turning on/off lights.
|
| 812 |
+
|
| 813 |
+
By default, this action sends a POST request (not GET!), though this can be changed with the method parameter. The only required parameter is url. Headers can be passed along using the headers parameter.
|
| 814 |
+
|
| 815 |
+
Here's an example using the X-Actions header:
|
| 816 |
+
|
| 817 |
+
Command line (curl)
|
| 818 |
+
ntfy CLI
|
| 819 |
+
HTTP
|
| 820 |
+
JavaScript
|
| 821 |
+
Go
|
| 822 |
+
PowerShell
|
| 823 |
+
Python
|
| 824 |
+
PHP
|
| 825 |
+
curl \
|
| 826 |
+
-d "Garage door has been open for 15 minutes. Close it?" \
|
| 827 |
+
-H "Actions: http, Close door, https://api.mygarage.lan/, method=PUT, headers.Authorization=Bearer zAzsx1sk.., body={\"action\": \"close\"}" \
|
| 828 |
+
ntfy.sh/myhome
|
| 829 |
+
|
| 830 |
+
|
| 831 |
+
And the same example using JSON publishing:
|
| 832 |
+
|
| 833 |
+
Command line (curl)
|
| 834 |
+
ntfy CLI
|
| 835 |
+
HTTP
|
| 836 |
+
JavaScript
|
| 837 |
+
Go
|
| 838 |
+
PowerShell
|
| 839 |
+
Python
|
| 840 |
+
PHP
|
| 841 |
+
curl ntfy.sh \
|
| 842 |
+
-d '{
|
| 843 |
+
"topic": "myhome",
|
| 844 |
+
"message": "Garage door has been open for 15 minutes. Close it?",
|
| 845 |
+
"actions": [
|
| 846 |
+
{
|
| 847 |
+
"action": "http",
|
| 848 |
+
"label": "Close door",
|
| 849 |
+
"url": "https://api.mygarage.lan/",
|
| 850 |
+
"method": "PUT",
|
| 851 |
+
"headers": {
|
| 852 |
+
"Authorization": "Bearer zAzsx1sk.."
|
| 853 |
+
},
|
| 854 |
+
"body": "{\"action\": \"close\"}"
|
| 855 |
+
}
|
| 856 |
+
]
|
| 857 |
+
}'
|
| 858 |
+
|
| 859 |
+
|
| 860 |
+
The http action supports the following fields:
|
| 861 |
+
|
| 862 |
+
Field Required Type Default Example Description
|
| 863 |
+
action ✔️ string - http Action type (must be http)
|
| 864 |
+
label ✔️ string - Open garage door Label of the action button in the notification
|
| 865 |
+
url ✔️ string - https://ntfy.sh/mytopic URL to which the HTTP request will be sent
|
| 866 |
+
method -️ GET/POST/PUT/... POST ⚠️ GET HTTP method to use for request, default is POST ⚠️
|
| 867 |
+
headers -️ map of strings - see above HTTP headers to pass in request. When publishing as JSON, headers are passed as a map. When the simple format is used, use headers.<header1>=<value>.
|
| 868 |
+
body -️ string empty some body, somebody? HTTP body
|
| 869 |
+
clear -️ boolean false true Clear notification after HTTP request succeeds. If the request fails, the notification is not cleared.
|
| 870 |
+
Click action¶
|
| 871 |
+
|
| 872 |
+
Supported on:
|
| 873 |
+
|
| 874 |
+
|
| 875 |
+
|
| 876 |
+
You can define which URL to open when a notification is clicked. This may be useful if your notification is related to a Zabbix alert or a transaction that you'd like to provide the deep-link for. Tapping the notification will open the web browser (or the app) and open the website.
|
| 877 |
+
|
| 878 |
+
To define a click action for the notification, pass a URL as the value of the X-Click header (or its alias Click). If you pass a website URL (http:// or https://) the web browser will open. If you pass another URI that can be handled by another app, the responsible app may open.
|
| 879 |
+
|
| 880 |
+
Examples:
|
| 881 |
+
|
| 882 |
+
http:// or https:// will open your browser (or an app if it registered for a URL)
|
| 883 |
+
mailto: links will open your mail app, e.g. mailto:[email protected]
|
| 884 |
+
geo: links will open Google Maps, e.g. geo:0,0?q=1600+Amphitheatre+Parkway,+Mountain+View,+CA
|
| 885 |
+
ntfy:// links will open ntfy (see ntfy:// links), e.g. ntfy://ntfy.sh/stats
|
| 886 |
+
twitter:// links will open Twitter, e.g. twitter://user?screen_name=..
|
| 887 |
+
...
|
| 888 |
+
|
| 889 |
+
Here's an example that will open Reddit when the notification is clicked:
|
| 890 |
+
|
| 891 |
+
Command line (curl)
|
| 892 |
+
ntfy CLI
|
| 893 |
+
HTTP
|
| 894 |
+
JavaScript
|
| 895 |
+
Go
|
| 896 |
+
PowerShell
|
| 897 |
+
Python
|
| 898 |
+
PHP
|
| 899 |
+
curl \
|
| 900 |
+
-d "New messages on Reddit" \
|
| 901 |
+
-H "Click: https://www.reddit.com/message/messages" \
|
| 902 |
+
ntfy.sh/reddit_alerts
|
| 903 |
+
|
| 904 |
+
Attachments¶
|
| 905 |
+
|
| 906 |
+
Supported on:
|
| 907 |
+
|
| 908 |
+
|
| 909 |
+
You can send images and other files to your phone as attachments to a notification. The attachments are then downloaded onto your phone (depending on size and setting automatically), and can be used from the Downloads folder.
|
| 910 |
+
|
| 911 |
+
There are two different ways to send attachments:
|
| 912 |
+
|
| 913 |
+
sending a local file via PUT, e.g. from ~/Flowers/flower.jpg or ringtone.mp3
|
| 914 |
+
or by passing an external URL as an attachment, e.g. https://f-droid.org/F-Droid.apk
|
| 915 |
+
Attach local file¶
|
| 916 |
+
|
| 917 |
+
To send a file from your computer as an attachment, you can send it as the PUT request body. If a message is greater than the maximum message size (4,096 bytes) or consists of non UTF-8 characters, the ntfy server will automatically detect the mime type and size, and send the message as an attachment file. To send smaller text-only messages or files as attachments, you must pass a filename by passing the X-Filename header or query parameter (or any of its aliases Filename, File or f).
|
| 918 |
+
|
| 919 |
+
By default, and how ntfy.sh is configured, the max attachment size is 15 MB (with 100 MB total per visitor). Attachments expire after 3 hours, which typically is plenty of time for the user to download it, or for the Android app to auto-download it. Please also check out the other limits below.
|
| 920 |
+
|
| 921 |
+
Here's an example showing how to upload an image:
|
| 922 |
+
|
| 923 |
+
Command line (curl)
|
| 924 |
+
ntfy CLI
|
| 925 |
+
HTTP
|
| 926 |
+
JavaScript
|
| 927 |
+
Go
|
| 928 |
+
PowerShell
|
| 929 |
+
Python
|
| 930 |
+
PHP
|
| 931 |
+
curl \
|
| 932 |
+
-T flower.jpg \
|
| 933 |
+
-H "Filename: flower.jpg" \
|
| 934 |
+
ntfy.sh/flowers
|
| 935 |
+
|
| 936 |
+
|
| 937 |
+
Here's what that looks like on Android:
|
| 938 |
+
|
| 939 |
+
Image attachment sent from a local file
|
| 940 |
+
Attach file from a URL¶
|
| 941 |
+
|
| 942 |
+
Instead of sending a local file to your phone, you can use an external URL to specify where the attachment is hosted. This could be a Dropbox link, a file from social media, or any other publicly available URL. Since the files are externally hosted, the expiration or size limits from above do not apply here.
|
| 943 |
+
|
| 944 |
+
To attach an external file, simple pass the X-Attach header or query parameter (or any of its aliases Attach or a) to specify the attachment URL. It can be any type of file.
|
| 945 |
+
|
| 946 |
+
ntfy will automatically try to derive the file name from the URL (e.g https://example.com/flower.jpg will yield a filename flower.jpg). To override this filename, you may send the X-Filename header or query parameter (or any of its aliases Filename, File or f).
|
| 947 |
+
|
| 948 |
+
Here's an example showing how to attach an APK file:
|
| 949 |
+
|
| 950 |
+
Command line (curl)
|
| 951 |
+
ntfy CLI
|
| 952 |
+
HTTP
|
| 953 |
+
JavaScript
|
| 954 |
+
Go
|
| 955 |
+
PowerShell
|
| 956 |
+
Python
|
| 957 |
+
PHP
|
| 958 |
+
curl \
|
| 959 |
+
-X POST \
|
| 960 |
+
-H "Attach: https://f-droid.org/F-Droid.apk" \
|
| 961 |
+
ntfy.sh/mydownloads
|
| 962 |
+
|
| 963 |
+
|
| 964 |
+
File attachment sent from an external URL
|
| 965 |
+
Icons¶
|
| 966 |
+
|
| 967 |
+
Supported on:
|
| 968 |
+
|
| 969 |
+
You can include an icon that will appear next to the text of the notification. Simply pass the X-Icon header or query parameter (or its alias Icon) to specify the URL that the icon is located at. The client will automatically download the icon (unless it is already cached locally, and less than 24 hours old), and show it in the notification. Icons are cached locally in the client until the notification is deleted. Only JPEG and PNG images are supported at this time.
|
| 970 |
+
|
| 971 |
+
Here's an example showing how to include an icon:
|
| 972 |
+
|
| 973 |
+
Command line (curl)
|
| 974 |
+
ntfy CLI
|
| 975 |
+
HTTP
|
| 976 |
+
JavaScript
|
| 977 |
+
Go
|
| 978 |
+
PowerShell
|
| 979 |
+
Python
|
| 980 |
+
PHP
|
| 981 |
+
curl \
|
| 982 |
+
-H "Icon: https://styles.redditmedia.com/t5_32uhe/styles/communityIcon_xnt6chtnr2j21.png" \
|
| 983 |
+
-H "Title: Kodi: Resuming Playback" \
|
| 984 |
+
-H "Tags: arrow_forward" \
|
| 985 |
+
-d "The Wire, S01E01" \
|
| 986 |
+
ntfy.sh/tvshows
|
| 987 |
+
|
| 988 |
+
|
| 989 |
+
Here's an example of how it will look on Android:
|
| 990 |
+
|
| 991 |
+
Custom icon from an external URL
|
| 992 |
+
E-mail notifications¶
|
| 993 |
+
|
| 994 |
+
Supported on:
|
| 995 |
+
|
| 996 |
+
|
| 997 |
+
|
| 998 |
+
You can forward messages to e-mail by specifying an address in the header. This can be useful for messages that you'd like to persist longer, or to blast-notify yourself on all possible channels.
|
| 999 |
+
|
| 1000 |
+
Usage is easy: Simply pass the X-Email header (or any of its aliases: X-E-mail, Email, E-mail, Mail, or e). Only one e-mail address is supported.
|
| 1001 |
+
|
| 1002 |
+
Since ntfy does not provide auth (yet), the rate limiting is pretty strict (see limitations). In the default configuration, you get 16 e-mails per visitor (IP address) and then after that one per hour. On top of that, your IP address appears in the e-mail body. This is to prevent abuse.
|
| 1003 |
+
|
| 1004 |
+
Command line (curl)
|
| 1005 |
+
ntfy CLI
|
| 1006 |
+
HTTP
|
| 1007 |
+
JavaScript
|
| 1008 |
+
Go
|
| 1009 |
+
PowerShell
|
| 1010 |
+
Python
|
| 1011 |
+
PHP
|
| 1012 |
+
curl \
|
| 1013 |
+
-H "Email: [email protected]" \
|
| 1014 |
+
-H "Tags: warning,skull,backup-host,ssh-login" \
|
| 1015 |
+
-H "Priority: high" \
|
| 1016 |
+
-d "Unknown login from 5.31.23.83 to backups.example.com" \
|
| 1017 |
+
ntfy.sh/alerts
|
| 1018 |
+
curl -H "Email: [email protected]" -d "You've Got Mail"
|
| 1019 |
+
curl -d "You've Got Mail" "ntfy.sh/[email protected]"
|
| 1020 |
+
|
| 1021 |
+
|
| 1022 |
+
Here's what that looks like in Google Mail:
|
| 1023 |
+
|
| 1024 |
+
E-mail notification
|
| 1025 |
+
E-mail publishing¶
|
| 1026 |
+
|
| 1027 |
+
Supported on:
|
| 1028 |
+
|
| 1029 |
+
|
| 1030 |
+
|
| 1031 |
+
You can publish messages to a topic via e-mail, i.e. by sending an email to a specific address. For instance, you can publish a message to the topic sometopic by sending an e-mail to [email protected]. This is useful for e-mail based integrations such as for statuspage.io (though these days most services also support webhooks and HTTP calls).
|
| 1032 |
+
|
| 1033 |
+
Depending on the server configuration, the e-mail address format can have a prefix to prevent spam on topics. For ntfy.sh, the prefix is configured to ntfy-, meaning that the general e-mail address format is:
|
| 1034 |
+
|
| 1035 | |
| 1036 |
+
|
| 1037 |
+
|
| 1038 |
+
If access control is enabled, and the target topic does not support anonymous writes, e-mail publishing won't work without providing an authorized access token or using SMTP AUTH PLAIN.
|
| 1039 |
+
|
| 1040 |
+
If you use access tokens, that will change the format of the e-mail's recipient address to
|
| 1041 |
+
|
| 1042 | |
| 1043 |
+
|
| 1044 |
+
|
| 1045 |
+
To use username/password, you can use SMTP PLAIN auth when authenticating to the ntfy server.
|
| 1046 |
+
|
| 1047 |
+
As of today, e-mail publishing only supports adding a message title (the e-mail subject). Tags, priority, delay and other features are not supported (yet). Here's an example that will publish a message with the title You've Got Mail to topic sometopic (see ntfy.sh/sometopic):
|
| 1048 |
+
|
| 1049 |
+
Publishing a message via e-mail
|
| 1050 |
+
Phone calls¶
|
| 1051 |
+
|
| 1052 |
+
Supported on:
|
| 1053 |
+
|
| 1054 |
+
|
| 1055 |
+
|
| 1056 |
+
You can use ntfy to call a phone and read the message out loud using text-to-speech. Similar to email notifications, this can be useful to blast-notify yourself on all possible channels, or to notify people that do not have the ntfy app installed on their phone.
|
| 1057 |
+
|
| 1058 |
+
Phone numbers have to be previously verified (via the web app), so this feature is only available to authenticated users (no anonymous phone calls). To forward a message as a voice call, pass a phone number in the X-Call header (or its alias: Call), prefixed with a plus sign and the country code, e.g. +12223334444. You may also simply pass yes as a value to pick the first of your verified phone numbers. On ntfy.sh, this feature is only supported to ntfy Pro plans.
|
| 1059 |
+
|
| 1060 |
+
Phone number verification in the web app
|
| 1061 |
+
|
| 1062 |
+
As of today, the text-to-speed voice used will only support English. If there is demand for other languages, we'll be happy to add support for that. Please open an issue on GitHub.
|
| 1063 |
+
|
| 1064 |
+
Info
|
| 1065 |
+
|
| 1066 |
+
You are responsible for the message content, and you must abide by the Twilio Acceptable Use Policy. This particularly means that you must not use this feature to send unsolicited messages, or messages that are illegal or violate the rights of others. Please read the policy for details. Failure to do so may result in your account being suspended or terminated.
|
| 1067 |
+
|
| 1068 |
+
Here's how you use it:
|
| 1069 |
+
|
| 1070 |
+
Command line (curl)
|
| 1071 |
+
ntfy CLI
|
| 1072 |
+
HTTP
|
| 1073 |
+
JavaScript
|
| 1074 |
+
Go
|
| 1075 |
+
PowerShell
|
| 1076 |
+
Python
|
| 1077 |
+
PHP
|
| 1078 |
+
curl \
|
| 1079 |
+
-u :tk_AgQdq7mVBoFD37zQVN29RhuMzNIz2 \
|
| 1080 |
+
-H "Call: +12223334444" \
|
| 1081 |
+
-d "Your garage seems to be on fire. You should probably check that out." \
|
| 1082 |
+
ntfy.sh/alerts
|
| 1083 |
+
|
| 1084 |
+
|
| 1085 |
+
Here's what a phone call from ntfy sounds like:
|
| 1086 |
+
|
| 1087 |
+
Audio transcript:
|
| 1088 |
+
|
| 1089 |
+
You have a notification from ntfy on topic alerts.
|
| 1090 |
+
Message: Your garage seems to be on fire. You should probably check that out. End message.
|
| 1091 |
+
This message was sent by user phil. It will be repeated up to three times.
|
| 1092 |
+
|
| 1093 |
+
Authentication¶
|
| 1094 |
+
|
| 1095 |
+
Depending on whether the server is configured to support access control, some topics may be read/write protected so that only users with the correct credentials can subscribe or publish to them. To publish/subscribe to protected topics, you can:
|
| 1096 |
+
|
| 1097 |
+
Use username & password via Basic auth, e.g. Authorization: Basic dGVzdHVzZXI6ZmFrZXBhc3N3b3Jk
|
| 1098 |
+
Use access tokens via Bearer/Basic auth, e.g. Authorization: Bearer tk_AgQdq7mVBoFD37zQVN29RhuMzNIz2
|
| 1099 |
+
or use either with the auth query parameter, e.g. ?auth=QmFzaWMgZEdWemRIVnpaWEk2Wm1GclpYQmhjM04zYjNKaw
|
| 1100 |
+
|
| 1101 |
+
Warning
|
| 1102 |
+
|
| 1103 |
+
When using Basic auth, base64 only encodes username and password. It is not encrypting it. For your self-hosted server, be sure to use HTTPS to avoid eavesdropping and exposing your password.
|
| 1104 |
+
|
| 1105 |
+
Username + password¶
|
| 1106 |
+
|
| 1107 |
+
The simplest way to authenticate against a ntfy server is to use Basic auth. Here's an example with a user testuser and password fakepassword:
|
| 1108 |
+
|
| 1109 |
+
Command line (curl)
|
| 1110 |
+
ntfy CLI
|
| 1111 |
+
HTTP
|
| 1112 |
+
JavaScript
|
| 1113 |
+
Go
|
| 1114 |
+
PowerShell 7+
|
| 1115 |
+
PowerShell 5 and earlier
|
| 1116 |
+
Python
|
| 1117 |
+
PHP
|
| 1118 |
+
curl \
|
| 1119 |
+
-u testuser:fakepassword \
|
| 1120 |
+
-d "Look ma, with auth" \
|
| 1121 |
+
https://ntfy.example.com/mysecrets
|
| 1122 |
+
|
| 1123 |
+
|
| 1124 |
+
To generate the Authorization header, use standard base64 to encode the colon-separated <username>:<password> and prepend the word Basic, i.e. Authorization: Basic base64(<username>:<password>). Here's some pseudo-code that hopefully explains it better:
|
| 1125 |
+
|
| 1126 |
+
username = "testuser"
|
| 1127 |
+
password = "fakepassword"
|
| 1128 |
+
authHeader = "Basic " + base64(username + ":" + password) // -> Basic dGVzdHVzZXI6ZmFrZXBhc3N3b3Jk
|
| 1129 |
+
|
| 1130 |
+
|
| 1131 |
+
The following command will generate the appropriate value for you on *nix systems:
|
| 1132 |
+
|
| 1133 |
+
echo "Basic $(echo -n 'testuser:fakepassword' | base64)"
|
| 1134 |
+
|
| 1135 |
+
Access tokens¶
|
| 1136 |
+
|
| 1137 |
+
In addition to username/password auth, ntfy also provides authentication via access tokens. Access tokens are useful to avoid having to configure your password across multiple publishing/subscribing applications. For instance, you may want to use a dedicated token to publish from your backup host, and one from your home automation system.
|
| 1138 |
+
|
| 1139 |
+
You can create access tokens using the ntfy token command, or in the web app in the "Account" section (when logged in). See access tokens for details.
|
| 1140 |
+
|
| 1141 |
+
Once an access token is created, you can use it to authenticate against the ntfy server, e.g. when you publish or subscribe to topics. Here's an example using Bearer auth, with the token tk_AgQdq7mVBoFD37zQVN29RhuMzNIz2:
|
| 1142 |
+
|
| 1143 |
+
Command line (curl)
|
| 1144 |
+
ntfy CLI
|
| 1145 |
+
HTTP
|
| 1146 |
+
JavaScript
|
| 1147 |
+
Go
|
| 1148 |
+
PowerShell 7+
|
| 1149 |
+
PowerShell 5 and earlier
|
| 1150 |
+
Python
|
| 1151 |
+
PHP
|
| 1152 |
+
curl \
|
| 1153 |
+
-H "Authorization: Bearer tk_AgQdq7mVBoFD37zQVN29RhuMzNIz2" \
|
| 1154 |
+
-d "Look ma, with auth" \
|
| 1155 |
+
https://ntfy.example.com/mysecrets
|
| 1156 |
+
|
| 1157 |
+
|
| 1158 |
+
Alternatively, you can use Basic Auth to send the access token. When sending an empty username, the basic auth password is treated by the ntfy server as an access token. This is primarily useful to make curl calls easier, e.g. curl -u:tk_AgQdq7mVBoFD37zQVN29RhuMzNIz2 ...:
|
| 1159 |
+
|
| 1160 |
+
Command line (curl)
|
| 1161 |
+
ntfy CLI
|
| 1162 |
+
HTTP
|
| 1163 |
+
JavaScript
|
| 1164 |
+
Go
|
| 1165 |
+
PowerShell
|
| 1166 |
+
Python
|
| 1167 |
+
PHP
|
| 1168 |
+
curl \
|
| 1169 |
+
-u :tk_AgQdq7mVBoFD37zQVN29RhuMzNIz2 \
|
| 1170 |
+
-d "Look ma, with auth" \
|
| 1171 |
+
https://ntfy.example.com/mysecrets
|
| 1172 |
+
|
| 1173 |
+
Query param¶
|
| 1174 |
+
|
| 1175 |
+
Here's an example using the auth query parameter:
|
| 1176 |
+
|
| 1177 |
+
Command line (curl)
|
| 1178 |
+
ntfy CLI
|
| 1179 |
+
HTTP
|
| 1180 |
+
JavaScript
|
| 1181 |
+
Go
|
| 1182 |
+
PowerShell
|
| 1183 |
+
Python
|
| 1184 |
+
PHP
|
| 1185 |
+
curl \
|
| 1186 |
+
-d "Look ma, with auth" \
|
| 1187 |
+
"https://ntfy.example.com/mysecrets?auth=QmFzaWMgZEdWemRIVnpaWEk2Wm1GclpYQmhjM04zYjNKaw"
|
| 1188 |
+
|
| 1189 |
+
|
| 1190 |
+
To generate the value of the auth parameter, encode the value of the Authorization header (see above) using raw base64 encoding (like base64, but strip any trailing =). Here's some pseudo-code that hopefully explains it better:
|
| 1191 |
+
|
| 1192 |
+
username = "testuser"
|
| 1193 |
+
password = "fakepassword"
|
| 1194 |
+
authHeader = "Basic " + base64(username + ":" + password) // -> Basic dGVzdHVzZXI6ZmFrZXBhc3N3b3Jk
|
| 1195 |
+
authParam = base64_raw(authHeader) // -> QmFzaWMgZEdWemRIVnpaWEk2Wm1GclpYQmhjM04zYjNKaw (no trailing =)
|
| 1196 |
+
|
| 1197 |
+
// If your language does not have a function to encode raw base64, simply use normal base64
|
| 1198 |
+
// and REMOVE TRAILING "=" characters.
|
| 1199 |
+
|
| 1200 |
+
|
| 1201 |
+
The following command will generate the appropriate value for you on *nix systems:
|
| 1202 |
+
|
| 1203 |
+
echo -n "Basic `echo -n 'testuser:fakepassword' | base64 -w0`" | base64 -w0 | tr -d '='
|
| 1204 |
+
|
| 1205 |
+
|
| 1206 |
+
For access tokens, you can use this instead:
|
| 1207 |
+
|
| 1208 |
+
echo -n "Bearer faketoken" | base64 -w0 | tr -d '='
|
| 1209 |
+
|
| 1210 |
+
Advanced features¶
|
| 1211 |
+
Message caching¶
|
| 1212 |
+
|
| 1213 |
+
Info
|
| 1214 |
+
|
| 1215 |
+
If Cache: no is used, messages will only be delivered to connected subscribers, and won't be re-delivered if a client re-connects. If a subscriber has (temporary) network issues or is reconnecting momentarily, messages might be missed.
|
| 1216 |
+
|
| 1217 |
+
By default, the ntfy server caches messages on disk for 12 hours (see message caching), so all messages you publish are stored server-side for a little while. The reason for this is to overcome temporary client-side network disruptions, but arguably this feature also may raise privacy concerns.
|
| 1218 |
+
|
| 1219 |
+
To avoid messages being cached server-side entirely, you can set X-Cache header (or its alias: Cache) to no. This will make sure that your message is not cached on the server, even if server-side caching is enabled. Messages are still delivered to connected subscribers, but since= and poll=1 won't return the message anymore.
|
| 1220 |
+
|
| 1221 |
+
Command line (curl)
|
| 1222 |
+
ntfy CLI
|
| 1223 |
+
HTTP
|
| 1224 |
+
JavaScript
|
| 1225 |
+
Go
|
| 1226 |
+
PowerShell
|
| 1227 |
+
Python
|
| 1228 |
+
PHP
|
| 1229 |
+
curl -H "X-Cache: no" -d "This message won't be stored server-side" ntfy.sh/mytopic
|
| 1230 |
+
curl -H "Cache: no" -d "This message won't be stored server-side" ntfy.sh/mytopic
|
| 1231 |
+
|
| 1232 |
+
Disable Firebase¶
|
| 1233 |
+
|
| 1234 |
+
Info
|
| 1235 |
+
|
| 1236 |
+
If Firebase: no is used and instant delivery isn't enabled in the Android app (Google Play variant only), message delivery will be significantly delayed (up to 15 minutes). To overcome this delay, simply enable instant delivery.
|
| 1237 |
+
|
| 1238 |
+
The ntfy server can be configured to use Firebase Cloud Messaging (FCM) (see Firebase config) for message delivery on Android (to minimize the app's battery footprint). The ntfy.sh server is configured this way, meaning that all messages published to ntfy.sh are also published to corresponding FCM topics.
|
| 1239 |
+
|
| 1240 |
+
If you'd like to avoid forwarding messages to Firebase, you can set the X-Firebase header (or its alias: Firebase) to no. This will instruct the server not to forward messages to Firebase.
|
| 1241 |
+
|
| 1242 |
+
Command line (curl)
|
| 1243 |
+
ntfy CLI
|
| 1244 |
+
HTTP
|
| 1245 |
+
JavaScript
|
| 1246 |
+
Go
|
| 1247 |
+
PowerShell
|
| 1248 |
+
Python
|
| 1249 |
+
PHP
|
| 1250 |
+
curl -H "X-Firebase: no" -d "This message won't be forwarded to FCM" ntfy.sh/mytopic
|
| 1251 |
+
curl -H "Firebase: no" -d "This message won't be forwarded to FCM" ntfy.sh/mytopic
|
| 1252 |
+
|
| 1253 |
+
UnifiedPush¶
|
| 1254 |
+
|
| 1255 |
+
Info
|
| 1256 |
+
|
| 1257 |
+
This setting is not relevant to users, only to app developers and people interested in UnifiedPush.
|
| 1258 |
+
|
| 1259 |
+
UnifiedPush is a standard for receiving push notifications without using the Google-owned Firebase Cloud Messaging (FCM) service. It puts push notifications in the control of the user. ntfy can act as a UnifiedPush distributor, forwarding messages to apps that support it.
|
| 1260 |
+
|
| 1261 |
+
When publishing messages to a topic, apps using ntfy as a UnifiedPush distributor can set the X-UnifiedPush header or query parameter (or any of its aliases unifiedpush or up) to 1 to disable Firebase. As of today, this option is mostly equivalent to Firebase: no, but was introduced to allow future flexibility. The flag additionally enables auto-detection of the message encoding. If the message is binary, it'll be encoded as base64.
|
| 1262 |
+
|
| 1263 |
+
Matrix Gateway¶
|
| 1264 |
+
|
| 1265 |
+
The ntfy server implements a Matrix Push Gateway (in combination with UnifiedPush as the Provider Push Protocol). This makes it easier to integrate with self-hosted Matrix servers (such as synapse), since you don't have to set up a separate push proxy (such as common-proxies).
|
| 1266 |
+
|
| 1267 |
+
In short, ntfy accepts Matrix messages on the /_matrix/push/v1/notify endpoint (see Push Gateway API), and forwards them to the ntfy topic defined in the pushkey of the message. The message will then be forwarded to the ntfy Android app, and passed on to the Matrix client there.
|
| 1268 |
+
|
| 1269 |
+
There is a nice diagram in the Push Gateway docs. In this diagram, the ntfy server plays the role of the Push Gateway, as well as the Push Provider. UnifiedPush is the Provider Push Protocol.
|
| 1270 |
+
|
| 1271 |
+
Info
|
| 1272 |
+
|
| 1273 |
+
This is not a generic Matrix Push Gateway. It only works in combination with UnifiedPush and ntfy.
|
| 1274 |
+
|
| 1275 |
+
Public topics¶
|
| 1276 |
+
|
| 1277 |
+
Obviously all topics on ntfy.sh are public, but there are a few designated topics that are used in examples, and topics that you can use to try out what authentication and access control looks like.
|
| 1278 |
+
|
| 1279 |
+
Topic User Permissions Description
|
| 1280 |
+
announcements * (unauthenticated) Read-only for everyone Release announcements and such
|
| 1281 |
+
stats * (unauthenticated) Read-only for everyone Daily statistics about ntfy.sh usage
|
| 1282 |
+
Limitations¶
|
| 1283 |
+
|
| 1284 |
+
There are a few limitations to the API to prevent abuse and to keep the server healthy. Almost all of these settings are configurable via the server side rate limiting settings. Most of these limits you won't run into, but just in case, let's list them all:
|
| 1285 |
+
|
| 1286 |
+
Limit Description
|
| 1287 |
+
Message length Each message can be up to 4,096 bytes long. Longer messages are treated as attachments.
|
| 1288 |
+
Requests By default, the server is configured to allow 60 requests per visitor at once, and then refills the your allowed requests bucket at a rate of one request per 5 seconds.
|
| 1289 |
+
Daily messages By default, the number of messages is governed by the request limits. This can be overridden. On ntfy.sh, the daily message limit is 250.
|
| 1290 |
+
E-mails By default, the server is configured to allow sending 16 e-mails per visitor at once, and then refills the your allowed e-mail bucket at a rate of one per hour. On ntfy.sh, the daily limit is 5.
|
| 1291 |
+
Phone calls By default, the server does not allow any phone calls, except for users with a tier that has a call limit.
|
| 1292 |
+
Subscription limit By default, the server allows each visitor to keep 30 connections to the server open.
|
| 1293 |
+
Attachment size limit By default, the server allows attachments up to 15 MB in size, up to 100 MB in total per visitor and up to 5 GB across all visitors. On ntfy.sh, the attachment size limit is 2 MB, and the per-visitor total is 20 MB.
|
| 1294 |
+
Attachment expiry By default, the server deletes attachments after 3 hours and thereby frees up space from the total visitor attachment limit.
|
| 1295 |
+
Attachment bandwidth By default, the server allows 500 MB of GET/PUT/POST traffic for attachments per visitor in a 24 hour period. Traffic exceeding that is rejected. On ntfy.sh, the daily bandwidth limit is 200 MB.
|
| 1296 |
+
Total number of topics By default, the server is configured to allow 15,000 topics. The ntfy.sh server has higher limits though.
|
| 1297 |
+
|
| 1298 |
+
These limits can be changed on a per-user basis using tiers. If payments are enabled, a user tier can be changed by purchasing a higher tier. ntfy.sh offers multiple paid tiers, which allows for much hier limits than the ones listed above.
|
| 1299 |
+
|
| 1300 |
+
List of all parameters¶
|
| 1301 |
+
|
| 1302 |
+
The following is a list of all parameters that can be passed when publishing a message. Parameter names are case-insensitive when used in HTTP headers, and must be lowercase when used as query parameters in the URL. They are listed in the table in their canonical form.
|
| 1303 |
+
|
| 1304 |
+
Info
|
| 1305 |
+
|
| 1306 |
+
ntfy supports UTF-8 in HTTP headers, but not every library or programming language does. If non-ASCII characters are causing issues for you in the title (i.e. you're seeing ? symbols), you may also encode any header as RFC 2047, e.g. =?UTF-8?B?8J+HqfCfh6o=?= (base64), or =?UTF-8?Q?=C3=84pfel?= (quoted-printable).
|
| 1307 |
+
|
| 1308 |
+
Parameter Aliases Description
|
| 1309 |
+
X-Message Message, m Main body of the message as shown in the notification
|
| 1310 |
+
X-Title Title, t Message title
|
| 1311 |
+
X-Priority Priority, prio, p Message priority
|
| 1312 |
+
X-Tags Tags, Tag, ta Tags and emojis
|
| 1313 |
+
X-Delay Delay, X-At, At, X-In, In Timestamp or duration for delayed delivery
|
| 1314 |
+
X-Actions Actions, Action JSON array or short format of user actions
|
| 1315 |
+
X-Click Click URL to open when notification is clicked
|
| 1316 |
+
X-Attach Attach, a URL to send as an attachment, as an alternative to PUT/POST-ing an attachment
|
| 1317 |
+
X-Markdown Markdown, md Enable Markdown formatting in the notification body
|
| 1318 |
+
X-Icon Icon URL to use as notification icon
|
| 1319 |
+
X-Filename Filename, file, f Optional attachment filename, as it appears in the client
|
| 1320 |
+
X-Email X-E-Mail, Email, E-Mail, mail, e E-mail address for e-mail notifications
|
| 1321 |
+
X-Call Call Phone number for phone calls
|
| 1322 |
+
X-Cache Cache Allows disabling message caching
|
| 1323 |
+
X-Firebase Firebase Allows disabling sending to Firebase
|
| 1324 |
+
X-UnifiedPush UnifiedPush, up UnifiedPush publish option, only to be used by UnifiedPush apps
|
| 1325 |
+
X-Poll-ID Poll-ID Internal parameter, used for iOS push notifications
|
| 1326 |
+
Authorization - If supported by the server, you can login to access protected topics
|
| 1327 |
+
Content-Type - If set to text/markdown, Markdown formatting is enabled
|
| 1328 |
+
Made with ❤️ by Philipp C. Heckel
|
| 1329 |
+
Made with Material for MkDocs
|
docs-ntfy-sh-publish-template-functions-20250924.md
ADDED
|
@@ -0,0 +1,1418 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
Title: Template functions - ntfy
|
| 2 |
+
|
| 3 |
+
URL Source: https://docs.ntfy.sh/publish/template-functions
|
| 4 |
+
|
| 5 |
+
Published Time: Wed, 24 Sep 2025 02:52:16 GMT
|
| 6 |
+
|
| 7 |
+
Markdown Content:
|
| 8 |
+
These template functions may be used in the **[message template](https://docs.ntfy.sh/publish/#message-templating)** feature of ntfy. Please refer to the examples in the documentation for how to use them.
|
| 9 |
+
|
| 10 |
+
The original set of template functions is based on the [Sprig library](https://masterminds.github.io/sprig/). This documentation page is a (slightly modified) copy of their docs. **Thank you to the Sprig developers for their work!** 🙏
|
| 11 |
+
|
| 12 |
+
Table of Contents[¶](https://docs.ntfy.sh/publish/template-functions#table-of-contents "Permanent link")
|
| 13 |
+
--------------------------------------------------------------------------------------------------------
|
| 14 |
+
|
| 15 |
+
* [String Functions](https://docs.ntfy.sh/publish/template-functions#string-functions)
|
| 16 |
+
* [String List Functions](https://docs.ntfy.sh/publish/template-functions#string-list-functions)
|
| 17 |
+
* [Integer Math Functions](https://docs.ntfy.sh/publish/template-functions#integer-math-functions)
|
| 18 |
+
* [Integer List Functions](https://docs.ntfy.sh/publish/template-functions#integer-list-functions)
|
| 19 |
+
* [Float Math Functions](https://docs.ntfy.sh/publish/template-functions#float-math-functions)
|
| 20 |
+
* [Date Functions](https://docs.ntfy.sh/publish/template-functions#date-functions)
|
| 21 |
+
* [Default Functions](https://docs.ntfy.sh/publish/template-functions#default-functions)
|
| 22 |
+
* [Encoding Functions](https://docs.ntfy.sh/publish/template-functions#encoding-functions)
|
| 23 |
+
* [Lists and List Functions](https://docs.ntfy.sh/publish/template-functions#lists-and-list-functions)
|
| 24 |
+
* [Dictionaries and Dict Functions](https://docs.ntfy.sh/publish/template-functions#dictionaries-and-dict-functions)
|
| 25 |
+
* [Type Conversion Functions](https://docs.ntfy.sh/publish/template-functions#type-conversion-functions)
|
| 26 |
+
* [Path and Filepath Functions](https://docs.ntfy.sh/publish/template-functions#path-and-filepath-functions)
|
| 27 |
+
* [Flow Control Functions](https://docs.ntfy.sh/publish/template-functions#flow-control-functions)
|
| 28 |
+
* [Reflection Functions](https://docs.ntfy.sh/publish/template-functions#reflection-functions)
|
| 29 |
+
* [Cryptographic and Security Functions](https://docs.ntfy.sh/publish/template-functions#cryptographic-and-security-functions)
|
| 30 |
+
* [URL Functions](https://docs.ntfy.sh/publish/template-functions#url-functions)
|
| 31 |
+
|
| 32 |
+
String Functions[¶](https://docs.ntfy.sh/publish/template-functions#string-functions "Permanent link")
|
| 33 |
+
------------------------------------------------------------------------------------------------------
|
| 34 |
+
|
| 35 |
+
Sprig has a number of string manipulation functions.
|
| 36 |
+
|
| 37 |
+
### trim[¶](https://docs.ntfy.sh/publish/template-functions#trim "Permanent link")
|
| 38 |
+
|
| 39 |
+
The `trim` function removes space from either side of a string:
|
| 40 |
+
|
| 41 |
+
```
|
| 42 |
+
trim " hello "
|
| 43 |
+
```
|
| 44 |
+
|
| 45 |
+
The above produces `hello`
|
| 46 |
+
|
| 47 |
+
### trimAll[¶](https://docs.ntfy.sh/publish/template-functions#trimall "Permanent link")
|
| 48 |
+
|
| 49 |
+
Remove given characters from the front or back of a string:
|
| 50 |
+
|
| 51 |
+
```
|
| 52 |
+
trimAll "$" "$5.00"
|
| 53 |
+
```
|
| 54 |
+
|
| 55 |
+
The above returns `5.00` (as a string).
|
| 56 |
+
|
| 57 |
+
### trimSuffix[¶](https://docs.ntfy.sh/publish/template-functions#trimsuffix "Permanent link")
|
| 58 |
+
|
| 59 |
+
Trim just the suffix from a string:
|
| 60 |
+
|
| 61 |
+
```
|
| 62 |
+
trimSuffix "-" "hello-"
|
| 63 |
+
```
|
| 64 |
+
|
| 65 |
+
The above returns `hello`
|
| 66 |
+
|
| 67 |
+
### trimPrefix[¶](https://docs.ntfy.sh/publish/template-functions#trimprefix "Permanent link")
|
| 68 |
+
|
| 69 |
+
Trim just the prefix from a string:
|
| 70 |
+
|
| 71 |
+
```
|
| 72 |
+
trimPrefix "-" "-hello"
|
| 73 |
+
```
|
| 74 |
+
|
| 75 |
+
The above returns `hello`
|
| 76 |
+
|
| 77 |
+
### upper[¶](https://docs.ntfy.sh/publish/template-functions#upper "Permanent link")
|
| 78 |
+
|
| 79 |
+
Convert the entire string to uppercase:
|
| 80 |
+
|
| 81 |
+
```
|
| 82 |
+
upper "hello"
|
| 83 |
+
```
|
| 84 |
+
|
| 85 |
+
The above returns `HELLO`
|
| 86 |
+
|
| 87 |
+
### lower[¶](https://docs.ntfy.sh/publish/template-functions#lower "Permanent link")
|
| 88 |
+
|
| 89 |
+
Convert the entire string to lowercase:
|
| 90 |
+
|
| 91 |
+
```
|
| 92 |
+
lower "HELLO"
|
| 93 |
+
```
|
| 94 |
+
|
| 95 |
+
The above returns `hello`
|
| 96 |
+
|
| 97 |
+
### title[¶](https://docs.ntfy.sh/publish/template-functions#title "Permanent link")
|
| 98 |
+
|
| 99 |
+
Convert to title case:
|
| 100 |
+
|
| 101 |
+
```
|
| 102 |
+
title "hello world"
|
| 103 |
+
```
|
| 104 |
+
|
| 105 |
+
The above returns `Hello World`
|
| 106 |
+
|
| 107 |
+
### repeat[¶](https://docs.ntfy.sh/publish/template-functions#repeat "Permanent link")
|
| 108 |
+
|
| 109 |
+
Repeat a string multiple times:
|
| 110 |
+
|
| 111 |
+
```
|
| 112 |
+
repeat 3 "hello"
|
| 113 |
+
```
|
| 114 |
+
|
| 115 |
+
The above returns `hellohellohello`
|
| 116 |
+
|
| 117 |
+
### substr[¶](https://docs.ntfy.sh/publish/template-functions#substr "Permanent link")
|
| 118 |
+
|
| 119 |
+
Get a substring from a string. It takes three parameters:
|
| 120 |
+
|
| 121 |
+
* start (int)
|
| 122 |
+
* end (int)
|
| 123 |
+
* string (string)
|
| 124 |
+
|
| 125 |
+
```
|
| 126 |
+
substr 0 5 "hello world"
|
| 127 |
+
```
|
| 128 |
+
|
| 129 |
+
The above returns `hello`
|
| 130 |
+
|
| 131 |
+
### trunc[¶](https://docs.ntfy.sh/publish/template-functions#trunc "Permanent link")
|
| 132 |
+
|
| 133 |
+
Truncate a string (and add no suffix)
|
| 134 |
+
|
| 135 |
+
```
|
| 136 |
+
trunc 5 "hello world"
|
| 137 |
+
```
|
| 138 |
+
|
| 139 |
+
The above produces `hello`.
|
| 140 |
+
|
| 141 |
+
```
|
| 142 |
+
trunc -5 "hello world"
|
| 143 |
+
```
|
| 144 |
+
|
| 145 |
+
The above produces `world`.
|
| 146 |
+
|
| 147 |
+
### contains[¶](https://docs.ntfy.sh/publish/template-functions#contains "Permanent link")
|
| 148 |
+
|
| 149 |
+
Test to see if one string is contained inside of another:
|
| 150 |
+
|
| 151 |
+
```
|
| 152 |
+
contains "cat" "catch"
|
| 153 |
+
```
|
| 154 |
+
|
| 155 |
+
The above returns `true` because `catch` contains `cat`.
|
| 156 |
+
|
| 157 |
+
### hasPrefix and hasSuffix[¶](https://docs.ntfy.sh/publish/template-functions#hasprefix-and-hassuffix "Permanent link")
|
| 158 |
+
|
| 159 |
+
The `hasPrefix` and `hasSuffix` functions test whether a string has a given prefix or suffix:
|
| 160 |
+
|
| 161 |
+
```
|
| 162 |
+
hasPrefix "cat" "catch"
|
| 163 |
+
```
|
| 164 |
+
|
| 165 |
+
The above returns `true` because `catch` has the prefix `cat`.
|
| 166 |
+
|
| 167 |
+
### quote and squote[¶](https://docs.ntfy.sh/publish/template-functions#quote-and-squote "Permanent link")
|
| 168 |
+
|
| 169 |
+
These functions wrap a string in double quotes (`quote`) or single quotes (`squote`).
|
| 170 |
+
|
| 171 |
+
### cat[¶](https://docs.ntfy.sh/publish/template-functions#cat "Permanent link")
|
| 172 |
+
|
| 173 |
+
The `cat` function concatenates multiple strings together into one, separating them with spaces:
|
| 174 |
+
|
| 175 |
+
```
|
| 176 |
+
cat "hello" "beautiful" "world"
|
| 177 |
+
```
|
| 178 |
+
|
| 179 |
+
The above produces `hello beautiful world`
|
| 180 |
+
|
| 181 |
+
### indent[¶](https://docs.ntfy.sh/publish/template-functions#indent "Permanent link")
|
| 182 |
+
|
| 183 |
+
The `indent` function indents every line in a given string to the specified indent width. This is useful when aligning multi-line strings:
|
| 184 |
+
|
| 185 |
+
```
|
| 186 |
+
indent 4 $lots_of_text
|
| 187 |
+
```
|
| 188 |
+
|
| 189 |
+
The above will indent every line of text by 4 space characters.
|
| 190 |
+
|
| 191 |
+
### nindent[¶](https://docs.ntfy.sh/publish/template-functions#nindent "Permanent link")
|
| 192 |
+
|
| 193 |
+
The `nindent` function is the same as the indent function, but prepends a new line to the beginning of the string.
|
| 194 |
+
|
| 195 |
+
```
|
| 196 |
+
nindent 4 $lots_of_text
|
| 197 |
+
```
|
| 198 |
+
|
| 199 |
+
The above will indent every line of text by 4 space characters and add a new line to the beginning.
|
| 200 |
+
|
| 201 |
+
### replace[¶](https://docs.ntfy.sh/publish/template-functions#replace "Permanent link")
|
| 202 |
+
|
| 203 |
+
Perform simple string replacement.
|
| 204 |
+
|
| 205 |
+
It takes three arguments:
|
| 206 |
+
|
| 207 |
+
* string to replace
|
| 208 |
+
* string to replace with
|
| 209 |
+
* source string
|
| 210 |
+
|
| 211 |
+
```
|
| 212 |
+
"I Am Henry VIII" | replace " " "-"
|
| 213 |
+
```
|
| 214 |
+
|
| 215 |
+
The above will produce `I-Am-Henry-VIII`
|
| 216 |
+
|
| 217 |
+
### plural[¶](https://docs.ntfy.sh/publish/template-functions#plural "Permanent link")
|
| 218 |
+
|
| 219 |
+
Pluralize a string.
|
| 220 |
+
|
| 221 |
+
```
|
| 222 |
+
len $fish | plural "one anchovy" "many anchovies"
|
| 223 |
+
```
|
| 224 |
+
|
| 225 |
+
In the above, if the length of the string is 1, the first argument will be printed (`one anchovy`). Otherwise, the second argument will be printed (`many anchovies`).
|
| 226 |
+
|
| 227 |
+
The arguments are:
|
| 228 |
+
|
| 229 |
+
* singular string
|
| 230 |
+
* plural string
|
| 231 |
+
* length integer
|
| 232 |
+
|
| 233 |
+
NOTE: Sprig does not currently support languages with more complex pluralization rules. And `0` is considered a plural because the English language treats it as such (`zero anchovies`). The Sprig developers are working on a solution for better internationalization.
|
| 234 |
+
|
| 235 |
+
### regexMatch, mustRegexMatch[¶](https://docs.ntfy.sh/publish/template-functions#regexmatch-mustregexmatch "Permanent link")
|
| 236 |
+
|
| 237 |
+
Returns true if the input string contains any match of the regular expression.
|
| 238 |
+
|
| 239 |
+
```
|
| 240 |
+
regexMatch "^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}$" "[email protected]"
|
| 241 |
+
```
|
| 242 |
+
|
| 243 |
+
The above produces `true`
|
| 244 |
+
|
| 245 |
+
`regexMatch` panics if there is a problem and `mustRegexMatch` returns an error to the template engine if there is a problem.
|
| 246 |
+
|
| 247 |
+
### regexFindAll, mustRegexFindAll[¶](https://docs.ntfy.sh/publish/template-functions#regexfindall-mustregexfindall "Permanent link")
|
| 248 |
+
|
| 249 |
+
Returns a slice of all matches of the regular expression in the input string. The last parameter n determines the number of substrings to return, where -1 means return all matches
|
| 250 |
+
|
| 251 |
+
```
|
| 252 |
+
regexFindAll "[2,4,6,8]" "123456789" -1
|
| 253 |
+
```
|
| 254 |
+
|
| 255 |
+
The above produces `[2 4 6 8]`
|
| 256 |
+
|
| 257 |
+
`regexFindAll` panics if there is a problem and `mustRegexFindAll` returns an error to the template engine if there is a problem.
|
| 258 |
+
|
| 259 |
+
### regexFind, mustRegexFind[¶](https://docs.ntfy.sh/publish/template-functions#regexfind-mustregexfind "Permanent link")
|
| 260 |
+
|
| 261 |
+
Return the first (left most) match of the regular expression in the input string
|
| 262 |
+
|
| 263 |
+
```
|
| 264 |
+
regexFind "[a-zA-Z][1-9]" "abcd1234"
|
| 265 |
+
```
|
| 266 |
+
|
| 267 |
+
The above produces `d1`
|
| 268 |
+
|
| 269 |
+
`regexFind` panics if there is a problem and `mustRegexFind` returns an error to the template engine if there is a problem.
|
| 270 |
+
|
| 271 |
+
### regexReplaceAll, mustRegexReplaceAll[¶](https://docs.ntfy.sh/publish/template-functions#regexreplaceall-mustregexreplaceall "Permanent link")
|
| 272 |
+
|
| 273 |
+
Returns a copy of the input string, replacing matches of the Regexp with the replacement string replacement. Inside string replacement, $ signs are interpreted as in Expand, so for instance $1 represents the text of the first submatch
|
| 274 |
+
|
| 275 |
+
```
|
| 276 |
+
regexReplaceAll "a(x*)b" "-ab-axxb-" "${1}W"
|
| 277 |
+
```
|
| 278 |
+
|
| 279 |
+
The above produces `-W-xxW-`
|
| 280 |
+
|
| 281 |
+
`regexReplaceAll` panics if there is a problem and `mustRegexReplaceAll` returns an error to the template engine if there is a problem.
|
| 282 |
+
|
| 283 |
+
### regexReplaceAllLiteral, mustRegexReplaceAllLiteral[¶](https://docs.ntfy.sh/publish/template-functions#regexreplaceallliteral-mustregexreplaceallliteral "Permanent link")
|
| 284 |
+
|
| 285 |
+
Returns a copy of the input string, replacing matches of the Regexp with the replacement string replacement The replacement string is substituted directly, without using Expand
|
| 286 |
+
|
| 287 |
+
```
|
| 288 |
+
regexReplaceAllLiteral "a(x*)b" "-ab-axxb-" "${1}"
|
| 289 |
+
```
|
| 290 |
+
|
| 291 |
+
The above produces `-${1}-${1}-`
|
| 292 |
+
|
| 293 |
+
`regexReplaceAllLiteral` panics if there is a problem and `mustRegexReplaceAllLiteral` returns an error to the template engine if there is a problem.
|
| 294 |
+
|
| 295 |
+
### regexSplit, mustRegexSplit[¶](https://docs.ntfy.sh/publish/template-functions#regexsplit-mustregexsplit "Permanent link")
|
| 296 |
+
|
| 297 |
+
Slices the input string into substrings separated by the expression and returns a slice of the substrings between those expression matches. The last parameter `n` determines the number of substrings to return, where `-1` means return all matches
|
| 298 |
+
|
| 299 |
+
```
|
| 300 |
+
regexSplit "z+" "pizza" -1
|
| 301 |
+
```
|
| 302 |
+
|
| 303 |
+
The above produces `[pi a]`
|
| 304 |
+
|
| 305 |
+
`regexSplit` panics if there is a problem and `mustRegexSplit` returns an error to the template engine if there is a problem.
|
| 306 |
+
|
| 307 |
+
### regexQuoteMeta[¶](https://docs.ntfy.sh/publish/template-functions#regexquotemeta "Permanent link")
|
| 308 |
+
|
| 309 |
+
Returns a string that escapes all regular expression metacharacters inside the argument text; the returned string is a regular expression matching the literal text.
|
| 310 |
+
|
| 311 |
+
```
|
| 312 |
+
regexQuoteMeta "1.2.3"
|
| 313 |
+
```
|
| 314 |
+
|
| 315 |
+
The above produces `1\.2\.3`
|
| 316 |
+
|
| 317 |
+
### See Also...[¶](https://docs.ntfy.sh/publish/template-functions#see-also "Permanent link")
|
| 318 |
+
|
| 319 |
+
The [Conversion Functions](https://docs.ntfy.sh/publish/template-functions#type-conversion-functions) contain functions for converting strings. The [String List Functions](https://docs.ntfy.sh/publish/template-functions#string-list-functions) contains functions for working with an array of strings.
|
| 320 |
+
|
| 321 |
+
String List Functions[¶](https://docs.ntfy.sh/publish/template-functions#string-list-functions "Permanent link")
|
| 322 |
+
----------------------------------------------------------------------------------------------------------------
|
| 323 |
+
|
| 324 |
+
These functions operate on or generate slices of strings. In Go, a slice is a growable array. In Sprig, it's a special case of a `list`.
|
| 325 |
+
|
| 326 |
+
### join[¶](https://docs.ntfy.sh/publish/template-functions#join "Permanent link")
|
| 327 |
+
|
| 328 |
+
Join a list of strings into a single string, with the given separator.
|
| 329 |
+
|
| 330 |
+
```
|
| 331 |
+
list "hello" "world" | join "_"
|
| 332 |
+
```
|
| 333 |
+
|
| 334 |
+
The above will produce `hello_world`
|
| 335 |
+
|
| 336 |
+
`join` will try to convert non-strings to a string value:
|
| 337 |
+
|
| 338 |
+
```
|
| 339 |
+
list 1 2 3 | join "+"
|
| 340 |
+
```
|
| 341 |
+
|
| 342 |
+
The above will produce `1+2+3`
|
| 343 |
+
|
| 344 |
+
### splitList and split[¶](https://docs.ntfy.sh/publish/template-functions#splitlist-and-split "Permanent link")
|
| 345 |
+
|
| 346 |
+
Split a string into a list of strings:
|
| 347 |
+
|
| 348 |
+
```
|
| 349 |
+
splitList "$" "foo$bar$baz"
|
| 350 |
+
```
|
| 351 |
+
|
| 352 |
+
The above will return `[foo bar baz]`
|
| 353 |
+
|
| 354 |
+
The older `split` function splits a string into a `dict`. It is designed to make it easy to use template dot notation for accessing members:
|
| 355 |
+
|
| 356 |
+
```
|
| 357 |
+
$a := split "$" "foo$bar$baz"
|
| 358 |
+
```
|
| 359 |
+
|
| 360 |
+
The above produces a map with index keys. `{_0: foo, _1: bar, _2: baz}`
|
| 361 |
+
|
| 362 |
+
```
|
| 363 |
+
$a._0
|
| 364 |
+
```
|
| 365 |
+
|
| 366 |
+
The above produces `foo`
|
| 367 |
+
|
| 368 |
+
### splitn[¶](https://docs.ntfy.sh/publish/template-functions#splitn "Permanent link")
|
| 369 |
+
|
| 370 |
+
`splitn` function splits a string into a `dict` with `n` keys. It is designed to make it easy to use template dot notation for accessing members:
|
| 371 |
+
|
| 372 |
+
```
|
| 373 |
+
$a := splitn "$" 2 "foo$bar$baz"
|
| 374 |
+
```
|
| 375 |
+
|
| 376 |
+
The above produces a map with index keys. `{_0: foo, _1: bar$baz}`
|
| 377 |
+
|
| 378 |
+
```
|
| 379 |
+
$a._0
|
| 380 |
+
```
|
| 381 |
+
|
| 382 |
+
The above produces `foo`
|
| 383 |
+
|
| 384 |
+
### sortAlpha[¶](https://docs.ntfy.sh/publish/template-functions#sortalpha "Permanent link")
|
| 385 |
+
|
| 386 |
+
The `sortAlpha` function sorts a list of strings into alphabetical (lexicographical) order.
|
| 387 |
+
|
| 388 |
+
It does _not_ sort in place, but returns a sorted copy of the list, in keeping with the immutability of lists.
|
| 389 |
+
|
| 390 |
+
Integer Math Functions[¶](https://docs.ntfy.sh/publish/template-functions#integer-math-functions "Permanent link")
|
| 391 |
+
------------------------------------------------------------------------------------------------------------------
|
| 392 |
+
|
| 393 |
+
The following math functions operate on `int64` values.
|
| 394 |
+
|
| 395 |
+
### add[¶](https://docs.ntfy.sh/publish/template-functions#add "Permanent link")
|
| 396 |
+
|
| 397 |
+
Sum numbers with `add`. Accepts two or more inputs.
|
| 398 |
+
|
| 399 |
+
```
|
| 400 |
+
add 1 2 3
|
| 401 |
+
```
|
| 402 |
+
|
| 403 |
+
### add1[¶](https://docs.ntfy.sh/publish/template-functions#add1 "Permanent link")
|
| 404 |
+
|
| 405 |
+
To increment by 1, use `add1`
|
| 406 |
+
|
| 407 |
+
### sub[¶](https://docs.ntfy.sh/publish/template-functions#sub "Permanent link")
|
| 408 |
+
|
| 409 |
+
To subtract, use `sub`
|
| 410 |
+
|
| 411 |
+
### div[¶](https://docs.ntfy.sh/publish/template-functions#div "Permanent link")
|
| 412 |
+
|
| 413 |
+
Perform integer division with `div`
|
| 414 |
+
|
| 415 |
+
### mod[¶](https://docs.ntfy.sh/publish/template-functions#mod "Permanent link")
|
| 416 |
+
|
| 417 |
+
Modulo with `mod`
|
| 418 |
+
|
| 419 |
+
### mul[¶](https://docs.ntfy.sh/publish/template-functions#mul "Permanent link")
|
| 420 |
+
|
| 421 |
+
Multiply with `mul`. Accepts two or more inputs.
|
| 422 |
+
|
| 423 |
+
```
|
| 424 |
+
mul 1 2 3
|
| 425 |
+
```
|
| 426 |
+
|
| 427 |
+
### max[¶](https://docs.ntfy.sh/publish/template-functions#max "Permanent link")
|
| 428 |
+
|
| 429 |
+
Return the largest of a series of integers:
|
| 430 |
+
|
| 431 |
+
This will return `3`:
|
| 432 |
+
|
| 433 |
+
```
|
| 434 |
+
max 1 2 3
|
| 435 |
+
```
|
| 436 |
+
|
| 437 |
+
### min[¶](https://docs.ntfy.sh/publish/template-functions#min "Permanent link")
|
| 438 |
+
|
| 439 |
+
Return the smallest of a series of integers.
|
| 440 |
+
|
| 441 |
+
`min 1 2 3` will return `1`
|
| 442 |
+
|
| 443 |
+
### floor[¶](https://docs.ntfy.sh/publish/template-functions#floor "Permanent link")
|
| 444 |
+
|
| 445 |
+
Returns the greatest float value less than or equal to input value
|
| 446 |
+
|
| 447 |
+
`floor 123.9999` will return `123.0`
|
| 448 |
+
|
| 449 |
+
### ceil[¶](https://docs.ntfy.sh/publish/template-functions#ceil "Permanent link")
|
| 450 |
+
|
| 451 |
+
Returns the greatest float value greater than or equal to input value
|
| 452 |
+
|
| 453 |
+
`ceil 123.001` will return `124.0`
|
| 454 |
+
|
| 455 |
+
### round[¶](https://docs.ntfy.sh/publish/template-functions#round "Permanent link")
|
| 456 |
+
|
| 457 |
+
Returns a float value with the remainder rounded to the given number to digits after the decimal point.
|
| 458 |
+
|
| 459 |
+
`round 123.555555 3` will return `123.556`
|
| 460 |
+
|
| 461 |
+
### randInt[¶](https://docs.ntfy.sh/publish/template-functions#randint "Permanent link")
|
| 462 |
+
|
| 463 |
+
Returns a random integer value from min (inclusive) to max (exclusive).
|
| 464 |
+
|
| 465 |
+
```
|
| 466 |
+
randInt 12 30
|
| 467 |
+
```
|
| 468 |
+
|
| 469 |
+
The above will produce a random number in the range [12,30].
|
| 470 |
+
|
| 471 |
+
Integer List Functions[¶](https://docs.ntfy.sh/publish/template-functions#integer-list-functions "Permanent link")
|
| 472 |
+
------------------------------------------------------------------------------------------------------------------
|
| 473 |
+
|
| 474 |
+
### until[¶](https://docs.ntfy.sh/publish/template-functions#until "Permanent link")
|
| 475 |
+
|
| 476 |
+
The `until` function builds a range of integers.
|
| 477 |
+
|
| 478 |
+
```
|
| 479 |
+
until 5
|
| 480 |
+
```
|
| 481 |
+
|
| 482 |
+
The above generates the list `[0, 1, 2, 3, 4]`.
|
| 483 |
+
|
| 484 |
+
This is useful for looping with `range $i, $e := until 5`.
|
| 485 |
+
|
| 486 |
+
### untilStep[¶](https://docs.ntfy.sh/publish/template-functions#untilstep "Permanent link")
|
| 487 |
+
|
| 488 |
+
Like `until`, `untilStep` generates a list of counting integers. But it allows you to define a start, stop, and step:
|
| 489 |
+
|
| 490 |
+
```
|
| 491 |
+
untilStep 3 6 2
|
| 492 |
+
```
|
| 493 |
+
|
| 494 |
+
The above will produce `[3 5]` by starting with 3, and adding 2 until it is equal or greater than 6. This is similar to Python's `range` function.
|
| 495 |
+
|
| 496 |
+
### seq[¶](https://docs.ntfy.sh/publish/template-functions#seq "Permanent link")
|
| 497 |
+
|
| 498 |
+
Works like the bash `seq` command. * 1 parameter (end) - will generate all counting integers between 1 and `end` inclusive. * 2 parameters (start, end) - will generate all counting integers between `start` and `end` inclusive incrementing or decrementing by 1. * 3 parameters (start, step, end) - will generate all counting integers between `start` and `end` inclusive incrementing or decrementing by `step`.
|
| 499 |
+
|
| 500 |
+
```
|
| 501 |
+
seq 5 => 1 2 3 4 5
|
| 502 |
+
seq -3 => 1 0 -1 -2 -3
|
| 503 |
+
seq 0 2 => 0 1 2
|
| 504 |
+
seq 2 -2 => 2 1 0 -1 -2
|
| 505 |
+
seq 0 2 10 => 0 2 4 6 8 10
|
| 506 |
+
seq 0 -2 -5 => 0 -2 -4
|
| 507 |
+
```
|
| 508 |
+
|
| 509 |
+
Float Math Functions[¶](https://docs.ntfy.sh/publish/template-functions#float-math-functions "Permanent link")
|
| 510 |
+
--------------------------------------------------------------------------------------------------------------
|
| 511 |
+
|
| 512 |
+
### maxf[¶](https://docs.ntfy.sh/publish/template-functions#maxf "Permanent link")
|
| 513 |
+
|
| 514 |
+
Return the largest of a series of floats:
|
| 515 |
+
|
| 516 |
+
This will return `3`:
|
| 517 |
+
|
| 518 |
+
```
|
| 519 |
+
maxf 1 2.5 3
|
| 520 |
+
```
|
| 521 |
+
|
| 522 |
+
### minf[¶](https://docs.ntfy.sh/publish/template-functions#minf "Permanent link")
|
| 523 |
+
|
| 524 |
+
Return the smallest of a series of floats.
|
| 525 |
+
|
| 526 |
+
This will return `1.5`:
|
| 527 |
+
|
| 528 |
+
```
|
| 529 |
+
minf 1.5 2 3
|
| 530 |
+
```
|
| 531 |
+
|
| 532 |
+
Date Functions[¶](https://docs.ntfy.sh/publish/template-functions#date-functions "Permanent link")
|
| 533 |
+
--------------------------------------------------------------------------------------------------
|
| 534 |
+
|
| 535 |
+
### now[¶](https://docs.ntfy.sh/publish/template-functions#now "Permanent link")
|
| 536 |
+
|
| 537 |
+
The current date/time. Use this in conjunction with other date functions.
|
| 538 |
+
|
| 539 |
+
### ago[¶](https://docs.ntfy.sh/publish/template-functions#ago "Permanent link")
|
| 540 |
+
|
| 541 |
+
The `ago` function returns duration from time.Now in seconds resolution.
|
| 542 |
+
|
| 543 |
+
```
|
| 544 |
+
ago .CreatedAt
|
| 545 |
+
```
|
| 546 |
+
|
| 547 |
+
returns in `time.Duration` String() format
|
| 548 |
+
|
| 549 |
+
```
|
| 550 |
+
2h34m7s
|
| 551 |
+
```
|
| 552 |
+
|
| 553 |
+
### date[¶](https://docs.ntfy.sh/publish/template-functions#date "Permanent link")
|
| 554 |
+
|
| 555 |
+
The `date` function formats a date.
|
| 556 |
+
|
| 557 |
+
Format the date to YEAR-MONTH-DAY:
|
| 558 |
+
|
| 559 |
+
```
|
| 560 |
+
now | date "2006-01-02"
|
| 561 |
+
```
|
| 562 |
+
|
| 563 |
+
Date formatting in Go is a [little bit different](https://pauladamsmith.com/blog/2011/05/go_time.html).
|
| 564 |
+
|
| 565 |
+
In short, take this as the base date:
|
| 566 |
+
|
| 567 |
+
```
|
| 568 |
+
Mon Jan 2 15:04:05 MST 2006
|
| 569 |
+
```
|
| 570 |
+
|
| 571 |
+
Write it in the format you want. Above, `2006-01-02` is the same date, but in the format we want.
|
| 572 |
+
|
| 573 |
+
### dateInZone[¶](https://docs.ntfy.sh/publish/template-functions#dateinzone "Permanent link")
|
| 574 |
+
|
| 575 |
+
Same as `date`, but with a timezone.
|
| 576 |
+
|
| 577 |
+
```
|
| 578 |
+
dateInZone "2006-01-02" (now) "UTC"
|
| 579 |
+
```
|
| 580 |
+
|
| 581 |
+
### duration[¶](https://docs.ntfy.sh/publish/template-functions#duration "Permanent link")
|
| 582 |
+
|
| 583 |
+
Formats a given amount of seconds as a `time.Duration`.
|
| 584 |
+
|
| 585 |
+
This returns 1m35s
|
| 586 |
+
|
| 587 |
+
```
|
| 588 |
+
duration "95"
|
| 589 |
+
```
|
| 590 |
+
|
| 591 |
+
### durationRound[¶](https://docs.ntfy.sh/publish/template-functions#durationround "Permanent link")
|
| 592 |
+
|
| 593 |
+
Rounds a given duration to the most significant unit. Strings and `time.Duration` gets parsed as a duration, while a `time.Time` is calculated as the duration since.
|
| 594 |
+
|
| 595 |
+
This return 2h
|
| 596 |
+
|
| 597 |
+
```
|
| 598 |
+
durationRound "2h10m5s"
|
| 599 |
+
```
|
| 600 |
+
|
| 601 |
+
This returns 3mo
|
| 602 |
+
|
| 603 |
+
```
|
| 604 |
+
durationRound "2400h10m5s"
|
| 605 |
+
```
|
| 606 |
+
|
| 607 |
+
### unixEpoch[¶](https://docs.ntfy.sh/publish/template-functions#unixepoch "Permanent link")
|
| 608 |
+
|
| 609 |
+
Returns the seconds since the unix epoch for a `time.Time`.
|
| 610 |
+
|
| 611 |
+
```
|
| 612 |
+
now | unixEpoch
|
| 613 |
+
```
|
| 614 |
+
|
| 615 |
+
### dateModify, mustDateModify[¶](https://docs.ntfy.sh/publish/template-functions#datemodify-mustdatemodify "Permanent link")
|
| 616 |
+
|
| 617 |
+
The `dateModify` takes a modification and a date and returns the timestamp.
|
| 618 |
+
|
| 619 |
+
Subtract an hour and thirty minutes from the current time:
|
| 620 |
+
|
| 621 |
+
```
|
| 622 |
+
now | dateModify "-1.5h"
|
| 623 |
+
```
|
| 624 |
+
|
| 625 |
+
If the modification format is wrong `dateModify` will return the date unmodified. `mustDateModify` will return an error otherwise.
|
| 626 |
+
|
| 627 |
+
### htmlDate[¶](https://docs.ntfy.sh/publish/template-functions#htmldate "Permanent link")
|
| 628 |
+
|
| 629 |
+
The `htmlDate` function formats a date for inserting into an HTML date picker input field.
|
| 630 |
+
|
| 631 |
+
```
|
| 632 |
+
now | htmlDate
|
| 633 |
+
```
|
| 634 |
+
|
| 635 |
+
### htmlDateInZone[¶](https://docs.ntfy.sh/publish/template-functions#htmldateinzone "Permanent link")
|
| 636 |
+
|
| 637 |
+
Same as htmlDate, but with a timezone.
|
| 638 |
+
|
| 639 |
+
```
|
| 640 |
+
htmlDateInZone (now) "UTC"
|
| 641 |
+
```
|
| 642 |
+
|
| 643 |
+
### toDate, mustToDate[¶](https://docs.ntfy.sh/publish/template-functions#todate-musttodate "Permanent link")
|
| 644 |
+
|
| 645 |
+
`toDate` converts a string to a date. The first argument is the date layout and the second the date string. If the string can't be convert it returns the zero value. `mustToDate` will return an error in case the string cannot be converted.
|
| 646 |
+
|
| 647 |
+
This is useful when you want to convert a string date to another format (using pipe). The example below converts "2017-12-31" to "31/12/2017".
|
| 648 |
+
|
| 649 |
+
```
|
| 650 |
+
toDate "2006-01-02" "2017-12-31" | date "02/01/2006"
|
| 651 |
+
```
|
| 652 |
+
|
| 653 |
+
Default Functions[¶](https://docs.ntfy.sh/publish/template-functions#default-functions "Permanent link")
|
| 654 |
+
--------------------------------------------------------------------------------------------------------
|
| 655 |
+
|
| 656 |
+
Sprig provides tools for setting default values for templates.
|
| 657 |
+
|
| 658 |
+
### default[¶](https://docs.ntfy.sh/publish/template-functions#default "Permanent link")
|
| 659 |
+
|
| 660 |
+
To set a simple default value, use `default`:
|
| 661 |
+
|
| 662 |
+
```
|
| 663 |
+
default "foo" .Bar
|
| 664 |
+
```
|
| 665 |
+
|
| 666 |
+
In the above, if `.Bar` evaluates to a non-empty value, it will be used. But if it is empty, `foo` will be returned instead.
|
| 667 |
+
|
| 668 |
+
The definition of "empty" depends on type:
|
| 669 |
+
|
| 670 |
+
* Numeric: 0
|
| 671 |
+
* String: ""
|
| 672 |
+
* Lists: `[]`
|
| 673 |
+
* Dicts: `{}`
|
| 674 |
+
* Boolean: `false`
|
| 675 |
+
* And always `nil` (aka null)
|
| 676 |
+
|
| 677 |
+
For structs, there is no definition of empty, so a struct will never return the default.
|
| 678 |
+
|
| 679 |
+
### empty[¶](https://docs.ntfy.sh/publish/template-functions#empty "Permanent link")
|
| 680 |
+
|
| 681 |
+
The `empty` function returns `true` if the given value is considered empty, and `false` otherwise. The empty values are listed in the `default` section.
|
| 682 |
+
|
| 683 |
+
```
|
| 684 |
+
empty .Foo
|
| 685 |
+
```
|
| 686 |
+
|
| 687 |
+
Note that in Go template conditionals, emptiness is calculated for you. Thus, you rarely need `if empty .Foo`. Instead, just use `if .Foo`.
|
| 688 |
+
|
| 689 |
+
### coalesce[¶](https://docs.ntfy.sh/publish/template-functions#coalesce "Permanent link")
|
| 690 |
+
|
| 691 |
+
The `coalesce` function takes a list of values and returns the first non-empty one.
|
| 692 |
+
|
| 693 |
+
```
|
| 694 |
+
coalesce 0 1 2
|
| 695 |
+
```
|
| 696 |
+
|
| 697 |
+
The above returns `1`.
|
| 698 |
+
|
| 699 |
+
This function is useful for scanning through multiple variables or values:
|
| 700 |
+
|
| 701 |
+
```
|
| 702 |
+
coalesce .name .parent.name "Matt"
|
| 703 |
+
```
|
| 704 |
+
|
| 705 |
+
The above will first check to see if `.name` is empty. If it is not, it will return that value. If it _is_ empty, `coalesce` will evaluate `.parent.name` for emptiness. Finally, if both `.name` and `.parent.name` are empty, it will return `Matt`.
|
| 706 |
+
|
| 707 |
+
### all[¶](https://docs.ntfy.sh/publish/template-functions#all "Permanent link")
|
| 708 |
+
|
| 709 |
+
The `all` function takes a list of values and returns true if all values are non-empty.
|
| 710 |
+
|
| 711 |
+
```
|
| 712 |
+
all 0 1 2
|
| 713 |
+
```
|
| 714 |
+
|
| 715 |
+
The above returns `false`.
|
| 716 |
+
|
| 717 |
+
This function is useful for evaluating multiple conditions of variables or values:
|
| 718 |
+
|
| 719 |
+
```
|
| 720 |
+
all (eq .Request.TLS.Version 0x0304) (.Request.ProtoAtLeast 2 0) (eq .Request.Method "POST")
|
| 721 |
+
```
|
| 722 |
+
|
| 723 |
+
The above will check http.Request is POST with tls 1.3 and http/2.
|
| 724 |
+
|
| 725 |
+
### any[¶](https://docs.ntfy.sh/publish/template-functions#any "Permanent link")
|
| 726 |
+
|
| 727 |
+
The `any` function takes a list of values and returns true if any value is non-empty.
|
| 728 |
+
|
| 729 |
+
```
|
| 730 |
+
any 0 1 2
|
| 731 |
+
```
|
| 732 |
+
|
| 733 |
+
The above returns `true`.
|
| 734 |
+
|
| 735 |
+
This function is useful for evaluating multiple conditions of variables or values:
|
| 736 |
+
|
| 737 |
+
```
|
| 738 |
+
any (eq .Request.Method "GET") (eq .Request.Method "POST") (eq .Request.Method "OPTIONS")
|
| 739 |
+
```
|
| 740 |
+
|
| 741 |
+
The above will check http.Request method is one of GET/POST/OPTIONS.
|
| 742 |
+
|
| 743 |
+
### fromJSON, mustFromJSON[¶](https://docs.ntfy.sh/publish/template-functions#fromjson-mustfromjson "Permanent link")
|
| 744 |
+
|
| 745 |
+
`fromJSON` decodes a JSON document into a structure. If the input cannot be decoded as JSON the function will return an empty string. `mustFromJSON` will return an error in case the JSON is invalid.
|
| 746 |
+
|
| 747 |
+
```
|
| 748 |
+
fromJSON "{\"foo\": 55}"
|
| 749 |
+
```
|
| 750 |
+
|
| 751 |
+
### toJSON, mustToJSON[¶](https://docs.ntfy.sh/publish/template-functions#tojson-musttojson "Permanent link")
|
| 752 |
+
|
| 753 |
+
The `toJSON` function encodes an item into a JSON string. If the item cannot be converted to JSON the function will return an empty string. `mustToJSON` will return an error in case the item cannot be encoded in JSON.
|
| 754 |
+
|
| 755 |
+
```
|
| 756 |
+
toJSON .Item
|
| 757 |
+
```
|
| 758 |
+
|
| 759 |
+
The above returns JSON string representation of `.Item`.
|
| 760 |
+
|
| 761 |
+
### toPrettyJSON, mustToPrettyJSON[¶](https://docs.ntfy.sh/publish/template-functions#toprettyjson-musttoprettyjson "Permanent link")
|
| 762 |
+
|
| 763 |
+
The `toPrettyJSON` function encodes an item into a pretty (indented) JSON string.
|
| 764 |
+
|
| 765 |
+
```
|
| 766 |
+
toPrettyJSON .Item
|
| 767 |
+
```
|
| 768 |
+
|
| 769 |
+
The above returns indented JSON string representation of `.Item`.
|
| 770 |
+
|
| 771 |
+
### toRawJSON, mustToRawJSON[¶](https://docs.ntfy.sh/publish/template-functions#torawjson-musttorawjson "Permanent link")
|
| 772 |
+
|
| 773 |
+
The `toRawJSON` function encodes an item into JSON string with HTML characters unescaped.
|
| 774 |
+
|
| 775 |
+
```
|
| 776 |
+
toRawJSON .Item
|
| 777 |
+
```
|
| 778 |
+
|
| 779 |
+
The above returns unescaped JSON string representation of `.Item`.
|
| 780 |
+
|
| 781 |
+
### ternary[¶](https://docs.ntfy.sh/publish/template-functions#ternary "Permanent link")
|
| 782 |
+
|
| 783 |
+
The `ternary` function takes two values, and a test value. If the test value is true, the first value will be returned. If the test value is empty, the second value will be returned. This is similar to the c ternary operator.
|
| 784 |
+
|
| 785 |
+
#### true test value[¶](https://docs.ntfy.sh/publish/template-functions#true-test-value "Permanent link")
|
| 786 |
+
|
| 787 |
+
```
|
| 788 |
+
ternary "foo" "bar" true
|
| 789 |
+
```
|
| 790 |
+
|
| 791 |
+
or
|
| 792 |
+
|
| 793 |
+
```
|
| 794 |
+
true | ternary "foo" "bar"
|
| 795 |
+
```
|
| 796 |
+
|
| 797 |
+
The above returns `"foo"`.
|
| 798 |
+
|
| 799 |
+
#### false test value[¶](https://docs.ntfy.sh/publish/template-functions#false-test-value "Permanent link")
|
| 800 |
+
|
| 801 |
+
```
|
| 802 |
+
ternary "foo" "bar" false
|
| 803 |
+
```
|
| 804 |
+
|
| 805 |
+
or
|
| 806 |
+
|
| 807 |
+
```
|
| 808 |
+
false | ternary "foo" "bar"
|
| 809 |
+
```
|
| 810 |
+
|
| 811 |
+
The above returns `"bar"`.
|
| 812 |
+
|
| 813 |
+
Encoding Functions[¶](https://docs.ntfy.sh/publish/template-functions#encoding-functions "Permanent link")
|
| 814 |
+
----------------------------------------------------------------------------------------------------------
|
| 815 |
+
|
| 816 |
+
Sprig has the following encoding and decoding functions:
|
| 817 |
+
|
| 818 |
+
* `b64enc`/`b64dec`: Encode or decode with Base64
|
| 819 |
+
* `b32enc`/`b32dec`: Encode or decode with Base32
|
| 820 |
+
|
| 821 |
+
Lists and List Functions[¶](https://docs.ntfy.sh/publish/template-functions#lists-and-list-functions "Permanent link")
|
| 822 |
+
----------------------------------------------------------------------------------------------------------------------
|
| 823 |
+
|
| 824 |
+
Sprig provides a simple `list` type that can contain arbitrary sequential lists of data. This is similar to arrays or slices, but lists are designed to be used as immutable data types.
|
| 825 |
+
|
| 826 |
+
Create a list of integers:
|
| 827 |
+
|
| 828 |
+
```
|
| 829 |
+
$myList := list 1 2 3 4 5
|
| 830 |
+
```
|
| 831 |
+
|
| 832 |
+
The above creates a list of `[1 2 3 4 5]`.
|
| 833 |
+
|
| 834 |
+
### first, mustFirst[¶](https://docs.ntfy.sh/publish/template-functions#first-mustfirst "Permanent link")
|
| 835 |
+
|
| 836 |
+
To get the head item on a list, use `first`.
|
| 837 |
+
|
| 838 |
+
`first $myList` returns `1`
|
| 839 |
+
|
| 840 |
+
`first` panics if there is a problem while `mustFirst` returns an error to the template engine if there is a problem.
|
| 841 |
+
|
| 842 |
+
### rest, mustRest[¶](https://docs.ntfy.sh/publish/template-functions#rest-mustrest "Permanent link")
|
| 843 |
+
|
| 844 |
+
To get the tail of the list (everything but the first item), use `rest`.
|
| 845 |
+
|
| 846 |
+
`rest $myList` returns `[2 3 4 5]`
|
| 847 |
+
|
| 848 |
+
`rest` panics if there is a problem while `mustRest` returns an error to the template engine if there is a problem.
|
| 849 |
+
|
| 850 |
+
### last, mustLast[¶](https://docs.ntfy.sh/publish/template-functions#last-mustlast "Permanent link")
|
| 851 |
+
|
| 852 |
+
To get the last item on a list, use `last`:
|
| 853 |
+
|
| 854 |
+
`last $myList` returns `5`. This is roughly analogous to reversing a list and then calling `first`.
|
| 855 |
+
|
| 856 |
+
`last` panics if there is a problem while `mustLast` returns an error to the template engine if there is a problem.
|
| 857 |
+
|
| 858 |
+
### initial, mustInitial[¶](https://docs.ntfy.sh/publish/template-functions#initial-mustinitial "Permanent link")
|
| 859 |
+
|
| 860 |
+
This compliments `last` by returning all _but_ the last element. `initial $myList` returns `[1 2 3 4]`.
|
| 861 |
+
|
| 862 |
+
`initial` panics if there is a problem while `mustInitial` returns an error to the template engine if there is a problem.
|
| 863 |
+
|
| 864 |
+
### append, mustAppend[¶](https://docs.ntfy.sh/publish/template-functions#append-mustappend "Permanent link")
|
| 865 |
+
|
| 866 |
+
Append a new item to an existing list, creating a new list.
|
| 867 |
+
|
| 868 |
+
```
|
| 869 |
+
$new = append $myList 6
|
| 870 |
+
```
|
| 871 |
+
|
| 872 |
+
The above would set `$new` to `[1 2 3 4 5 6]`. `$myList` would remain unaltered.
|
| 873 |
+
|
| 874 |
+
`append` panics if there is a problem while `mustAppend` returns an error to the template engine if there is a problem.
|
| 875 |
+
|
| 876 |
+
### prepend, mustPrepend[¶](https://docs.ntfy.sh/publish/template-functions#prepend-mustprepend "Permanent link")
|
| 877 |
+
|
| 878 |
+
Push an element onto the front of a list, creating a new list.
|
| 879 |
+
|
| 880 |
+
```
|
| 881 |
+
prepend $myList 0
|
| 882 |
+
```
|
| 883 |
+
|
| 884 |
+
The above would produce `[0 1 2 3 4 5]`. `$myList` would remain unaltered.
|
| 885 |
+
|
| 886 |
+
`prepend` panics if there is a problem while `mustPrepend` returns an error to the template engine if there is a problem.
|
| 887 |
+
|
| 888 |
+
### concat[¶](https://docs.ntfy.sh/publish/template-functions#concat "Permanent link")
|
| 889 |
+
|
| 890 |
+
Concatenate arbitrary number of lists into one.
|
| 891 |
+
|
| 892 |
+
```
|
| 893 |
+
concat $myList ( list 6 7 ) ( list 8 )
|
| 894 |
+
```
|
| 895 |
+
|
| 896 |
+
The above would produce `[1 2 3 4 5 6 7 8]`. `$myList` would remain unaltered.
|
| 897 |
+
|
| 898 |
+
### reverse, mustReverse[¶](https://docs.ntfy.sh/publish/template-functions#reverse-mustreverse "Permanent link")
|
| 899 |
+
|
| 900 |
+
Produce a new list with the reversed elements of the given list.
|
| 901 |
+
|
| 902 |
+
```
|
| 903 |
+
reverse $myList
|
| 904 |
+
```
|
| 905 |
+
|
| 906 |
+
The above would generate the list `[5 4 3 2 1]`.
|
| 907 |
+
|
| 908 |
+
`reverse` panics if there is a problem while `mustReverse` returns an error to the template engine if there is a problem.
|
| 909 |
+
|
| 910 |
+
### uniq, mustUniq[¶](https://docs.ntfy.sh/publish/template-functions#uniq-mustuniq "Permanent link")
|
| 911 |
+
|
| 912 |
+
Generate a list with all of the duplicates removed.
|
| 913 |
+
|
| 914 |
+
```
|
| 915 |
+
list 1 1 1 2 | uniq
|
| 916 |
+
```
|
| 917 |
+
|
| 918 |
+
The above would produce `[1 2]`
|
| 919 |
+
|
| 920 |
+
`uniq` panics if there is a problem while `mustUniq` returns an error to the template engine if there is a problem.
|
| 921 |
+
|
| 922 |
+
### without, mustWithout[¶](https://docs.ntfy.sh/publish/template-functions#without-mustwithout "Permanent link")
|
| 923 |
+
|
| 924 |
+
The `without` function filters items out of a list.
|
| 925 |
+
|
| 926 |
+
```
|
| 927 |
+
without $myList 3
|
| 928 |
+
```
|
| 929 |
+
|
| 930 |
+
The above would produce `[1 2 4 5]`
|
| 931 |
+
|
| 932 |
+
Without can take more than one filter:
|
| 933 |
+
|
| 934 |
+
```
|
| 935 |
+
without $myList 1 3 5
|
| 936 |
+
```
|
| 937 |
+
|
| 938 |
+
That would produce `[2 4]`
|
| 939 |
+
|
| 940 |
+
`without` panics if there is a problem while `mustWithout` returns an error to the template engine if there is a problem.
|
| 941 |
+
|
| 942 |
+
### has, mustHas[¶](https://docs.ntfy.sh/publish/template-functions#has-musthas "Permanent link")
|
| 943 |
+
|
| 944 |
+
Test to see if a list has a particular element.
|
| 945 |
+
|
| 946 |
+
```
|
| 947 |
+
has 4 $myList
|
| 948 |
+
```
|
| 949 |
+
|
| 950 |
+
The above would return `true`, while `has "hello" $myList` would return false.
|
| 951 |
+
|
| 952 |
+
`has` panics if there is a problem while `mustHas` returns an error to the template engine if there is a problem.
|
| 953 |
+
|
| 954 |
+
### compact, mustCompact[¶](https://docs.ntfy.sh/publish/template-functions#compact-mustcompact "Permanent link")
|
| 955 |
+
|
| 956 |
+
Accepts a list and removes entries with empty values.
|
| 957 |
+
|
| 958 |
+
```
|
| 959 |
+
$list := list 1 "a" "foo" ""
|
| 960 |
+
$copy := compact $list
|
| 961 |
+
```
|
| 962 |
+
|
| 963 |
+
`compact` will return a new list with the empty (i.e., "") item removed.
|
| 964 |
+
|
| 965 |
+
`compact` panics if there is a problem and `mustCompact` returns an error to the template engine if there is a problem.
|
| 966 |
+
|
| 967 |
+
### slice, mustSlice[¶](https://docs.ntfy.sh/publish/template-functions#slice-mustslice "Permanent link")
|
| 968 |
+
|
| 969 |
+
To get partial elements of a list, use `slice list [n] [m]`. It is equivalent of `list[n:m]`.
|
| 970 |
+
|
| 971 |
+
* `slice $myList` returns `[1 2 3 4 5]`. It is same as `myList[:]`.
|
| 972 |
+
* `slice $myList 3` returns `[4 5]`. It is same as `myList[3:]`.
|
| 973 |
+
* `slice $myList 1 3` returns `[2 3]`. It is same as `myList[1:3]`.
|
| 974 |
+
* `slice $myList 0 3` returns `[1 2 3]`. It is same as `myList[:3]`.
|
| 975 |
+
|
| 976 |
+
`slice` panics if there is a problem while `mustSlice` returns an error to the template engine if there is a problem.
|
| 977 |
+
|
| 978 |
+
### chunk[¶](https://docs.ntfy.sh/publish/template-functions#chunk "Permanent link")
|
| 979 |
+
|
| 980 |
+
To split a list into chunks of given size, use `chunk size list`. This is useful for pagination.
|
| 981 |
+
|
| 982 |
+
```
|
| 983 |
+
chunk 3 (list 1 2 3 4 5 6 7 8)
|
| 984 |
+
```
|
| 985 |
+
|
| 986 |
+
This produces list of lists `[ [ 1 2 3 ] [ 4 5 6 ] [ 7 8 ] ]`.
|
| 987 |
+
|
| 988 |
+
### A Note on List Internals[¶](https://docs.ntfy.sh/publish/template-functions#a-note-on-list-internals "Permanent link")
|
| 989 |
+
|
| 990 |
+
A list is implemented in Go as a `[]any`. For Go developers embedding Sprig, you may pass `[]any` items into your template context and be able to use all of the `list` functions on those items.
|
| 991 |
+
|
| 992 |
+
Dictionaries and Dict Functions[¶](https://docs.ntfy.sh/publish/template-functions#dictionaries-and-dict-functions "Permanent link")
|
| 993 |
+
------------------------------------------------------------------------------------------------------------------------------------
|
| 994 |
+
|
| 995 |
+
Sprig provides a key/value storage type called a `dict` (short for "dictionary", as in Python). A `dict` is an _unorder_ type.
|
| 996 |
+
|
| 997 |
+
The key to a dictionary **must be a string**. However, the value can be any type, even another `dict` or `list`.
|
| 998 |
+
|
| 999 |
+
Unlike `list`s, `dict`s are not immutable. The `set` and `unset` functions will modify the contents of a dictionary.
|
| 1000 |
+
|
| 1001 |
+
### dict[¶](https://docs.ntfy.sh/publish/template-functions#dict "Permanent link")
|
| 1002 |
+
|
| 1003 |
+
Creating dictionaries is done by calling the `dict` function and passing it a list of pairs.
|
| 1004 |
+
|
| 1005 |
+
The following creates a dictionary with three items:
|
| 1006 |
+
|
| 1007 |
+
```
|
| 1008 |
+
$myDict := dict "name1" "value1" "name2" "value2" "name3" "value 3"
|
| 1009 |
+
```
|
| 1010 |
+
|
| 1011 |
+
### get[¶](https://docs.ntfy.sh/publish/template-functions#get "Permanent link")
|
| 1012 |
+
|
| 1013 |
+
Given a map and a key, get the value from the map.
|
| 1014 |
+
|
| 1015 |
+
```
|
| 1016 |
+
get $myDict "name1"
|
| 1017 |
+
```
|
| 1018 |
+
|
| 1019 |
+
The above returns `"value1"`
|
| 1020 |
+
|
| 1021 |
+
Note that if the key is not found, this operation will simply return `""`. No error will be generated.
|
| 1022 |
+
|
| 1023 |
+
### set[¶](https://docs.ntfy.sh/publish/template-functions#set "Permanent link")
|
| 1024 |
+
|
| 1025 |
+
Use `set` to add a new key/value pair to a dictionary.
|
| 1026 |
+
|
| 1027 |
+
```
|
| 1028 |
+
$_ := set $myDict "name4" "value4"
|
| 1029 |
+
```
|
| 1030 |
+
|
| 1031 |
+
Note that `set`_returns the dictionary_ (a requirement of Go template functions), so you may need to trap the value as done above with the `$_` assignment.
|
| 1032 |
+
|
| 1033 |
+
### unset[¶](https://docs.ntfy.sh/publish/template-functions#unset "Permanent link")
|
| 1034 |
+
|
| 1035 |
+
Given a map and a key, delete the key from the map.
|
| 1036 |
+
|
| 1037 |
+
```
|
| 1038 |
+
$_ := unset $myDict "name4"
|
| 1039 |
+
```
|
| 1040 |
+
|
| 1041 |
+
As with `set`, this returns the dictionary.
|
| 1042 |
+
|
| 1043 |
+
Note that if the key is not found, this operation will simply return. No error will be generated.
|
| 1044 |
+
|
| 1045 |
+
### hasKey[¶](https://docs.ntfy.sh/publish/template-functions#haskey "Permanent link")
|
| 1046 |
+
|
| 1047 |
+
The `hasKey` function returns `true` if the given dict contains the given key.
|
| 1048 |
+
|
| 1049 |
+
```
|
| 1050 |
+
hasKey $myDict "name1"
|
| 1051 |
+
```
|
| 1052 |
+
|
| 1053 |
+
If the key is not found, this returns `false`.
|
| 1054 |
+
|
| 1055 |
+
### pluck[¶](https://docs.ntfy.sh/publish/template-functions#pluck "Permanent link")
|
| 1056 |
+
|
| 1057 |
+
The `pluck` function makes it possible to give one key and multiple maps, and get a list of all of the matches:
|
| 1058 |
+
|
| 1059 |
+
```
|
| 1060 |
+
pluck "name1" $myDict $myOtherDict
|
| 1061 |
+
```
|
| 1062 |
+
|
| 1063 |
+
The above will return a `list` containing every found value (`[value1 otherValue1]`).
|
| 1064 |
+
|
| 1065 |
+
If the give key is _not found_ in a map, that map will not have an item in the list (and the length of the returned list will be less than the number of dicts in the call to `pluck`.
|
| 1066 |
+
|
| 1067 |
+
If the key is _found_ but the value is an empty value, that value will be inserted.
|
| 1068 |
+
|
| 1069 |
+
A common idiom in Sprig templates is to uses `pluck... | first` to get the first matching key out of a collection of dictionaries.
|
| 1070 |
+
|
| 1071 |
+
### dig[¶](https://docs.ntfy.sh/publish/template-functions#dig "Permanent link")
|
| 1072 |
+
|
| 1073 |
+
The `dig` function traverses a nested set of dicts, selecting keys from a list of values. It returns a default value if any of the keys are not found at the associated dict.
|
| 1074 |
+
|
| 1075 |
+
```
|
| 1076 |
+
dig "user" "role" "humanName" "guest" $dict
|
| 1077 |
+
```
|
| 1078 |
+
|
| 1079 |
+
Given a dict structured like
|
| 1080 |
+
|
| 1081 |
+
```
|
| 1082 |
+
{
|
| 1083 |
+
user: {
|
| 1084 |
+
role: {
|
| 1085 |
+
humanName: "curator"
|
| 1086 |
+
}
|
| 1087 |
+
}
|
| 1088 |
+
}
|
| 1089 |
+
```
|
| 1090 |
+
|
| 1091 |
+
the above would return `"curator"`. If the dict lacked even a `user` field, the result would be `"guest"`.
|
| 1092 |
+
|
| 1093 |
+
Dig can be very useful in cases where you'd like to avoid guard clauses, especially since Go's template package's `and` doesn't shortcut. For instance `and a.maybeNil a.maybeNil.iNeedThis` will always evaluate `a.maybeNil.iNeedThis`, and panic if `a` lacks a `maybeNil` field.)
|
| 1094 |
+
|
| 1095 |
+
`dig` accepts its dict argument last in order to support pipelining.
|
| 1096 |
+
|
| 1097 |
+
### keys[¶](https://docs.ntfy.sh/publish/template-functions#keys "Permanent link")
|
| 1098 |
+
|
| 1099 |
+
The `keys` function will return a `list` of all of the keys in one or more `dict` types. Since a dictionary is _unordered_, the keys will not be in a predictable order. They can be sorted with `sortAlpha`.
|
| 1100 |
+
|
| 1101 |
+
```
|
| 1102 |
+
keys $myDict | sortAlpha
|
| 1103 |
+
```
|
| 1104 |
+
|
| 1105 |
+
When supplying multiple dictionaries, the keys will be concatenated. Use the `uniq` function along with `sortAlpha` to get a unqiue, sorted list of keys.
|
| 1106 |
+
|
| 1107 |
+
```
|
| 1108 |
+
keys $myDict $myOtherDict | uniq | sortAlpha
|
| 1109 |
+
```
|
| 1110 |
+
|
| 1111 |
+
### pick[¶](https://docs.ntfy.sh/publish/template-functions#pick "Permanent link")
|
| 1112 |
+
|
| 1113 |
+
The `pick` function selects just the given keys out of a dictionary, creating a new `dict`.
|
| 1114 |
+
|
| 1115 |
+
```
|
| 1116 |
+
$new := pick $myDict "name1" "name2"
|
| 1117 |
+
```
|
| 1118 |
+
|
| 1119 |
+
The above returns `{name1: value1, name2: value2}`
|
| 1120 |
+
|
| 1121 |
+
### omit[¶](https://docs.ntfy.sh/publish/template-functions#omit "Permanent link")
|
| 1122 |
+
|
| 1123 |
+
The `omit` function is similar to `pick`, except it returns a new `dict` with all the keys that _do not_ match the given keys.
|
| 1124 |
+
|
| 1125 |
+
```
|
| 1126 |
+
$new := omit $myDict "name1" "name3"
|
| 1127 |
+
```
|
| 1128 |
+
|
| 1129 |
+
The above returns `{name2: value2}`
|
| 1130 |
+
|
| 1131 |
+
### values[¶](https://docs.ntfy.sh/publish/template-functions#values "Permanent link")
|
| 1132 |
+
|
| 1133 |
+
The `values` function is similar to `keys`, except it returns a new `list` with all the values of the source `dict` (only one dictionary is supported).
|
| 1134 |
+
|
| 1135 |
+
```
|
| 1136 |
+
$vals := values $myDict
|
| 1137 |
+
```
|
| 1138 |
+
|
| 1139 |
+
The above returns `list["value1", "value2", "value 3"]`. Note that the `values` function gives no guarantees about the result ordering- if you care about this, then use `sortAlpha`.
|
| 1140 |
+
|
| 1141 |
+
Type Conversion Functions[¶](https://docs.ntfy.sh/publish/template-functions#type-conversion-functions "Permanent link")
|
| 1142 |
+
------------------------------------------------------------------------------------------------------------------------
|
| 1143 |
+
|
| 1144 |
+
The following type conversion functions are provided by Sprig:
|
| 1145 |
+
|
| 1146 |
+
* `atoi`: Convert a string to an integer.
|
| 1147 |
+
* `float64`: Convert to a `float64`.
|
| 1148 |
+
* `int`: Convert to an `int` at the system's width.
|
| 1149 |
+
* `int64`: Convert to an `int64`.
|
| 1150 |
+
* `toDecimal`: Convert a unix octal to a `int64`.
|
| 1151 |
+
* `toString`: Convert to a string.
|
| 1152 |
+
* `toStrings`: Convert a list, slice, or array to a list of strings.
|
| 1153 |
+
|
| 1154 |
+
Only `atoi` requires that the input be a specific type. The others will attempt to convert from any type to the destination type. For example, `int64` can convert floats to ints, and it can also convert strings to ints.
|
| 1155 |
+
|
| 1156 |
+
### toStrings[¶](https://docs.ntfy.sh/publish/template-functions#tostrings "Permanent link")
|
| 1157 |
+
|
| 1158 |
+
Given a list-like collection, produce a slice of strings.
|
| 1159 |
+
|
| 1160 |
+
```
|
| 1161 |
+
list 1 2 3 | toStrings
|
| 1162 |
+
```
|
| 1163 |
+
|
| 1164 |
+
The above converts `1` to `"1"`, `2` to `"2"`, and so on, and then returns them as a list.
|
| 1165 |
+
|
| 1166 |
+
### toDecimal[¶](https://docs.ntfy.sh/publish/template-functions#todecimal "Permanent link")
|
| 1167 |
+
|
| 1168 |
+
Given a unix octal permission, produce a decimal.
|
| 1169 |
+
|
| 1170 |
+
```
|
| 1171 |
+
"0777" | toDecimal
|
| 1172 |
+
```
|
| 1173 |
+
|
| 1174 |
+
The above converts `0777` to `511` and returns the value as an int64.
|
| 1175 |
+
|
| 1176 |
+
Path and Filepath Functions[¶](https://docs.ntfy.sh/publish/template-functions#path-and-filepath-functions "Permanent link")
|
| 1177 |
+
----------------------------------------------------------------------------------------------------------------------------
|
| 1178 |
+
|
| 1179 |
+
While Sprig does not grant access to the filesystem, it does provide functions for working with strings that follow file path conventions.
|
| 1180 |
+
|
| 1181 |
+
### Paths[¶](https://docs.ntfy.sh/publish/template-functions#paths "Permanent link")
|
| 1182 |
+
|
| 1183 |
+
Paths separated by the slash character (`/`), processed by the `path` package.
|
| 1184 |
+
|
| 1185 |
+
Examples:
|
| 1186 |
+
|
| 1187 |
+
* The [Linux](https://en.wikipedia.org/wiki/Linux) and [MacOS](https://en.wikipedia.org/wiki/MacOS)[filesystems](https://en.wikipedia.org/wiki/File_system): `/home/user/file`, `/etc/config`;
|
| 1188 |
+
* The path component of [URIs](https://en.wikipedia.org/wiki/Uniform_Resource_Identifier): `https://example.com/some/content/`, `ftp://example.com/file/`.
|
| 1189 |
+
|
| 1190 |
+
#### base[¶](https://docs.ntfy.sh/publish/template-functions#base "Permanent link")
|
| 1191 |
+
|
| 1192 |
+
Return the last element of a path.
|
| 1193 |
+
|
| 1194 |
+
```
|
| 1195 |
+
base "foo/bar/baz"
|
| 1196 |
+
```
|
| 1197 |
+
|
| 1198 |
+
The above prints "baz".
|
| 1199 |
+
|
| 1200 |
+
#### dir[¶](https://docs.ntfy.sh/publish/template-functions#dir "Permanent link")
|
| 1201 |
+
|
| 1202 |
+
Return the directory, stripping the last part of the path. So `dir "foo/bar/baz"` returns `foo/bar`.
|
| 1203 |
+
|
| 1204 |
+
#### clean[¶](https://docs.ntfy.sh/publish/template-functions#clean "Permanent link")
|
| 1205 |
+
|
| 1206 |
+
Clean up a path.
|
| 1207 |
+
|
| 1208 |
+
```
|
| 1209 |
+
clean "foo/bar/../baz"
|
| 1210 |
+
```
|
| 1211 |
+
|
| 1212 |
+
The above resolves the `..` and returns `foo/baz`.
|
| 1213 |
+
|
| 1214 |
+
#### ext[¶](https://docs.ntfy.sh/publish/template-functions#ext "Permanent link")
|
| 1215 |
+
|
| 1216 |
+
Return the file extension.
|
| 1217 |
+
|
| 1218 |
+
```
|
| 1219 |
+
ext "foo.bar"
|
| 1220 |
+
```
|
| 1221 |
+
|
| 1222 |
+
The above returns `.bar`.
|
| 1223 |
+
|
| 1224 |
+
#### isAbs[¶](https://docs.ntfy.sh/publish/template-functions#isabs "Permanent link")
|
| 1225 |
+
|
| 1226 |
+
To check whether a path is absolute, use `isAbs`.
|
| 1227 |
+
|
| 1228 |
+
### Filepaths[¶](https://docs.ntfy.sh/publish/template-functions#filepaths "Permanent link")
|
| 1229 |
+
|
| 1230 |
+
Paths separated by the `os.PathSeparator` variable, processed by the `path/filepath` package.
|
| 1231 |
+
|
| 1232 |
+
These are the recommended functions to use when parsing paths of local filesystems, usually when dealing with local files, directories, etc.
|
| 1233 |
+
|
| 1234 |
+
Examples:
|
| 1235 |
+
|
| 1236 |
+
* Running on Linux or MacOS the filesystem path is separated by the slash character (`/`): `/home/user/file`, `/etc/config`;
|
| 1237 |
+
* Running on [Windows](https://en.wikipedia.org/wiki/Microsoft_Windows) the filesystem path is separated by the backslash character (`\`): `C:\Users\Username\`, `C:\Program Files\Application\`;
|
| 1238 |
+
|
| 1239 |
+
#### osBase[¶](https://docs.ntfy.sh/publish/template-functions#osbase "Permanent link")
|
| 1240 |
+
|
| 1241 |
+
Return the last element of a filepath.
|
| 1242 |
+
|
| 1243 |
+
```
|
| 1244 |
+
osBase "/foo/bar/baz"
|
| 1245 |
+
osBase "C:\\foo\\bar\\baz"
|
| 1246 |
+
```
|
| 1247 |
+
|
| 1248 |
+
The above prints "baz" on Linux and Windows, respectively.
|
| 1249 |
+
|
| 1250 |
+
#### osDir[¶](https://docs.ntfy.sh/publish/template-functions#osdir "Permanent link")
|
| 1251 |
+
|
| 1252 |
+
Return the directory, stripping the last part of the path. So `osDir "/foo/bar/baz"` returns `/foo/bar` on Linux, and `osDir "C:\\foo\\bar\\baz"` returns `C:\\foo\\bar` on Windows.
|
| 1253 |
+
|
| 1254 |
+
#### osClean[¶](https://docs.ntfy.sh/publish/template-functions#osclean "Permanent link")
|
| 1255 |
+
|
| 1256 |
+
Clean up a path.
|
| 1257 |
+
|
| 1258 |
+
```
|
| 1259 |
+
osClean "/foo/bar/../baz"
|
| 1260 |
+
osClean "C:\\foo\\bar\\..\\baz"
|
| 1261 |
+
```
|
| 1262 |
+
|
| 1263 |
+
The above resolves the `..` and returns `foo/baz` on Linux and `C:\\foo\\baz` on Windows.
|
| 1264 |
+
|
| 1265 |
+
#### osExt[¶](https://docs.ntfy.sh/publish/template-functions#osext "Permanent link")
|
| 1266 |
+
|
| 1267 |
+
Return the file extension.
|
| 1268 |
+
|
| 1269 |
+
```
|
| 1270 |
+
osExt "/foo.bar"
|
| 1271 |
+
osExt "C:\\foo.bar"
|
| 1272 |
+
```
|
| 1273 |
+
|
| 1274 |
+
The above returns `.bar` on Linux and Windows, respectively.
|
| 1275 |
+
|
| 1276 |
+
#### osIsAbs[¶](https://docs.ntfy.sh/publish/template-functions#osisabs "Permanent link")
|
| 1277 |
+
|
| 1278 |
+
To check whether a file path is absolute, use `osIsAbs`.
|
| 1279 |
+
|
| 1280 |
+
Flow Control Functions[¶](https://docs.ntfy.sh/publish/template-functions#flow-control-functions "Permanent link")
|
| 1281 |
+
------------------------------------------------------------------------------------------------------------------
|
| 1282 |
+
|
| 1283 |
+
### fail[¶](https://docs.ntfy.sh/publish/template-functions#fail "Permanent link")
|
| 1284 |
+
|
| 1285 |
+
Unconditionally returns an empty `string` and an `error` with the specified text. This is useful in scenarios where other conditionals have determined that template rendering should fail.
|
| 1286 |
+
|
| 1287 |
+
```
|
| 1288 |
+
fail "Please accept the end user license agreement"
|
| 1289 |
+
```
|
| 1290 |
+
|
| 1291 |
+
Reflection Functions[¶](https://docs.ntfy.sh/publish/template-functions#reflection-functions "Permanent link")
|
| 1292 |
+
--------------------------------------------------------------------------------------------------------------
|
| 1293 |
+
|
| 1294 |
+
Sprig provides rudimentary reflection tools. These help advanced template developers understand the underlying Go type information for a particular value.
|
| 1295 |
+
|
| 1296 |
+
Go has several primitive _kinds_, like `string`, `slice`, `int64`, and `bool`.
|
| 1297 |
+
|
| 1298 |
+
Go has an open _type_ system that allows developers to create their own types.
|
| 1299 |
+
|
| 1300 |
+
Sprig provides a set of functions for each.
|
| 1301 |
+
|
| 1302 |
+
### Kind Functions[¶](https://docs.ntfy.sh/publish/template-functions#kind-functions "Permanent link")
|
| 1303 |
+
|
| 1304 |
+
There are two Kind functions: `kindOf` returns the kind of an object.
|
| 1305 |
+
|
| 1306 |
+
```
|
| 1307 |
+
kindOf "hello"
|
| 1308 |
+
```
|
| 1309 |
+
|
| 1310 |
+
The above would return `string`. For simple tests (like in `if` blocks), the `kindIs` function will let you verify that a value is a particular kind:
|
| 1311 |
+
|
| 1312 |
+
```
|
| 1313 |
+
kindIs "int" 123
|
| 1314 |
+
```
|
| 1315 |
+
|
| 1316 |
+
The above will return `true`
|
| 1317 |
+
|
| 1318 |
+
### Type Functions[¶](https://docs.ntfy.sh/publish/template-functions#type-functions "Permanent link")
|
| 1319 |
+
|
| 1320 |
+
Types are slightly harder to work with, so there are three different functions:
|
| 1321 |
+
|
| 1322 |
+
* `typeOf` returns the underlying type of a value: `typeOf $foo`
|
| 1323 |
+
* `typeIs` is like `kindIs`, but for types: `typeIs "*io.Buffer" $myVal`
|
| 1324 |
+
* `typeIsLike` works as `typeIs`, except that it also dereferences pointers.
|
| 1325 |
+
|
| 1326 |
+
**Note:** None of these can test whether or not something implements a given interface, since doing so would require compiling the interface in ahead of time.
|
| 1327 |
+
|
| 1328 |
+
### deepEqual[¶](https://docs.ntfy.sh/publish/template-functions#deepequal "Permanent link")
|
| 1329 |
+
|
| 1330 |
+
`deepEqual` returns true if two values are ["deeply equal"](https://golang.org/pkg/reflect/#DeepEqual)
|
| 1331 |
+
|
| 1332 |
+
Works for non-primitive types as well (compared to the built-in `eq`).
|
| 1333 |
+
|
| 1334 |
+
```
|
| 1335 |
+
deepEqual (list 1 2 3) (list 1 2 3)
|
| 1336 |
+
```
|
| 1337 |
+
|
| 1338 |
+
The above will return `true`
|
| 1339 |
+
|
| 1340 |
+
Cryptographic and Security Functions[¶](https://docs.ntfy.sh/publish/template-functions#cryptographic-and-security-functions "Permanent link")
|
| 1341 |
+
----------------------------------------------------------------------------------------------------------------------------------------------
|
| 1342 |
+
|
| 1343 |
+
Sprig provides a couple of advanced cryptographic functions.
|
| 1344 |
+
|
| 1345 |
+
### sha1sum[¶](https://docs.ntfy.sh/publish/template-functions#sha1sum "Permanent link")
|
| 1346 |
+
|
| 1347 |
+
The `sha1sum` function receives a string, and computes it's SHA1 digest.
|
| 1348 |
+
|
| 1349 |
+
```
|
| 1350 |
+
sha1sum "Hello world!"
|
| 1351 |
+
```
|
| 1352 |
+
|
| 1353 |
+
### sha256sum[¶](https://docs.ntfy.sh/publish/template-functions#sha256sum "Permanent link")
|
| 1354 |
+
|
| 1355 |
+
The `sha256sum` function receives a string, and computes it's SHA256 digest.
|
| 1356 |
+
|
| 1357 |
+
```
|
| 1358 |
+
sha256sum "Hello world!"
|
| 1359 |
+
```
|
| 1360 |
+
|
| 1361 |
+
The above will compute the SHA 256 sum in an "ASCII armored" format that is safe to print.
|
| 1362 |
+
|
| 1363 |
+
### sha512sum[¶](https://docs.ntfy.sh/publish/template-functions#sha512sum "Permanent link")
|
| 1364 |
+
|
| 1365 |
+
The `sha512sum` function receives a string, and computes it's SHA512 digest.
|
| 1366 |
+
|
| 1367 |
+
```
|
| 1368 |
+
sha512sum "Hello world!"
|
| 1369 |
+
```
|
| 1370 |
+
|
| 1371 |
+
The above will compute the SHA 512 sum in an "ASCII armored" format that is safe to print.
|
| 1372 |
+
|
| 1373 |
+
### adler32sum[¶](https://docs.ntfy.sh/publish/template-functions#adler32sum "Permanent link")
|
| 1374 |
+
|
| 1375 |
+
The `adler32sum` function receives a string, and computes its Adler-32 checksum.
|
| 1376 |
+
|
| 1377 |
+
```
|
| 1378 |
+
adler32sum "Hello world!"
|
| 1379 |
+
```
|
| 1380 |
+
|
| 1381 |
+
URL Functions[¶](https://docs.ntfy.sh/publish/template-functions#url-functions "Permanent link")
|
| 1382 |
+
------------------------------------------------------------------------------------------------
|
| 1383 |
+
|
| 1384 |
+
### urlParse[¶](https://docs.ntfy.sh/publish/template-functions#urlparse "Permanent link")
|
| 1385 |
+
|
| 1386 |
+
Parses string for URL and produces dict with URL parts
|
| 1387 |
+
|
| 1388 |
+
```
|
| 1389 |
+
urlParse "http://admin:[email protected]:8080/api?list=false#anchor"
|
| 1390 |
+
```
|
| 1391 |
+
|
| 1392 |
+
The above returns a dict, containing URL object:
|
| 1393 |
+
|
| 1394 |
+
```
|
| 1395 |
+
scheme: 'http'
|
| 1396 |
+
host: 'server.com:8080'
|
| 1397 |
+
path: '/api'
|
| 1398 |
+
query: 'list=false'
|
| 1399 |
+
opaque: nil
|
| 1400 |
+
fragment: 'anchor'
|
| 1401 |
+
userinfo: 'admin:secret'
|
| 1402 |
+
```
|
| 1403 |
+
|
| 1404 |
+
For more info, check https://golang.org/pkg/net/url/#URL
|
| 1405 |
+
|
| 1406 |
+
### urlJoin[¶](https://docs.ntfy.sh/publish/template-functions#urljoin "Permanent link")
|
| 1407 |
+
|
| 1408 |
+
Joins map (produced by `urlParse`) to produce URL string
|
| 1409 |
+
|
| 1410 |
+
```
|
| 1411 |
+
urlJoin (dict "fragment" "fragment" "host" "host:80" "path" "/path" "query" "query" "scheme" "http")
|
| 1412 |
+
```
|
| 1413 |
+
|
| 1414 |
+
The above returns the following string:
|
| 1415 |
+
|
| 1416 |
+
```
|
| 1417 |
+
proto://host:80/path?query#fragment
|
| 1418 |
+
```
|
docs-ntfy-sh-releases-20250924.md
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
docs-ntfy-sh-subscribe-api-20250924.md
ADDED
|
@@ -0,0 +1,414 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
Title: Using the API - ntfy
|
| 2 |
+
|
| 3 |
+
URL Source: https://docs.ntfy.sh/subscribe/api
|
| 4 |
+
|
| 5 |
+
Markdown Content:
|
| 6 |
+
Subscribe via API[¶](https://docs.ntfy.sh/subscribe/api#subscribe-via-api "Permanent link")
|
| 7 |
+
-------------------------------------------------------------------------------------------
|
| 8 |
+
|
| 9 |
+
You can create and subscribe to a topic in the [web UI](https://docs.ntfy.sh/subscribe/web/), via the [phone app](https://docs.ntfy.sh/subscribe/phone/), via the [ntfy CLI](https://docs.ntfy.sh/subscribe/cli/), or in your own app or script by subscribing the API. This page describes how to subscribe via API. You may also want to check out the page that describes how to [publish messages](https://docs.ntfy.sh/publish/).
|
| 10 |
+
|
| 11 |
+
You can consume the subscription API as either a **[simple HTTP stream (JSON, SSE or raw)](https://docs.ntfy.sh/subscribe/api#http-stream)**, or **[via WebSockets](https://docs.ntfy.sh/subscribe/api#websockets)**. Both are incredibly simple to use.
|
| 12 |
+
|
| 13 |
+
HTTP stream[¶](https://docs.ntfy.sh/subscribe/api#http-stream "Permanent link")
|
| 14 |
+
-------------------------------------------------------------------------------
|
| 15 |
+
|
| 16 |
+
The HTTP stream-based API relies on a simple GET request with a streaming HTTP response, i.e **you open a GET request and the connection stays open forever**, sending messages back as they come in. There are three different API endpoints, which only differ in the response format:
|
| 17 |
+
|
| 18 |
+
* [JSON stream](https://docs.ntfy.sh/subscribe/api#subscribe-as-json-stream): `<topic>/json` returns a JSON stream, with one JSON message object per line
|
| 19 |
+
* [SSE stream](https://docs.ntfy.sh/subscribe/api#subscribe-as-sse-stream): `<topic>/sse` returns messages as [Server-Sent Events (SSE)](https://en.wikipedia.org/wiki/Server-sent_events), which can be used with [EventSource](https://developer.mozilla.org/en-US/docs/Web/API/EventSource)
|
| 20 |
+
* [Raw stream](https://docs.ntfy.sh/subscribe/api#subscribe-as-raw-stream): `<topic>/raw` returns messages as raw text, with one line per message
|
| 21 |
+
|
| 22 |
+
### Subscribe as JSON stream[¶](https://docs.ntfy.sh/subscribe/api#subscribe-as-json-stream "Permanent link")
|
| 23 |
+
|
| 24 |
+
Here are a few examples of how to consume the JSON endpoint (`<topic>/json`). For almost all languages, **this is the recommended way to subscribe to a topic**. The notable exception is JavaScript, for which the [SSE/EventSource stream](https://docs.ntfy.sh/subscribe/api#subscribe-as-sse-stream) is much easier to work with.
|
| 25 |
+
|
| 26 |
+
Command line (curl) ntfy CLI HTTP Go Python PHP
|
| 27 |
+
|
| 28 |
+
```
|
| 29 |
+
$ curl -s ntfy.sh/disk-alerts/json
|
| 30 |
+
{"id":"SLiKI64DOt","time":1635528757,"event":"open","topic":"mytopic"}
|
| 31 |
+
{"id":"hwQ2YpKdmg","time":1635528741,"event":"message","topic":"mytopic","message":"Disk full"}
|
| 32 |
+
{"id":"DGUDShMCsc","time":1635528787,"event":"keepalive","topic":"mytopic"}
|
| 33 |
+
...
|
| 34 |
+
```
|
| 35 |
+
|
| 36 |
+
```
|
| 37 |
+
$ ntfy subcribe disk-alerts
|
| 38 |
+
{"id":"hwQ2YpKdmg","time":1635528741,"event":"message","topic":"mytopic","message":"Disk full"}
|
| 39 |
+
...
|
| 40 |
+
```
|
| 41 |
+
|
| 42 |
+
```
|
| 43 |
+
GET /disk-alerts/json HTTP/1.1
|
| 44 |
+
Host: ntfy.sh
|
| 45 |
+
|
| 46 |
+
HTTP/1.1 200 OK
|
| 47 |
+
Content-Type: application/x-ndjson; charset=utf-8
|
| 48 |
+
Transfer-Encoding: chunked
|
| 49 |
+
|
| 50 |
+
{"id":"SLiKI64DOt","time":1635528757,"event":"open","topic":"mytopic"}
|
| 51 |
+
{"id":"hwQ2YpKdmg","time":1635528741,"event":"message","topic":"mytopic","message":"Disk full"}
|
| 52 |
+
{"id":"DGUDShMCsc","time":1635528787,"event":"keepalive","topic":"mytopic"}
|
| 53 |
+
...
|
| 54 |
+
```
|
| 55 |
+
|
| 56 |
+
```
|
| 57 |
+
resp, err := http.Get("https://ntfy.sh/disk-alerts/json")
|
| 58 |
+
if err != nil {
|
| 59 |
+
log.Fatal(err)
|
| 60 |
+
}
|
| 61 |
+
defer resp.Body.Close()
|
| 62 |
+
scanner := bufio.NewScanner(resp.Body)
|
| 63 |
+
for scanner.Scan() {
|
| 64 |
+
println(scanner.Text())
|
| 65 |
+
}
|
| 66 |
+
```
|
| 67 |
+
|
| 68 |
+
```
|
| 69 |
+
resp = requests.get("https://ntfy.sh/disk-alerts/json", stream=True)
|
| 70 |
+
for line in resp.iter_lines():
|
| 71 |
+
if line:
|
| 72 |
+
print(line)
|
| 73 |
+
```
|
| 74 |
+
|
| 75 |
+
```
|
| 76 |
+
$fp = fopen('https://ntfy.sh/disk-alerts/json', 'r');
|
| 77 |
+
if (!$fp) die('cannot open stream');
|
| 78 |
+
while (!feof($fp)) {
|
| 79 |
+
echo fgets($fp, 2048);
|
| 80 |
+
flush();
|
| 81 |
+
}
|
| 82 |
+
fclose($fp);
|
| 83 |
+
```
|
| 84 |
+
|
| 85 |
+
### Subscribe as SSE stream[¶](https://docs.ntfy.sh/subscribe/api#subscribe-as-sse-stream "Permanent link")
|
| 86 |
+
|
| 87 |
+
Using [EventSource](https://developer.mozilla.org/en-US/docs/Web/API/EventSource) in JavaScript, you can consume notifications via a [Server-Sent Events (SSE)](https://en.wikipedia.org/wiki/Server-sent_events) stream. It's incredibly easy to use. Here's what it looks like. You may also want to check out the [full example on GitHub](https://github.com/binwiederhier/ntfy/tree/main/examples/web-example-eventsource).
|
| 88 |
+
|
| 89 |
+
Command line (curl) HTTP JavaScript
|
| 90 |
+
|
| 91 |
+
```
|
| 92 |
+
$ curl -s ntfy.sh/mytopic/sse
|
| 93 |
+
event: open
|
| 94 |
+
data: {"id":"weSj9RtNkj","time":1635528898,"event":"open","topic":"mytopic"}
|
| 95 |
+
|
| 96 |
+
data: {"id":"p0M5y6gcCY","time":1635528909,"event":"message","topic":"mytopic","message":"Hi!"}
|
| 97 |
+
|
| 98 |
+
event: keepalive
|
| 99 |
+
data: {"id":"VNxNIg5fpt","time":1635528928,"event":"keepalive","topic":"test"}
|
| 100 |
+
...
|
| 101 |
+
```
|
| 102 |
+
|
| 103 |
+
```
|
| 104 |
+
GET /mytopic/sse HTTP/1.1
|
| 105 |
+
Host: ntfy.sh
|
| 106 |
+
|
| 107 |
+
HTTP/1.1 200 OK
|
| 108 |
+
Content-Type: text/event-stream; charset=utf-8
|
| 109 |
+
Transfer-Encoding: chunked
|
| 110 |
+
|
| 111 |
+
event: open
|
| 112 |
+
data: {"id":"weSj9RtNkj","time":1635528898,"event":"open","topic":"mytopic"}
|
| 113 |
+
|
| 114 |
+
data: {"id":"p0M5y6gcCY","time":1635528909,"event":"message","topic":"mytopic","message":"Hi!"}
|
| 115 |
+
|
| 116 |
+
event: keepalive
|
| 117 |
+
data: {"id":"VNxNIg5fpt","time":1635528928,"event":"keepalive","topic":"test"}
|
| 118 |
+
...
|
| 119 |
+
```
|
| 120 |
+
|
| 121 |
+
```
|
| 122 |
+
const eventSource = new EventSource('https://ntfy.sh/mytopic/sse');
|
| 123 |
+
eventSource.onmessage = (e) => {
|
| 124 |
+
console.log(e.data);
|
| 125 |
+
};
|
| 126 |
+
```
|
| 127 |
+
|
| 128 |
+
### Subscribe as raw stream[¶](https://docs.ntfy.sh/subscribe/api#subscribe-as-raw-stream "Permanent link")
|
| 129 |
+
|
| 130 |
+
The `/raw` endpoint will output one line per message, and **will only include the message body**. It's useful for extremely simple scripts, and doesn't include all the data. Additional fields such as [priority](https://docs.ntfy.sh/publish/#message-priority), [tags](https://docs.ntfy.sh/publish/#tags-emojis) or [message title](https://docs.ntfy.sh/publish/#message-title) are not included in this output format. Keepalive messages are sent as empty lines.
|
| 131 |
+
|
| 132 |
+
Command line (curl) HTTP Go Python PHP
|
| 133 |
+
|
| 134 |
+
```
|
| 135 |
+
$ curl -s ntfy.sh/disk-alerts/raw
|
| 136 |
+
|
| 137 |
+
Disk full
|
| 138 |
+
...
|
| 139 |
+
```
|
| 140 |
+
|
| 141 |
+
```
|
| 142 |
+
GET /disk-alerts/raw HTTP/1.1
|
| 143 |
+
Host: ntfy.sh
|
| 144 |
+
|
| 145 |
+
HTTP/1.1 200 OK
|
| 146 |
+
Content-Type: text/plain; charset=utf-8
|
| 147 |
+
Transfer-Encoding: chunked
|
| 148 |
+
|
| 149 |
+
Disk full
|
| 150 |
+
...
|
| 151 |
+
```
|
| 152 |
+
|
| 153 |
+
```
|
| 154 |
+
resp, err := http.Get("https://ntfy.sh/disk-alerts/raw")
|
| 155 |
+
if err != nil {
|
| 156 |
+
log.Fatal(err)
|
| 157 |
+
}
|
| 158 |
+
defer resp.Body.Close()
|
| 159 |
+
scanner := bufio.NewScanner(resp.Body)
|
| 160 |
+
for scanner.Scan() {
|
| 161 |
+
println(scanner.Text())
|
| 162 |
+
}
|
| 163 |
+
```
|
| 164 |
+
|
| 165 |
+
```
|
| 166 |
+
resp = requests.get("https://ntfy.sh/disk-alerts/raw", stream=True)
|
| 167 |
+
for line in resp.iter_lines():
|
| 168 |
+
if line:
|
| 169 |
+
print(line)
|
| 170 |
+
```
|
| 171 |
+
|
| 172 |
+
```
|
| 173 |
+
$fp = fopen('https://ntfy.sh/disk-alerts/raw', 'r');
|
| 174 |
+
if (!$fp) die('cannot open stream');
|
| 175 |
+
while (!feof($fp)) {
|
| 176 |
+
echo fgets($fp, 2048);
|
| 177 |
+
flush();
|
| 178 |
+
}
|
| 179 |
+
fclose($fp);
|
| 180 |
+
```
|
| 181 |
+
|
| 182 |
+
WebSockets[¶](https://docs.ntfy.sh/subscribe/api#websockets "Permanent link")
|
| 183 |
+
-----------------------------------------------------------------------------
|
| 184 |
+
|
| 185 |
+
You may also subscribe to topics via [WebSockets](https://en.wikipedia.org/wiki/WebSocket), which is also widely supported in many languages. Most notably, WebSockets are natively supported in JavaScript. You may also want to check out the [full example on GitHub](https://github.com/binwiederhier/ntfy/tree/main/examples/web-example-websocket). On the command line, I recommend [websocat](https://github.com/vi/websocat), a fantastic tool similar to `socat` or `curl`, but specifically for WebSockets.
|
| 186 |
+
|
| 187 |
+
The WebSockets endpoint is available at `<topic>/ws` and returns messages as JSON objects similar to the [JSON stream endpoint](https://docs.ntfy.sh/subscribe/api#subscribe-as-json-stream).
|
| 188 |
+
|
| 189 |
+
Command line (websocat) HTTP Go JavaScript
|
| 190 |
+
|
| 191 |
+
```
|
| 192 |
+
$ websocat wss://ntfy.sh/mytopic/ws
|
| 193 |
+
{"id":"qRHUCCvjj8","time":1642307388,"event":"open","topic":"mytopic"}
|
| 194 |
+
{"id":"eOWoUBJ14x","time":1642307754,"event":"message","topic":"mytopic","message":"hi there"}
|
| 195 |
+
```
|
| 196 |
+
|
| 197 |
+
```
|
| 198 |
+
GET /disk-alerts/ws HTTP/1.1
|
| 199 |
+
Host: ntfy.sh
|
| 200 |
+
Upgrade: websocket
|
| 201 |
+
Connection: Upgrade
|
| 202 |
+
|
| 203 |
+
HTTP/1.1 101 Switching Protocols
|
| 204 |
+
Upgrade: websocket
|
| 205 |
+
Connection: Upgrade
|
| 206 |
+
...
|
| 207 |
+
```
|
| 208 |
+
|
| 209 |
+
```
|
| 210 |
+
import "github.com/gorilla/websocket"
|
| 211 |
+
ws, _, _ := websocket.DefaultDialer.Dial("wss://ntfy.sh/mytopic/ws", nil)
|
| 212 |
+
messageType, data, err := ws.ReadMessage()
|
| 213 |
+
...
|
| 214 |
+
```
|
| 215 |
+
|
| 216 |
+
```
|
| 217 |
+
const socket = new WebSocket('wss://ntfy.sh/mytopic/ws');
|
| 218 |
+
socket.addEventListener('message', function (event) {
|
| 219 |
+
console.log(event.data);
|
| 220 |
+
});
|
| 221 |
+
```
|
| 222 |
+
|
| 223 |
+
Advanced features[¶](https://docs.ntfy.sh/subscribe/api#advanced-features "Permanent link")
|
| 224 |
+
-------------------------------------------------------------------------------------------
|
| 225 |
+
|
| 226 |
+
### Poll for messages[¶](https://docs.ntfy.sh/subscribe/api#poll-for-messages "Permanent link")
|
| 227 |
+
|
| 228 |
+
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`).
|
| 229 |
+
|
| 230 |
+
```
|
| 231 |
+
curl -s "ntfy.sh/mytopic/json?poll=1"
|
| 232 |
+
```
|
| 233 |
+
|
| 234 |
+
### Fetch cached messages[¶](https://docs.ntfy.sh/subscribe/api#fetch-cached-messages "Permanent link")
|
| 235 |
+
|
| 236 |
+
Messages may be cached for a couple of hours (see [message caching](https://docs.ntfy.sh/config/#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 a duration (e.g. `10m` or `30s`), a Unix timestamp (e.g. `1635528757`), a message ID (e.g. `nFS3knfcQ1xe`), or `all` (all cached messages).
|
| 237 |
+
|
| 238 |
+
```
|
| 239 |
+
curl -s "ntfy.sh/mytopic/json?since=10m"
|
| 240 |
+
curl -s "ntfy.sh/mytopic/json?since=1645970742"
|
| 241 |
+
curl -s "ntfy.sh/mytopic/json?since=nFS3knfcQ1xe"
|
| 242 |
+
```
|
| 243 |
+
|
| 244 |
+
### Fetch latest message[¶](https://docs.ntfy.sh/subscribe/api#fetch-latest-message "Permanent link")
|
| 245 |
+
|
| 246 |
+
If you only want the most recent message sent to a topic and do not have a message ID or timestamp to use with `since=`, you can use `since=latest` to grab the most recent message from the cache for a particular topic.
|
| 247 |
+
|
| 248 |
+
```
|
| 249 |
+
curl -s "ntfy.sh/mytopic/json?poll=1&since=latest"
|
| 250 |
+
```
|
| 251 |
+
|
| 252 |
+
### Fetch scheduled messages[¶](https://docs.ntfy.sh/subscribe/api#fetch-scheduled-messages "Permanent link")
|
| 253 |
+
|
| 254 |
+
Messages that are [scheduled to be delivered](https://docs.ntfy.sh/publish/#scheduled-delivery) at a later date are not typically returned when subscribing via the API, which makes sense, because after all, the messages have technically not been delivered yet. To also return scheduled messages from the API, you can use the `scheduled=1` (alias: `sched=1`) parameter (makes most sense with the `poll=1` parameter):
|
| 255 |
+
|
| 256 |
+
```
|
| 257 |
+
curl -s "ntfy.sh/mytopic/json?poll=1&sched=1"
|
| 258 |
+
```
|
| 259 |
+
|
| 260 |
+
### Filter messages[¶](https://docs.ntfy.sh/subscribe/api#filter-messages "Permanent link")
|
| 261 |
+
|
| 262 |
+
You can filter which messages are returned based on the well-known message fields `id`, `message`, `title`, `priority` and `tags`. Here's an example that only returns messages of high or urgent priority that contains the both tags "zfs-error" and "error". Note that the `priority` filter is a logical OR and the `tags` filter is a logical AND.
|
| 263 |
+
|
| 264 |
+
```
|
| 265 |
+
$ curl "ntfy.sh/alerts/json?priority=high&tags=zfs-error"
|
| 266 |
+
{"id":"0TIkJpBcxR","time":1640122627,"event":"open","topic":"alerts"}
|
| 267 |
+
{"id":"X3Uzz9O1sM","time":1640122674,"event":"message","topic":"alerts","priority":4,
|
| 268 |
+
"tags":["error", "zfs-error"], "message":"ZFS pool corruption detected"}
|
| 269 |
+
```
|
| 270 |
+
|
| 271 |
+
Available filters (all case-insensitive):
|
| 272 |
+
|
| 273 |
+
| Filter variable | Alias | Example | Description |
|
| 274 |
+
| --- | --- | --- | --- |
|
| 275 |
+
| `id` | `X-ID` | `ntfy.sh/mytopic/json?poll=1&id=pbkiz8SD7ZxG` | Only return messages that match this exact message ID |
|
| 276 |
+
| `message` | `X-Message`, `m` | `ntfy.sh/mytopic/json?message=lalala` | Only return messages that match this exact message string |
|
| 277 |
+
| `title` | `X-Title`, `t` | `ntfy.sh/mytopic/json?title=some+title` | Only return messages that match this exact title string |
|
| 278 |
+
| `priority` | `X-Priority`, `prio`, `p` | `ntfy.sh/mytopic/json?p=high,urgent` | Only return messages that match _any priority listed_ (comma-separated) |
|
| 279 |
+
| `tags` | `X-Tags`, `tag`, `ta` | `ntfy.sh/mytopic?/jsontags=error,alert` | Only return messages that match _all listed tags_ (comma-separated) |
|
| 280 |
+
|
| 281 |
+
### Subscribe to multiple topics[¶](https://docs.ntfy.sh/subscribe/api#subscribe-to-multiple-topics "Permanent link")
|
| 282 |
+
|
| 283 |
+
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:
|
| 284 |
+
|
| 285 |
+
```
|
| 286 |
+
$ curl -s ntfy.sh/mytopic1,mytopic2/json
|
| 287 |
+
{"id":"0OkXIryH3H","time":1637182619,"event":"open","topic":"mytopic1,mytopic2,mytopic3"}
|
| 288 |
+
{"id":"dzJJm7BCWs","time":1637182634,"event":"message","topic":"mytopic1","message":"for topic 1"}
|
| 289 |
+
{"id":"Cm02DsxUHb","time":1637182643,"event":"message","topic":"mytopic2","message":"for topic 2"}
|
| 290 |
+
```
|
| 291 |
+
|
| 292 |
+
### Authentication[¶](https://docs.ntfy.sh/subscribe/api#authentication "Permanent link")
|
| 293 |
+
|
| 294 |
+
Depending on whether the server is configured to support [access control](https://docs.ntfy.sh/config/#access-control), some topics may be read/write protected so that only users with the correct credentials can subscribe or publish to them. To publish/subscribe to protected topics, you can:
|
| 295 |
+
|
| 296 |
+
* Use [basic auth](https://docs.ntfy.sh/publish/#authentication), e.g. `Authorization: Basic dGVzdHVzZXI6ZmFrZXBhc3N3b3Jk`
|
| 297 |
+
* or use the [`auth` query parameter](https://docs.ntfy.sh/publish/#query-param), e.g. `?auth=QmFzaWMgZEdWemRIVnpaWEk2Wm1GclpYQmhjM04zYjNKaw`
|
| 298 |
+
|
| 299 |
+
Please refer to the [publishing documentation](https://docs.ntfy.sh/publish/#authentication) for additional details.
|
| 300 |
+
|
| 301 |
+
JSON message format[¶](https://docs.ntfy.sh/subscribe/api#json-message-format "Permanent link")
|
| 302 |
+
-----------------------------------------------------------------------------------------------
|
| 303 |
+
|
| 304 |
+
Both the [`/json` endpoint](https://docs.ntfy.sh/subscribe/api#subscribe-as-json-stream) and the [`/sse` endpoint](https://docs.ntfy.sh/subscribe/api#subscribe-as-sse-stream) return a JSON format of the message. It's very straight forward:
|
| 305 |
+
|
| 306 |
+
**Message**:
|
| 307 |
+
|
| 308 |
+
| Field | Required | Type | Example | Description |
|
| 309 |
+
| --- | --- | --- | --- | --- |
|
| 310 |
+
| `id` | ✔️ | _string_ | `hwQ2YpKdmg` | Randomly chosen message identifier |
|
| 311 |
+
| `time` | ✔️ | _number_ | `1635528741` | Message date time, as Unix time stamp |
|
| 312 |
+
| `expires` | (✔)️ | _number_ | `1673542291` | Unix time stamp indicating when the message will be deleted, not set if `Cache: no` is sent |
|
| 313 |
+
| `event` | ✔️ | `open`, `keepalive`, `message`, or `poll_request` | `message` | Message type, typically you'd be only interested in `message` |
|
| 314 |
+
| `topic` | ✔️ | _string_ | `topic1,topic2` | Comma-separated list of topics the message is associated with; only one for all `message` events, but may be a list in `open` events |
|
| 315 |
+
| `message` | - | _string_ | `Some message` | Message body; always present in `message` events |
|
| 316 |
+
| `title` | - | _string_ | `Some title` | Message [title](https://docs.ntfy.sh/publish/#message-title); if not set defaults to `ntfy.sh/<topic>` |
|
| 317 |
+
| `tags` | - | _string array_ | `["tag1","tag2"]` | List of [tags](https://docs.ntfy.sh/publish/#tags-emojis) that may or not map to emojis |
|
| 318 |
+
| `priority` | - | _1, 2, 3, 4, or 5_ | `4` | Message [priority](https://docs.ntfy.sh/publish/#message-priority) with 1=min, 3=default and 5=max |
|
| 319 |
+
| `click` | - | _URL_ | `https://example.com` | Website opened when notification is [clicked](https://docs.ntfy.sh/publish/#click-action) |
|
| 320 |
+
| `actions` | - | _JSON array_ | _see [actions buttons](https://docs.ntfy.sh/publish/#action-buttons)_ | [Action buttons](https://docs.ntfy.sh/publish/#action-buttons) that can be displayed in the notification |
|
| 321 |
+
| `attachment` | - | _JSON object_ | _see below_ | Details about an attachment (name, URL, size, ...) |
|
| 322 |
+
|
| 323 |
+
**Attachment** (part of the message, see [attachments](https://docs.ntfy.sh/publish/#attachments) for details):
|
| 324 |
+
|
| 325 |
+
| Field | Required | Type | Example | Description |
|
| 326 |
+
| --- | --- | --- | --- | --- |
|
| 327 |
+
| `name` | ✔️ | _string_ | `attachment.jpg` | Name of the attachment, can be overridden with `X-Filename`, see [attachments](https://docs.ntfy.sh/publish/#attachments) |
|
| 328 |
+
| `url` | ✔️ | _URL_ | `https://example.com/file.jpg` | URL of the attachment |
|
| 329 |
+
| `type` | -️ | _mime type_ | `image/jpeg` | Mime type of the attachment, only defined if attachment was uploaded to ntfy server |
|
| 330 |
+
| `size` | -️ | _number_ | `33848` | Size of the attachment in bytes, only defined if attachment was uploaded to ntfy server |
|
| 331 |
+
| `expires` | -️ | _number_ | `1635528741` | Attachment expiry date as Unix time stamp, only defined if attachment was uploaded to ntfy server |
|
| 332 |
+
|
| 333 |
+
Here's an example for each message type:
|
| 334 |
+
|
| 335 |
+
Notification message Notification message (minimal) Open message Keepalive message Poll request message
|
| 336 |
+
|
| 337 |
+
```
|
| 338 |
+
{
|
| 339 |
+
"id": "sPs71M8A2T",
|
| 340 |
+
"time": 1643935928,
|
| 341 |
+
"expires": 1643936928,
|
| 342 |
+
"event": "message",
|
| 343 |
+
"topic": "mytopic",
|
| 344 |
+
"priority": 5,
|
| 345 |
+
"tags": [
|
| 346 |
+
"warning",
|
| 347 |
+
"skull"
|
| 348 |
+
],
|
| 349 |
+
"click": "https://homecam.mynet.lan/incident/1234",
|
| 350 |
+
"attachment": {
|
| 351 |
+
"name": "camera.jpg",
|
| 352 |
+
"type": "image/png",
|
| 353 |
+
"size": 33848,
|
| 354 |
+
"expires": 1643946728,
|
| 355 |
+
"url": "https://ntfy.sh/file/sPs71M8A2T.png"
|
| 356 |
+
},
|
| 357 |
+
"title": "Unauthorized access detected",
|
| 358 |
+
"message": "Movement detected in the yard. You better go check"
|
| 359 |
+
}
|
| 360 |
+
```
|
| 361 |
+
|
| 362 |
+
```
|
| 363 |
+
{
|
| 364 |
+
"id": "wze9zgqK41",
|
| 365 |
+
"time": 1638542110,
|
| 366 |
+
"expires": 1638543112,
|
| 367 |
+
"event": "message",
|
| 368 |
+
"topic": "phil_alerts",
|
| 369 |
+
"message": "Remote access to phils-laptop detected. Act right away."
|
| 370 |
+
}
|
| 371 |
+
```
|
| 372 |
+
|
| 373 |
+
```
|
| 374 |
+
{
|
| 375 |
+
"id": "2pgIAaGrQ8",
|
| 376 |
+
"time": 1638542215,
|
| 377 |
+
"event": "open",
|
| 378 |
+
"topic": "phil_alerts"
|
| 379 |
+
}
|
| 380 |
+
```
|
| 381 |
+
|
| 382 |
+
```
|
| 383 |
+
{
|
| 384 |
+
"id": "371sevb0pD",
|
| 385 |
+
"time": 1638542275,
|
| 386 |
+
"event": "keepalive",
|
| 387 |
+
"topic": "phil_alerts"
|
| 388 |
+
}
|
| 389 |
+
```
|
| 390 |
+
|
| 391 |
+
```
|
| 392 |
+
{
|
| 393 |
+
"id": "371sevb0pD",
|
| 394 |
+
"time": 1638542275,
|
| 395 |
+
"event": "poll_request",
|
| 396 |
+
"topic": "phil_alerts"
|
| 397 |
+
}
|
| 398 |
+
```
|
| 399 |
+
|
| 400 |
+
List of all parameters[¶](https://docs.ntfy.sh/subscribe/api#list-of-all-parameters "Permanent link")
|
| 401 |
+
-----------------------------------------------------------------------------------------------------
|
| 402 |
+
|
| 403 |
+
The following is a list of all parameters that can be passed **when subscribing to a message**. Parameter names are **case-insensitive**, and can be passed as **HTTP headers** or **query parameters in the URL**. They are listed in the table in their canonical form.
|
| 404 |
+
|
| 405 |
+
| Parameter | Aliases (case-insensitive) | Description |
|
| 406 |
+
| --- | --- | --- |
|
| 407 |
+
| `poll` | `X-Poll`, `po` | Return cached messages and close connection |
|
| 408 |
+
| `since` | `X-Since`, `si` | Return cached messages since timestamp, duration or message ID |
|
| 409 |
+
| `scheduled` | `X-Scheduled`, `sched` | Include scheduled/delayed messages in message list |
|
| 410 |
+
| `id` | `X-ID` | Filter: Only return messages that match this exact message ID |
|
| 411 |
+
| `message` | `X-Message`, `m` | Filter: Only return messages that match this exact message string |
|
| 412 |
+
| `title` | `X-Title`, `t` | Filter: Only return messages that match this exact title string |
|
| 413 |
+
| `priority` | `X-Priority`, `prio`, `p` | Filter: Only return messages that match _any priority listed_ (comma-separated) |
|
| 414 |
+
| `tags` | `X-Tags`, `tag`, `ta` | Filter: Only return messages that match _all listed tags_ (comma-separated) |
|
docs-ntfy-sh-subscribe-cli-20250924.md
ADDED
|
@@ -0,0 +1,308 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
Title: From the CLI - ntfy
|
| 2 |
+
|
| 3 |
+
URL Source: https://docs.ntfy.sh/subscribe/cli
|
| 4 |
+
|
| 5 |
+
Markdown Content:
|
| 6 |
+
Subscribe via ntfy CLI[¶](https://docs.ntfy.sh/subscribe/cli#subscribe-via-ntfy-cli "Permanent link")
|
| 7 |
+
-----------------------------------------------------------------------------------------------------
|
| 8 |
+
|
| 9 |
+
In addition to subscribing via the [web UI](https://docs.ntfy.sh/subscribe/web/), the [phone app](https://docs.ntfy.sh/subscribe/phone/), or the [API](https://docs.ntfy.sh/subscribe/api/), you can subscribe to topics via the ntfy CLI. The CLI is included in the same `ntfy` binary that can be used to [self-host a server](https://docs.ntfy.sh/install/).
|
| 10 |
+
|
| 11 |
+
Info
|
| 12 |
+
|
| 13 |
+
The **ntfy CLI is not required to send or receive messages**. You can instead [send messages with curl](https://docs.ntfy.sh/publish/), and even use it to [subscribe to topics](https://docs.ntfy.sh/subscribe/api/). It may be a little more convenient to use the ntfy CLI than writing your own script. It all depends on the use case. 😀
|
| 14 |
+
|
| 15 |
+
Install + configure[¶](https://docs.ntfy.sh/subscribe/cli#install-configure "Permanent link")
|
| 16 |
+
---------------------------------------------------------------------------------------------
|
| 17 |
+
|
| 18 |
+
To install the ntfy CLI, simply **follow the steps outlined on the [install page](https://docs.ntfy.sh/install/)**. The ntfy server and client are the same binary, so it's all very convenient. After installing, you can (optionally) configure the client by creating `~/.config/ntfy/client.yml` (for the non-root user), `~/Library/Application Support/ntfy/client.yml` (for the macOS non-root user), or `/etc/ntfy/client.yml` (for the root user). You can find a [skeleton config](https://github.com/binwiederhier/ntfy/blob/main/client/client.yml) on GitHub.
|
| 19 |
+
|
| 20 |
+
If you just want to use [ntfy.sh](https://ntfy.sh/), you don't have to change anything. If you **self-host your own server**, you may want to edit the `default-host` option:
|
| 21 |
+
|
| 22 |
+
```
|
| 23 |
+
# Base URL used to expand short topic names in the "ntfy publish" and "ntfy subscribe" commands.
|
| 24 |
+
# If you self-host a ntfy server, you'll likely want to change this.
|
| 25 |
+
#
|
| 26 |
+
default-host: https://ntfy.myhost.com
|
| 27 |
+
```
|
| 28 |
+
|
| 29 |
+
Publish messages[¶](https://docs.ntfy.sh/subscribe/cli#publish-messages "Permanent link")
|
| 30 |
+
-----------------------------------------------------------------------------------------
|
| 31 |
+
|
| 32 |
+
You can send messages with the ntfy CLI using the `ntfy publish` command (or any of its aliases `pub`, `send` or `trigger`). There are a lot of examples on the page about [publishing messages](https://docs.ntfy.sh/publish/), but here are a few quick ones:
|
| 33 |
+
|
| 34 |
+
Simple send Send with title, priority, and tags Send at 8:30am Triggering a webhook
|
| 35 |
+
|
| 36 |
+
```
|
| 37 |
+
ntfy publish mytopic This is a message
|
| 38 |
+
ntfy publish mytopic "This is a message"
|
| 39 |
+
ntfy pub mytopic "This is a message"
|
| 40 |
+
```
|
| 41 |
+
|
| 42 |
+
```
|
| 43 |
+
ntfy publish \
|
| 44 |
+
--title="Thing sold on eBay" \
|
| 45 |
+
--priority=high \
|
| 46 |
+
--tags=partying_face \
|
| 47 |
+
mytopic \
|
| 48 |
+
"Somebody just bought the thing that you sell"
|
| 49 |
+
```
|
| 50 |
+
|
| 51 |
+
```
|
| 52 |
+
ntfy pub --at=8:30am delayed_topic Laterzz
|
| 53 |
+
```
|
| 54 |
+
|
| 55 |
+
```
|
| 56 |
+
ntfy trigger mywebhook
|
| 57 |
+
ntfy pub mywebhook
|
| 58 |
+
```
|
| 59 |
+
|
| 60 |
+
### Attaching a local file[¶](https://docs.ntfy.sh/subscribe/cli#attaching-a-local-file "Permanent link")
|
| 61 |
+
|
| 62 |
+
You can easily upload and attach a local file to a notification:
|
| 63 |
+
|
| 64 |
+
```
|
| 65 |
+
$ ntfy pub --file README.md mytopic | jq .
|
| 66 |
+
{
|
| 67 |
+
"id": "meIlClVLABJQ",
|
| 68 |
+
"time": 1655825460,
|
| 69 |
+
"event": "message",
|
| 70 |
+
"topic": "mytopic",
|
| 71 |
+
"message": "You received a file: README.md",
|
| 72 |
+
"attachment": {
|
| 73 |
+
"name": "README.md",
|
| 74 |
+
"type": "text/plain; charset=utf-8",
|
| 75 |
+
"size": 2892,
|
| 76 |
+
"expires": 1655836260,
|
| 77 |
+
"url": "https://ntfy.sh/file/meIlClVLABJQ.txt"
|
| 78 |
+
}
|
| 79 |
+
}
|
| 80 |
+
```
|
| 81 |
+
|
| 82 |
+
### Wait for PID/command[¶](https://docs.ntfy.sh/subscribe/cli#wait-for-pidcommand "Permanent link")
|
| 83 |
+
|
| 84 |
+
If you have a long-running command and want to **publish a notification when the command completes**, you may wrap it with `ntfy publish --wait-cmd` (aliases: `--cmd`, `--done`). Or, if you forgot to wrap it, and the command is already running, you can wait for the process to complete with `ntfy publish --wait-pid` (alias: `--pid`).
|
| 85 |
+
|
| 86 |
+
Run a command and wait for it to complete (here: `rsync ...`):
|
| 87 |
+
|
| 88 |
+
```
|
| 89 |
+
$ ntfy pub --wait-cmd mytopic rsync -av ./ [email protected]:/backups/ | jq .
|
| 90 |
+
{
|
| 91 |
+
"id": "Re0rWXZQM8WB",
|
| 92 |
+
"time": 1655825624,
|
| 93 |
+
"event": "message",
|
| 94 |
+
"topic": "mytopic",
|
| 95 |
+
"message": "Command succeeded after 56.553s: rsync -av ./ [email protected]:/backups/"
|
| 96 |
+
}
|
| 97 |
+
```
|
| 98 |
+
|
| 99 |
+
Or, if you already started the long-running process and want to wait for it using its process ID (PID), you can do this:
|
| 100 |
+
|
| 101 |
+
Using a PID directly Using a `pidof`
|
| 102 |
+
|
| 103 |
+
```
|
| 104 |
+
$ ntfy pub --wait-pid 8458 mytopic | jq .
|
| 105 |
+
{
|
| 106 |
+
"id": "orM6hJKNYkWb",
|
| 107 |
+
"time": 1655825827,
|
| 108 |
+
"event": "message",
|
| 109 |
+
"topic": "mytopic",
|
| 110 |
+
"message": "Process with PID 8458 exited after 2.003s"
|
| 111 |
+
}
|
| 112 |
+
```
|
| 113 |
+
|
| 114 |
+
```
|
| 115 |
+
$ ntfy pub --wait-pid $(pidof rsync) mytopic | jq .
|
| 116 |
+
{
|
| 117 |
+
"id": "orM6hJKNYkWb",
|
| 118 |
+
"time": 1655825827,
|
| 119 |
+
"event": "message",
|
| 120 |
+
"topic": "mytopic",
|
| 121 |
+
"message": "Process with PID 8458 exited after 2.003s"
|
| 122 |
+
}
|
| 123 |
+
```
|
| 124 |
+
|
| 125 |
+
Subscribe to topics[¶](https://docs.ntfy.sh/subscribe/cli#subscribe-to-topics "Permanent link")
|
| 126 |
+
-----------------------------------------------------------------------------------------------
|
| 127 |
+
|
| 128 |
+
You can subscribe to topics using `ntfy subscribe`. Depending on how it is called, this command will either print or execute a command for every arriving message. There are a few different ways in which the command can be run:
|
| 129 |
+
|
| 130 |
+
### Stream messages as JSON[¶](https://docs.ntfy.sh/subscribe/cli#stream-messages-as-json "Permanent link")
|
| 131 |
+
|
| 132 |
+
```
|
| 133 |
+
ntfy subscribe TOPIC
|
| 134 |
+
```
|
| 135 |
+
|
| 136 |
+
If you run the command like this, it prints the JSON representation of every incoming message. This is useful when you have a command that wants to stream-read incoming JSON messages. Unless `--poll` is passed, this command stays open forever.
|
| 137 |
+
|
| 138 |
+
```
|
| 139 |
+
$ ntfy sub mytopic
|
| 140 |
+
{"id":"nZ8PjH5oox","time":1639971913,"event":"message","topic":"mytopic","message":"hi there"}
|
| 141 |
+
{"id":"sekSLWTujn","time":1639972063,"event":"message","topic":"mytopic",priority:5,"message":"Oh no!"}
|
| 142 |
+
...
|
| 143 |
+
```
|
| 144 |
+
|
| 145 |
+
Subscribe in JSON mode
|
| 146 |
+
|
| 147 |
+
### Run command for every message[¶](https://docs.ntfy.sh/subscribe/cli#run-command-for-every-message "Permanent link")
|
| 148 |
+
|
| 149 |
+
```
|
| 150 |
+
ntfy subscribe TOPIC COMMAND
|
| 151 |
+
```
|
| 152 |
+
|
| 153 |
+
If you run it like this, a COMMAND is executed for every incoming messages. Scroll down to see a list of available environment variables. Here are a few examples:
|
| 154 |
+
|
| 155 |
+
```
|
| 156 |
+
ntfy sub mytopic 'notify-send "$m"'
|
| 157 |
+
ntfy sub topic1 /my/script.sh
|
| 158 |
+
ntfy sub topic1 'echo "Message $m was received. Its title was $t and it had priority $p"'
|
| 159 |
+
```
|
| 160 |
+
|
| 161 |
+
Execute command on incoming messages
|
| 162 |
+
|
| 163 |
+
The message fields are passed to the command as environment variables and can be used in scripts. Note that since these are environment variables, you typically don't have to worry about quoting too much, as long as you enclose them in double-quotes, you should be fine:
|
| 164 |
+
|
| 165 |
+
| Variable | Aliases | Description |
|
| 166 |
+
| --- | --- | --- |
|
| 167 |
+
| `$NTFY_ID` | `$id` | Unique message ID |
|
| 168 |
+
| `$NTFY_TIME` | `$time` | Unix timestamp of the message delivery |
|
| 169 |
+
| `$NTFY_TOPIC` | `$topic` | Topic name |
|
| 170 |
+
| `$NTFY_MESSAGE` | `$message`, `$m` | Message body |
|
| 171 |
+
| `$NTFY_TITLE` | `$title`, `$t` | Message title |
|
| 172 |
+
| `$NTFY_PRIORITY` | `$priority`, `$prio`, `$p` | Message priority (1=min, 5=max) |
|
| 173 |
+
| `$NTFY_TAGS` | `$tags`, `$tag`, `$ta` | Message tags (comma separated list) |
|
| 174 |
+
| `$NTFY_RAW` | `$raw` | Raw JSON message |
|
| 175 |
+
|
| 176 |
+
### Subscribe to multiple topics[¶](https://docs.ntfy.sh/subscribe/cli#subscribe-to-multiple-topics "Permanent link")
|
| 177 |
+
|
| 178 |
+
```
|
| 179 |
+
ntfy subscribe --from-config
|
| 180 |
+
```
|
| 181 |
+
|
| 182 |
+
To subscribe to multiple topics at once, and run different commands for each one, you can use `ntfy subscribe --from-config`, which will read the `subscribe` config from the config file. Please also check out the [ntfy-client systemd service](https://docs.ntfy.sh/subscribe/cli#using-the-systemd-service).
|
| 183 |
+
Here's an example config file that subscribes to three different topics, executing a different command for each of them:
|
| 184 |
+
|
| 185 |
+
~/.config/ntfy/client.yml (Linux) ~/Library/Application Support/ntfy/client.yml (macOS) %AppData%\ntfy\client.yml (Windows)
|
| 186 |
+
|
| 187 |
+
```
|
| 188 |
+
default-host: https://ntfy.sh
|
| 189 |
+
default-user: phill
|
| 190 |
+
default-password: mypass
|
| 191 |
+
|
| 192 |
+
subscribe:
|
| 193 |
+
- topic: echo-this
|
| 194 |
+
command: 'echo "Message received: $message"'
|
| 195 |
+
- topic: alerts
|
| 196 |
+
command: notify-send -i /usr/share/ntfy/logo.png "Important" "$m"
|
| 197 |
+
if:
|
| 198 |
+
priority: high,urgent
|
| 199 |
+
- topic: calc
|
| 200 |
+
command: 'gnome-calculator 2>/dev/null &'
|
| 201 |
+
- topic: print-temp
|
| 202 |
+
command: |
|
| 203 |
+
echo "You can easily run inline scripts, too."
|
| 204 |
+
temp="$(sensors | awk '/Pack/ { print substr($4,2,2) }')"
|
| 205 |
+
if [ $temp -gt 80 ]; then
|
| 206 |
+
echo "Warning: CPU temperature is $temp. Too high."
|
| 207 |
+
else
|
| 208 |
+
echo "CPU temperature is $temp. That's alright."
|
| 209 |
+
fi
|
| 210 |
+
```
|
| 211 |
+
|
| 212 |
+
```
|
| 213 |
+
default-host: https://ntfy.sh
|
| 214 |
+
default-user: phill
|
| 215 |
+
default-password: mypass
|
| 216 |
+
|
| 217 |
+
subscribe:
|
| 218 |
+
- topic: echo-this
|
| 219 |
+
command: 'echo "Message received: $message"'
|
| 220 |
+
- topic: alerts
|
| 221 |
+
command: osascript -e "display notification \"$message\""
|
| 222 |
+
if:
|
| 223 |
+
priority: high,urgent
|
| 224 |
+
- topic: calc
|
| 225 |
+
command: open -a Calculator
|
| 226 |
+
```
|
| 227 |
+
|
| 228 |
+
```
|
| 229 |
+
default-host: https://ntfy.sh
|
| 230 |
+
default-user: phill
|
| 231 |
+
default-password: mypass
|
| 232 |
+
|
| 233 |
+
subscribe:
|
| 234 |
+
- topic: echo-this
|
| 235 |
+
command: 'echo Message received: %message%'
|
| 236 |
+
- topic: alerts
|
| 237 |
+
command: |
|
| 238 |
+
notifu /m "%NTFY_MESSAGE%"
|
| 239 |
+
exit 0
|
| 240 |
+
if:
|
| 241 |
+
priority: high,urgent
|
| 242 |
+
- topic: calc
|
| 243 |
+
command: calc
|
| 244 |
+
```
|
| 245 |
+
|
| 246 |
+
In this example, when `ntfy subscribe --from-config` is executed:
|
| 247 |
+
|
| 248 |
+
* Messages to `echo-this` simply echos to standard out
|
| 249 |
+
* Messages to `alerts` display as desktop notification for high priority messages using [notify-send](https://manpages.ubuntu.com/manpages/focal/man1/notify-send.1.html) (Linux), [notifu](https://www.paralint.com/projects/notifu/) (Windows) or `osascript` (macOS)
|
| 250 |
+
* Messages to `calc` open the calculator 😀 (_because, why not_)
|
| 251 |
+
* Messages to `print-temp` execute an inline script and print the CPU temperature (Linux version only)
|
| 252 |
+
|
| 253 |
+
I hope this shows how powerful this command is. Here's a short video that demonstrates the above example:
|
| 254 |
+
|
| 255 |
+
Execute all the things
|
| 256 |
+
|
| 257 |
+
If most (or all) of your subscriptions use the same credentials, you can set defaults in `client.yml`. Use `default-user` and `default-password` or `default-token` (but not both). You can also specify a `default-command` that will run when a message is received. If a subscription does not include credentials to use or does not have a command, the defaults will be used, otherwise, the subscription settings will override the defaults.
|
| 258 |
+
|
| 259 |
+
Warning
|
| 260 |
+
|
| 261 |
+
Because the `default-user`, `default-password`, and `default-token` will be sent for each topic that does not have its own username/password (even if the topic does not require authentication), be sure that the servers/topics you subscribe to use HTTPS to prevent leaking the username and password.
|
| 262 |
+
|
| 263 |
+
### Using the systemd service[¶](https://docs.ntfy.sh/subscribe/cli#using-the-systemd-service "Permanent link")
|
| 264 |
+
|
| 265 |
+
You can use the `ntfy-client` systemd services to subscribe to multiple topics just like in the example above.
|
| 266 |
+
|
| 267 |
+
You have the option of either enabling `ntfy-client` as a **system service** (see [here](https://github.com/binwiederhier/ntfy/blob/main/client/ntfy-client.service)) or **user service** (see [here](https://github.com/binwiederhier/ntfy/blob/main/client/user/ntfy-client.service)). Neither system service nor user service are enabled or started by default, so you have to do that yourself.
|
| 268 |
+
|
| 269 |
+
**System service:** The `ntfy-client` systemd system service runs as the `ntfy` user. When enabled, it is started at system boot. To configure it as a system service, edit `/etc/ntfy/client.yml` and then enable/start the service (as root), like so:
|
| 270 |
+
|
| 271 |
+
```
|
| 272 |
+
sudo systemctl enable ntfy-client
|
| 273 |
+
sudo systemctl restart ntfy-client
|
| 274 |
+
```
|
| 275 |
+
|
| 276 |
+
The system service runs as user `ntfy`, meaning that typical Linux permission restrictions apply. It also means that the system service cannot run commands in your X session as the primary machine user (unlike the user service).
|
| 277 |
+
|
| 278 |
+
**User service:** The `ntfy-client` user service is run when the user logs into their desktop environment. To enable/start it, edit `~/.config/ntfy/client.yml` and run the following commands (without sudo!):
|
| 279 |
+
|
| 280 |
+
```
|
| 281 |
+
systemctl --user enable ntfy-client
|
| 282 |
+
systemctl --user restart ntfy-client
|
| 283 |
+
```
|
| 284 |
+
|
| 285 |
+
Unlike the system service, the user service can interact with the user's desktop environment, and run commands like `notify-send` to display desktop notifications. It can also run commands that require access to the user's home directory, such as `gnome-calculator`.
|
| 286 |
+
|
| 287 |
+
### Authentication[¶](https://docs.ntfy.sh/subscribe/cli#authentication "Permanent link")
|
| 288 |
+
|
| 289 |
+
Depending on whether the server is configured to support [access control](https://docs.ntfy.sh/config/#access-control), some topics may be read/write protected so that only users with the correct credentials can subscribe or publish to them. To publish/subscribe to protected topics, you can use [Basic Auth](https://en.wikipedia.org/wiki/Basic_access_authentication) with a valid username/password. For your self-hosted server, **be sure to use HTTPS to avoid eavesdropping** and exposing your password.
|
| 290 |
+
|
| 291 |
+
You can either add your username and password to the configuration file:
|
| 292 |
+
|
| 293 |
+
~/.config/ntfy/client.yml
|
| 294 |
+
|
| 295 |
+
```
|
| 296 |
+
- topic: secret
|
| 297 |
+
command: 'notify-send "$m"'
|
| 298 |
+
user: phill
|
| 299 |
+
password: mypass
|
| 300 |
+
```
|
| 301 |
+
|
| 302 |
+
Or with the `ntfy subscribe` command:
|
| 303 |
+
|
| 304 |
+
```
|
| 305 |
+
ntfy subscribe \
|
| 306 |
+
-u phil:mypass \
|
| 307 |
+
ntfy.example.com/mysecrets
|
| 308 |
+
```
|
docs-ntfy-sh-subscribe-phone-20250924.md
ADDED
|
@@ -0,0 +1,176 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
Title: From your phone - ntfy
|
| 2 |
+
|
| 3 |
+
URL Source: https://docs.ntfy.sh/subscribe/phone
|
| 4 |
+
|
| 5 |
+
Markdown Content:
|
| 6 |
+
Subscribe from your phone[¶](https://docs.ntfy.sh/subscribe/phone#subscribe-from-your-phone "Permanent link")
|
| 7 |
+
-------------------------------------------------------------------------------------------------------------
|
| 8 |
+
|
| 9 |
+
You can use the ntfy [Android App](https://play.google.com/store/apps/details?id=io.heckel.ntfy) or [iOS app](https://apps.apple.com/us/app/ntfy/id1625396347) to receive notifications directly on your phone. Just like the server, this app is also open source, and the code is available on GitHub ([Android](https://github.com/binwiederhier/ntfy-android), [iOS](https://github.com/binwiederhier/ntfy-ios)). Feel free to contribute, or [build your own](https://docs.ntfy.sh/develop/).
|
| 10 |
+
|
| 11 |
+
[](https://play.google.com/store/apps/details?id=io.heckel.ntfy)[](https://f-droid.org/en/packages/io.heckel.ntfy/)[](https://apps.apple.com/us/app/ntfy/id1625396347)
|
| 12 |
+
|
| 13 |
+
You can get the Android app from [Google Play](https://play.google.com/store/apps/details?id=io.heckel.ntfy), [F-Droid](https://f-droid.org/en/packages/io.heckel.ntfy/), or via the APKs from [GitHub Releases](https://github.com/binwiederhier/ntfy-android/releases). The Google Play and F-Droid releases are largely identical, with the one exception that the F-Droid flavor does not use Firebase. The iOS app can be downloaded from the [App Store](https://apps.apple.com/us/app/ntfy/id1625396347).
|
| 14 |
+
|
| 15 |
+
Alternatively, you may also want to consider using the **[progressive web app (PWA)](https://docs.ntfy.sh/subscribe/pwa/)** instead of the native app. The PWA is a website that you can add to your home screen, and it will behave just like a native app.
|
| 16 |
+
|
| 17 |
+
If you're downloading the APKs from [GitHub](https://github.com/binwiederhier/ntfy-android/releases), they are signed with a certificate with the following SHA-256 fingerprint: `6e145d7ae685eff75468e5067e03a6c3645453343e4e181dac8b6b17ff67489d`. You can also query the DNS TXT records for `ntfy.sh` to find this fingerprint.
|
| 18 |
+
|
| 19 |
+
Overview[¶](https://docs.ntfy.sh/subscribe/phone#overview "Permanent link")
|
| 20 |
+
---------------------------------------------------------------------------
|
| 21 |
+
|
| 22 |
+
A picture is worth a thousand words. Here are a few screenshots showing what the app looks like. It's all pretty straight forward. You can add topics and as soon as you add them, you can [publish messages](https://docs.ntfy.sh/publish/) to them.
|
| 23 |
+
|
| 24 |
+
[](https://docs.ntfy.sh/static/img/android-screenshot-main.png)[](https://docs.ntfy.sh/static/img/android-screenshot-detail.png)[](https://docs.ntfy.sh/static/img/android-screenshot-pause.png)[](https://docs.ntfy.sh/static/img/android-screenshot-add.png)[](https://docs.ntfy.sh/static/img/android-screenshot-add-instant.png)[](https://docs.ntfy.sh/static/img/android-screenshot-add-other.png)
|
| 25 |
+
|
| 26 |
+
If those screenshots are still not enough, here's a video:
|
| 27 |
+
|
| 28 |
+
Sending push notifications to your Android phone
|
| 29 |
+
|
| 30 |
+
Message priority[¶](https://docs.ntfy.sh/subscribe/phone#message-priority "Permanent link")
|
| 31 |
+
-------------------------------------------------------------------------------------------
|
| 32 |
+
|
| 33 |
+
_Supported on:_
|
| 34 |
+
|
| 35 |
+
When you [publish messages](https://docs.ntfy.sh/publish/#message-priority) to a topic, you can **define a priority**. This priority defines how urgently Android will notify you about the notification, and whether they make a sound and/or vibrate.
|
| 36 |
+
|
| 37 |
+
By default, messages with default priority or higher (>= 3) will vibrate and make a sound. Messages with high or urgent priority (>= 4) will also show as pop-over, like so:
|
| 38 |
+
|
| 39 |
+

|
| 40 |
+
|
| 41 |
+
High and urgent notifications show as pop-over
|
| 42 |
+
|
| 43 |
+
You can change these settings in Android by long-pressing on the app, and tapping "Notifications", or from the "Settings" menu under "Channel settings". There is one notification channel for each priority:
|
| 44 |
+
|
| 45 |
+

|
| 46 |
+
|
| 47 |
+
Per-priority channels
|
| 48 |
+
|
| 49 |
+
Per notification channel, you can configure a **channel-specific sound**, whether to **override the Do Not Disturb (DND)** setting, and other settings such as popover or notification dot:
|
| 50 |
+
|
| 51 |
+

|
| 52 |
+
|
| 53 |
+
Per-priority sound/vibration settings
|
| 54 |
+
|
| 55 |
+
Instant delivery[��](https://docs.ntfy.sh/subscribe/phone#instant-delivery "Permanent link")
|
| 56 |
+
-------------------------------------------------------------------------------------------
|
| 57 |
+
|
| 58 |
+
_Supported on:_
|
| 59 |
+
|
| 60 |
+
Instant delivery allows you to receive messages on your phone instantly, **even when your phone is in doze mode**, i.e. when the screen turns off, and you leave it on the desk for a while. This is achieved with a foreground service, which you'll see as a permanent notification that looks like this:
|
| 61 |
+
|
| 62 |
+

|
| 63 |
+
|
| 64 |
+
Instant delivery foreground notification
|
| 65 |
+
|
| 66 |
+
Android does not allow you to dismiss this notification, unless you turn off the notification channel in the settings. To do so, long-press on the foreground notification (screenshot above) and navigate to the settings. Then toggle the "Subscription Service" off:
|
| 67 |
+
|
| 68 |
+

|
| 69 |
+
|
| 70 |
+
Turning off the persistent instant delivery notification
|
| 71 |
+
|
| 72 |
+
**Limitations without instant delivery**: Without instant delivery, **messages may arrive with a significant delay** (sometimes many minutes, or even hours later). If you've ever picked up your phone and suddenly had 10 messages that were sent long before you know what I'm talking about.
|
| 73 |
+
|
| 74 |
+
The reason for this is [Firebase Cloud Messaging (FCM)](https://firebase.google.com/docs/cloud-messaging). FCM is the _only_ Google approved way to send push messages to Android devices, and it's what pretty much all apps use to deliver push notifications. Firebase is overall pretty bad at delivering messages in time, but on Android, most apps are stuck with it.
|
| 75 |
+
|
| 76 |
+
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 the F-Droid flavor.
|
| 77 |
+
|
| 78 |
+
_Supported on:_
|
| 79 |
+
|
| 80 |
+
You can share files to a topic using Android's "Share" feature. This works in almost any app that supports sharing files or text, and it's useful for sending yourself links, files or other things. The feature remembers a few of the last topics you shared content to and lists them at the bottom.
|
| 81 |
+
|
| 82 |
+
The feature is pretty self-explanatory, and one picture says more than a thousand words. So here are two pictures:
|
| 83 |
+
|
| 84 |
+
[](https://docs.ntfy.sh/static/img/android-screenshot-share-1.jpg)[](https://docs.ntfy.sh/static/img/android-screenshot-share-2.jpg)
|
| 85 |
+
|
| 86 |
+
ntfy:// links[¶](https://docs.ntfy.sh/subscribe/phone#ntfy-links "Permanent link")
|
| 87 |
+
----------------------------------------------------------------------------------
|
| 88 |
+
|
| 89 |
+
_Supported on:_
|
| 90 |
+
|
| 91 |
+
The ntfy Android app supports deep linking directly to topics. This is useful when integrating with [automation apps](https://docs.ntfy.sh/subscribe/phone#automation-apps) such as [MacroDroid](https://play.google.com/store/apps/details?id=com.arlosoft.macrodroid) or [Tasker](https://play.google.com/store/apps/details?id=net.dinglisch.android.taskerm), or to simply directly link to a topic from a mobile website.
|
| 92 |
+
|
| 93 |
+
Info
|
| 94 |
+
|
| 95 |
+
Android deep linking of http/https links is very brittle and limited, which is why something like `https://<host>/<topic>/subscribe` is **not possible**, and instead `ntfy://` links have to be used. More details in [issue #20](https://github.com/binwiederhier/ntfy/issues/20).
|
| 96 |
+
|
| 97 |
+
**Supported link formats:**
|
| 98 |
+
|
| 99 |
+
| Link format | Example | Description |
|
| 100 |
+
| --- | --- | --- |
|
| 101 |
+
| `ntfy://<host>/<topic>` | `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!) |
|
| 102 |
+
| `ntfy://<host>/<topic>?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!) |
|
| 103 |
+
|
| 104 |
+
Integrations[¶](https://docs.ntfy.sh/subscribe/phone#integrations "Permanent link")
|
| 105 |
+
-----------------------------------------------------------------------------------
|
| 106 |
+
|
| 107 |
+
### UnifiedPush[¶](https://docs.ntfy.sh/subscribe/phone#unifiedpush "Permanent link")
|
| 108 |
+
|
| 109 |
+
_Supported on:_
|
| 110 |
+
|
| 111 |
+
[UnifiedPush](https://unifiedpush.org/) is a standard for receiving push notifications without using the Google-owned [Firebase Cloud Messaging (FCM)](https://firebase.google.com/docs/cloud-messaging) service. It puts push notifications in the control of the user. ntfy can act as a **UnifiedPush distributor**, forwarding messages to apps that support it.
|
| 112 |
+
|
| 113 |
+
To use ntfy as a distributor, simply select it in one of the [supported apps](https://unifiedpush.org/users/apps/). That's it. It's a one-step installation 😀. If desired, you can select your own [selfhosted ntfy server](https://docs.ntfy.sh/install/) to handle messages. Here's an example with [FluffyChat](https://fluffychat.im/):
|
| 114 |
+
|
| 115 |
+
[](https://docs.ntfy.sh/static/img/android-screenshot-unifiedpush-fluffychat.jpg)[](https://docs.ntfy.sh/static/img/android-screenshot-unifiedpush-subscription.jpg)[](https://docs.ntfy.sh/static/img/android-screenshot-unifiedpush-settings.jpg)
|
| 116 |
+
|
| 117 |
+
### Automation apps[¶](https://docs.ntfy.sh/subscribe/phone#automation-apps "Permanent link")
|
| 118 |
+
|
| 119 |
+
_Supported on:_
|
| 120 |
+
|
| 121 |
+
The ntfy Android app integrates nicely with automation apps such as [MacroDroid](https://play.google.com/store/apps/details?id=com.arlosoft.macrodroid) or [Tasker](https://play.google.com/store/apps/details?id=net.dinglisch.android.taskerm). Using Android intents, you can **react to incoming messages**, as well as **send messages**.
|
| 122 |
+
|
| 123 |
+
#### React to incoming messages[¶](https://docs.ntfy.sh/subscribe/phone#react-to-incoming-messages "Permanent link")
|
| 124 |
+
|
| 125 |
+
To react on incoming notifications, you have to register to intents with the `io.heckel.ntfy.MESSAGE_RECEIVED` action (see [code for details](https://github.com/binwiederhier/ntfy-android/blob/main/app/src/main/java/io/heckel/ntfy/msg/BroadcastService.kt)). Here's an example using [MacroDroid](https://play.google.com/store/apps/details?id=com.arlosoft.macrodroid) and [Tasker](https://play.google.com/store/apps/details?id=net.dinglisch.android.taskerm), but any app that can catch broadcasts is supported:
|
| 126 |
+
|
| 127 |
+
[](https://docs.ntfy.sh/static/img/android-screenshot-macrodroid-overview.png)[](https://docs.ntfy.sh/static/img/android-screenshot-macrodroid-trigger.png)[](https://docs.ntfy.sh/static/img/android-screenshot-macrodroid-action.png)[](https://docs.ntfy.sh/static/img/android-screenshot-tasker-profiles.png)[](https://docs.ntfy.sh/static/img/android-screenshot-tasker-event-edit.png)[](https://docs.ntfy.sh/static/img/android-screenshot-tasker-task-edit.png)[](https://docs.ntfy.sh/static/img/android-screenshot-tasker-action-edit.png)
|
| 128 |
+
|
| 129 |
+
For MacroDroid, be sure to type in the package name `io.heckel.ntfy`, otherwise intents may be silently swallowed. If you're using topics to drive automation, you'll likely want to mute the topic in the ntfy app. This will prevent notification popups:
|
| 130 |
+
|
| 131 |
+

|
| 132 |
+
|
| 133 |
+
Muting notifications to prevent popups
|
| 134 |
+
|
| 135 |
+
Here's a list of extras you can access. Most likely, you'll want to filter for `topic` and react on `message`:
|
| 136 |
+
|
| 137 |
+
| Extra name | Type | Example | Description |
|
| 138 |
+
| --- | --- | --- | --- |
|
| 139 |
+
| `id` | _String_ | `bP8dMjO8ig` | Randomly chosen message identifier (likely not very useful for task automation) |
|
| 140 |
+
| `base_url` | _String_ | `https://ntfy.sh` | Root URL of the ntfy server this message came from |
|
| 141 |
+
| `topic` ❤️ | _String_ | `mytopic` | Topic name; **you'll likely want to filter for a specific topic** |
|
| 142 |
+
| `muted` | _Boolean_ | `true` | Indicates whether the subscription was muted in the app |
|
| 143 |
+
| `muted_str` | _String (`true` or `false`)_ | `true` | Same as `muted`, but as string `true` or `false` |
|
| 144 |
+
| `time` | _Int_ | `1635528741` | Message date time, as Unix time stamp |
|
| 145 |
+
| `title` | _String_ | `Some title` | Message [title](https://docs.ntfy.sh/publish/#message-title); may be empty if not set |
|
| 146 |
+
| `message` ❤️ | _String_ | `Some message` | Message body; **this is likely what you're interested in** |
|
| 147 |
+
| `message_bytes` | _ByteArray_ | `(binary data)` | Message body as binary data |
|
| 148 |
+
| `encoding`️ | _String_ | - | Message encoding (empty or "base64") |
|
| 149 |
+
| `tags` | _String_ | `tag1,tag2,..` | Comma-separated list of [tags](https://docs.ntfy.sh/publish/#tags-emojis) |
|
| 150 |
+
| `tags_map` | _String_ | `0=tag1,1=tag2,..` | Map of tags to make it easier to map first, second, ... tag |
|
| 151 |
+
| `priority` | _Int (between 1-5)_ | `4` | Message [priority](https://docs.ntfy.sh/publish/#message-priority) with 1=min, 3=default and 5=max |
|
| 152 |
+
| `click` | _String_ | `https://google.com` | [Click action](https://docs.ntfy.sh/publish/#click-action) URL, or empty if not set |
|
| 153 |
+
| `attachment_name` | _String_ | `attachment.jpg` | Filename of the attachment; may be empty if not set |
|
| 154 |
+
| `attachment_type` | _String_ | `image/jpeg` | Mime type of the attachment; may be empty if not set |
|
| 155 |
+
| `attachment_size` | _Long_ | `9923111` | Size in bytes of the attachment; may be zero if not set |
|
| 156 |
+
| `attachment_expires` | _Long_ | `1655514244` | Expiry date as Unix timestamp of the attachment URL; may be zero if not set |
|
| 157 |
+
| `attachment_url` | _String_ | `https://ntfy.sh/file/afUbjadfl7ErP.jpg` | URL of the attachment; may be empty if not set |
|
| 158 |
+
|
| 159 |
+
#### Send messages using intents[¶](https://docs.ntfy.sh/subscribe/phone#send-messages-using-intents "Permanent link")
|
| 160 |
+
|
| 161 |
+
To send messages from other apps (such as [MacroDroid](https://play.google.com/store/apps/details?id=com.arlosoft.macrodroid) and [Tasker](https://play.google.com/store/apps/details?id=net.dinglisch.android.taskerm)), you can broadcast an intent with the `io.heckel.ntfy.SEND_MESSAGE` action. The ntfy Android app will forward the intent as a HTTP POST request to [publish a message](https://docs.ntfy.sh/publish/). This is primarily useful for apps that do not support HTTP POST/PUT (like MacroDroid). In Tasker, you can simply use the "HTTP Request" action, which is a little easier and also works if ntfy is not installed.
|
| 162 |
+
|
| 163 |
+
Here's what that looks like:
|
| 164 |
+
|
| 165 |
+
[](https://docs.ntfy.sh/static/img/android-screenshot-macrodroid-send-macro.png)[](https://docs.ntfy.sh/static/img/android-screenshot-macrodroid-send-action.png)[](https://docs.ntfy.sh/static/img/android-screenshot-tasker-profile-send.png)[](https://docs.ntfy.sh/static/img/android-screenshot-tasker-task-edit-post.png)[](https://docs.ntfy.sh/static/img/android-screenshot-tasker-action-http-post.png)
|
| 166 |
+
|
| 167 |
+
The following intent extras are supported when for the intent with the `io.heckel.ntfy.SEND_MESSAGE` action:
|
| 168 |
+
|
| 169 |
+
| Extra name | Required | Type | Example | Description |
|
| 170 |
+
| --- | --- | --- | --- | --- |
|
| 171 |
+
| `base_url` | - | _String_ | `https://ntfy.sh` | Root URL of the ntfy server this message came from, defaults to `https://ntfy.sh` |
|
| 172 |
+
| `topic` ❤️ | ✔ | _String_ | `mytopic` | Topic name; **you must set this** |
|
| 173 |
+
| `title` | - | _String_ | `Some title` | Message [title](https://docs.ntfy.sh/publish/#message-title); may be empty if not set |
|
| 174 |
+
| `message` ❤️ | ✔ | _String_ | `Some message` | Message body; **you must set this** |
|
| 175 |
+
| `tags` | - | _String_ | `tag1,tag2,..` | Comma-separated list of [tags](https://docs.ntfy.sh/publish/#tags-emojis) |
|
| 176 |
+
| `priority` | - | _String or Int (between 1-5)_ | `4` | Message [priority](https://docs.ntfy.sh/publish/#message-priority) with 1=min, 3=default and 5=max |
|
docs-ntfy-sh-subscribe-pwa-20250924.md
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
Title: From the Desktop - ntfy
|
| 2 |
+
|
| 3 |
+
URL Source: https://docs.ntfy.sh/subscribe/pwa
|
| 4 |
+
|
| 5 |
+
Markdown Content:
|
| 6 |
+
Using the progressive web app (PWA)[¶](https://docs.ntfy.sh/subscribe/pwa#using-the-progressive-web-app-pwa "Permanent link")
|
| 7 |
+
-----------------------------------------------------------------------------------------------------------------------------
|
| 8 |
+
|
| 9 |
+
While ntfy doesn't have a native desktop app, it is built as a [progressive web app](https://developer.mozilla.org/en-US/docs/Web/Progressive_web_apps) (PWA) and thus can be **installed on both desktop and mobile devices**.
|
| 10 |
+
|
| 11 |
+
This gives it its own launcher (e.g. shortcut on Windows, app on macOS, launcher shortcut on Linux, home screen icon on iOS, and launcher icon on Android), a standalone window, push notifications, and an app badge with the unread notification count.
|
| 12 |
+
|
| 13 |
+
Web app installation is **supported on** (see [compatibility table](https://caniuse.com/web-app-manifest) for details):
|
| 14 |
+
|
| 15 |
+
* **Chrome:** Android, Windows, Linux, macOS
|
| 16 |
+
* **Safari:** iOS 16.4+, macOS 14+
|
| 17 |
+
* **Firefox:** Android, as well as on Windows/Linux [via an extension](https://addons.mozilla.org/en-US/firefox/addon/pwas-for-firefox/)
|
| 18 |
+
* **Edge:** Windows
|
| 19 |
+
|
| 20 |
+
Note that for self-hosted servers, [Web Push](https://docs.ntfy.sh/config/#web-push) must be configured for the PWA to work.
|
| 21 |
+
|
| 22 |
+
Installation[¶](https://docs.ntfy.sh/subscribe/pwa#installation "Permanent link")
|
| 23 |
+
---------------------------------------------------------------------------------
|
| 24 |
+
|
| 25 |
+
### Chrome on Desktop[¶](https://docs.ntfy.sh/subscribe/pwa#chrome-on-desktop "Permanent link")
|
| 26 |
+
|
| 27 |
+
To install and register the web app via Chrome, click the "install app" icon. After installation, you can find the app in your app drawer:
|
| 28 |
+
|
| 29 |
+
[](https://docs.ntfy.sh/static/img/pwa-install.png)[](https://docs.ntfy.sh/static/img/pwa.png)[](https://docs.ntfy.sh/static/img/pwa-badge.png)
|
| 30 |
+
|
| 31 |
+
### Safari on macOS[¶](https://docs.ntfy.sh/subscribe/pwa#safari-on-macos "Permanent link")
|
| 32 |
+
|
| 33 |
+
To install and register the web app via Safari, click on the Share menu and click Add to Dock. You need to be on macOS Sonoma (14) or higher.
|
| 34 |
+
|
| 35 |
+
[](https://docs.ntfy.sh/static/img/pwa-install-macos-safari-add-to-dock.png)
|
| 36 |
+
|
| 37 |
+
### Chrome/Firefox on Android[¶](https://docs.ntfy.sh/subscribe/pwa#chromefirefox-on-android "Permanent link")
|
| 38 |
+
|
| 39 |
+
For Chrome on Android, either click the "Add to Home Screen" banner at the bottom of the screen, or select "Install app" in the menu, and then click "Install" in the popup menu. After installation, you can find the app in your app drawer, and on your home screen.
|
| 40 |
+
|
| 41 |
+
[](https://docs.ntfy.sh/static/img/pwa-install-chrome-android.jpg)[](https://docs.ntfy.sh/static/img/pwa-install-chrome-android-menu.jpg)[](https://docs.ntfy.sh/static/img/pwa-install-chrome-android-popup.jpg)
|
| 42 |
+
|
| 43 |
+
For Firefox, select "Install" in the menu, and then click "Add" to add an icon to your home screen:
|
| 44 |
+
|
| 45 |
+
[](https://docs.ntfy.sh/static/img/pwa-install-firefox-android-menu.jpg)[](https://docs.ntfy.sh/static/img/pwa-install-firefox-android-popup.jpg)
|
| 46 |
+
|
| 47 |
+
### Safari on iOS[¶](https://docs.ntfy.sh/subscribe/pwa#safari-on-ios "Permanent link")
|
| 48 |
+
|
| 49 |
+
On iOS Safari, tap on the Share menu, then tap "Add to Home Screen":
|
| 50 |
+
|
| 51 |
+
[](https://docs.ntfy.sh/static/img/pwa-install-safari-ios-button.jpg)[](https://docs.ntfy.sh/static/img/pwa-install-safari-ios-menu.jpg)[](https://docs.ntfy.sh/static/img/pwa-install-safari-ios-add-icon.jpg)
|
| 52 |
+
|
| 53 |
+
Background notifications[¶](https://docs.ntfy.sh/subscribe/pwa#background-notifications "Permanent link")
|
| 54 |
+
---------------------------------------------------------------------------------------------------------
|
| 55 |
+
|
| 56 |
+
Background notifications via web push are enabled by default and cannot be turned off when the app is installed, as notifications would not be delivered reliably otherwise. You can mute topics you don't want to receive notifications for.
|
| 57 |
+
|
| 58 |
+
On desktop, you generally need either your browser or the web app open to receive notifications, though the ntfy tab doesn't need to be open. On mobile, you don't need to have the web app open to receive notifications. Look at the [web docs](https://docs.ntfy.sh/subscribe/web/#background-notifications) for a detailed breakdown.
|
docs-ntfy-sh-subscribe-web-20250924.md
ADDED
|
@@ -0,0 +1,68 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
Title: From the Web app - ntfy
|
| 2 |
+
|
| 3 |
+
URL Source: https://docs.ntfy.sh/subscribe/web
|
| 4 |
+
|
| 5 |
+
Markdown Content:
|
| 6 |
+
Subscribe from the web app[¶](https://docs.ntfy.sh/subscribe/web#subscribe-from-the-web-app "Permanent link")
|
| 7 |
+
-------------------------------------------------------------------------------------------------------------
|
| 8 |
+
|
| 9 |
+
The web app lets you subscribe and publish messages to ntfy topics. For ntfy.sh, the web app is available at [ntfy.sh/app](https://ntfy.sh/app). To subscribe, simply type in the topic name and click the _Subscribe_ button. **After subscribing, messages published to the topic will appear in the web app, and pop up as a notification.**
|
| 10 |
+
|
| 11 |
+
[](https://docs.ntfy.sh/static/img/web-subscribe.png)
|
| 12 |
+
|
| 13 |
+
Publish messages[¶](https://docs.ntfy.sh/subscribe/web#publish-messages "Permanent link")
|
| 14 |
+
-----------------------------------------------------------------------------------------
|
| 15 |
+
|
| 16 |
+
To learn how to send messages, check out the [publishing page](https://docs.ntfy.sh/publish/).
|
| 17 |
+
|
| 18 |
+
[](https://docs.ntfy.sh/static/img/web-detail.png)[](https://docs.ntfy.sh/static/img/web-notification.png)
|
| 19 |
+
|
| 20 |
+
Topic reservations[¶](https://docs.ntfy.sh/subscribe/web#topic-reservations "Permanent link")
|
| 21 |
+
---------------------------------------------------------------------------------------------
|
| 22 |
+
|
| 23 |
+
If topic reservations are enabled, you can claim ownership over topics and define access to it:
|
| 24 |
+
|
| 25 |
+
[](https://docs.ntfy.sh/static/img/web-reserve-topic.png)[](https://docs.ntfy.sh/static/img/web-reserve-topic-dialog.png)
|
| 26 |
+
|
| 27 |
+
Notification features and browser support[¶](https://docs.ntfy.sh/subscribe/web#notification-features-and-browser-support "Permanent link")
|
| 28 |
+
-------------------------------------------------------------------------------------------------------------------------------------------
|
| 29 |
+
|
| 30 |
+
* Emoji tags are supported in all browsers
|
| 31 |
+
|
| 32 |
+
* [Click](https://docs.ntfy.sh/publish/#click-action) actions are supported in all browsers
|
| 33 |
+
|
| 34 |
+
* Only Chrome, Edge, and Opera support displaying view and http [actions](https://docs.ntfy.sh/publish/#action-buttons) in notifications.
|
| 35 |
+
|
| 36 |
+
Their presentation is platform specific.
|
| 37 |
+
|
| 38 |
+
Note that HTTP actions are performed using fetch and thus are limited to the [CORS](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS) rules, which means that any URL you include needs to respond to a [preflight request](https://developer.mozilla.org/en-US/docs/Glossary/Preflight_request) with headers allowing the origin of the ntfy web app (`Access-Control-Allow-Origin: https://ntfy.sh`) or `*`.
|
| 39 |
+
|
| 40 |
+
* Only Chrome, Edge, and Opera support displaying [images](https://docs.ntfy.sh/publish/#attachments) in notifications.
|
| 41 |
+
|
| 42 |
+
Look at the [Notifications API](https://developer.mozilla.org/en-US/docs/Web/API/Notifications_API#browser_compatibility) for more info.
|
| 43 |
+
|
| 44 |
+
Background notifications[¶](https://docs.ntfy.sh/subscribe/web#background-notifications "Permanent link")
|
| 45 |
+
---------------------------------------------------------------------------------------------------------
|
| 46 |
+
|
| 47 |
+
While subscribing, you have the option to enable background notifications on supported browsers (see "Settings" tab).
|
| 48 |
+
|
| 49 |
+
Note: If you add the web app to your homescreen (as a progressive web app, more info in the [installed web app](https://docs.ntfy.sh/subscribe/pwa/) docs), you cannot turn these off, as notifications would not be delivered reliably otherwise. You can mute topics you don't want to receive notifications for.
|
| 50 |
+
|
| 51 |
+
**If background notifications are off:** This requires an active ntfy tab to be open to receive notifications. These are typically instantaneous, and will appear as a system notification. If you don't see these, check that your browser is allowed to show notifications (for example in System Settings on macOS). If you don't want to enable background notifications, **pinning the ntfy tab on your browser** is a good solution to leave it running.
|
| 52 |
+
|
| 53 |
+
**If background notifications are on:** This uses the [Web Push API](https://caniuse.com/push-api). You don't need an active ntfy tab open, but in some cases you may need to keep your browser open. Background notifications are only supported on the same server hosting the web app. You cannot use another server, but can instead subscribe on the other server itself.
|
| 54 |
+
|
| 55 |
+
If the ntfy app is not opened for more than a week, background notifications will be paused. You can resume them by opening the app again, and will get a warning notification before they are paused.
|
| 56 |
+
|
| 57 |
+
| Browser | Platform | Browser Running | Browser Not Running | Restrictions |
|
| 58 |
+
| --- | --- | --- | --- | --- |
|
| 59 |
+
| Chrome | Desktop | ✅ | ❌ | |
|
| 60 |
+
| Firefox | Desktop | ✅ | ❌ | |
|
| 61 |
+
| Edge | Desktop | ✅ | ❌ | |
|
| 62 |
+
| Opera | Desktop | ✅ | ❌ | |
|
| 63 |
+
| Safari | Desktop | ✅ | �� | requires Safari 16.1, macOS 13 Ventura |
|
| 64 |
+
| Chrome | Android | ✅ | ✅ | |
|
| 65 |
+
| Firefox | Android | ✅ | ✅ | |
|
| 66 |
+
| Safari | iOS | ⚠️ | ⚠️ | requires iOS 16.4, only when app is added to homescreen |
|
| 67 |
+
|
| 68 |
+
(Browsers below 1% usage not shown, look at the [Push API](https://caniuse.com/push-api) for more info)
|
docs-ntfy-sh-troubleshooting-20250924.md
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
Title: Troubleshooting - ntfy
|
| 2 |
+
|
| 3 |
+
URL Source: https://docs.ntfy.sh/troubleshooting
|
| 4 |
+
|
| 5 |
+
Markdown Content:
|
| 6 |
+
```
|
| 7 |
+
$ ntfy serve --debug
|
| 8 |
+
2023/03/20 14:45:38 INFO Listening on :2586[http] :1025[smtp], ntfy 2.1.2, log level is DEBUG (tag=startup)
|
| 9 |
+
2023/03/20 14:45:38 DEBUG Waiting until 2023-03-21 00:00:00 +0000 UTC to reset visitor stats (tag=resetter)
|
| 10 |
+
2023/03/20 14:45:39 DEBUG Rate limiters reset for visitor (visitor_auth_limiter_limit=0.016666666666666666, visitor_auth_limiter_tokens=10, visitor_emails=0, visitor_emails_limit=12, visitor_emails_remaining=12, visitor_id=ip:127.0.0.1, visitor_ip=127.0.0.1, visitor_messages=0, visitor_messages_limit=500, visitor_messages_remaining=500, visitor_request_limiter_limit=0.2, visitor_request_limiter_tokens=60, visitor_seen=2023-03-20T14:45:39.7-04:00)
|
| 11 |
+
2023/03/20 14:45:39 DEBUG HTTP request started (http_method=POST, http_path=/mytopic, tag=http, visitor_auth_limiter_limit=0.016666666666666666, visitor_auth_limiter_tokens=10, visitor_emails=0, visitor_emails_limit=12, visitor_emails_remaining=12, visitor_id=ip:127.0.0.1, visitor_ip=127.0.0.1, visitor_messages=0, visitor_messages_limit=500, visitor_messages_remaining=500, visitor_request_limiter_limit=0.2, visitor_request_limiter_tokens=60, visitor_seen=2023-03-20T14:45:39.7-04:00)
|
| 12 |
+
2023/03/20 14:45:39 DEBUG Received message (http_method=POST, http_path=/mytopic, message_body_size=2, message_delayed=false, message_email=, message_event=message, message_firebase=true, message_id=EZu6i2WZjH0v, message_sender=127.0.0.1, message_time=1679337939, message_unifiedpush=false, tag=publish, topic=mytopic, topic_last_access=2023-03-20T14:45:38.319-04:00, topic_subscribers=0, visitor_auth_limiter_limit=0.016666666666666666, visitor_auth_limiter_tokens=10, visitor_emails=0, visitor_emails_limit=12, visitor_emails_remaining=12, visitor_id=ip:127.0.0.1, visitor_ip=127.0.0.1, visitor_messages=1, visitor_messages_limit=500, visitor_messages_remaining=499, visitor_request_limiter_limit=0.2, visitor_request_limiter_tokens=59.0002132248, visitor_seen=2023-03-20T14:45:39.7-04:00)
|
| 13 |
+
2023/03/20 14:45:39 DEBUG Adding message to cache (http_method=POST, http_path=/mytopic, message_body_size=2, message_event=message, message_id=EZu6i2WZjH0v, message_sender=127.0.0.1, message_time=1679337939, tag=publish, topic=mytopic, visitor_auth_limiter_limit=0.016666666666666666, visitor_auth_limiter_tokens=10, visitor_emails=0, visitor_emails_limit=12, visitor_emails_remaining=12, visitor_id=ip:127.0.0.1, visitor_ip=127.0.0.1, visitor_messages=1, visitor_messages_limit=500, visitor_messages_remaining=499, visitor_request_limiter_limit=0.2, visitor_request_limiter_tokens=59.000259165, visitor_seen=2023-03-20T14:45:39.7-04:00)
|
| 14 |
+
2023/03/20 14:45:39 DEBUG HTTP request finished (http_method=POST, http_path=/mytopic, tag=http, time_taken_ms=2, visitor_auth_limiter_limit=0.016666666666666666, visitor_auth_limiter_tokens=10, visitor_emails=0, visitor_emails_limit=12, visitor_emails_remaining=12, visitor_id=ip:127.0.0.1, visitor_ip=127.0.0.1, visitor_messages=1, visitor_messages_limit=500, visitor_messages_remaining=499, visitor_request_limiter_limit=0.2, visitor_request_limiter_tokens=59.0004147334, visitor_seen=2023-03-20T14:45:39.7-04:00)
|
| 15 |
+
2023/03/20 14:45:39 DEBUG Wrote 1 message(s) in 8.285712ms (tag=message_cache)
|
| 16 |
+
...
|
| 17 |
+
```
|
| 18 |
+
|
| 19 |
+
```
|
| 20 |
+
$ ntfy serve --trace
|
| 21 |
+
2023/03/20 14:40:42 INFO Listening on :2586[http] :1025[smtp], ntfy 2.1.2, log level is TRACE (tag=startup)
|
| 22 |
+
2023/03/20 14:40:42 DEBUG Waiting until 2023-03-21 00:00:00 +0000 UTC to reset visitor stats (tag=resetter)
|
| 23 |
+
2023/03/20 14:40:59 DEBUG Rate limiters reset for visitor (visitor_auth_limiter_limit=0.016666666666666666, visitor_auth_limiter_tokens=10, visitor_emails=0, visitor_emails_limit=12, visitor_emails_remaining=12, visitor_id=ip:127.0.0.1, visitor_ip=127.0.0.1, visitor_messages=0, visitor_messages_limit=500, visitor_messages_remaining=500, visitor_request_limiter_limit=0.2, visitor_request_limiter_tokens=60, visitor_seen=2023-03-20T14:40:59.893-04:00)
|
| 24 |
+
2023/03/20 14:40:59 TRACE HTTP request started (http_method=POST, http_path=/mytopic, http_request=POST /mytopic HTTP/1.1
|
| 25 |
+
User-Agent: curl/7.81.0
|
| 26 |
+
Accept: */*
|
| 27 |
+
Content-Length: 2
|
| 28 |
+
Content-Type: application/x-www-form-urlencoded
|
| 29 |
+
|
| 30 |
+
hi, tag=http, visitor_auth_limiter_limit=0.016666666666666666, visitor_auth_limiter_tokens=10, visitor_emails=0, visitor_emails_limit=12, visitor_emails_remaining=12, visitor_id=ip:127.0.0.1, visitor_ip=127.0.0.1, visitor_messages=0, visitor_messages_limit=500, visitor_messages_remaining=500, visitor_request_limiter_limit=0.2, visitor_request_limiter_tokens=60, visitor_seen=2023-03-20T14:40:59.893-04:00)
|
| 31 |
+
2023/03/20 14:40:59 TRACE Received message (http_method=POST, http_path=/mytopic, message_body={
|
| 32 |
+
"id": "Khaup1RVclU3",
|
| 33 |
+
"time": 1679337659,
|
| 34 |
+
"expires": 1679380859,
|
| 35 |
+
"event": "message",
|
| 36 |
+
"topic": "mytopic",
|
| 37 |
+
"message": "hi"
|
| 38 |
+
}, message_body_size=2, message_delayed=false, message_email=, message_event=message, message_firebase=true, message_id=Khaup1RVclU3, message_sender=127.0.0.1, message_time=1679337659, message_unifiedpush=false, tag=publish, topic=mytopic, topic_last_access=2023-03-20T14:40:59.893-04:00, topic_subscribers=0, visitor_auth_limiter_limit=0.016666666666666666, visitor_auth_limiter_tokens=10, visitor_emails=0, visitor_emails_limit=12, visitor_emails_remaining=12, visitor_id=ip:127.0.0.1, visitor_ip=127.0.0.1, visitor_messages=1, visitor_messages_limit=500, visitor_messages_remaining=499, visitor_request_limiter_limit=0.2, visitor_request_limiter_tokens=59.0001785048, visitor_seen=2023-03-20T14:40:59.893-04:00)
|
| 39 |
+
2023/03/20 14:40:59 DEBUG Adding message to cache (http_method=POST, http_path=/mytopic, message_body_size=2, message_event=message, message_id=Khaup1RVclU3, message_sender=127.0.0.1, message_time=1679337659, tag=publish, topic=mytopic, visitor_auth_limiter_limit=0.016666666666666666, visitor_auth_limiter_tokens=10, visitor_emails=0, visitor_emails_limit=12, visitor_emails_remaining=12, visitor_id=ip:127.0.0.1, visitor_ip=127.0.0.1, visitor_messages=1, visitor_messages_limit=500, visitor_messages_remaining=499, visitor_request_limiter_limit=0.2, visitor_request_limiter_tokens=59.0002044368, visitor_seen=2023-03-20T14:40:59.893-04:00)
|
| 40 |
+
2023/03/20 14:40:59 DEBUG HTTP request finished (http_method=POST, http_path=/mytopic, tag=http, time_taken_ms=1, visitor_auth_limiter_limit=0.016666666666666666, visitor_auth_limiter_tokens=10, visitor_emails=0, visitor_emails_limit=12, visitor_emails_remaining=12, visitor_id=ip:127.0.0.1, visitor_ip=127.0.0.1, visitor_messages=1, visitor_messages_limit=500, visitor_messages_remaining=499, visitor_request_limiter_limit=0.2, visitor_request_limiter_tokens=59.000220502, visitor_seen=2023-03-20T14:40:59.893-04:00)
|
| 41 |
+
2023/03/20 14:40:59 TRACE No stream or WebSocket subscribers, not forwarding (message_body_size=2, message_event=message, message_id=Khaup1RVclU3, message_sender=127.0.0.1, message_time=1679337659, tag=publish, topic=mytopic, visitor_auth_limiter_limit=0.016666666666666666, visitor_auth_limiter_tokens=10, visitor_emails=0, visitor_emails_limit=12, visitor_emails_remaining=12, visitor_id=ip:127.0.0.1, visitor_ip=127.0.0.1, visitor_messages=1, visitor_messages_limit=500, visitor_messages_remaining=499, visitor_request_limiter_limit=0.2, visitor_request_limiter_tokens=59.0002369212, visitor_seen=2023-03-20T14:40:59.893-04:00)
|
| 42 |
+
2023/03/20 14:41:00 DEBUG Wrote 1 message(s) in 9.529196ms (tag=message_cache)
|
| 43 |
+
...
|
| 44 |
+
```
|
requirements.txt
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
gradio>=4.0.0
|
| 2 |
+
torch>=2.0.0
|
| 3 |
+
transformers>=4.35.0
|
| 4 |
+
accelerate>=0.24.0
|
| 5 |
+
bitsandbytes>=0.41.0
|
| 6 |
+
spaces>=0.19.0
|
| 7 |
+
tokenizers>=0.15.0
|
| 8 |
+
datasets>=2.14.0
|
| 9 |
+
requests>=2.31.0
|
| 10 |
+
Pillow>=10.0.0
|
| 11 |
+
numpy>=1.24.0
|
| 12 |
+
scipy>=1.11.0
|
| 13 |
+
langchain>=0.1.0
|
| 14 |
+
langchain-community>=0.0.10
|
| 15 |
+
langchain-huggingface>=0.0.1
|
| 16 |
+
sentence-transformers>=2.2.0
|
| 17 |
+
faiss-cpu>=1.7.0
|
| 18 |
+
markdown>=3.5.0
|
| 19 |
+
unstructured>=0.10.0
|