RepoPilot

svix/svix-webhooks

The open source and enterprise-ready webhooks service πŸ¦€

Healthy

Healthy across the board

HealthyDependency

Permissive license, no critical CVEs, actively maintained β€” safe to depend on.

HealthyFork & modify

Has a license, tests, and CI β€” clean foundation to fork and modify.

HealthyLearn from

Documented and popular β€” useful reference codebase to read through.

HealthyDeploy as-is

No critical CVEs, sane security posture β€” runnable as-is.

  • βœ“Last commit today
  • βœ“10 active contributors
  • βœ“Distributed ownership (top contributor 26% of recent commits)
  • βœ“MIT licensed
  • βœ“CI configured
  • βœ“Tests present

Computed from maintenance signals β€” commit recency, contributor breadth, bus factor, license, CI, tests

Informational only. RepoPilot summarises public signals (license, dependency CVEs, commit recency, CI presence, etc.) at the time of analysis. Signals can be incomplete or stale. Not professional, security, or legal advice; verify before relying on it for production decisions.

Embed the "Healthy" badge

Paste into your README β€” live-updates from the latest cached analysis.

Variant:
RepoPilot: Healthy
[![RepoPilot: Healthy](https://repopilot.app/api/badge/svix/svix-webhooks)](https://repopilot.app/r/svix/svix-webhooks)

Paste at the top of your README.md β€” renders inline like a shields.io badge.

β–ΈPreview social card

This card auto-renders when someone shares https://repopilot.app/r/svix/svix-webhooks on X, Slack, or LinkedIn.

Ask AI about svix/svix-webhooks

Grounded in the actual source code. Pick a starter question or write your own.

Or write your own question β†’

Onboarding doc

Onboarding: svix/svix-webhooks

Generated by RepoPilot Β· 2026-06-24 Β· Source

🎯Verdict

GO β€” Healthy across the board

  • Last commit today
  • 10 active contributors
  • Distributed ownership (top contributor 26% of recent commits)
  • MIT licensed
  • CI configured
  • Tests present

<sub>Computed from maintenance signals β€” commit recency, contributor breadth, bus factor, license, CI, tests</sub>

⚑TL;DR

Svix is an enterprise-grade webhook delivery service written primarily in Rust that abstracts away the complexity of sending, retrying, securing, and monitoring webhooks at scale. Developers call one API endpoint, and Svix handles deliverability guarantees, exponential backoff retries, payload signing (HMAC), and detailed event loggingβ€”similar to how Twilio abstracts SMS but for webhooks. Monorepo structure: svix-bridge/ contains the core Rust webhook service with OpenTelemetry observability; svix-bridge-types/ defines shared types; svix-bridge-plugin-queue/ and svix-bridge-plugin-kafka/ are pluggable queue backends. Separate language-specific SDKs (python/, java/, csharp/, etc.) are code-generated or hand-written, with release pipelines per language (.github/workflows/*-release.yml). The server component (likely in server/ based on workflows) runs the central webhook orchestration, while CLI tooling (cli-docker-release.yml) provides operational interfaces.

πŸ‘₯Who it's for

Backend engineers and platform teams building SaaS products who need reliable webhook delivery without managing their own retry logic, security, and monitoring infrastructure. SDK users span 8+ languages (Python, TypeScript, Go, Java, C#, Rust, Ruby, PHP, Kotlin) to integrate Svix into their applications.

🌱Maturity & risk

Production-ready and actively maintained. The codebase is substantial (1.8M LOC in Rust alone across the monorepo) with extensive CI/CD pipelines (.github/workflows/ contains 20+ automated checks including security scans, linting, and multi-language releases). Multiple SDK versions published to package registries (PyPI, Crates.io, NPM, Maven Central, NuGet, Packagist) indicate stable, versioned releases. Version pinned at 1.93.0 in Cargo workspace suggests regular releases.

Low-to-moderate risk for a webhook service. The monorepo structure spans 8+ languages which increases maintenance surface areaβ€”any breaking change requires coordinated releases across server, CLI, bridge, and all SDKs (see mega-releaser.yml). Dependency management is centralized via workspace.dependencies in Cargo.toml but external dependencies are substantial (opentelemetry, tokio, serde, thiserror, tracing). No visible single-maintainer risk given the organizational backing (Svix company), but the multi-language complexity means regressions in one SDK can silently affect users of others.

Active areas of work

Active development across multiple dimensions: language SDK releases are automated (mega-releaser.yml coordinates them), security scanning is ongoing (rust-security.yml, server-security.yml, bridge-security.yml), and container image management is automated (server-docker-image.yml, cli-docker-release.yml). The presence of codegen.yml suggests API spec or SDK generation is part of the workflow. OpenTelemetry integration is a focus area (version 0.29.0 pinned), indicating observability investment.

πŸš€Get running

git clone https://github.com/svix/svix-webhooks.git
cd svix-webhooks
# For Rust components (primary server/bridge):
cargo build
cargo test
# For a specific language SDK, e.g., Python:
cd python
pip install -e .
# For CLI (Rust-based):
cargo build --bin svix

Daily commands: For the Rust server/bridge component: cargo build && cargo run --bin svix-bridge. For Python SDK testing: cd python && pip install -e . && pytest. For CLI: cargo build --bin svix && ./target/debug/svix --help. Actual server startup likely requires environment configuration (database connection, queue backend, auth tokens)β€”check server-ci.yml for CI runtime setup hints.

πŸ—ΊοΈMap of the codebase

  • bridge/Cargo.toml β€” Workspace root for the Svix Bridge project; defines version, members, and shared Rust lints that all contributors must understand
  • bridge/svix-bridge-plugin-queue/src/lib.rs β€” Core queue plugin abstraction serving as the foundation for all message queue integrations (RabbitMQ, SQS, Redis, GCP Pub/Sub)
  • bridge/svix-bridge-plugin-kafka/src/lib.rs β€” Kafka plugin entry point; demonstrates the plugin architecture pattern used throughout the bridge system
  • bridge/svix-bridge-types/src β€” Shared type definitions and interfaces for all bridge components; critical for inter-plugin communication contracts
  • .github/workflows/server-ci.yml β€” Main CI pipeline for the Svix server; every contributor must understand the automated testing and validation gates
  • README.md β€” Project overview and scope; essential context on what Svix webhooks service does and its position in the ecosystem

πŸ› οΈHow to make changes

Add a new message queue backend

  1. Create a new module in bridge/svix-bridge-plugin-queue/src/ (e.g., src/newqueue/mod.rs) (bridge/svix-bridge-plugin-queue/src/lib.rs)
  2. Define Config, Input (consumer), and Output (producer) structs implementing traits from svix-bridge-types (bridge/svix-bridge-plugin-queue/src/config.rs)
  3. Register the new backend in the plugin's lib.rs with conditional compilation or feature gates (bridge/svix-bridge-plugin-queue/src/lib.rs)
  4. Add integration test in bridge/svix-bridge-plugin-queue/tests/it/ (e.g., newqueue_consumer.rs) (bridge/svix-bridge-plugin-queue/tests/it/main.rs)
  5. Update Cargo.toml with optional dependency and feature flag for the new backend (bridge/svix-bridge-plugin-queue/Cargo.toml)

Add a new plugin type (beyond queues/Kafka)

  1. Create new workspace member directory bridge/svix-bridge-plugin-mytype/ with its own Cargo.toml (bridge/Cargo.toml)
  2. Define your plugin's Config, Input/Output types implementing core traits from svix-bridge-types/src (bridge/svix-bridge-types/src)
  3. Implement error handling following the pattern in bridge/svix-bridge-plugin-kafka/src/error.rs (bridge/svix-bridge-plugin-kafka/src/error.rs)
  4. Add integration tests in bridge/svix-bridge-plugin-mytype/tests/it/ (bridge/svix-bridge-plugin-kafka/tests/it/main.rs)
  5. Create CI workflow at .github/workflows/ following bridge-ci.yml and bridge-release.yml patterns (.github/workflows/bridge-ci.yml)

Release a new bridge version

  1. Update version in bridge/Cargo.toml (workspace.package.version) (bridge/Cargo.toml)
  2. Update .version file at repository root to match (.version)
  3. Create git tag matching the version (e.g., v1.93.0) (.github/workflows/bridge-release.yml)
  4. Push tag to main branch; bridge-release.yml workflow automatically publishes to crates.io and Docker Hub (.github/workflows/bridge-release.yml)

πŸ”§Why these technologies

  • Rust (Tokio async runtime) β€” High performance, memory safety, and concurrency for handling high-volume webhook traffic without garbage collection pauses
  • Plugin architecture (trait-based) β€” Enables extensible integrations with multiple message queues and event sources without monolithic coupling
  • Docker containerization β€” Simplifies deployment and enables the bridge to run alongside Svix server in cloud and on-premise environments
  • Multi-crate workspace (Cargo) β€” Allows shared types (svix-bridge-types) and independent plugin compilation/release cycles

βš–οΈTrade-offs already made

  • Trait-based plugin system over dynamic loading

    • Why: Compile-time safety and no runtime reflection overhead
    • Consequence: New queue backends require code changes and recompilation; cannot load plugins at runtime without reimplementing the system
  • Feature gates for optional queue backends

    • Why: Reduce binary size and dependency bloat for users who only need specific queues
    • Consequence: More complex Cargo.toml and conditional compilation; developers must remember to enable features in tests
  • Integration tests over unit tests for queue backends

    • Why: Real queue behavior (connection pooling, retry logic, ordering) cannot be reliably mocked
    • Consequence: Tests require external services (RabbitMQ, SQS, Redis, Kafka) running locally; slower CI pipelines
  • Single workspace with all plugins vs. separate repositories

    • Why: Unified versioning and shared type contracts; easier to enforce breaking changes across plugins
    • Consequence: Repository is larger; changes to svix-bridge-types may trigger releases of all plugins

🚫Non-goals (don't propose these)

  • Does not implement webhook storage or persistence; relies on Svix server for durability
  • Not a message broker; only consumes and produces to external queues (RabbitMQ, SQS, Kafka, etc.)
  • Does not handle webhook signature validation or authentication; Svix server owns that
  • Not a real-time UI or dashboard; bridge is a headless integration service

πŸͺ€Traps & gotchas

Multi-language coordination: A single logical change (e.g., new webhook field) requires updates to server, svix-bridge-types, AND all 8 language SDKs. The mega-releaser.yml workflow expects consistent versioning (workspace.package.version = "1.93.0")β€”bumping this in one place should cascade. Docker hub publishing: svix/svix-server publishes automatically; ensure docker credentials are configured in GitHub secrets. Workspace resolver 2: Cargo workspace requires resolver = "2" to compile (see comment in Cargo.toml about wgpu-hal)β€”don't downgrade to resolver 1. Plugin system: svix-bridge-plugin-kafka and svix-bridge-plugin-queue define pluggable backends; new storage layers require implementing the trait contract in bridge-types. Linting: Pre-commit hooks (.pre-commit-config.yaml) run formatters and linters; failing these will block commits locally and in CI.

πŸ—οΈArchitecture

πŸ’‘Concepts to learn

  • Exponential Backoff Retry Strategy β€” Svix's core feature is handling delivery retries; exponential backoff ensures failed webhooks don't overwhelm downstream services while respecting delivery deadlines
  • HMAC Payload Signing β€” Webhooks are sent to user-controlled endpoints; HMAC-SHA256 signing prevents tampering and proves messages came from Svix, following the standard-webhooks spec
  • Pluggable Queue Backends β€” svix-bridge-plugin-queue and svix-bridge-plugin-kafka show Svix's architecture allows swapping the underlying message queue (in-memory, Kafka, RabbitMQ) without changing core logic
  • Distributed Tracing (OpenTelemetry/OTLP) β€” A webhook delivery service must trace requests across retries, queue processing, and delivery attempts; OpenTelemetry integration (0.29.0 workspace dependency) enables observability in production
  • Workspace Resolver 2 (Cargo) β€” The monorepo uses Rust workspace resolver v2 to handle complex dependency graphs across bridge, plugins, and multiple binaries; this is a non-obvious Cargo configuration detail
  • Code Generation for Multi-Language SDKs β€” codegen.yml suggests SDKs are generated from a canonical schema (likely OpenAPI/Swagger); changes to API contracts flow automatically to all 8 language SDKs
  • Event Sourcing / Audit Logging β€” Webhook services must maintain an immutable event log for compliance and debugging; Svix's detailed event logging (mentioned in README) likely uses event sourcing patterns
  • standard-webhooks/standard-webhooks β€” Defines the webhook signing standard (HMAC-based) that Svix implements; referenced in payload security validation
  • inngest/inngest β€” Alternative workflow/event orchestration service; competes in the reliable event delivery space for background jobs and webhooks
  • temporal-io/temporal β€” Distributed workflow engine; solves similar retry/durability problems but for internal workflows rather than external webhooks
  • hookdeck/hookdeck-open-source β€” Open-source webhook gateway/proxy; complements Svix by providing on-prem webhook ingestion and routing
  • open-telemetry/opentelemetry-rust β€” The OpenTelemetry Rust SDK that Svix heavily depends on (0.29.0); understanding this library is critical for observability customization

πŸͺ„PR ideas

To work on one of these in Claude Code or Cursor, paste: Implement the "<title>" PR idea from CLAUDE.md, working through the checklist as the task list.

Add CI workflow for Bridge plugin validation and compatibility testing

The repo has multiple bridge plugins (kafka, queue) but no dedicated CI workflow to validate plugin compilation, integration tests, or compatibility across the workspace. Currently, plugins rely on general rust-ci.yml. A dedicated workflow would catch plugin-specific regressions early and ensure plugin authors follow the pattern established in svix-bridge-types.

  • [ ] Create .github/workflows/bridge-plugins-ci.yml that runs tests for all members in bridge/svix-bridge-plugin-*/ directories
  • [ ] Add integration tests in bridge/svix-bridge-plugin-kafka/tests/ and bridge/svix-bridge-plugin-queue/tests/ (currently missing or minimal)
  • [ ] Validate that each plugin implements the expected trait interfaces from svix-bridge-types
  • [ ] Add step to verify workspace dependency resolution with 'cargo build -p svix-bridge-plugin-kafka' and '-p svix-bridge-plugin-queue'

Add lint configuration and CI workflow for Rust bridge code (clippy, format checks)

While rust-lint.yml exists for the main Rust server, the bridge Cargo workspace has its own .rustfmt.toml and .clippy.toml (in bridge/.clippy.toml and bridge/.rustfmt.toml) but no dedicated bridge-lint.yml workflow. This creates inconsistent lint enforcement between server and bridge codebases and risks clippy/format violations in bridge PRs.

  • [ ] Create .github/workflows/bridge-lint.yml that runs 'cargo fmt --check' and 'cargo clippy --all-targets' in the bridge/ directory
  • [ ] Ensure the workflow reads the workspace-level lints from bridge/Cargo.toml [workspace.lints] section (currently defined but not actively enforced in CI)
  • [ ] Add a check for bridge/.rustfmt.toml and bridge/.clippy.toml to validate they align with root linting rules
  • [ ] Include deny checks for bridge dependencies (similar to server security workflow pattern)

Create bridge/PLUGIN_DEVELOPMENT.md with plugin lifecycle and testing patterns

The repo has bridge/README.md but lacks specific guidance for developing new plugins. With svix-bridge-types as a shared interface and existing plugins (kafka, queue), new contributors need clear documentation on plugin trait implementation, testing patterns, and workspace integration. Currently this institutional knowledge is only in code.

  • [ ] Create bridge/PLUGIN_DEVELOPMENT.md documenting the plugin trait interface from svix-bridge-types/src/lib.rs
  • [ ] Add a step-by-step example showing how to create a minimal new plugin (e.g., svix-bridge-plugin-example)
  • [ ] Document required test patterns: unit tests in plugin crate, integration tests with svix-bridge (reference bridge/run-tests.sh and bridge/run-idle-test.sh)
  • [ ] Include workspace Cargo.toml member registration requirements and version management via [workspace.package]
  • [ ] Add section on how to verify plugin builds with 'cargo build -p svix-bridge-plugin-<name>' and validate it integrates with main bridge binary

🌿Good first issues

  • Add integration tests for C# SDK webhook signing verification (csharp-release.yml exists but no csharp/ tests visible in workflows; audit test coverage gap and add HMAC signature validation tests similar to Python's test suite)
  • Document OpenTelemetry metrics export in OpenTelemetry.md and add example Grafana dashboard config (OpenTelemetry.md exists but is sparse; add concrete examples of metrics exported by svix-bridge and how to visualize them)
  • Add missing --help output documentation to the CLI binary and generate man pages in CI (cli-docker-release.yml builds the CLI but no man page generation visible; contribute to CLI usability)

⭐Top contributors

Click to expand

πŸ“Recent commits

Click to expand
  • 78fe28f β€” ruby: Remove post-install message (#2318) (svix-jplatte)
  • 81bf9e9 β€” Release v1.93.0 (#2315) (svix-jplatte)
  • 563e068 β€” server: Bump Cargo.lock (#2316) (svix-jplatte)
  • 3705758 β€” js: npm audit fix (#2314) (svix-jplatte)
  • e207918 β€” Java: Add a Java 8 compilation test to CI. (#2312) (tasn)
  • 37bfed9 β€” C#: implement trusted publishing. (#2313) (tasn)
  • 9e92075 β€” Java: fix compatibilty with Java 1.8. (#2311) (tasn)
  • c36ae2a β€” build(deps-dev): bump ip-address from 10.1.0 to 10.2.0 in /javascript (#2310) (dependabot[bot])
  • b3bea29 β€” build(deps): bump openssl from 0.10.78 to 0.10.79 in /bridge (#2309) (dependabot[bot])
  • 601c2b5 β€” deps: update webhook_http_client to use hickory 0.26 (#2303) (svix-jbrown)

πŸ”’Security observations

The Svix webhooks codebase demonstrates a strong security posture with multiple security workflows (security.yml files for rust, server, bridge), active use of linting and code quality tools, and a clear security reporting policy. However, there are areas for improvement: (1) Automated dependency vulnerability scanning should be formally integrated into CI/CD, (2) Security headers and middleware configuration need explicit visibility, (3) Input validation patterns for webhook handling should be documented and enforced, (4) Some clippy lints should be elevated from 'warn' to 'deny', and (5) SBOM generation would improve supply chain security transparency. The project shows good security practices with workspace linting, pre-commit hooks, and multiple security workflows, but would benefit from stricter enforcement of certain rules and more explicit documentation of security-critical components.

  • Medium Β· Outdated Dependencies with Known Vulnerabilities β€” Cargo.toml (workspace dependencies). The workspace dependencies include versions that may have known security vulnerabilities. Specifically, tokio 1.38.0, serde 1.0.203, and other dependencies should be regularly audited. The project should implement automated dependency scanning. Fix: Run 'cargo audit' regularly in CI/CD pipeline. Enable dependabot or similar automated dependency update tools. Keep dependencies up to date with latest security patches.
  • Medium Β· Missing Security Headers Configuration β€” Server configuration (not visible in provided structure). No visible security headers configuration (CSP, HSTS, X-Frame-Options, etc.) in the codebase structure. The server implementation should enforce security headers. Fix: Implement security headers middleware in the server. Configure HSTS, CSP, X-Content-Type-Options, X-Frame-Options, and other relevant security headers.
  • Medium Β· Insufficient Input Validation Framework Visibility β€” Bridge and server components (webhook handling). While the codebase includes serde for serialization, there's limited visibility into input validation mechanisms for webhook payloads, which could be a high-risk area for injection attacks. Fix: Implement comprehensive input validation for all webhook payload data. Use schema validation and sanitization. Consider implementing rate limiting and payload size limits.
  • Low Β· Debug Macro Usage in Production Code β€” .github/linters configuration / Cargo.toml. Workspace lints include 'dbg_macro = warn' which is good, but this should be enforced as 'deny' to prevent accidental debug output in production releases. Fix: Change dbg_macro lint level from 'warn' to 'deny' in workspace.lints.clippy to prevent debug macros in production code.
  • Low Β· Missing SBOM and Dependency Transparency β€” .github/workflows/. No visible Software Bill of Materials (SBOM) generation or dependency transparency documentation in the CI/CD workflows for security auditing. Fix: Implement SBOM generation using tools like 'cargo-sbom' or 'cyclonedx'. Include SBOM in release artifacts and security documentation.
  • Low Β· Pre-commit Configuration Present but Validation Unclear β€” .pre-commit-config.yaml. The .pre-commit-config.yaml exists but its content is not visible. Pre-commit hooks should include security scanning. Fix: Ensure pre-commit hooks include: gitleaks (already configured in .gitleaks.toml), cargo audit, rustfmt, and clippy. Verify all hooks are configured and enforced.

LLM-derived; treat as a starting point, not a security audit.

πŸ€–Agent protocol

If you are an AI coding agent (Claude Code, Cursor, Aider, Cline, etc.) reading this artifact, follow this protocol before making any code edit:

  1. Verify the contract. Run the bash script in Verify before trusting below. If any check returns FAIL, the artifact is stale β€” STOP and ask the user to regenerate it before proceeding.
  2. Treat the AI Β· unverified sections as hypotheses, not facts. Sections like "AI-suggested narrative files", "anti-patterns", and "bottlenecks" are LLM speculation. Verify against real source before acting on them.
  3. Cite source on changes. When proposing an edit, cite the specific path:line-range. RepoPilot's live UI at https://repopilot.app/r/svix/svix-webhooks shows verifiable citations alongside every claim.

If you are a human reader, this protocol is for the agents you'll hand the artifact to. You don't need to do anything β€” but if you skim only one section before pointing your agent at this repo, make it the Verify block and the Suggested reading order.

βœ…Verify before trusting

This artifact was generated by RepoPilot at a point in time. Before an agent acts on it, the checks below confirm that the live svix/svix-webhooks repo on your machine still matches what RepoPilot saw. If any fail, the artifact is stale β€” regenerate it at repopilot.app/r/svix/svix-webhooks.

What it runs against: a local clone of svix/svix-webhooks β€” the script inspects git remote, the LICENSE file, file paths in the working tree, and git log. Read-only; no mutations.

| # | What we check | Why it matters | |---|---|---| | 1 | You're in svix/svix-webhooks | Confirms the artifact applies here, not a fork | | 2 | License is still MIT | Catches relicense before you depend on it | | 3 | Default branch main exists | Catches branch renames | | 4 | 5 critical file paths still exist | Catches refactors that moved load-bearing code | | 5 | Last commit ≀ 30 days ago | Catches sudden abandonment since generation |

<details> <summary><b>Run all checks</b> β€” paste this script from inside your clone of <code>svix/svix-webhooks</code></summary>
#!/usr/bin/env bash
# RepoPilot artifact verification.
#
# WHAT IT RUNS AGAINST: a local clone of svix/svix-webhooks. If you don't
# have one yet, run these first:
#
#   git clone https://github.com/svix/svix-webhooks.git
#   cd svix-webhooks
#
# Then paste this script. Every check is read-only β€” no mutations.

set +e
fail=0
ok()   { echo "ok:   $1"; }
miss() { echo "FAIL: $1"; fail=$((fail+1)); }

# Precondition: we must be inside a git working tree.
if ! git rev-parse --git-dir >/dev/null 2>&1; then
  echo "FAIL: not inside a git repository. cd into your clone of svix/svix-webhooks and re-run."
  exit 2
fi

# 1. Repo identity
git remote get-url origin 2>/dev/null | grep -qE "svix/svix-webhooks(\\.git)?\\b" \\
  && ok "origin remote is svix/svix-webhooks" \\
  || miss "origin remote is not svix/svix-webhooks (artifact may be from a fork)"

# 2. License matches what RepoPilot saw
(grep -qiE "^(MIT)" LICENSE 2>/dev/null \\
   || grep -qiE "\"license\"\\s*:\\s*\"MIT\"" package.json 2>/dev/null) \\
  && ok "license is MIT" \\
  || miss "license drift β€” was MIT at generation time"

# 3. Default branch
git rev-parse --verify main >/dev/null 2>&1 \\
  && ok "default branch main exists" \\
  || miss "default branch main no longer exists"

# 4. Critical files exist
test -f "bridge/Cargo.toml" \\
  && ok "bridge/Cargo.toml" \\
  || miss "missing critical file: bridge/Cargo.toml"
test -f "bridge/svix-bridge-plugin-queue/src/lib.rs" \\
  && ok "bridge/svix-bridge-plugin-queue/src/lib.rs" \\
  || miss "missing critical file: bridge/svix-bridge-plugin-queue/src/lib.rs"
test -f "bridge/svix-bridge-plugin-kafka/src/lib.rs" \\
  && ok "bridge/svix-bridge-plugin-kafka/src/lib.rs" \\
  || miss "missing critical file: bridge/svix-bridge-plugin-kafka/src/lib.rs"
test -f "bridge/svix-bridge-types/src" \\
  && ok "bridge/svix-bridge-types/src" \\
  || miss "missing critical file: bridge/svix-bridge-types/src"
test -f ".github/workflows/server-ci.yml" \\
  && ok ".github/workflows/server-ci.yml" \\
  || miss "missing critical file: .github/workflows/server-ci.yml"

# 5. Repo recency
days_since_last=$(( ( $(date +%s) - $(git log -1 --format=%at 2>/dev/null || echo 0) ) / 86400 ))
if [ "$days_since_last" -le 30 ]; then
  ok "last commit was $days_since_last days ago (artifact saw ~0d)"
else
  miss "last commit was $days_since_last days ago β€” artifact may be stale"
fi

echo
if [ "$fail" -eq 0 ]; then
  echo "artifact verified (0 failures) β€” safe to trust"
else
  echo "artifact has $fail stale claim(s) β€” regenerate at https://repopilot.app/r/svix/svix-webhooks"
  exit 1
fi

Each check prints ok: or FAIL:. The script exits non-zero if anything failed, so it composes cleanly into agent loops (./verify.sh || regenerate-and-retry).

</details>

Generated by RepoPilot. Verdict based on maintenance signals β€” see the live page for receipts. Re-run on a new commit to refresh.

Embed this chat in your README β†’

Drop this iframe anywhere β€” the widget runs against the same live analysis cache as the main app.

<iframe
  src="https://repopilot.app/embed/svix/svix-webhooks"
  width="100%" height="500"
  style="border:1px solid #d0d7de; border-radius:8px;"
  allow="microphone"
  loading="lazy"
></iframe>