Skip to main content
VcsManager · .NET 10

One API.
Any Git provider.

A unified .NET abstraction for GitHub, GitLab, Azure DevOps, and Gitea. Create repositories and pull requests, merge or close them, and add retries, timeouts, logging, and telemetry without changing your application code.

Works with
  • GitHub
  • GitLab
  • Azure DevOps
  • Gitea
Program.csVcsManager.GitHub
ConfigureGitHubwith one builder
// GitHub
var provider = new VcsProviderBuilder()
    .WithGitHub(options =>
    {
        options.Token = Environment
            .GetEnvironmentVariable("VCS_GITHUB_TOKEN");
        options.DefaultOwner = "my-org";
    })
    .Build();
Read the GitHub guide →

One contract, every provider

Repository and pull request automation that stays portable when the provider changes.

01

Unified API

Create, list, get, and delete repositories. Create, list, get, merge, and close pull requests through one contract.

02

Four providers

Use GitHub, GitLab, Azure DevOps, or Gitea without changing your application logic. Swap the package and configuration.

03

Modular packages

The core package has no provider SDK. Install only the provider packages your application uses.

04

Pagination and errors

One page shape with nullable totals and provider-driven next-page metadata. One exception family for every provider.

05

Operational layers

Add retries, timeouts, concurrency limits, logging, and OpenTelemetry without modifying provider code.

06

Flexible configuration

Configure with the fluent API, environment variables, or YAML. The last configuration source wins.

Start with the core package
$dotnet add package VcsManager.Core

Configure your way

Register a provider, choose a configuration source, and build. Every source produces the same settings dictionary.

Program.cs
using VcsManager;
using VcsManager.Builder;
using VcsManager.GitHub;

await using var provider = new VcsProviderBuilder()
.WithGitHub(options =>
{
options.Token = Environment.GetEnvironmentVariable("VCS_GITHUB_TOKEN");
options.DefaultOwner = "my-org";
})
.Build();

var repository = await provider.GetRepositoryAsync(new RepositoryRef
{
Owner = "my-org",
Name = "payments-api",
});

Console.WriteLine(repository.FullName);