Skip to main content
ntfybridge

ntfybridge

Two-way communication between Jeedom and ntfy. Receive rich alerts and control your home automation by message from your phone.

Jeedom 4.4+betaos 11+php 7.4/8.xNode.js☕ Soutenir le développement

User Manual — ntfybridge Plugin

The ntfybridge plugin connects Jeedom to ntfy, an open-source notification service available on iOS, Android and Web.

Communication is two-way:

  • Jeedom → Phone: alerts, reports, camera snapshots, file attachments
  • Phone → Jeedom: queries, commands, confirmations

Why ntfybridge?

Most home-automation notification solutions are one-way: the controller sends an alert, end of story. To take action, you have to open the app, navigate menus, find the right button.

ntfybridge flips the logic. Your smart home becomes a conversation: you ask a question, Jeedom answers. You give an order, Jeedom asks for confirmation. All from a simple notification — without ever opening the Jeedom UI.

In embedded mode, ntfy also becomes a private messenger between household members. Each user has their own access managed through the built-in panel — no need for WhatsApp, Telegram or any third-party service to let someone know the gate is open or dinner is ready.

And when everything crashes — Apache down, Jeedom unreachable — rescue mode takes over. The daemon runs independently: a ping or emergency from ntfy is enough to diagnose and restart services, with no SSH or web access required.

Everything stays on your premises: ntfy is embedded, no cloud required, no quotas, your data never passes through any third-party server.


Quick Start — 9 Steps

Minimal walkthrough to make Jeedom reachable by notification from your phone, without creating any equipment.

#StepDetails
1Install the pluginJeedom Market or GitHub → activate the plugin
2Install dependenciesClick Relaunch — installs Node.js ≥ 22 and the ntfy binary automatically
3Configure the ntfy serverEmbedded mode: set the admin username and password → see details ↓
4Start the daemonClick Relaunch — the ntfy server starts with the daemon
5Open ports on your internet routerForward ports 80 (HTTP) and 443 (HTTPS) to your Jeedom IP address
6Test the reverse proxyRun the built-in wizard, follow the 5 steps → see reverse proxy ↓
7Create an ntfy userUser panel: add an account with permissions on the rescue topic → see panel ↓
8Install the ntfy appDownload on iOS / Android, add the server, authenticate → see app ↓
9Configure rescue topics and test pingRescue modal: enter the action and response topics, enable ping, send ping from the app → see rescue ↓
Result

In 9 steps, your Jeedom is reachable from anywhere by notification — even if the web interface is down.


Configure the ntfy Server

Plugins → Plugin Management → ntfybridge → Configuration

The ntfy server is built into the plugin — everything is automatic.

