Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Create and manage webhook subscriptions for event-driven agent activation. Use when the user wants external services to trigger agent runs automatically.
.claude/skills/graniet-webhook-subscriptions/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-19 | ✗→✓ | ▲ Improved | 288% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 47% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 30% | 0% |
| case-09 | ✗→✓ | ▲ Improved | 50% | 0% |
| case-10 | ✗→✓ | ▲ Improved | -25% | 0% |
This skill is repo-local and stays inactive until explicitly activated.
When the original instructions refer to legacy tool names, use these Kheish mappings:
terminal => bashweb_extract => web_fetch, plus web_search when discovery is neededsearch_files => grep_search and glob_searchbrowser_* tools require a browser-capable surfaced tool or MCP; if none is available, use the closest available surface and say so explicitlyWhen the instructions mention local helper files, resolve them from ${KHEISH_SKILL_DIR}.
Kheish does not currently ship a dedicated webhook subscription CLI. In the examples below, webhook-manager and gateway-manager are placeholders for your deployment tooling around daemon connector config, ingress routing, and lifecycle management.
Create dynamic webhook subscriptions so external services (GitHub, GitLab, Stripe, CI/CD, IoT sensors, monitoring tools) can trigger Kheish agent runs by POSTing events to a URL.
The webhook platform must be enabled before subscriptions can be created. Check with:
bashwebhook-manager list
If it says "Webhook platform is not enabled", set it up:
bashgateway-manager setup
Follow the prompts to enable webhooks, set the port, and set a global HMAC secret.
Add to ~/.kheish/config.yaml:
yamlplatforms: webhook: enabled: true extra: host: "0.0.0.0" port: 8644 secret: "generate-a-strong-secret-here"
Add to ~/.kheish/.env:
bashWEBHOOK_ENABLED=true WEBHOOK_PORT=8644 WEBHOOK_SECRET=generate-a-strong-secret-here
After configuration, start (or restart) the gateway:
bashgateway-manager run # Or if using systemd: systemctl --user restart kheish-daemon
Verify it's running:
bashcurl http://localhost:8644/health
All management is via the webhook-manager CLI command:
bashwebhook-manager subscribe <name> \ --prompt "Prompt template with {payload.fields}" \ --events "event1,event2" \ --description "What this does" \ --skills "skill1,skill2" \ --deliver telegram \ --deliver-chat-id "12345" \ --secret "optional-custom-secret"
Returns the webhook URL and HMAC secret. The user configures their service to POST to that URL.
bashwebhook-manager list
bashwebhook-manager remove <name>
bashwebhook-manager test <name> webhook-manager test <name> --payload '{"key": "value"}'
Prompts support {dot.notation} for accessing nested payload fields:
{issue.title} — GitHub issue title{pull_request.user.login} — PR author{data.object.amount} — Stripe payment amount{sensor.temperature} — IoT sensor readingIf no prompt is specified, the full JSON payload is dumped into the agent prompt.
bashwebhook-manager subscribe github-issues \ --events "issues" \ --prompt "New GitHub issue #{issue.number}: {issue.title}\n\nAction: {action}\nAuthor: {issue.user.login}\nBody:\n{issue.body}\n\nPlease triage this issue." \ --deliver telegram \ --deliver-chat-id "-100123456789"
Then in GitHub repo Settings → Webhooks → Add webhook:
bashwebhook-manager subscribe github-prs \ --events "pull_request" \ --prompt "PR #{pull_request.number} {action}: {pull_request.title}\nBy: {pull_request.user.login}\nBranch: {pull_request.head.ref}\n\n{pull_request.body}" \ --skills "github-code-review" \ --deliver github_comment
bashwebhook-manager subscribe stripe-payments \ --events "payment_intent.succeeded,payment_intent.payment_failed" \ --prompt "Payment {data.object.status}: {data.object.amount} cents from {data.object.receipt_email}" \ --deliver telegram \ --deliver-chat-id "-100123456789"
bashwebhook-manager subscribe ci-builds \ --events "pipeline" \ --prompt "Build {object_attributes.status} on {project.name} branch {object_attributes.ref}\nCommit: {commit.message}" \ --deliver discord \ --deliver-chat-id "1234567890"
bashwebhook-manager subscribe alerts \ --prompt "Alert: {alert.name}\nSeverity: {alert.severity}\nMessage: {alert.message}\n\nPlease investigate and suggest remediation." \ --deliver origin
--secret)~/.kheish/webhook_subscriptions.jsonwebhook-manager subscribe writes to ~/.kheish/webhook_subscriptions.jsonIf webhooks aren't working:
systemctl --user status kheish-daemon or ps aux | grep gatewaycurl http://localhost:8644/health should return {"status": "ok"}grep webhook ~/.kheish/logs/gateway.log | tail -20webhook-manager list. GitHub sends X-Hub-Signature-256, GitLab sends X-Gitlab-Token.--events filter matches what the service sends. Use webhook-manager test <name> to verify the route works.| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-19 | fail→pass | 3,044 | 1,693 | -44% | 1 | 1 | 0% | 496 | 1,926 | +288% | 0 | 0 | — |
case-01 | fail→fail | 8,640 | 8,376 | -3% | 1 | 1 | 0% | 1,553 | 2,058 | +33% | 0 | 0 | — |
case-02 | fail→fail | 8,084 | 6,131 | -24% | 1 | 1 | 0% | 1,362 | 1,987 | +46% | 0 | 0 | — |
case-03 | fail→fail | 16,815 | 5,528 | -67% | 1 | 1 | 0% | 2,987 | 1,971 | -34% | 0 | 0 | — |
case-04 | pass→pass | 8,029 | 6,055 | -25% | 1 | 1 | 0% | 1,545 | 2,978 | +93% | 0 | 0 | — |
case-05 | pass→pass | 10,396 | 7,910 | -24% | 1 | 1 | 0% | 2,094 | 3,327 | +59% | 0 | 0 | — |
case-06 | pass→pass | 8,909 | 6,543 | -27% | 1 | 1 | 0% | 1,637 | 2,975 | +82% | 0 | 0 | — |
case-07 | fail→pass | 8,278 | 2,795 | -66% | 1 | 1 | 0% | 1,525 | 2,239 | +47% | 0 | 0 | — |
case-08 | fail→pass | 7,742 | 2,125 | -73% | 1 | 1 | 0% | 1,658 | 2,149 | +30% | 0 | 0 | — |
case-09 | fail→pass | 6,997 | 1,346 | -81% | 1 | 1 | 0% | 1,289 | 1,933 | +50% | 0 | 0 | — |
case-10 | fail→pass | 15,946 | 2,726 | -83% | 1 | 1 | 0% | 2,984 | 2,228 | -25% | 0 | 0 | — |
case-11 | fail→pass | 19,998 | 2,869 | -86% | 1 | 1 | 0% | 3,547 | 2,315 | -35% | 0 | 0 | — |
case-12 | fail→pass | 8,219 | 2,965 | -64% | 1 | 1 | 0% | 1,359 | 2,247 | +65% | 0 | 0 | — |
case-13 | pass→pass | 7,692 | 2,996 | -61% | 1 | 1 | 0% | 1,423 | 2,298 | +61% | 0 | 0 | — |
case-14 | fail→pass | 14,893 | 2,290 | -85% | 1 | 1 | 0% | 2,353 | 2,111 | -10% | 0 | 0 | — |
case-15 | fail→pass | 7,671 | 1,396 | -82% | 1 | 1 | 0% | 1,442 | 1,924 | +33% | 0 | 0 | — |
case-16 | fail→pass | 13,368 | 1,360 | -90% | 1 | 1 | 0% | 2,289 | 1,953 | -15% | 0 | 0 | — |
case-17 | pass→pass | 10,226 | 1,712 | -83% | 1 | 1 | 0% | 1,833 | 2,007 | +9% | 0 | 0 | — |
case-18 | fail→pass | 10,125 | 1,574 | -84% | 1 | 1 | 0% | 1,759 | 1,905 | +8% | 0 | 0 | — |
case-20 | fail→pass | 13,119 | 2,950 | -78% | 1 | 1 | 0% | 2,382 | 2,200 | -8% | 0 | 0 | — |
case-21 | fail→pass | 6,983 | 3,227 | -54% | 1 | 1 | 0% | 1,178 | 2,316 | +97% | 0 | 0 | — |
case-22 | fail→fail | 9,499 | 1,752 | -82% | 1 | 1 | 0% | 1,636 | 1,981 | +21% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted, and 19 counted toward the lift figure. The other 3 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +59 percentage points is the difference between those two pass rates over the 19 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.