skills$openclaw/ngrok-unofficial-webhook-skill
tanchunsiong259

by tanchunsiong

ngrok-unofficial-webhook-skill – OpenClaw Skill

ngrok-unofficial-webhook-skill is an OpenClaw Skills integration for coding workflows. Start an ngrok tunnel to receive incoming webhooks and process them via the LLM. Use when the user asks to listen for webhooks, set up a webhook endpoint, start ngrok, or when another skill (like Zoom RTMS Meeting Assistant) needs a public webhook URL. Receives webhook payloads and lets the LLM decide how to handle them.

259 stars8.1k forksSecurity L1
Updated Feb 7, 2026Created Feb 7, 2026coding

Skill Snapshot

namengrok-unofficial-webhook-skill
descriptionStart an ngrok tunnel to receive incoming webhooks and process them via the LLM. Use when the user asks to listen for webhooks, set up a webhook endpoint, start ngrok, or when another skill (like Zoom RTMS Meeting Assistant) needs a public webhook URL. Receives webhook payloads and lets the LLM decide how to handle them. OpenClaw Skills integration.
ownertanchunsiong
repositorytanchunsiong/ngrok-unofficial-webhook-skill
languageMarkdown
licenseMIT
topics
securityL1
installopenclaw add @tanchunsiong/ngrok-unofficial-webhook-skill
last updatedFeb 7, 2026

Maintainer

tanchunsiong

tanchunsiong

Maintains ngrok-unofficial-webhook-skill in the OpenClaw Skills directory.

View GitHub profile
File Explorer
8 files
.
scripts
webhook-server.js
9.7 KB
_meta.json
848 B
package-lock.json
36.3 KB
package.json
194 B
README.md
4.1 KB
skill.json
839 B
SKILL.md
3.8 KB
SKILL.md

name: ngrok-unofficial-webhook-skill description: Start an ngrok tunnel to receive incoming webhooks and process them via the LLM. Use when the user asks to listen for webhooks, set up a webhook endpoint, start ngrok, or when another skill (like Zoom RTMS Meeting Assistant) needs a public webhook URL. Receives webhook payloads and lets the LLM decide how to handle them.

Ngrok Webhook Listener

Start a public webhook endpoint via ngrok. Incoming webhooks are auto-routed to matching skills or presented to the user for manual handling.

Prerequisites

cd skills/ngrok-unofficial-webhook-skill
npm install

Environment Variables

Set in the skill's .env file (copy from .env.example).

Required:

Optional:

  • NGROK_DOMAIN — stable ngrok domain for consistent URLs
  • WEBHOOK_PORT — local port (default: 4040)
  • WEBHOOK_PATH — webhook path (default: /webhook)
  • OPENCLAW_BIN — path to openclaw binary (default: openclaw)
  • OPENCLAW_NOTIFY_CHANNEL — notification channel (default: whatsapp)
  • OPENCLAW_NOTIFY_TARGET — phone number / target for notifications

Usage

Start the webhook listener

Run as a background process:

cd skills/ngrok-unofficial-webhook-skill
node scripts/webhook-server.js

The server prints its public URL to stderr:

NGROK_URL=https://xxxx.ngrok-free.app
Webhook endpoint: https://xxxx.ngrok-free.app/webhook

For long-running use, launch with nohup:

nohup node scripts/webhook-server.js >> /tmp/ngrok-webhook.log 2>&1 &

What happens when a webhook arrives

  1. The server immediately responds 200 OK to the sender
  2. It discovers installed skills that declare webhookEvents in their skill.json
  3. Auto-routing (no user intervention needed):
    • If a matching skill has forwardPort → HTTP POST to the local service
    • If a matching skill has webhookCommands → runs the configured shell command
  4. Manual routing (user decides):
    • If no auto-route is available, sends a WhatsApp notification with the payload and a numbered list of matching skills
    • User replies with their choice

Skill discovery

Skills opt into webhook handling by adding webhookEvents to their skill.json:

{
  "openclaw": {
    "webhookEvents": ["meeting.rtms_started", "meeting.rtms_stopped"],
    "forwardPort": 4048,
    "forwardPath": "/"
  }
}

For command-based auto-handling (no running service required):

{
  "openclaw": {
    "webhookEvents": ["recording.completed"],
    "webhookCommands": {
      "recording.completed": {
        "command": "python3 scripts/download.py {{meeting_id}}",
        "description": "Download cloud recording",
        "meetingIdPath": "payload.object.id"
      }
    }
  }
}
  • command — shell command to run; {{meeting_id}} is replaced with the extracted value
  • meetingIdPath — dot-separated path to extract the meeting ID from the webhook payload
  • description — human-readable description for notifications

The ngrok skill scans all sibling skill folders for skill.json files with these fields.

Stdout output

The server also writes each webhook as a JSON line to stdout for process polling:

{
  "id": "uuid",
  "timestamp": "ISO-8601",
  "method": "POST",
  "path": "/webhook",
  "query": {},
  "body": {}
}

