•The visual-style split now reports its arm under the variant keys PostHog expects, so the experiment results line up
Web Appv0.31.0
A Clean Visual Style
•A second visual style: switch between the bold classic look and a clean one with thin borders, rounded corners, soft shadows, and sentence-case labels
•The style switch sits next to the light and dark mode switch in the header, works with both modes, and is remembered in your browser
Web Appv0.30.1
Dependency Security Updates
•Nodemailer moved to 10.x, closing the address-parser denial of service, the recipient-domain validation bypasses, and the file-access bypass reported against earlier releases
•Transitive dependency floors raised for hono (4.13.5), js-yaml (3.15.2 and 4.3.2), and @ai-sdk/provider-utils (4.0.33) to pick up their security fixes
•Routine dependency bumps: Next, jose, Supabase SSR, zod, lucide-react, posthog-js, resend, simple-icons, vitest 5, swagger-parser 13, Playwright, tsx, postcss, plus tower-http, constant_time_eq, and open on the Rust side
Web Appv0.30.0
Search Finds Requests on Shared Endpoints
•Searching and counting requests now covers endpoints shared with you through a subscribed team, in the dashboard and through the API, instead of only endpoints you own (migration 00039)
•Requests on shared endpoints follow the endpoint owner's retention, not the searcher's plan, matching what the request list already shows team members
•Endpoints shared with you now also carry `fromTeams`, every one of your subscribed teams the endpoint is shared with, alongside the existing `fromTeam` (the oldest share)
•Teams docs gained a section on working with shared endpoints from the CLI, SDK, and MCP server; the OpenAPI description of endpoint listing no longer says shared endpoints need a Pro plan
CLIv1.3.0
Teams from the Terminal
•New `whk teams` commands: `list` shows your teams with seats, pooled usage, and status; `members <team>` lists members and pending invites; `share <slug> --team <team>` and `unshare` manage sharing; `invite <team> <email>`, `invites`, `accept`, and `decline` handle invites. Teams are addressed by id or by name
•`whk list --team <team>` keeps only the endpoints tied to one team, whether shared with you from it or yours shared with it; the team is resolved the same way as in `whk teams`, so an unknown or ambiguous name is an error
•`whk teams invite` reports when the invite was created but its email could not be sent, instead of claiming the invitee was notified
•`whk usage` prints the pooled quota of every subscribed team you belong to under your personal plan, and `--json` adds a `teams` array (plus `teamsError` if the pools could not be loaded)
•`whk requests search` and `count` now find requests on endpoints shared with you (server-side change in web 0.30.0)
•Fixed `whk requests search`, which failed to parse the search response since the API started returning a plain array; each hit now shows its endpoint slug
SDKv1.10.0
Teams Namespace
•New `client.teams` namespace: `list()` returns your teams with seats and pooled `requestsUsed`/`requestLimit`; `members(teamId)`, `share(teamId, slug)`, `unshare(teamId, slug)`, `invite(teamId, email)`, and `invites.list/accept/decline` mirror the team routes. Share and unshare take a slug and resolve the endpoint id for you
•`endpoints.list({ team })` keeps only endpoints tied to a team id or unique name (resolved through `teams.list()`, so an unknown or ambiguous name throws), matched against `fromTeams`, `fromTeam`, and `sharedWith`; `Endpoint.fromTeams` is new and lists every one of your teams a shared endpoint belongs to
•New `Team`, `TeamMember`, `TeamInvite`, `TeamMembers`, and `ListEndpointsOptions` types; `TeamInvite.warning` is set when the invite was created but its email could not be sent; `describe()` documents the teams operations
•`requests.search` and `requests.count` now return requests on endpoints shared with you (server-side change in web 0.30.0)
MCPv1.8.0
Team Tools
•Four new tools: `list_teams` (seats, pooled usage, status), `list_team_members`, `share_endpoint`, and `unshare_endpoint`, bringing the tool count to 35. Invites stay out of MCP because accepting one claims a paid seat
•`list_endpoints` accepts an optional `team` (id or name) to keep only that team's endpoints
•`get_usage` adds a `teams` array with the pooled quota of every subscribed team you belong to; if the team list cannot be loaded the personal usage is still returned with a `teamsError`
•`search_requests` and `count_requests` now find requests on endpoints shared with you (server-side change in web 0.30.0)
Web Appv0.29.2
Webhook Total No Longer Drops on Deletion
•The webhooks-processed total on the landing page kept the counts of endpoints removed by the guest cleanup but lost them when you deleted an endpoint or your account; counts from every deleted endpoint are now preserved (migration 00038)
Web Appv0.29.1
Security and Reliability Fixes from the Architecture Review
•Database privileges hardened: signed-in users can no longer update their own plan or limits through the database API, and every stored procedure is callable by the server only (migration 00037)
•Team members now receive live dashboard updates for endpoints shared with their team instead of having to refresh
•Guest endpoint reads no longer expose ephemeral endpoints that belong to a signed-in user
•Deleting an account now cancels the Pro subscription and the subscriptions of teams you own first, and refuses to delete if that fails, instead of leaving them billing
•Endpoint lookups by slug use a proper index again (the hottest query in the receiver)
•Webhooks whose body, path or query contain a NUL byte are stored (raw bytes preserved) instead of being silently dropped with a 200
•The receiver answers 503 with Retry-After on transient database failures so senders retry, and reports capture outcomes as metrics
•Rate limits are keyed on the Cloudflare client IP, so a forged X-Forwarded-For no longer bypasses them
•The landing page syncs guest endpoints by polling instead of holding a Realtime channel that could never deliver
CLIv1.2.0
Tunnels That Stay Up
•`whk tunnel` and `whk listen` reconnect automatically: the server rotates stream connections every 30 minutes, and the CLI now resumes from the last request it saw instead of stopping silently
•Network errors and stream drops retry with backoff and are reported; authentication and not-found errors exit non-zero with a message instead of exiting 0
•A stream that goes quiet for 90 seconds (no keepalive) is treated as dead and reconnected
•`whk tunnel` keeps the endpoint it created unless you pass `--ephemeral`, and prints how to reuse or delete it on exit
SDKv1.9.1
Streams Survive the 30-Minute Rotation
•`requests.subscribe(slug, { reconnect: true })` now reconnects transparently when the server rotates the connection (every 30 minutes) and resumes from the last request it saw; previously the iterator ended silently
•New `idleTimeout` option (default 90s): a stream with no keepalive for that long is reconnected (or ends with a TimeoutError when `reconnect` is off) instead of hanging forever
•Reconnects no longer accumulate abort listeners on the outer signal
Web Appv0.29.0
Sign In with Email and Password
•Create an account with an email address and password, alongside GitHub and Google: sign-up sends a confirmation link, and the account is usable once the email is verified
•Forgot password? Request a reset link from the login page and choose a new password on the reset page; the link works in any browser
•Team invitees without a GitHub or Google account can now sign up with the invited email address and the invite is waiting for them
•OAuth errors and invalid email links now show a message on the login page instead of being dropped
Web Appv0.28.1
Fix: Team Checkout for Owners Who Already Have a Polar Customer
•Team checkout no longer fails for owners who already have a personal Pro subscription (or own another team): the team's Polar customer is now created as a team customer with the owner as its owner member, instead of a second customer on the owner's email, which Polar rejects
•Team billing errors now reach the browser with their detail instead of being swallowed by Cloudflare's 502 page
•Polar errors are logged without the request's authorization header
Web Appv0.28.0
Invite Anyone to Your Team by Email
•Team invites no longer require the invitee to have an account: invite any email address, they get an invite email, and signing up with that address links the invite to their new account automatically
•Invite emails tell the invitee who invited them, to which team, and where to accept
•Clicking Subscribe again within 30 minutes reuses the open checkout session for the same seat count instead of creating a second one, and the billing webhook ignores events from a subscription the team doesn't hold
•Pro renewals now reset the monthly request counter the moment the renewal lands instead of relying on a background sweep
•When a member leaves or is removed, the endpoints they shared with the team are unshared so their traffic stops drawing from the team pool
•Checkout failures now surface Polar's validation detail (e.g. a rejected billing email) instead of a bare error
Web Appv0.27.0
Teams Is Now Its Own Seat-Based Plan
•Teams no longer requires Pro — any account can create a team, and the team carries its own subscription at $12/seat/mo
•Every seat adds 100,000 requests per 30 days to a pool shared by the whole team: requests on team-shared endpoints bill the team instead of the endpoint owner
•Seats are the member cap — add a seat to add a member, and freed seats are reusable
•Team-billed requests are kept for 31 days regardless of the endpoint owner's plan
•Per-team billing through Polar: subscribe, adjust seats, cancel, and resubscribe from the team page
•A team without an active subscription is suspended — its data is kept, but invites, sharing, and member access to shared endpoints pause until it subscribes
Web Appv0.26.3
Security: dependency updates across the stack
•Next.js 16.2.11, patching several security advisories in the framework
•All open Dependabot security alerts resolved: hardened transitive dependencies (sharp, tar, js-yaml, dompurify, hono, and friends) via lockfile overrides
•Routine dependency refresh: React 19.2.8, Supabase SSR, Radix UI, Polar SDK, PostHog, and the Rust receiver/CLI dependency set (including a quinn-proto advisory fix)
Web Appv0.26.2
Fix: CLI login no longer locks out at the API key cap
•CLI device logins at the 10-key limit now rotate the oldest CLI-issued key instead of failing with an opaque “Claim failed” — manually created keys are never touched
•When a claim does hit the cap (all keys manually created), the CLI now shows an actionable message pointing to the account page instead of “Claim failed”
CLIv1.1.3
Self-Update Rescue for v0.x Installs
•Releases again include the legacy `whk_<os>_<arch>` archives (with checksums), so `whk update` works from pre-1.0 installs — v0.6.0 users stuck on “no release asset for darwin/arm64” can now update straight to the current version
•No binary changes — identical CLI code to 1.1.2
Web Appv0.26.1
Fix: stale delete button in endpoint settings
•Fixed the endpoint settings dialog showing a disabled “Deleting...” button when opening another endpoint's settings right after deleting one — previously only a page reload cleared it
Web Appv0.26.0
The Landing Page Is Now the Dashboard
•Visit webhooks.cc and you're in the inspector: a live guest webhook URL is created the moment you arrive — no signup — with the full request dashboard (live feed, body tree, headers, replay) filling the first screen
•One-click test sends from the empty state: a custom payload or signed Stripe, GitHub, and Shopify templates, plus a copy-able curl command
•One click with GitHub or Google keeps your guest endpoint and unlocks the free plan — messaging now spells this out at every step, including a guest-vs-free comparison
•/go retired: it permanently redirects to the landing page, which now provides the same experience
•Crawler protection: guest endpoints are no longer created for bots (server-side user-agent screen + creation waits for a human input signal)
•SEO: HowTo structured data, new FAQ entries, and an instant-URL page title and description
Web Appv0.25.0
Landing Redesign + Per-Provider Webhook Pages
•New provider pages at /webhooks — setup steps, signature details, and sample events for all 32 supported providers, plus a browsable hub grouped by category
•Landing page redesigned around a sign-up-first hero: prominent GitHub/Google start-free buttons, with the no-signup guest endpoint as the secondary path
•New provider strip and navbar links (Docs, Providers, Compare, Pricing, Blog) for easier discovery
•SEO: provider pages added to the sitemap, /agent/claim marked noindex
Web Appv0.24.0
4 New Providers — DocuSign, Adyen, PayPal, Plaid
•Provider catalog grows from 28 to 32: added DocuSign, Adyen, PayPal, and Plaid across templates and detection
•Server-side signature verification now supports DocuSign HMAC, Adyen body-embedded HMAC, and PayPal RSA certificate verification; Plaid remains template-only until Plaid JWT/JWK credentials are supported
•Endpoint settings and the Signature tab use provider-specific credential labels, including PayPal Webhook ID and Adyen HMAC Key
SDKv1.9.0
4 New Providers — DocuSign, Adyen, PayPal, Plaid
•Added DocuSign, Adyen, PayPal, and Plaid templates, bringing TEMPLATE_PROVIDERS to 32 named providers
•New verifiers: verifyDocuSignSignature, verifyAdyenSignature, and verifyPayPalSignature with PayPal certificate URL validation and RSA-SHA256 verification
•New detection helpers: isDocuSignWebhook, isAdyenWebhook, isPayPalWebhook, and isPlaidWebhook; Plaid remains template-only for verification
MCPv1.7.0
4 New Providers
•DocuSign, Adyen, PayPal, and Plaid are available in provider template tools through the SDK catalog; verify_signature now exposes DocuSign, Adyen, and PayPal while keeping Plaid template-only
Web Appv0.23.1
Fix: send-webhook templates for newer providers
•Fixed the dashboard send-webhook dialog failing with “Unsupported template "custom"” for 14 providers (HubSpot, Square, Meta, Lemon Squeezy, Coinbase Commerce, Razorpay, Cal.com, Intercom, Telegram, Mailgun, Calendly, Mux, Sentry, Bitbucket) — their template presets now derive from the SDK provider metadata so every listed provider can send a signed test webhook
•Unclaimed agent credentials now work immediately in a bounded sandbox: an anonymous key can create ephemeral endpoints and read only its own captured requests, with strict cross-tenant isolation, before a human claims it
•Anonymous registrations get a short human-friendly claim code (e.g. ABCD-EFGH) alongside the claim link — a signed-in user can claim by typing the code at /agent/claim
•Verification emails (OTP) now send over SMTP in production (SMTP → Resend → dev fallback); local dev and tests keep using the in-process capture transport
•Documented the ID-JAG trusted-provider config format and added an identity-provider onboarding section to the hosted /auth.md
SDKv1.8.0
Agent self-registration on-ramp
•New static WebhooksCC.register helpers let an agent obtain its own credential before it has one: anonymous (with claim code + poll/waitForClaim), verified_email (withEmail + confirmEmailOtp), and identity_assertion (withIdJag)
•WebhooksCC.describeRegistration() and client.describe().registration surface the auth.md on-ramp so an unauthenticated agent can discover how to register
•Standalone exports (registerAnonymous, registerWithEmail, confirmEmailOtp, registerWithIdJag, pollClaim, waitForClaim) plus an AgentRegisterError carrying the auth.md error code
MCPv1.6.0
Agent self-registration on-ramp
•New unauthenticated tools — how_to_register, register_agent, and check_claim — let an agent with no API key learn the auth.md flows and drive the anonymous register + claim handshake
•The MCP server now boots without WHK_API_KEY, exposing only the registration on-ramp so an agent can obtain a credential instead of failing to start
•describe now includes the registration on-ramp block from the SDK
•Implements the WorkOS auth.md agent-registration protocol: agents self-register a credential anonymously, via a verified-email one-time code, or by presenting a provider-signed ID-JAG identity assertion
•Adds RFC 9728 discovery (/.well-known/oauth-protected-resource and /.well-known/oauth-authorization-server), a hosted /auth.md, and a WWW-Authenticate hint on 401s so agents can discover how to authenticate
•Anonymous credentials can be claimed by a signed-in user from an in-app claim page, permanently attaching the key to their account
•Supports provider-driven revocation (logout token) for ID-JAG-issued credentials
•Provider catalog grows from 21 to 28: added Square, HubSpot, Mailgun, Calendly, Mux, Sentry, and Bitbucket across templates, auto-detection, and signature verification
•Three new signing schemes are now supported server-side: URL + body (Square), HTTP method + URI + body + timestamp (HubSpot), and body-embedded signature fields (Mailgun)
•Endpoint settings, the send-webhook dialog, and the Signature tab list all 28 named providers; automatic server-side verification works for every one except SendGrid (IP allowlisting)
•Refreshed provider template and signature-verification docs with payload shapes, headers, and algorithms for each new provider
•Provider catalog grows from 14 to 21: added Meta (WhatsApp/Messenger/Instagram), Lemon Squeezy, Coinbase Commerce, Razorpay, Cal.com, Intercom, and Telegram across templates, auto-detection, and signature verification
•Endpoint settings, the send-webhook dialog, and the Signature tab now list all new providers; server-side automatic verification works for every one
•Refreshed provider template and signature-verification docs with payload shapes, headers, and algorithms for each new provider
•Added Square, HubSpot, Mailgun, Calendly, Mux, Sentry, and Bitbucket to templates, detection, and verification — the catalog now covers 28 named providers
•VerifySignatureOptions gains an optional method field; Square and HubSpot verification require the request url (HubSpot also uses the method and rejects timestamps older than 5 minutes)
•Bitbucket is detected on x-event-key before Intercom to avoid the shared x-hub-signature collision (Bitbucket sha256=, Intercom sha1=)
SDKv1.6.0
7 New Providers
•Added Meta (WhatsApp/Messenger/Instagram), Lemon Squeezy, Coinbase Commerce, Razorpay, Cal.com, Intercom, and Telegram to templates, detection, and verification
•Square, HubSpot, Mailgun, Calendly, Mux, Sentry, and Bitbucket are now available in send_webhook, send_to, preview_webhook, list_provider_templates, and verify_signature — wired automatically through the SDK provider lists, bringing the catalog to 28 named providers
MCPv1.4.2
7 New Providers
•Meta, Lemon Squeezy, Coinbase Commerce, Razorpay, Cal.com, Intercom, and Telegram are now available in send_webhook, send_to, preview_webhook, list_provider_templates, and verify_signature — wired automatically through the SDK provider lists
Web Appv0.20.3
CLI v1.1.2 Release
•Ships the CLI v1.1.2 polish — correct version display in `whk update` and a clear, actionable message when the install directory isn't writable
CLIv1.1.2
Update Command Polish
•`whk update` now displays the current version correctly (was rendering as `vv1.0.0` due to a double `v` prefix)
•When the install directory isn't user-writable, `whk update` fails fast with a clear message naming the path and suggesting `sudo whk update` or a user-writable reinstall — instead of the cryptic `Permission denied (os error 13)` after a multi-MB download
Web Appv0.20.2
MCP v1.4.1 & CLI v1.1.1 Release
•MCP and CLI version bumps ship transitive dependency upgrades — zod 4 in MCP, tokio 1.52 and rustls-webpki refresh in the CLI
•Internal clippy 1.95 cleanups in the TUI event loop and update screen (no behavior change)
MCPv1.4.1
zod 4 Upgrade
•Upgrades the zod dependency from 3.x to 4.x with the matching tool-schema adaptation in src/tools.ts
Web Appv0.20.1
CI hardening & lint cleanup
•CI: Build Web App job now uses placeholder env values when Supabase secrets aren't available (e.g. Dependabot PRs), so dependency-update PRs get a meaningful build signal
•Resolved new strict react-hooks lint errors surfaced by an upcoming plugin bump, keeping the workspace lint-clean across plugin versions
Web Appv0.20.0
Provider Auto-Detect & Typeform Support
•Dashboard auto-detects the webhook provider from headers and payload and renders a colored provider badge on each request
•Provider icons (Stripe, GitHub, Shopify, Twilio, Slack, Paddle, Linear, Clerk, Discord, Vercel, GitLab, Typeform, and more) across the request list and detail panes
•Typeform added to provider templates and signature verification — configure on any endpoint
•Hardened signing configuration invariants: partial or stale provider state is no longer possible, eliminating a class of silent verification failures
•Refreshed provider docs, ngrok and webhook.site comparison guides, signature verification guide, and MCP tools reference
SDKv1.5.0
Typeform Provider & Webhook Auto-Detect
•Typeform provider templates (form_response, partial_response, payment) and verifyTypeformSignature
•detectWebhookInfo() and detectWebhookProvider() helpers for provider auto-detection from headers and body
•DetectedWebhookInfo type and isTypeformWebhook detection helper
MCPv1.4.0
Typeform Provider Support
•Typeform exposed in list_provider_templates with templates, default event, and signature metadata
•Typeform usable in create_endpoint and update_endpoint signing config
Web Appv0.19.1
Guest Dashboard SEO Overhaul
•Fixed layout bug on /go where hero copy rendered above the navbar
•Added feature cards flanking the Send Your First Webhook widget — mock responses, signature verification, CLI tunnel, SDK testing, MCP, and search/replay — visible without scrolling on xl+ screens
•Promoted the page h1 to a visible subtitle inside the nav on md+ screens
CLIv1.1.0
Signature Verification
•Tunnel forwards X-Signature-Verified, X-Signature-Provider, and X-Signature-Error headers
•Listen shows inline verification status (checkmark/cross) per request
•Create supports --signing-provider and --signing-secret flags (or WHK_SIGNING_SECRET env var)
SDKv1.4.0
Signature Verification Matchers
•matchVerified() and matchUnverified() matchers for signature verification assertions
•signatureVerified, signatureError, and signingProvider fields on Request and Endpoint types
MCPv1.3.0
Signature Verification Tools
•Signing config (provider + secret) on create_endpoint and update_endpoint
•verify_signature tool returns stored server-side results with skipped detection
•Discord publicKey support for Ed25519 verification
Web Appv0.19.0
Signature Verification
•Server-side webhook signature verification for 13 providers — configure once per endpoint, every request verified automatically
•New Signature tab in request detail: paste a secret for instant client-side verification, or view stored server-side results with detailed error diagnostics
•Verification badges (shield icons) in the request list and summary bar for at-a-glance valid/invalid status