gitglubber commited on
Commit
1f897e1
·
verified ·
1 Parent(s): d230b4f

Upload folder using huggingface_hub

Browse files
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
+ [![Image 1](https://docs.ntfy.sh/static/img/badge-googleplay.png)](https://play.google.com/store/apps/details?id=io.heckel.ntfy)[![Image 2](https://docs.ntfy.sh/static/img/badge-fdroid.png)](https://f-droid.org/en/packages/io.heckel.ntfy/)[![Image 3](https://docs.ntfy.sh/static/img/badge-appstore.png)](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
+ ![Image 4: adding a topic](https://docs.ntfy.sh/static/img/getting-started-add.png)
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
+ ![Image 5: basic notification](https://docs.ntfy.sh/static/img/android-screenshot-basic-notification.png)
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 (![some image](https://bing.com/logo.png))
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
+ [![Image 1](https://docs.ntfy.sh/static/img/badge-googleplay.png)](https://play.google.com/store/apps/details?id=io.heckel.ntfy)[![Image 2](https://docs.ntfy.sh/static/img/badge-fdroid.png)](https://f-droid.org/en/packages/io.heckel.ntfy/)[![Image 3](https://docs.ntfy.sh/static/img/badge-appstore.png)](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
+ [![Image 4](https://docs.ntfy.sh/static/img/android-screenshot-main.png)](https://docs.ntfy.sh/static/img/android-screenshot-main.png)[![Image 5](https://docs.ntfy.sh/static/img/android-screenshot-detail.png)](https://docs.ntfy.sh/static/img/android-screenshot-detail.png)[![Image 6](https://docs.ntfy.sh/static/img/android-screenshot-pause.png)](https://docs.ntfy.sh/static/img/android-screenshot-pause.png)[![Image 7](https://docs.ntfy.sh/static/img/android-screenshot-add.png)](https://docs.ntfy.sh/static/img/android-screenshot-add.png)[![Image 8](https://docs.ntfy.sh/static/img/android-screenshot-add-instant.png)](https://docs.ntfy.sh/static/img/android-screenshot-add-instant.png)[![Image 9](https://docs.ntfy.sh/static/img/android-screenshot-add-other.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
+ ![Image 10: priority notification](https://docs.ntfy.sh/static/img/priority-notification.png)
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
+ ![Image 11: notification settings](https://docs.ntfy.sh/static/img/android-screenshot-notification-settings.png)
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
+ ![Image 12: channel details](https://docs.ntfy.sh/static/img/android-screenshot-notification-details.jpg)
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
+ ![Image 13: foreground service](https://docs.ntfy.sh/static/img/foreground-service.png)
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
+ ![Image 14: foreground service](https://docs.ntfy.sh/static/img/notification-settings.png)
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
+ [![Image 15](https://docs.ntfy.sh/static/img/android-screenshot-share-1.jpg)](https://docs.ntfy.sh/static/img/android-screenshot-share-1.jpg)[![Image 16](https://docs.ntfy.sh/static/img/android-screenshot-share-2.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
+ [![Image 17](https://docs.ntfy.sh/static/img/android-screenshot-unifiedpush-fluffychat.jpg)](https://docs.ntfy.sh/static/img/android-screenshot-unifiedpush-fluffychat.jpg)[![Image 18](https://docs.ntfy.sh/static/img/android-screenshot-unifiedpush-subscription.jpg)](https://docs.ntfy.sh/static/img/android-screenshot-unifiedpush-subscription.jpg)[![Image 19](https://docs.ntfy.sh/static/img/android-screenshot-unifiedpush-settings.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
+ [![Image 20](https://docs.ntfy.sh/static/img/android-screenshot-macrodroid-overview.png)](https://docs.ntfy.sh/static/img/android-screenshot-macrodroid-overview.png)[![Image 21](https://docs.ntfy.sh/static/img/android-screenshot-macrodroid-trigger.png)](https://docs.ntfy.sh/static/img/android-screenshot-macrodroid-trigger.png)[![Image 22](https://docs.ntfy.sh/static/img/android-screenshot-macrodroid-action.png)](https://docs.ntfy.sh/static/img/android-screenshot-macrodroid-action.png)[![Image 23](https://docs.ntfy.sh/static/img/android-screenshot-tasker-profiles.png)](https://docs.ntfy.sh/static/img/android-screenshot-tasker-profiles.png)[![Image 24](https://docs.ntfy.sh/static/img/android-screenshot-tasker-event-edit.png)](https://docs.ntfy.sh/static/img/android-screenshot-tasker-event-edit.png)[![Image 25](https://docs.ntfy.sh/static/img/android-screenshot-tasker-task-edit.png)](https://docs.ntfy.sh/static/img/android-screenshot-tasker-task-edit.png)[![Image 26](https://docs.ntfy.sh/static/img/android-screenshot-tasker-action-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
+ ![Image 27: muted subscription](https://docs.ntfy.sh/static/img/android-screenshot-muted.png)
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
+ [![Image 28](https://docs.ntfy.sh/static/img/android-screenshot-macrodroid-send-macro.png)](https://docs.ntfy.sh/static/img/android-screenshot-macrodroid-send-macro.png)[![Image 29](https://docs.ntfy.sh/static/img/android-screenshot-macrodroid-send-action.png)](https://docs.ntfy.sh/static/img/android-screenshot-macrodroid-send-action.png)[![Image 30](https://docs.ntfy.sh/static/img/android-screenshot-tasker-profile-send.png)](https://docs.ntfy.sh/static/img/android-screenshot-tasker-profile-send.png)[![Image 31](https://docs.ntfy.sh/static/img/android-screenshot-tasker-task-edit-post.png)](https://docs.ntfy.sh/static/img/android-screenshot-tasker-task-edit-post.png)[![Image 32](https://docs.ntfy.sh/static/img/android-screenshot-tasker-action-http-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
+ [![Image 1](https://docs.ntfy.sh/static/img/pwa-install.png)](https://docs.ntfy.sh/static/img/pwa-install.png)[![Image 2](https://docs.ntfy.sh/static/img/pwa.png)](https://docs.ntfy.sh/static/img/pwa.png)[![Image 3](https://docs.ntfy.sh/static/img/pwa-badge.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
+ [![Image 4](https://docs.ntfy.sh/static/img/pwa-install-macos-safari-add-to-dock.png)](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
+ [![Image 5](https://docs.ntfy.sh/static/img/pwa-install-chrome-android.jpg)](https://docs.ntfy.sh/static/img/pwa-install-chrome-android.jpg)[![Image 6](https://docs.ntfy.sh/static/img/pwa-install-chrome-android-menu.jpg)](https://docs.ntfy.sh/static/img/pwa-install-chrome-android-menu.jpg)[![Image 7](https://docs.ntfy.sh/static/img/pwa-install-chrome-android-popup.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
+ [![Image 8](https://docs.ntfy.sh/static/img/pwa-install-firefox-android-menu.jpg)](https://docs.ntfy.sh/static/img/pwa-install-firefox-android-menu.jpg)[![Image 9](https://docs.ntfy.sh/static/img/pwa-install-firefox-android-popup.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
+ [![Image 10](https://docs.ntfy.sh/static/img/pwa-install-safari-ios-button.jpg)](https://docs.ntfy.sh/static/img/pwa-install-safari-ios-button.jpg)[![Image 11](https://docs.ntfy.sh/static/img/pwa-install-safari-ios-menu.jpg)](https://docs.ntfy.sh/static/img/pwa-install-safari-ios-menu.jpg)[![Image 12](https://docs.ntfy.sh/static/img/pwa-install-safari-ios-add-icon.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
+ [![Image 1](https://docs.ntfy.sh/static/img/web-subscribe.png)](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
+ [![Image 2](https://docs.ntfy.sh/static/img/web-detail.png)](https://docs.ntfy.sh/static/img/web-detail.png)[![Image 3](https://docs.ntfy.sh/static/img/web-notification.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
+ [![Image 4](https://docs.ntfy.sh/static/img/web-reserve-topic.png)](https://docs.ntfy.sh/static/img/web-reserve-topic.png)[![Image 5](https://docs.ntfy.sh/static/img/web-reserve-topic-dialog.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