Health check

curl http://localhost:4040/health

Stop the listener

Kill the background process when done.

Integration with Zoom

Typical flow:

  1. Start this webhook listener → get ngrok URL
  2. Configure the ngrok URL in your Zoom Marketplace app's webhook settings
  3. When RTMS starts, Zoom sends meeting.rtms_started → auto-forwarded to the RTMS Meeting Assistant
  4. When RTMS stops, Zoom sends meeting.rtms_stopped → auto-forwarded, triggers cleanup
README.md

Ngrok Unofficial Webhook Skill

Start a public webhook endpoint via ngrok to receive incoming webhooks from any service. Auto-discovers installed skills that can handle specific webhook events and routes them accordingly.

Unofficial — This skill is not affiliated with or endorsed by ngrok.

Requires OpenClaw — This skill uses the OpenClaw CLI for notifications.

Features

  • Public webhook URL — Instant ngrok tunnel with optional static domain
  • Skill auto-discovery — Scans sibling skill folders for skill.json with webhookEvents
  • Auto-forwarding — Routes matching events to skills with forwardPort (e.g. RTMS service)
  • Auto-execution — Runs shell commands for matching events via webhookCommands config
  • User notifications — Sends WhatsApp/Telegram notifications with event details and skill options
  • Health check — Built-in /health endpoint

Quick Start

1. Install dependencies

cd skills/ngrok-unofficial-webhook-skill
npm install

2. Configure

Copy .env.example to .env and fill in:

NGROK_AUTHTOKEN=your_ngrok_auth_token
NGROK_DOMAIN=your-static-domain.ngrok-free.app
OPENCLAW_NOTIFY_TARGET=+1234567890

Get your auth token from https://dashboard.ngrok.com

3. Start

node scripts/webhook-server.js

The server prints its public URL:

NGROK_URL=https://your-domain.ngrok-free.app
Webhook endpoint: https://your-domain.ngrok-free.app/webhook

How It Works

Webhook arrives → Auto-routing

  1. Server responds 200 OK immediately
  2. Discovers installed skills that declare webhookEvents in their skill.json
  3. Routes the event:
    • forwardPort — HTTP POST to a local service (e.g. RTMS assistant on port 4048)
    • webhookCommands — Runs a shell command with the meeting ID extracted from the payload
    • Neither — Notifies user with payload and skill options to choose from

Skill Discovery

Skills opt into webhook handling by declaring events in their skill.json:

{
  "openclaw": {
    "webhookEvents": ["meeting.rtms_started", "meeting.rtms_stopped"],
    "forwardPort": 4048,
    "forwardPath": "/"
  }
}

For command-based handling (no running service needed):

{
  "openclaw": {
    "webhookEvents": ["recording.completed"],
    "webhookCommands": {
      "recording.completed": {
        "command": "python3 scripts/download.py {{meeting_id}}",
        "description": "Download cloud recording",
        "meetingIdPath": "payload.object.id"
      }
    }
  }
}

Environment Variables

VariableRequiredDefaultDescription
NGROK_AUTHTOKENngrok auth token
NGROK_DOMAINrandomStatic ngrok domain for consistent URLs
WEBHOOK_PORT4040Local server port
WEBHOOK_PATH/webhookWebhook endpoint path
OPENCLAW_BINopenclawPath to OpenClaw binary
OPENCLAW_NOTIFY_CHANNELwhatsappNotification channel
OPENCLAW_NOTIFY_TARGETPhone number / target for notifications

API Endpoints

# Health check
curl http://localhost:4040/health

# Webhooks are received at
POST http://localhost:4040/webhook

Integration with Zoom

Typical flow with Zoom RTMS:

  1. Start this webhook listener → get ngrok URL
  2. Set the ngrok URL as your Zoom Marketplace app's webhook endpoint
  3. Zoom sends meeting.rtms_started → auto-forwarded to RTMS Meeting Assistant
  4. Zoom sends meeting.rtms_stopped → auto-forwarded, triggers cleanup

Bug Reports & Contributing

Found a bug? Please raise an issue at: 👉 https://github.com/tanchunsiong/ngrok-unofficial-webhook-skill/issues

Pull requests are also welcome!

License

MIT

Permissions & Security

Security level L1: Low-risk skills with minimal permissions. Review inputs and outputs before running in production.

Requirements

```bash cd skills/ngrok-unofficial-webhook-skill npm install ```

FAQ

How do I install ngrok-unofficial-webhook-skill?

Run openclaw add @tanchunsiong/ngrok-unofficial-webhook-skill in your terminal. This installs ngrok-unofficial-webhook-skill into your OpenClaw Skills catalog.

Does this skill run locally or in the cloud?

OpenClaw Skills execute locally by default. Review the SKILL.md and permissions before running any skill.

Where can I verify the source code?

The source repository is available at https://github.com/openclaw/skills/tree/main/skills/tanchunsiong/ngrok-unofficial-webhook-skill. Review commits and README documentation before installing.