vuecwiz49 downloadsReceive ntfy messages in Obsidian and route them into Markdown notes with configurable rules, templates, attachments, durable recovery, and optional processing results.
Ntfy Sync connects Obsidian desktop to a user-configured ntfy server. Messages published from mobile apps, browser extensions, scripts, or other ntfy clients are received through streaming or polling, then routed into Markdown notes using ordered, first-match rules. Rules can match topics, titles, message content, tags, priority, URLs, and attachment metadata, while configurable templates control the destination note, inserted content, insertion mode, and attachment path.
Accepted messages are persisted before processing, and idempotency markers prevent duplicate Vault writes during reconnects or replay. The plugin supports authenticated public and self-hosted ntfy servers, guarded same-origin attachment downloads, durable recovery, dead-letter retries, redacted diagnostics, and optional publication of processing results to a separate ntfy topic. Ntfy Sync is desktop-only.

If ntfy is new to you, start with the official ntfy Getting started guide, which covers subscribing to a topic and sending the first message.
Open the right-sidebar composer to complete the publish flow without a browser or command-line request.

Ctrl/Cmd+Enter.Available Obsidian commands:
The three settings views below cover receiving, routing, and rule editing. All values shown are synthetic examples.
Configure message receiving and the ntfy connection.

Rules are evaluated from top to bottom. Each rule provides quick enable/disable, priority, edit, and delete controls.

Rules use ordered, first-match evaluation. Configure conditions and the target note in the structured editor; place a catch-all rule last.

See the configuration reference for rule fields, condition operators, path constraints, and template variables.
The status-bar bubble distinguishes off, monitor only, idle, connecting, connected, polling, retrying, and error. Connecting and polling use subtle motion, and hovering shows a detailed status summary.

| Tooltip line | Meaning |
|---|---|
Ntfy Sync — Connected |
Overall state derived from the plugin switch and all connection runners. |
Receiving: enabled |
Whether inbound processing is enabled in plugin settings. |
Writer: this device |
Whether this device owns Vault writes. another device means monitor-only operation. |
Connections: 1 · 1 connected |
Total configured connection runners followed by their current state distribution. |
Subscriptions: 1 |
Total configured input subscriptions across all connections. Topic names are never shown. |
Last connected: just now |
Relative time of the most recent successful connection. |
Last message: just now |
Relative time of the most recently received event. Message content is never shown. |
Reconnect attempts: 0 |
Sum of reconnect attempts across active connection runners. |
Last fault: <code> |
Error code shown only when a transport fault exists. |
Inbox: 4 total · 0 pending · 0 dead letter |
Durable inbox totals and unresolved/dead-letter counts. |
Result outbox: 0 pending |
Results waiting to be published. |
Obsidian/ntfy/.Runtime state is stored beside the plugin as state-v1.json, with a checksum and previous snapshot backup. A corrupt primary is isolated and recovered from the backup; if both copies are corrupt, the plugin stops instead of silently rebuilding and replaying everything. Preserve the corrupt files for diagnosis and use the redacted diagnostics command before manual recovery.
To roll back, disable Ntfy Sync first and confirm its status is off. Disabling aborts streams and poll timers but does not delete notes or attachments already written. Only after ntfy input has stopped should another ingress be enabled for the corresponding route; never let two transports write the same queue unless the downstream workflow is independently idempotent.
.nvmrc and CI use Node 22).npm ci
npm run verify
The installable files are main.js, manifest.json, and styles.css. For the isolated test Vault:
npm run build
npm run install:test-vault
Set OBSIDIAN_NTFY_TEST_VAULT to an isolated Vault whose directory name contains test. install:test-vault rejects any other target. Manual production installation should happen only after the deployment checks below.
| Command | Coverage |
|---|---|
npm run verify |
Formatting, lint, type checking, unit/contract/integration tests, coverage, secret scanning, build, reproducibility, and release-package checks. |
npm run test:ui |
Installs the build into an isolated test Vault, exercises the rule editor, verifies persistence and reload, and restores the original settings. |
npm run test:acceptance |
Runs the UI gate plus stream and poll scenarios covering reconnects, attachments, duplicate prevention, result privacy, rollback, and cleanup. |
Acceptance reports are written under the ignored .artifacts/ directory.
data.json; local filesystem and Vault Sync permissions are the security boundary.Licensed under AGPL-3.0-only, Inspired by Obsidian Telegram Sync.