[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M77Y20K3HSKC82N4VMM9T36T":3,"skill-same:01M77Y20K3HSKC82N4VMM9T36T":45},{"skillNo":4,"name":5,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":17,"publishedAt":18,"linkOnly":19,"markdownContent":20,"markdownBody":20,"frontMatter":21,"refName":22,"commitSha":23,"skillDirectory":24,"forksCount":25,"repositoryHtmlUrl":26,"repositoryHomepageUrl":27,"ownerHtmlUrl":28,"ownerBlogUrl":6,"ownerDescription":29,"updatedAt":30,"install":31,"resources":44},"01M77Y20K3HSKC82N4VMM9T36T","webhook-router",null,"Lord1Egypt\u002Fawesome-skill-forge","Lord1Egypt","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F99746359?v=4","01M7592YDNT0XK9WJ0T2MQVPDN","Mohamed Mounir Ali AL Keshita","01M75GRFNHC8VZNWEB8DKDE433",3,"MIT","https:\u002F\u002Fgithub.com\u002FLord1Egypt\u002Fawesome-skill-forge\u002Fblob\u002Fmaster\u002Fcommunity\u002Fclawhub\u002Fw\u002Fwebhook-router\u002FSKILL.md",[],[],"2026-11-15 14:19:17",false,"# Webhook Router for OpenClaw\n\nA general-purpose webhook receiver that routes incoming webhooks from any source to appropriate handlers. Integrates seamlessly with OpenClaw's hooks system and Tailscale Funnel for secure, public webhook endpoints.\n\n## Overview\n\nThis skill provides a complete webhook routing infrastructure:\n\n- **Secure endpoint** via Tailscale Funnel (HTTPS)\n- **Automatic routing** based on webhook source\n- **Built-in handlers** for GitHub, ClawHub, and generic sources\n- **Registration system** for adding new webhook sources\n- **Audit logging** of all received webhooks\n- **Smart alerting** on important events\n\n## How It Works\n\n### Architecture\n\n```\nExternal Service → Tailscale Funnel → OpenClaw \u002Fhooks → router.sh → Handler Script\n```\n\n1. External service sends webhook to your Tailscale Funnel URL\n2. OpenClaw's hooks system receives the webhook\n3. `router.sh` inspects the payload and routes to the appropriate handler\n4. Handler processes the event and triggers alerts\u002Factions as needed\n\n### Your Webhook Endpoint\n\n```\nhttps:\u002F\u002Fgregs-mac-mini.taila31444.ts.net\u002Fhooks\n```\n\n**Authentication:** Use OpenClaw's hook token in the `X-Hook-Token` header:\n```\nX-Hook-Token: 19e78f0288d476ee1197d4b374b6f73394abe121c12cc38a\n```\n\n## Quick Start\n\n### 1. Verify Tailscale Funnel is Running\n\n```bash\nopenclaw gateway status\n# Should show: Tailscale Funnel: ACTIVE\n```\n\nIf not active:\n```bash\nopenclaw gateway start\n```\n\n### 2. Test the Router Locally\n\n```bash\ncd \u002FUsers\u002Fgregborden\u002F.openclaw\u002Fworkspace\u002Fclawhub-skills\u002Fwebhook-router\n.\u002Ftest.sh\n```\n\n### 3. Register a New Webhook Source\n\n```bash\n.\u002Fregister.sh github my-repo\n# Output: https:\u002F\u002Fgregs-mac-mini.taila31444.ts.net\u002Fhooks?source=github-my-repo\n```\n\n### 4. Configure in Your Service\n\nUse the generated URL in your service's webhook settings with the hook token header.\n\n## Available Handlers\n\n### GitHub (`handlers\u002Fgithub.sh`)\n\nHandles GitHub webhook events:\n- **push** - Code pushed to repository\n- **pull_request** - PR opened, closed, merged, synchronized\n- **issues** - Issue opened, closed, assigned, labeled\n- **release** - Release published\n\n**Alert triggers:**\n- PR merged → Notification\n- Issue assigned to you → Notification  \n- New release → Notification\n\n**Configuration:**\n```bash\n# Set your GitHub username for personalized alerts\nexport GITHUB_USERNAME=\"your-username\"\n```\n\n### Generic (`handlers\u002Fgeneric.sh`)\n\nFallback handler for unknown webhook sources:\n- Logs full payload\n- Attempts to extract event type and meaningful fields\n- Creates alert for manual review\n\n### ClawHub (`handlers\u002Fclawhub.sh`)\n\nHandles ClawHub-specific webhooks (auto-created by `register.sh`):\n- New skill published\n- Skill updated\n- User mentions\n\n## Registration System\n\n### Register a New Source\n\n```bash\n.\u002Fregister.sh \u003Csource-type> \u003Cname>\n```\n\n**Examples:**\n\n```bash\n# GitHub repository\n.\u002Fregister.sh github my-awesome-app\n\n# Stripe payments\n.\u002Fregister.sh stripe payments\n\n# Custom service\n.\u002Fregister.sh custom my-service\n```\n\nThis will:\n1. Generate a unique source identifier\n2. Create a handler template (if new source type)\n3. Output the webhook URL to configure\n\n### Webhook URL Format\n\n```\nhttps:\u002F\u002Fgregs-mac-mini.taila31444.ts.net\u002Fhooks?source=\u003Csource-id>\n```\n\nOr with header:\n```\nX-Webhook-Source: \u003Csource-id>\n```\n\n## Advanced Configuration\n\n### Custom Handler Development\n\nCreate a new handler in `handlers\u002F\u003Ctype>.sh`:\n\n```bash\n#!\u002Fbin\u002Fbash\n# handlers\u002Fmyapp.sh\n\nPAYLOAD=\"$1\"\nSOURCE=\"$2\"\nEVENT_TYPE=\"$3\"\n\n# Extract fields using jq\nfield=$(echo \"$PAYLOAD\" | jq -r '.field \u002F\u002F \"unknown\"')\n\n# Log to vault\nvault write \"webhooks\u002F$SOURCE\u002F$EVENT_TYPE\" \\\n  --data \"$PAYLOAD\" \\\n  --tags \"webhook,$SOURCE,$EVENT_TYPE\"\n\n# Alert on important events\nif [[ \"$EVENT_TYPE\" == \"critical\" ]]; then\n  alert \"🚨 Critical event from $SOURCE\" \"$field\"\nfi\n```\n\nMake it executable:\n```bash\nchmod +x handlers\u002Fmyapp.sh\n```\n\n### Environment Variables\n\n```bash\n# GitHub username for personalized alerts\nexport GITHUB_USERNAME=\"your-github-username\"\n\n# Alert channel (default: main)\nexport WEBHOOK_ALERT_CHANNEL=\"telegram\"\n\n# Log file path (default: \u002FUsers\u002Fgregborden\u002F.openclaw\u002Fworkspace\u002Fmemory\u002Fwebhooks.jsonl)\nexport WEBHOOK_LOG_PATH=\"\u002Fcustom\u002Fpath\u002Fwebhooks.jsonl\"\n```\n\n### Log Format\n\nAll webhooks are logged to `\u002FUsers\u002Fgregborden\u002F.openclaw\u002Fworkspace\u002Fmemory\u002Fwebhooks.jsonl`:\n\n```json\n{\n  \"timestamp\": \"2026-02-07T20:30:00Z\",\n  \"source\": \"github-myrepo\",\n  \"event_type\": \"push\",\n  \"repository\": \"owner\u002Frepo\",\n  \"sender\": \"username\",\n  \"payload_hash\": \"sha256:abc123...\",\n  \"processed\": true\n}\n```\n\n## Service-Specific Setup\n\n### GitHub\n\n1. Go to repository → Settings → Webhooks → Add webhook\n2. **Payload URL:** `https:\u002F\u002Fgregs-mac-mini.taila31444.ts.net\u002Fhooks?source=github-\u003Crepo>`\n3. **Content type:** `application\u002Fjson`\n4. **Secret:** (leave blank, token is in header)\n5. **Events:** Select events or \"Let me select individual events\"\n6. Add header: `X-Hook-Token: 19e78f0288d476ee1197d4b374b6f73394abe121c12cc38a`\n\n### Stripe\n\n1. Dashboard → Developers → Webhooks → Add endpoint\n2. **Endpoint URL:** `https:\u002F\u002Fgregs-mac-mini.taila31444.ts.net\u002Fhooks?source=stripe-payments`\n3. Select events to listen for\n4. Add header: `X-Hook-Token: 19e78f0288d476ee1197d4b374b6f73394abe121c12cc38a`\n\n### ClawHub\n\nUse the built-in hooks integration or register:\n```bash\n.\u002Fregister.sh clawhub skills\n```\n\n### Custom Services\n\nAny service that supports webhooks:\n1. Run `.\u002Fregister.sh \u003Ctype> \u003Cname>`\n2. Copy the generated URL\n3. Configure in your service with the `X-Hook-Token` header\n\n## Testing\n\n### Local Test\n\n```bash\n.\u002Ftest.sh\n```\n\nSends mock webhooks to test the routing system.\n\n### Manual Test with curl\n\n```bash\n# GitHub push event\ncurl -X POST \"https:\u002F\u002Fgregs-mac-mini.taila31444.ts.net\u002Fhooks?source=github-test\" \\\n  -H \"X-Hook-Token: 19e78f0288d476ee1197d4b374b6f73394abe121c12cc38a\" \\\n  -H \"X-GitHub-Event: push\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"ref\": \"refs\u002Fheads\u002Fmain\",\n    \"repository\": {\"full_name\": \"test\u002Frepo\"},\n    \"pusher\": {\"name\": \"testuser\"},\n    \"commits\": [{\"message\": \"Test commit\"}]\n  }'\n```\n\n## Troubleshooting\n\n### Check Recent Webhooks\n\n```bash\n# View last 10 webhooks\ntail -10 \u002FUsers\u002Fgregborden\u002F.openclaw\u002Fworkspace\u002Fmemory\u002Fwebhooks.jsonl | jq .\n```\n\n### Verify Handler Exists\n\n```bash\nls -la handlers\u002F\n```\n\n### Test Router Directly\n\n```bash\necho '{\"test\": \"data\"}' | .\u002Frouter.sh --source test --event push\n```\n\n### Check OpenClaw Hooks Status\n\n```bash\nopenclaw gateway status\n```\n\n### Logs\n\n- Webhook audit log: `\u002FUsers\u002Fgregborden\u002F.openclaw\u002Fworkspace\u002Fmemory\u002Fwebhooks.jsonl`\n- Handler logs: Check your vault or notification channel\n\n## Security Notes\n\n- The hook token authenticates requests to OpenClaw\n- Tailscale Funnel provides HTTPS encryption\n- Webhook payloads are logged (hashed) but consider sanitizing sensitive data\n- Each source can have its own validation in its handler\n\n## Files\n\n- `router.sh` - Main routing logic\n- `register.sh` - Source registration\n- `handlers\u002Fgithub.sh` - GitHub webhook handler\n- `handlers\u002Fgeneric.sh` - Generic fallback handler\n- `test.sh` - Test suite\n- `SKILL.md` - This documentation\n\n## License\n\nMIT - See ClawHub repository for details.\n",{},"master","4aa004da461d820f4ea5499e58eb8d196cf99016","community\u002Fclawhub\u002Fw\u002Fwebhook-router",0,"https:\u002F\u002Fgithub.com\u002FLord1Egypt\u002Fawesome-skill-forge","https:\u002F\u002Fskill-explorer-rho.vercel.app","https:\u002F\u002Fgithub.com\u002FLord1Egypt","Unbreakable. Unstoppable. Unmatched⚡.\r\n Speaker of machine tongues 🤖  | World-builder of decentralized dreams 🌐 | Defender of the digital realm🛡️.","2026-06-10 08:21:01",{"source":7,"skillName":5,"commands":32,"prompt":42,"zipAvailable":43},[33,36,39],{"tool":34,"command":35},"npx","npx skills add Lord1Egypt\u002Fawesome-skill-forge --skill webhook-router",{"tool":37,"command":38},"bunx","bunx skills add Lord1Egypt\u002Fawesome-skill-forge --skill webhook-router",{"tool":40,"command":41},"pnpm","pnpm dlx skills add Lord1Egypt\u002Fawesome-skill-forge --skill webhook-router","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FLord1Egypt\u002Fawesome-skill-forge\u002Fblob\u002Fmaster\u002Fcommunity\u002Fclawhub\u002Fw\u002Fwebhook-router\u002FSKILL.md",true,[],[46,53,60,67,74,81],{"skillNo":47,"name":48,"nameZh":6,"description":49,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":50,"categories":51,"keywords":52,"publishedAt":18},"01M785WKJB99G3STR1NF9NRTJW","youtube-content","YouTube transcripts to summaries, threads, blogs.","https:\u002F\u002Fgithub.com\u002FLord1Egypt\u002Fawesome-skill-forge\u002Fblob\u002Fmaster\u002Fskills\u002Fyoutube-content\u002FSKILL.md",[],[],{"skillNo":54,"name":55,"nameZh":6,"description":56,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":57,"categories":58,"keywords":59,"publishedAt":18},"01M785WEFHB0G2S9YA6EPR3H0E","xurl","X\u002FTwitter via xurl CLI: post, search, DM, media, v2 API.","https:\u002F\u002Fgithub.com\u002FLord1Egypt\u002Fawesome-skill-forge\u002Fblob\u002Fmaster\u002Fskills\u002Fxurl\u002FSKILL.md",[],[],{"skillNo":61,"name":62,"nameZh":6,"description":63,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":64,"categories":65,"keywords":66,"publishedAt":18},"01M785W98EDN4EFJXJPMQEHCRC","touchdesigner-mcp","Control a running TouchDesigner instance via twozero MCP — create operators, set parameters, wire connections, execute Python, build real-time visuals. 36 native tools.","https:\u002F\u002Fgithub.com\u002FLord1Egypt\u002Fawesome-skill-forge\u002Fblob\u002Fmaster\u002Fskills\u002Ftouchdesigner-mcp\u002FSKILL.md",[],[],{"skillNo":68,"name":69,"nameZh":6,"description":70,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":71,"categories":72,"keywords":73,"publishedAt":18},"01M785W5S9FP3QBH2V191E025P","test-driven-development","TDD: enforce RED-GREEN-REFACTOR, tests before code.","https:\u002F\u002Fgithub.com\u002FLord1Egypt\u002Fawesome-skill-forge\u002Fblob\u002Fmaster\u002Fskills\u002Ftest-driven-development\u002FSKILL.md",[],[],{"skillNo":75,"name":76,"nameZh":6,"description":77,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":78,"categories":79,"keywords":80,"publishedAt":18},"01M785W2AS08NSSH9YATCV6FJB","teams-meeting-pipeline","Operate the Teams meeting summary pipeline via Hermes CLI — summarize meetings, inspect pipeline status, replay jobs, manage Microsoft Graph subscriptions.","https:\u002F\u002Fgithub.com\u002FLord1Egypt\u002Fawesome-skill-forge\u002Fblob\u002Fmaster\u002Fskills\u002Fteams-meeting-pipeline\u002FSKILL.md",[],[],{"skillNo":82,"name":83,"nameZh":6,"description":84,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":85,"categories":86,"keywords":87,"publishedAt":18},"01M785VXKW4T34BTP1SCHW1R7F","systematic-debugging","4-phase root cause debugging: understand bugs before fixing.","https:\u002F\u002Fgithub.com\u002FLord1Egypt\u002Fawesome-skill-forge\u002Fblob\u002Fmaster\u002Fskills\u002Fsystematic-debugging\u002FSKILL.md",[],[]]