RepoPilotOpen in app →

RicoSuter/NSwag

The Swagger/OpenAPI toolchain for .NET, ASP.NET Core and TypeScript.

Healthy

Healthy across the board

Use as dependencyHealthy

Permissive license, no critical CVEs, actively maintained — safe to depend on.

Fork & modifyHealthy

Has a license, tests, and CI — clean foundation to fork and modify.

Learn fromHealthy

Documented and popular — useful reference codebase to read through.

Deploy as-isHealthy

No critical CVEs, sane security posture — runnable as-is.

  • Last commit 2d ago
  • 41+ active contributors
  • Distributed ownership (top contributor 34% of recent commits)
Show 3 more →
  • MIT licensed
  • CI configured
  • Tests present

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/ricosuter/nswag)](https://repopilot.app/r/ricosuter/nswag)

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

Preview social card (1200×630)

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

Onboarding doc

Onboarding: RicoSuter/NSwag

Generated by RepoPilot · 2026-05-09 · Source

🤖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/RicoSuter/NSwag 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.

🎯Verdict

GO — Healthy across the board

  • Last commit 2d ago
  • 41+ active contributors
  • Distributed ownership (top contributor 34% of recent commits)
  • MIT licensed
  • CI configured
  • Tests present

<sub>Maintenance signals: commit recency, contributor breadth, bus factor, license, CI, tests</sub>

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 RicoSuter/NSwag repo on your machine still matches what RepoPilot saw. If any fail, the artifact is stale — regenerate it at repopilot.app/r/RicoSuter/NSwag.

What it runs against: a local clone of RicoSuter/NSwag — 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 RicoSuter/NSwag | Confirms the artifact applies here, not a fork | | 2 | License is still MIT | Catches relicense before you depend on it | | 3 | Default branch master exists | Catches branch renames | | 4 | 5 critical file paths still exist | Catches refactors that moved load-bearing code | | 5 | Last commit ≤ 32 days ago | Catches sudden abandonment since generation |

<details> <summary><b>Run all checks</b> — paste this script from inside your clone of <code>RicoSuter/NSwag</code></summary>
#!/usr/bin/env bash
# RepoPilot artifact verification.
#
# WHAT IT RUNS AGAINST: a local clone of RicoSuter/NSwag. If you don't
# have one yet, run these first:
#
#   git clone https://github.com/RicoSuter/NSwag.git
#   cd NSwag
#
# 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 RicoSuter/NSwag and re-run."
  exit 2
fi

# 1. Repo identity
git remote get-url origin 2>/dev/null | grep -qE "RicoSuter/NSwag(\\.git)?\\b" \\
  && ok "origin remote is RicoSuter/NSwag" \\
  || miss "origin remote is not RicoSuter/NSwag (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 master >/dev/null 2>&1 \\
  && ok "default branch master exists" \\
  || miss "default branch master no longer exists"

# 4. Critical files exist
test -f "src/NSwag.AspNetCore/Extensions/NSwagServiceCollectionExtensions.cs" \\
  && ok "src/NSwag.AspNetCore/Extensions/NSwagServiceCollectionExtensions.cs" \\
  || miss "missing critical file: src/NSwag.AspNetCore/Extensions/NSwagServiceCollectionExtensions.cs"
test -f "src/NSwag.AspNetCore/Middlewares/OpenApiDocumentMiddleware.cs" \\
  && ok "src/NSwag.AspNetCore/Middlewares/OpenApiDocumentMiddleware.cs" \\
  || miss "missing critical file: src/NSwag.AspNetCore/Middlewares/OpenApiDocumentMiddleware.cs"
test -f "src/NSwag.Annotations/OpenApiOperationAttribute.cs" \\
  && ok "src/NSwag.Annotations/OpenApiOperationAttribute.cs" \\
  || miss "missing critical file: src/NSwag.Annotations/OpenApiOperationAttribute.cs"
test -f "src/NSwag.AspNetCore/Extensions/NSwagSwaggerGeneratorSettingsExtensions.cs" \\
  && ok "src/NSwag.AspNetCore/Extensions/NSwagSwaggerGeneratorSettingsExtensions.cs" \\
  || miss "missing critical file: src/NSwag.AspNetCore/Extensions/NSwagSwaggerGeneratorSettingsExtensions.cs"
test -f "Directory.Build.props" \\
  && ok "Directory.Build.props" \\
  || miss "missing critical file: Directory.Build.props"

# 5. Repo recency
days_since_last=$(( ( $(date +%s) - $(git log -1 --format=%at 2>/dev/null || echo 0) ) / 86400 ))
if [ "$days_since_last" -le 32 ]; then
  ok "last commit was $days_since_last days ago (artifact saw ~2d)"
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/RicoSuter/NSwag"
  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>

TL;DR

NSwag is a unified .NET/TypeScript code generator that produces OpenAPI 3.0/Swagger 2.0 specifications from ASP.NET (Core) controllers and generates strongly-typed client code (C#, TypeScript, Java) from those specs. It replaces the need for separate tools like Swashbuckle and AutoRest by handling both spec generation and client generation in one toolchain. Monorepo structure: src/NSwag.Annotations/ contains attributes for ASP.NET controller decoration; core generation logic in src/ (not fully listed but inferred); Liquid templates (142K LOC) for multi-language code generation; build/ directory uses Nuke build orchestration; docs/tutorials/ has runnable example projects. GitHub Actions workflows automate testing and publishing to NuGet/npm.

👥Who it's for

.NET backend developers building REST APIs in ASP.NET Core who need to generate and serve OpenAPI docs, and frontend developers (TypeScript/JavaScript, Angular, React) who need auto-generated, type-safe HTTP clients that stay in sync with API changes.

🌱Maturity & risk

Highly mature and production-ready. Active GitHub Actions CI/CD pipeline (build.yml, pr.yml), distributed across NuGet and npm with versioning badges, maintained by Rico Suter with consistent contribution history. The project integrates established patterns (Swagger UI middleware, NJsonSchema integration) and has extensive documentation in the wiki.

Standard open source risks apply.

Active areas of work

The project is actively maintained with CI/CD running on every commit via GitHub Actions workflows. Recent focus includes OpenAPI 3.0 spec compliance, TypeScript client generation improvements (evidenced by TypeScript 4.3.5 and @types packages in devDependencies), and onboarding new documentation (Apimundo announcement in README suggests evolving ecosystem).

🚀Get running

git clone https://github.com/RicoSuter/NSwag.git
cd NSwag
./build.ps1  # PowerShell on Windows, or build.sh on Linux/macOS

The build uses Nuke (see build/_build.csproj). For quick CLI use, install from NuGet: dotnet add package NSwag.Core.

Daily commands: From root:

./build.ps1 # Windows
./build.sh  # Linux/macOS
dotnet build src/NSwag.sln

For CLI generation, install nswag CLI and run nswag run config.nswag (see docs/tutorials/GenerateProxyClientWithCLI/sample.nswag for example config).

🗺️Map of the codebase

  • src/NSwag.AspNetCore/Extensions/NSwagServiceCollectionExtensions.cs — Core ASP.NET Core integration point that registers NSwag services and configures OpenAPI document generation in the DI container
  • src/NSwag.AspNetCore/Middlewares/OpenApiDocumentMiddleware.cs — Primary middleware that handles OpenAPI/Swagger document generation and serves it at configured endpoints; all documentation requests flow through here
  • src/NSwag.Annotations/OpenApiOperationAttribute.cs — Core annotation framework allowing developers to declaratively customize OpenAPI operation metadata on controller actions
  • src/NSwag.AspNetCore/Extensions/NSwagSwaggerGeneratorSettingsExtensions.cs — Configuration extension layer that bridges ASP.NET Core DI to NJsonSchema code generation settings
  • Directory.Build.props — Root MSBuild properties defining versioning, package metadata, and build defaults across all 600 files in the solution
  • build/Build.cs — NUKE build orchestration entry point controlling compilation, testing, NuGet packing, and CI/CD workflows
  • src/NSwag.AspNetCore/OpenApiDocumentProvider.cs — Orchestrates reflection-based API endpoint discovery and translates ASP.NET Core routes into OpenAPI specifications

🛠️How to make changes

Add Custom Metadata to an Existing Endpoint

  1. Decorate the action method with OpenApiOperationAttribute from src/NSwag.Annotations/ (src/NSwag.Annotations/OpenApiOperationAttribute.cs)
  2. Set properties like OperationId, Tags, Summary, and Description (YourController.cs (user code))
  3. Optionally add SwaggerResponseAttribute for non-200 responses (src/NSwag.Annotations/SwaggerResponseAttribute.cs)
  4. Rebuild and restart; OpenApiDocumentProvider in src/NSwag.AspNetCore/OpenApiDocumentProvider.cs will reflect the attributes

Register NSwag in a New ASP.NET Core Project

  1. Call AddOpenApiDocument() in Program.cs via NSwagServiceCollectionExtensions (src/NSwag.AspNetCore/Extensions/NSwagServiceCollectionExtensions.cs)
  2. Configure settings (document name, version, title) via OpenApiDocumentMiddlewareSettings (src/NSwag.AspNetCore/OpenApiDocumentMiddlewareSettings.cs)
  3. Call MapOpenApiDocuments() and optionally MapSwaggerUi() in NSwagApplicationBuilderExtensions (src/NSwag.AspNetCore/Extensions/NSwagApplicationBuilderExtensions.cs)
  4. Middleware will auto-discover endpoints via OpenApiDocumentProvider reflection and serve at /swagger/v1/swagger.json

Exclude Controllers or Actions from OpenAPI Spec

  1. Decorate controller or action with OpenApiIgnoreAttribute (src/NSwag.Annotations/OpenApiIgnoreAttribute.cs)
  2. On rebuild, OpenApiDocumentProvider.cs will skip those endpoints during reflection-based discovery

Customize File Upload/Multipart Handling

  1. Mark file parameters with OpenApiFileAttribute (src/NSwag.Annotations/OpenApiFileAttribute.cs)
  2. OpenApiDocumentProvider will generate multipart/form-data schema with file type

🔧Why these technologies

  • ASP.NET Core — Primary target platform for zero-friction API documentation and codegen in modern .NET applications
  • Reflection / Roslyn — Enables automatic endpoint discovery and metadata extraction from controller attributes without manual registration
  • NJsonSchema — Unified JSON Schema generation for OpenAPI specs, ensuring consistent type/validation representation across C#, TypeScript, and other targets
  • NUKE Build — Strongly-typed, C#-based build orchestration allowing same language for CI/CD pipeline and build logic
  • MSBuild / NuGet — Standard .NET packaging and distribution; enables seamless integration into Visual Studio and dotnet CLI workflows

⚖️Trade-offs already made

  • Reflection-based endpoint discovery vs. explicit registration

    • Why: Reflection is more convenient for developers (no boilerplate registration) and auto-picks up new endpoints
    • Consequence: Slower startup time (50–200ms per doc generation), potential false positives if API surface is large; mitigated by in-app caching
  • Support both legacy (OWIN/WebAPI) and modern (ASP.NET Core) frameworks

    • Why: Backward compatibility and enterprise adoption where legacy apps still exist
    • Consequence: Code duplication across NSwag.AspNet.Owin and NSwag.AspNetCore; higher maintenance burden but wider addressable market
  • Attributes-based customization (OpenApiOperationAttribute, SwaggerResponseAttribute) vs. fluent builder API

    • Why: Attributes are declarative and co-located with endpoint code; more discoverable for users
    • Consequence: Less flexible for cross-cutting customization; builders can be added separately if needed
  • Single monolithic OpenAPI spec vs. per-document strategy (OpenApiDocumentRegistration

    • Why: undefined
    • Consequence: undefined

🪤Traps & gotchas

Build system: Uses Nuke (not raw MSBuild); scripts are at build/_build.csproj and invoked via build.ps1/build.sh. Language versions: Global .NET SDK version in global.json; TypeScript 4.3.5 is pinned—newer may break Liquid template output. Liquid templates: Code generation logic lives in .liquid files (not standard C#), so string-based metaprogramming is pervasive. Multi-targeting: NSwag targets .NET Framework, .NET Core, and .NET 5+ simultaneously; build matrix complexity in CI/CD. Annotations: ASP.NET attributes in src/NSwag.Annotations/ must match current ASP.NET Core versions or reflection will miss metadata.

🏗️Architecture

💡Concepts to learn

  • JSON Schema to Code Generation — NSwag's core capability—it converts JSON Schema definitions (derived from .NET types) into strongly-typed client code across languages; understanding schema structure is essential for debugging code generation issues.
  • OpenAPI 3.0 Specification — NSwag must emit valid OpenAPI 3.0 specs from ASP.NET controllers; understanding the spec's operation, parameter, and response structures is critical for troubleshooting spec generation.
  • Liquid Templating Engine — All multi-language code generation (C#, TypeScript, Java) uses Liquid templates (142K LOC); modifying client generation requires Liquid syntax knowledge, not just C#.
  • ASP.NET Controller Reflection — NSwag uses .NET reflection to inspect Web API controllers' methods, parameters, and return types at build time to extract API contracts; understanding reflection is essential for annotation processing.
  • Type Inheritance and Polymorphism in JSON Schema — NSwag must map C# class hierarchies to JSON Schema discriminators and allOf patterns; the README explicitly mentions inheritance as a feature that NSwag handles better than competitors.
  • Enum Serialization Strategies — NSwag supports multiple enum representations in OpenAPI (string, integer, flags); the README highlights enum handling as a differentiator; understanding enum modes is critical for API contract correctness.
  • Nuke Build Automation Framework — The entire build pipeline (compile, test, pack, publish to NuGet/npm) is orchestrated via Nuke (C# DSL), not traditional MSBuild—contributors must understand Nuke tasks to modify CI/CD or local builds.
  • RicoSuter/NJsonSchema — Heavy dependency of NSwag for JSON Schema parsing and C#/TypeScript class generation; understand this to understand how NSwag derives schemas from types.
  • swagger-api/swagger-ui — NSwag serves Swagger UI via ASP.NET middleware; understanding Swagger UI's API expectations clarifies how NSwag's OpenAPI output is consumed.
  • OpenAPITools/openapi-generator — Competing monolithic code generator for OpenAPI specs (Java-based); NSwag is the .NET-native alternative with tighter ASP.NET integration.
  • domaindrivendev/Swashbuckle.AspNetCore — Predecessor tool (Swagger generation only, not client generation); NSwag was designed to combine Swashbuckle + AutoRest functionality.
  • RicoSuter/Namotion.Reflection — Companion library for advanced .NET type reflection used by NSwag and NJsonSchema to extract metadata beyond standard reflection APIs.

🪄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 TypeScript unit tests for NSwag CLI code generation

The repo has TypeScript dependencies (@types/node, typescript, axios) and npm tooling, but no visible test files in src/ for the TypeScript/npm package logic. Given that NSwag generates TypeScript clients, adding Jest/Vitest tests would validate the code generation pipeline and prevent regressions in client generation.

  • [ ] Create tests/unit/ directory structure
  • [ ] Add Jest or Vitest configuration to package.json
  • [ ] Write tests for core TypeScript generation logic (likely in src/NSwag.TypeScript or equivalent)
  • [ ] Add GitHub Action workflow .github/workflows/test-typescript.yml to run tests on PR
  • [ ] Document testing approach in CONTRIBUTING.md

Add integration tests for OWIN middleware OpenAPI documentation serving

src/NSwag.AspNet.Owin/ contains middleware for serving OpenAPI docs (OpenApiDocumentMiddleware.cs, SwaggerUiIndexMiddleware.cs) but there are no visible integration test files validating that the middleware correctly serves Swagger UI, ReDoc, and OpenAPI JSON. This is critical for a toolchain repo.

  • [ ] Create src/NSwag.AspNet.Owin.Tests/ directory
  • [ ] Add xUnit tests for OpenApiDocumentMiddleware to verify JSON output and caching
  • [ ] Add tests for SwaggerUiIndexMiddleware to validate HTML serving and asset routing
  • [ ] Test ReDoc index.html serving with correct script injection
  • [ ] Add integration test project to build/ configuration

Add GitHub Actions workflow for dependency vulnerability scanning

The repo has complex dependencies (angular 1.8.3 is EOL, axios, multiple @types packages) but .github/workflows/ only shows build.yml and pr.yml. A Dependabot or Snyk workflow would catch security issues early, especially important for a code generation tool that analyzes user APIs.

  • [ ] Create .github/dependabot.yml with npm and NuGet configuration
  • [ ] Add .github/workflows/security-scan.yml using GitHub's CodeQL or similar
  • [ ] Update Directory.Packages.props to audit transitive dependencies
  • [ ] Document security policy in SECURITY.md
  • [ ] Configure branch protection rules to require security checks

🌿Good first issues

  • Add C# XML documentation parsing for OpenApiIgnoreAttribute.cs and related Annotations—currently these are minimally documented for IDE IntelliSense; a PR adding /// <summary> blocks would improve developer experience.
  • Extend the docs/tutorials/GenerateProxyClientWithCLI/ directory with runnable examples for TypeScript/Angular and C# console app client generation—currently only a config sample exists; add step-by-step walkthroughs.
  • Create integration tests for Liquid template output validation—with 142K LOC of templates, verify that C#, TypeScript, and Java code generation produce syntactically valid output for a standard OpenAPI 3.0 spec (similar to golden-file testing).

Top contributors

Click to expand

📝Recent commits

Click to expand
  • 2389c07 — Upgrade to NJsonSchema v11.6.1 (NSwag v14.7.1) (#5367) (RicoSuter)
  • b108f11 — Update to NJsonSchema v11.6.0 and Namotion.Reflection v3.5.0 (v14.7.0) (#5357) (RicoSuter)
  • eac9c1f — Fix duplicate client/operation names when operation IDs contain multiple underscores (#5348) (Copilot)
  • c93797f — Fix compile error in generated C# client when media type contains quotes (#5345) (bkoelman)
  • c5fcfd4 — Fix legacy document transformation (#5315) (copyleftproducts)
  • 160d11a — fix axios template: [object Object] is not valid JSON. (#5283) (adnanalbeda)
  • 3d5b62b — Default missing attributes to empty array in OperationResponseProcessor (#5337) (MeikelLP)
  • 2a5ca6e — Remove runtime arg before calling dotnet app (#5320) (ptasev)
  • 75d8a4a — Upgrade to NUKE 10.1.0 (#5314) (lahma)
  • 52fc6cd — Upgrade to NUKE 10 (#5310) (lahma)

🔒Security observations

The NSwag codebase has moderate security concerns, primarily driven by outdated dependencies in the npm package ecosystem. The most critical issues are outdated TypeScript (v4.3.5 from 2021) and the inclusion of legacy frameworks like AngularJS 1.x which no longer receive security updates. The lack of a visible lock file creates supply chain risks. While the C#/.NET components appear structurally sound for an OpenAPI toolchain, the JavaScript/TypeScript dependencies need immediate updating to patch known vulnerabilities. Additionally, there

  • High · Outdated TypeScript Dependency — package.json - devDependencies. TypeScript is pinned to version 4.3.5, which was released in June 2021 and is significantly outdated. This version contains known security vulnerabilities and lacks security patches available in current versions (5.x). Fix: Update TypeScript to the latest stable version (^5.0.0 or higher) to receive security patches and bug fixes.
  • High · Outdated Node.js Types — package.json - devDependencies. @types/node is pinned to ^24.1.0 but the major version 24 is significantly ahead of Node.js LTS versions. This mismatch could indicate dependency management issues and potential type safety problems. Fix: Align @types/node version with the target Node.js LTS version being used. Verify compatibility between all packages.
  • Medium · Loose Dependency Pinning with Caret (^) — package.json - all devDependencies. Most dependencies use caret (^) versioning which allows minor and patch version changes. Combined with outdated base versions, this could introduce breaking changes or security issues from minor version updates. Fix: Consider using more restrictive version constraints (exact versions or tilde ~) for critical dependencies, especially security-sensitive packages like axios.
  • Medium · Axios HTTP Client - Version Verification Needed — package.json - devDependencies. Axios ^1.11.0 is specified. While relatively recent, this range allows updates to 1.x versions. Axios has had CVEs in the past related to SSRF and other security issues. No lock file visible to verify actual installed version. Fix: Verify the exact installed version using package-lock.json or yarn.lock. Check axios security advisories at npmjs.com and update to ^1.7.0 or higher if available.
  • Medium · jQuery Dependency - Legacy Library — package.json - devDependencies. @types/jquery is included but jQuery is not explicitly listed. This suggests potential unused dependencies or missing dependency declarations. jQuery has a history of XSS vulnerabilities and is considered legacy. Fix: Verify if jQuery is actually used. If not, remove @types/jquery. If used, ensure jQuery is properly declared and update to the latest version.
  • Low · Angular 1.x - End of Life Framework — package.json - devDependencies. Angular ^1.8.3 is specified. Angular 1.x (AngularJS) reached end-of-life in 2021 and no longer receives security updates. This version is vulnerable to XSS attacks and other security issues. Fix: Consider migrating to Angular 2+ or a modern alternative framework. If AngularJS must be used, implement strict CSP headers and HTML sanitization.
  • Low · Missing Lock File in Repository — Repository root. No package-lock.json, yarn.lock, or pnpm-lock.yaml file is visible in the provided structure. This makes dependency version pinning unreliable and creates supply chain risks. Fix: Commit a lock file (package-lock.json) to the repository to ensure reproducible builds and prevent unexpected dependency updates.
  • Low · Potential Swagger/Swagger-UI Security Considerations — src/NSwag.AspNet.Owin/SwaggerUi/. The codebase includes Swagger UI assets and OpenAPI documentation generation. Swagger UI can expose sensitive API information if not properly configured with authentication/authorization. Fix: Ensure Swagger UI is disabled or protected in production environments. Implement authentication and authorization checks before exposing API documentation.

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


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

Healthy signals · RicoSuter/NSwag — RepoPilot