SettingDescription
ntfy PortAuto-detected on first start. Test and Auto-detect buttons available
Admin Usernamentfy administrator account, generated at install (default: ntfyadmin)
Listen InterfaceLocalhost (recommended, behind reverse proxy) or LAN (all interfaces)
Public URLOnly needed for internet access (e.g. https://ntfy.mydomain.com)

To expose ntfy to the internet: enter the Public URL then click Reverse Proxy Wizard. The wizard generates the configuration in 5 steps for Apache, Nginx, NPM, Traefik or Cloudflare.

First-time Setup
  1. Save the configuration → the port is auto-detected
  2. Start the daemon → the ntfy server starts automatically
  3. (Optional) Run the reverse proxy wizard for external access

Manage Users (Panel)

Plugins → ntfybridge → Panel
Embedded Mode Only

The user management panel is only available in embedded mode. In external mode, manage users directly on your ntfy server.

The panel displays a Topics × Users cross-table for fine-grained access control.

Add a User

  1. Click Add User
  2. Enter a username and password (minimum 8 characters)
  3. Click Create

Manage Permissions

For each user/topic combination, choose the access level:

PermissionDescription
read-writeThe user can publish and receive messages on this topic
read-onlyThe user can only receive messages
deny-allAccess denied to this topic

Each change is applied immediately on the ntfy server.

Delete a User

Click the delete icon in the user's column. Deletion is permanent.


Install and Configure the ntfy App

Download the App

PlatformLink
iOSApp Store
AndroidGoogle Play or F-Droid
WebAccess your ntfy server URL in a browser

Subscribe to a Topic

  1. Open the ntfy app
  2. Tap + (add a subscription)
  3. Configure according to your mode:
  • With subdomain: enter the full URL https://ntfy.yourdomain.com/your_topic
  • Local / VPN: enter http://JEEDOM_IP:NTFY_PORT/your_topic
  • If authentication is enabled: enter the username and password created in the panel
tip

The subscription URL is displayed in the Subscription section of each ntfybridge equipment — you can copy it directly.


What You Can Do

Jeedom contacts you, informs you, alerts you.

  • 🔔 Alert if a window is left open while it's raining
  • 🌡️ Notification if the garage temperature drops below 5 °C
  • 📸 Camera snapshot when the gate opens
  • 🚨 Urgent alert with custom icon and sound
  • 📋 Daily report of your home status
  • ⏰ Delayed message — "Reminder in 30 minutes"
  • 🗂️ Named send profiles: urgent, quiet, report

Configuration Modes

Recommended Setup

Embedded mode + HTTPS subdomain — all-in-one installation, data stays on your premises, all features available (native iOS push, confirmation buttons, icons, file attachments).

ntfy is included in the plugin and exposed via reverse proxy on a subdomain.

Strengths:

  • All-in-one, nothing to install separately
  • All features: native iOS push, Yes/No buttons, icons, files
  • Data stays on your premises, full control of ntfy users
  • Built-in reverse proxy wizard (5 guided steps)

Requirements:

  • A domain name (e.g. ntfy.mydomain.com)
  • A reverse proxy (Apache, Nginx, NPM, Traefik, Cloudflare…) — see configuration →

Installation

1. Install the Plugin

Plugins → Plugin Management → Market → ntfybridge → Install

Activate the plugin after installation.

info

Node.js (≥ 22) and the ntfy binary are installed automatically. No manual intervention required.


2. Create an Equipment

  1. Plugins → ntfybridge → Add
  2. Name it, enable it
  3. Configure the topics:
    • Listen Topic: Jeedom receives messages on this topic (e.g. home_cmd)
    • Response Topic: Jeedom sends its responses on this topic (e.g. home_reply)
  4. Save — commands are created automatically
tip

The topic acts like a password. Choose a name that is hard to guess.

Subscribe in the ntfy app by copying the URL shown in the Subscription section of the equipment.


Equipment Configuration

Each ntfybridge equipment has four tabs.

Equipment Tab

Topics

FieldRole
Listen Topicntfy topic on which Jeedom receives incoming messages (SSE). E.g. home_cmd
Response Topicntfy topic on which Jeedom sends its automatic responses and confirmations. E.g. home_reply
tip

Both topics can be the same if you only have one topic for everything. However, separating topics lets you subscribe only to responses without receiving your own commands echoed back.

Default Values

These values apply to each send unless overridden by a cache command or inline parameter.

SettingDescription
PriorityNotification level: 1=min (silent) · 2=low · 3=default · 4=high · 5=urgent (loud sound)
TagsEmojis displayed in the notification, comma-separated (e.g. loudspeaker,bell)
MarkdownEnables bold, italic, lists rendering in the message body
IconURL of an image displayed as icon (Android only)
DelayDelayed send: 30m, 9am, 2026-01-01T09:00
ntfy CacheServer-side ntfy caching (yes/no). Empty = server default
FirebaseFirebase push activation (yes/no). Empty = server default

Security

SettingDescription
Allowed UsersList of ntfy users authorized to send commands, comma-separated. Empty = all
Blacklisted WordsWords whose presence in a message blocks all processing (e.g. delete,rm,sudo)
Confirmation TimeoutExpiration delay for a Yes/No confirmation request, in seconds (default: 60 s)

Silent Mode

OptionDescription
Global Silent ModeBlocks all outgoing sends and automatic responses
Disable Outgoing SendsPermanently blocks the send_message command
Disable Automatic ResponsesIgnores Response and Action rules for incoming messages
When SilentBehavior: block completely or switch to priority 1 (min, silent)
Time SlotsAutomatic silence periods (e.g. 22:00 → 08:00)
info

Disabling outgoing sends is useful for example for an equipment dedicated solely to receiving commands, without ever sending a notification on the listen topic.


Responses Tab

Defines what Jeedom replies when it receives a message matching keywords.

Rule Columns

FieldDescription
NameRule label (shown in the Trigger Response select)
KeywordsTrigger terms, comma-separated. E.g. living room temperature, temp living
ModeContains: keyword can be part of a longer word · Exact Word: must be a separate word (avoids false positives)
ResponseText sent, with {#command_id#} references to insert real-time values
Titlentfy notification title (optional)
PriorityResponse priority (1–5)
Tagsntfy emojis for the response
Image URLURL of an image attached to the response

Command References in Responses

Click + to open the Jeedom command selector and insert {#id#} at the cursor position.

Multi-command template example
Living room: {#364#} °C — Humidity: {#365#} % — CO₂: {#366#} ppm

Multiple commands can be combined in the same template. Values are read in parallel at send time.

info

Each rule can send the response to a different topic than the equipment's default response topic (optional Response Topic field per rule).


Actions Tab

Defines what Jeedom executes when it receives a message matching keywords.

Rule Fields

FieldDescription
NameRule label (shown in the Trigger Action select)
KeywordsTrigger terms, comma-separated
ModeContains or Exact Word (see Responses Tab)
ActionJeedom command or scenario to execute (standard Jeedom selector)
ConfirmationIf enabled: sends a notification with Yes ✓ / No ✗ buttons before executing
Confirmation TextMessage displayed with the buttons (e.g. Open the gate?)
Success TextMessage sent after successful execution
Cancel TextMessage sent if the user clicks No
Priority / Tagsntfy settings for the confirmation notification

Yes / No Confirmation

When confirmation is enabled, Jeedom generates a secure token (128-bit, single-use) and sends an ntfy notification with two HTTP buttons.

  • Yes ✓ → Jeedom executes the action and sends the success text
  • No ✗ → Jeedom sends the cancel text and deletes the token

The token automatically expires after the configured timeout (Equipment tab → Security).

warning

ntfy buttons are displayed in the message detail (tap on the notification), not on the lock screen banner. Buttons require that the Jeedom external URL is reachable from the internet.

Disable Notifications on the Action Topic

If you do not want to receive confirmation/success/cancel messages on the response topic, leave the Success Text and Cancel Text fields empty and disable confirmation. Only the action will be executed, with no ntfy feedback.


Commands Tab

Commands are created automatically when saving the equipment. No manual action required.

Send Commands

CommandTypeRole
Send MessageAction / messageTriggers the actual send. Title + body.
PriorityAction / slider (1–5)Sets the priority for the next send (stored in cache)
TagsAction / stringSets the tags for the next send
URLAction / stringSets the click URL for the next send
ImageAction / stringSets the attached image URL
FileAction / stringPath to a local file to send as attachment (binary PUT)
TopicAction / stringOne-time override of the send topic
MarkdownAction / slider (0/1)Enables or disables Markdown rendering
IconAction / stringIcon URL for the notification
DelayAction / stringDelayed send (30m, 9am…)
ntfy CacheAction / stringntfy cache override (yes/no)
FirebaseAction / stringFirebase override (yes/no)

Trigger Commands

CommandTypeRole
Trigger ResponseAction / selectExecutes a Response rule from a Jeedom scenario
Trigger ActionAction / selectExecutes an Action rule from a Jeedom scenario
Execution Order in a Scenario

Cache commands (Priority, Tags, Icon…) must be called before Send Message in the scenario. The Send Message command reads the caches, sends the notification, then resets all caches.

Jeedom scenario example
Action block:
1. [Home][ntfybridge] Priority → 5
2. [Home][ntfybridge] Tags → warning,fire
3. [Home][ntfybridge] Send Message
Title : Alarm
Message : Motion detected zone A

Sending Notifications

The send_message Command

In a Jeedom scenario:

Action → Message → [ntfybridge equipment] Send Message
Title : Alarm
Message : Motion detected zone A

Send Options

Call cache commands before send_message, or use inline parameters directly in the message:

OptionCache CommandInlineValues
Prioritysend_priority (1–5)[priority=5]1=min · 2=low · 3=default · 4=high · 5=urgent
Tagssend_tags[tags=warning,bell]ntfy emojis, comma-separated
Iconsend_icon[icon=https://...]Image URL (Android only)
Markdownsend_markdown (0/1)[md=1]bold, italic, lists
Delaysend_delay[delay=30m]30m, 9am, 2026-01-01T09:00
Filesend_file[file=/path]Absolute path on the server
Topicsend_topic[topic=alerts]One-time override
Click URLsend_url[url=https://...]URL opened on tap

Full inline example:

[priority=5][tags=warning,fire][title=Alert] Motion detected zone A
Platform Compatibility
FeatureAndroidiOSWeb
Custom icons
Markdown⚠️ partial
Action buttons
File attachments
Native push without public HTTPSFirebase

Send Profiles

Group your recurring settings into named profiles. Open from Plugins → ntfybridge → Profiles.

Priority Levels

LevelValueBehavior
min1Silent, no sound or vibration — passive reports
low2Discreet — silent banner
default3Standard device behavior
high4Sound + vibration, even in Do Not Disturb mode
urgent5Loud sound + vibration + overrides silent mode

Common Tags

Tags correspond to ntfy emoji names, comma-separated.

TagEmojiUsage
warning⚠️General alert
rotating_light🚨Emergency, alarm
fire🔥Fire, critical temperature
bell🔔Notification, reminder
information_sourceℹ️Information, report
white_check_markSuccess, confirmation
xError, failure
house🏠General home automation
thermometer🌡️Temperature
lock🔒Security, alarm
droplet💧Water, rain, humidity
electric_plug🔌Energy, power outage
camera📷Camera, detection
zzz💤Night mode, silence

Create a Profile

FieldExample
Namealert
Priority5
Tagswarning,rotating_light
Iconhttps://...
Markdown

Use a Profile

[profile=alert] Intrusion detected
[profile=info] Daily report ready
[profile=alert][priority=3] Priority overridden on top of the profile

Response Rules

When an incoming message matches keywords, Jeedom reads an info command and replies.

Example:

  • Keywords: living room temperature, temp living
  • Response: Living room temperature: {#364#} °C — Humidity: {#365#} %

Click + in the response field to insert a {#id#} reference via the Jeedom command selector. Multiple commands can be combined in the same template.


Action Rules

When a message matches, Jeedom executes an action.

Without confirmation → immediate action + success message.

With confirmation → Jeedom sends a notification with Yes ✓ / No ✗ buttons. The token expires after the configured delay (default: 60 s).

warning

ntfy buttons are displayed in the message detail (long press or tap on the notification), not as a banner.


Silent Mode

Per equipment:

  • Global Silent Mode: blocks all sends
  • Disable Outgoing Sends: blocks send_message
  • Disable Automatic Responses: ignores rules
  • Time Slots: e.g. silent from 10 PM to 8 AM
  • Behavior: block completely or switch to minimum priority (1)

Rescue Mode

Rescue Mode lets you query and troubleshoot Jeedom from the ntfy app, even when the web interface is unreachable (Apache or PHP down, Jeedom not responding).

The ntfybridge daemon runs independently from Jeedom. It can keep responding to your messages even when everything else is down.


Configure Rescue Mode

Open the plugin configuration:

Plugins → ntfybridge → (rescue icon)

Rescue Topics

FieldDescription
Action Topicntfy topic on which you send your rescue commands. E.g. home_rescue
Response TopicTopic on which Jeedom replies. Can be different for better organization of your ntfy subscriptions.
tip

Separating the rescue topic from your regular topics lets you subscribe to it only when needed — without cluttering your normal notifications.


Built-in Commands

These commands are available without any additional configuration, even if PHP is unreachable.

Send the keyword in ntfy → Jeedom responds automatically.

CommandWhat You Receive
pingAlive confirmation + server time, CPU load, free RAM, uptime, Jeedom DNS resolution
healthFull status: CPU, RAM, disk space, temperature, uptime
log ntfybridgedLast 20 lines of the ntfybridge daemon log
log <log_name>Last 20 lines of any Jeedom log
jeedomJeedom health report: database, plugins, services
emergencyApache, PHP-FPM and MySQL diagnostics — with Restart buttons for each service that is down

Check the commands you want to enable in the Rescue modal. It is recommended to enable at least ping and emergency.

The emergency Command in Detail

When you send emergency:

  1. Jeedom checks the status of Apache, PHP-FPM and MySQL
  2. For each service that is down, you receive an ntfy notification with two buttons: Yes ✓ (restart) and No ✗ (ignore)
  3. If you press Yes, the service restarts and you receive an acknowledgement

If all services are running, you simply receive an "all good" message.

Sudo Rights Required

For service restart to work, sudo rights must be granted to the www-data user. The Rescue modal displays the exact configuration block to copy into /etc/sudoers.d/ntfybridge.


Custom Commands

You can add your own commands: send a keyword in ntfy to trigger script execution on the server, and the result is sent back to you.

Add a Command

  1. Open the Rescue modal
  2. Click Add Command
  3. Fill in:
FieldDescription
NameDisplay label (e.g. Disk Space)
KeywordsWhat you type in ntfy to trigger the command (e.g. disk space, disk)
ScriptFile to execute, selected from available scripts in data/rescue_scripts/. The interpreter is automatically detected from the file extension (.sh→bash, .py→python3, .php→php, .js→node)
ConfirmationIf enabled: Jeedom asks Yes/No before executing
TimeoutMaximum execution time in seconds (5–120 s)
  1. Click Save

Deploy a Script

Scripts must be placed in:

plugins/ntfybridge/data/rescue_scripts/

Accepted formats: .sh, .php, .js, .py

The script runs and its output (stdout) is sent as an ntfy response. On error or timeout, you receive an error message without affecting the daemon.

Included Test Scripts

The folder already contains four test scripts (test_hello.sh, test_hello.php, test_hello.js, test_hello.py) that simply return the date and language version — handy for verifying execution works before adding your own scripts.

Security
  • Only files with a .sh, .php, .js or .py extension are accepted
  • Suspicious filenames (directory traversal attempts) are automatically rejected
  • Access is controlled by the ntfy ACLs configured in the user panel

Phone Control

iOS — Native Shortcuts

  1. Shortcuts app → New Shortcut
  2. Add the Ask for Input action (optional prompt)
  3. Add the Get Contents of URL action
    • URL: https://ntfy.yourdomain.com/my_topic
    • Method: POST
    • Request body: Text provided by the previous step
  4. Add the shortcut to the Home Screen or use it with Siri
Optional Prompt

Do not enter a question in the "Ask for Input" action. Depending on the iOS version, a mandatory prompt may be sent along with the message and break keyword matching in ntfybridge.

The Original Idea

ntfybridge was born from this concept: an iOS shortcut sends a POST → Jeedom receives and acts.

Android

AppHighlights
HTTP Request Shortcuts (F-Droid)Simple, widget support, open-source
TaskerVery powerful, advanced automations
MacroDroidUser-friendly, built-in HTTP actions

Logs

LogDescription
ntfybridgeMain plugin and daemon log

Enable Debug only for troubleshooting.


Configure the Reverse Proxy (Embedded Mode + Subdomain)

The built-in wizard generates the Apache configuration in 5 steps.

Then apply in the terminal:

Step 1 — Create the config file
sudo nano /etc/apache2/sites-available/ntfy.conf
# Paste the content generated by the wizard
Step 2 — Certbot (if not already installed)
sudo apt install certbot python3-certbot-apache -y
Step 3 — Enable and obtain the SSL certificate
sudo a2ensite ntfy.conf
sudo a2enmod proxy proxy_http proxy_wstunnel rewrite ssl headers
sudo apache2ctl configtest
sudo systemctl reload apache2
sudo certbot --apache -d ntfy.yourdomain.com
Step 4 — Verify
curl -I https://ntfy.yourdomain.com
# Expected: HTTP/2 200 (or 401 if auth — normal ✅)

Return to the wizard → Next → final validation.

Automatic SSL Renewal
sudo certbot renew --dry-run

Troubleshooting

The Daemon Won't Start

  • Check Node.js ≥ 22: node --version
  • ntfy port free: Reset Port button in configuration
  • Check logs: Plugins → ntfybridge → Logs

Yes/No Buttons Don't Work

The Jeedom external URL must be reachable from the internet:

Settings → System → Configuration → Networks → External Access → URL

No Notification Received

  • Same topic in the equipment and the ntfy app
  • User authorized (allowedUsers)
  • No blacklisted word triggered (blacklistWords)

iOS Push Not Working

Requires an HTTPS subdomain in embedded mode, or ntfy.sh in external mode.