Documentation

Send rich messages: CLI, Markdown, tables and charts

Use Ntfyx CLI 0.5.0 independently for plain messages, Markdown and native blocks, with local validation, summaries, bounded formats, MCP and HTTPS.

Updated

Choose a message format

#

Keep ntfyx send for short notices. Use lightweight Markdown for reports, or combine callouts, metrics, tables, progress and line/bar charts when numeric comparison helps. CLI 0.5.0 works without MCP. Rendering requires iOS/Android 1.7.0, Chrome 0.3.0 or the updated Web Inbox; feature versions and public store availability are separate.

Check the download page first.

Plain notices, Markdown and literal logs

#

The ordinary send command remains valid. --format markdown explicitly selects formatting; --format text preserves literal stars, angle brackets and logs. --stdin reads text. HTML remains text, with no script execution or automatic remote webpage loading.

Terminal
ntfyx send "Build complete" --topic Work
ntfyx send --stdin --format markdown --title "Report" --topic Work < report.md
ntfyx send --stdin --format text --title "Log" --topic Work < output.txt

Save a rich-message JSON document

#

Save the following as report.json. The document contains only title, summary and content; title and summary are optional. If omitted, the CLI derives a summary of at most 240 Unicode code points locally, without a model call. Supply Topic, Session, priority and deduplication through command arguments.

JSON configuration
{
  "title": "Deployment report",
  "summary": "Deployment complete. All checks passed.",
  "content": {
    "version": 1,
    "format": "blocks",
    "blocks": [
      {
        "type": "callout",
        "tone": "success",
        "text": "Service is healthy."
      },
      {
        "type": "metrics",
        "items": [
          {
            "label": "Checks passed",
            "value": 24,
            "unit": "checks"
          }
        ]
      },
      {
        "type": "table",
        "columns": [
          "Service",
          "Latency ms"
        ],
        "rows": [
          [
            "API",
            182
          ],
          [
            "Worker",
            95
          ]
        ]
      },
      {
        "type": "progress",
        "label": "Checks",
        "value": 24,
        "max": 24
      },
      {
        "type": "chart",
        "kind": "line",
        "title": "Latency",
        "unit": "ms",
        "labels": [
          "09:00",
          "10:00",
          "11:00"
        ],
        "series": [
          {
            "name": "API",
            "values": [
              210,
              null,
              182
            ]
          }
        ]
      }
    ]
  }
}

Validate locally, then send

#

validate-message makes no network request, needs no pairing and creates no delivery attempt. Replace Work with your paired Topic. File and stdin inputs are equivalent. Retry with the same Session, deduplication key and complete content; use a new key for changed content. --json controls command output, not message format.

Terminal
ntfyx validate-message --message-file report.json --json
ntfyx send --message-file report.json --topic Work --session-id deploy-42 --session-name "Deployment" --dedupe-key deploy-42-report-1

# Equivalent stdin retry
ntfyx send --message-stdin --topic Work --session-id deploy-42 --session-name "Deployment" --dedupe-key deploy-42-report-1 < report.json

Let an agent discover the contract

#

An agent can inspect command schemas, limits and examples, then validate its generated file locally. With MCP, ntfyx_send accepts either body or content with optional summary; these inputs are mutually exclusive. ntfyx_validate_message applies the same local validation. No additional chart framework is needed.

Terminal
ntfyx capabilities --json
ntfyx help send --json
ntfyx help validate-message --json

Use the same document with HTTPS / Webhook

#

POST JSON to an existing phone-authorized send address and put the document in ntfyx.message. Do not mix it with top-level title, body, message, text or content text aliases. Ordinary provider JSON remains data. Hosted HTTPS processes plaintext before encrypting, while CLI/MCP encrypt on the sender.

JSON configuration
{
  "ntfyx": {
    "message": {
      "title": "Report",
      "summary": "Checks passed.",
      "content": {
        "version": 1,
        "format": "markdown",
        "text": "## Result\n- API healthy"
      }
    }
  },
  "idempotency_key": "checks-report-1"
}

Lightweight rendering and bounded formats

#

Local components draw the content without downloading webpages, chart scripts or remote images. Notifications and conversation lists use the summary; details, search and copy retain the full content. Tables initially show six rows and can expand. Chart data can expand too; null means missing, not zero.

Oversized input is rejected, never silently truncated.

ItemLimit
Whole message, including summary and Session16,384 UTF-8 bytes
Blocks20
Metrics per block8
Table30 rows × 6 columns
Charts2 charts, 3 series each, 300 values total including null

Questions, receipts and recovery

#

Rich messages present information; they do not authorize execution. Confirmation, choice and text questions continue through ntfyx ask and signed replies. Keep decision text in the question, not only in a notification summary. Accepted, received, read and answered remain different states. Retries preserve original signed content, and local restart retains the full message; uninstalling without keys does not guarantee history recovery.