Skip to content

Configuration

This page is the reference for secrets and the Web UI. Core concepts live in dedicated pages:

TopicPage
Routes, targets, fallback / stop, role pingsRoutes & Targets
Groups, roles, invites, self sign-up, log channelGroups & Access Control
Webhook providers, per-group ingress, customWebhook Ingress & Tenancy
KV / D1 key layoutStorage Layout
Filters (pattern syntax reference)Filter Types below / Filter Tutorial

Secrets

WebHooker requires several secrets to function. For local development, store them in .dev.vars. For production, use Cloudflare Worker Secrets.

Required Secrets

VariableDescription
GITHUB_WEBHOOK_SECRETWebhook secret from your GitHub App settings
GITEA_WEBHOOK_SECRETWebhook secret from your Gitea instance (only to receive Gitea webhooks)
GITHUB_CLIENT_IDOAuth client ID from App settings
GITHUB_CLIENT_SECRETOAuth client secret from App settings
DISCORD_TOKENDiscord bot token
TELEGRAM_TOKENTelegram bot token (from BotFather) — required for Telegram routes

NOTE

GITHUB_APP_ID and GITHUB_PRIVATE_KEY (PKCS#8 PEM) are used by the GitHub App install flow (/auth/github/install) to resolve the installing account's login via an App JWT. They are optional — when unset, the install page still works but shows an anonymous inst-{installationId} group without the account name. The OAuth flow itself only needs GITHUB_CLIENT_ID / GITHUB_CLIENT_SECRET.

Optional Secrets

VariableDescriptionDefault
DISCORD_PUBLIC_KEYDiscord application public key (Developer Portal) — required for interactionsUnset → interactions return 401
DISCORD_APPLICATION_IDDiscord application id; auto-resolved when omittedAuto-resolved
TELEGRAM_WEBHOOK_SECRETSecret token for POST /telegram/webhook verification (X-Telegram-Bot-Api-Secret-Token)Disabled (no verification)
TELEGRAM_RICH_HEADER_HOSTBase URL of an external rich-header service; when unset, the built-in GET /api/richheader serves the Telegram avatar cardBuilt-in /api/richheader
BASE_URLPublic URL for OAuth callbackshttp://localhost:8787
ADMIN_USER_IDSComma-separated GitHub user IDs (or logins) allowed to access the Web UIDisabled
ALLOW_SELF_SIGNUPWhen enabled (1/true), GitHub users without any group access get a personal group on first login instead of 403Disabled
AUDIT_RETENTION_DAYSAudit-log retention in days for the scheduled cleanup90
NUXT_PUBLIC_DOCS_URLDocs site URL used by the landing page (client-side runtime config)Landing page defaults
NUXT_PUBLIC_REPO_URLGitHub repo URL used by the landing pageLanding page defaults
NUXT_PUBLIC_LEGAL_CONTACTContact shown on /terms and /privacyUnset → placeholder text

Web UI

WebHooker ships with a built-in config console at /admin for managing routes, groups, members, invites, send logs, and the audit log in the browser. It is protected by GitHub OAuth plus an admin whitelist.

Setup

  1. Configure ADMIN_USER_IDS with the GitHub user IDs allowed to manage everything. Logins are also accepted, e.g. ADMIN_USER_IDS=12345,RhenCloud. If unset, the console is disabled (unless ALLOW_SELF_SIGNUP is enabled).
  2. Open /admin and sign in with GitHub.
  3. Users without any access get 403, except when ALLOW_SELF_SIGNUP=1 (they receive a personal group) or when they follow a group invite link.

The console is served as an SPA at /admin; its tabs are deep-linkable via the URL path (/admin/groups, /admin/logs, /admin/audit). URLs outside /admin that do not match an endpoint return a plain 404 instead of the console.

All management endpoints (/admin/api/*) are documented in the Admin API. Saved routes are written to KV config:routes immediately and the config cache is invalidated so the webhook pipeline picks them up on the next run.

Filter Types

See the Filter Tutorial for a hands-on guide with worked examples.

TypeMatchesExample
eventGitHub event namepush, pull_*, pull_request
repoRepository full nameorg/repo, org/*
actorSender loginusername, [bot], *[bot]
actionEvent actionopened, closed, published
branchBranch namemain, feature-?, /^release-/
keywordText in payload bodydeploy, /fix\s+\d+/

Filter Behavior

  • All filters in a route must match for the route to trigger (AND logic)
  • Set "exclude": true on any filter to invert it (NOT logic)
  • Every filter type supports the same pattern forms: plain text, */? globs (* = any run, ? = one character), and /regular expression/ — all case-insensitive
  • Field filters (event/repo/actor/action/branch) glob-match the whole value; keyword globs and regexes search anywhere in the payload; plain keyword text is a substring search
  • Patterns longer than 200 characters are not compiled as glob/regex; an invalid //-wrapped regex matches nothing
  • branch filter works for push, pull_request, pull_request_review, pull_request_review_comment, create/delete, workflow_run, workflow_job, check_suite, deployment, and code_scanning_alert events

Match Values

Filters accept either a single string or an array of strings:

json
{ "type": "event", "match": "push" }
{ "type": "event", "match": ["push", "pull_request"] }

Released under the MIT License.