From 72de2654697e871222d48e96131516ed41fd026f Mon Sep 17 00:00:00 2001
From: devlooped-bot <bot@devlooped.com>
Date: Tue, 31 Mar 2026 00:25:57 +0000
Subject: [PATCH] =?UTF-8?q?=E2=AC=86=EF=B8=8F=20Bump=20files=20with=20dotn?=
 =?UTF-8?q?et-file=20sync=20=EF=BB=BF#=20devlooped/oss?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

- Update branches for push event in build.yml https://github.com/devlooped/oss/commit/5da103c
- Ignore *.local recursively https://github.com/devlooped/oss/commit/a225b7a
- Keep the --yes on dnx runfile https://github.com/devlooped/oss/commit/9c2f8c7
- Ensure dnx run succeeds even on Windows https://github.com/devlooped/oss/commit/7f5f9ee
- Update create-pull-request action to version 8 https://github.com/devlooped/oss/commit/0662872
- Add readme template https://github.com/devlooped/oss/commit/2cc4ada
---
 .github/workflows/build.yml    |   7 +--
 .github/workflows/includes.yml |   4 +-
 .github/workflows/publish.yml  |   5 +-
 .gitignore                     |   1 +
 .netconfig                     |  26 ++++++---
 oss.cs                         | 100 +++++++++++++++++++++++++++++++++
 readme.md                      |  12 ++--
 readme.tmp.md                  |  63 +++++++++++++++++++++
 8 files changed, 193 insertions(+), 25 deletions(-)
 create mode 100644 oss.cs
 create mode 100644 readme.tmp.md

diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index d6bd793..94db3ff 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -12,7 +12,7 @@ on:
         - Release
         - Debug
   push:
-    branches: [ main, dev, 'dev/*', 'feature/*', 'rel/*' ]
+    branches: [ main, 'feature/*', 'rel/*' ]
     paths-ignore:
       - changelog.md
       - readme.md
@@ -72,9 +72,8 @@ jobs:
         run: dotnet build -m:1 -bl:build.binlog
 
       - name: 🧪 test
-        run: |
-          dotnet tool update -g dotnet-retest
-          dotnet retest -- --no-build
+        shell: pwsh
+        run: dnx --yes retest -- --no-build
 
       - name: 🐛 logs
         uses: actions/upload-artifact@v4
diff --git a/.github/workflows/includes.yml b/.github/workflows/includes.yml
index b591d40..fc6dbeb 100644
--- a/.github/workflows/includes.yml
+++ b/.github/workflows/includes.yml
@@ -50,11 +50,11 @@ jobs:
           ((get-content -raw $file) -replace '\$product\$',$product).trim() | set-content $file
 
       - name: ✍ pull request
-        uses: peter-evans/create-pull-request@v6
+        uses: peter-evans/create-pull-request@v8
         with:
           add-paths: |
             **.md
-            osmfeula.txt
+            *.txt
           base: main
           branch: markdown-includes
           delete-branch: true
diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml
index 03e57d9..035d811 100644
--- a/.github/workflows/publish.yml
+++ b/.github/workflows/publish.yml
@@ -34,9 +34,8 @@ jobs:
         run: dotnet build -m:1 -bl:build.binlog
 
       - name: 🧪 test
-        run: |
-          dotnet tool update -g dotnet-retest
-          dotnet retest -- --no-build
+        shell: pwsh
+        run: dnx --yes retest -- --no-build
 
       - name: 🐛 logs
         uses: actions/upload-artifact@v4
diff --git a/.gitignore b/.gitignore
index 0fe79fb..dfe1fe0 100644
--- a/.gitignore
+++ b/.gitignore
@@ -12,6 +12,7 @@ BenchmarkDotNet.Artifacts
 .idea
 local.settings.json
 .env
+*.local
 
 *.suo
 *.sdf
diff --git a/.netconfig b/.netconfig
index 2d8f60d..571fe21 100644
--- a/.netconfig
+++ b/.netconfig
@@ -85,9 +85,9 @@
 [file ".github/workflows/build.yml"]
 	url = https://github.com/devlooped/oss/blob/main/.github/workflows/build.yml
 	weak
-	sha = 56c2b8532c2f86235a0f5bd00ba6eba126f199cf
+	sha = 5da103cfbc1c4f9b5f59cfa698d2afbd744a7525
 
-	etag = bf99c19427f4372ecfe38ec56aa8c411058684fb717da5661f17ac00388b3602
+	etag = 851af098748f7cfa5bc3cfd4cc404a6de930532b59ceb2b3b535282c41226f3a
 [file ".github/workflows/changelog.config"]
 	url = https://github.com/devlooped/oss/blob/main/.github/workflows/changelog.config
 	sha = 08d83cb510732f861416760d37702f9f55bd7f9e
@@ -99,21 +99,21 @@
 	skip
 [file ".github/workflows/includes.yml"]
 	url = https://github.com/devlooped/oss/blob/main/.github/workflows/includes.yml
-	sha = 2d1fb4ed52b63689f2b20b994512ebac28721243
+	sha = 06628725a6303bb8c4cf3076a384fc982a91bc0b
 
-	etag = 34ade86f020dea717c6a27ad7dcd0069c35be2832c58b0ba961278a1efe34089
+	etag = 478f91d4126230e57cc601382da1ba23f9daa054645b4af89800d8dd862e64fd
 	weak
 [file ".github/workflows/publish.yml"]
 	url = https://github.com/devlooped/oss/blob/main/.github/workflows/publish.yml
 	weak
-	sha = 56c2b8532c2f86235a0f5bd00ba6eba126f199cf
+	sha = 7f5f9ee9f362f7e8f951d618f8f799033550e687
 
-	etag = 2ef43521627aa3a91dd55bdc2856ec0c6a93b42485d4fe9d6b181f9ee42c8e18
+	etag = c60411d1aa4e98e7f69e2d34cbccb8eb7e387ec11f6f8e78ee8d8b92122d7025
 [file ".gitignore"]
 	url = https://github.com/devlooped/oss/blob/main/.gitignore
-	sha = 3776526342afb3f57da7e80f2095e5fdca3c31c9
+	sha = a225b7a9f609f26bcc24e0d84f663387be251a7d
 
-	etag = 11767f73556aa4c6c8bcc153b77ee8e8114f99fa3b885b0a7d66d082f91e77b3
+	etag = 20a8b49d57024abbd85aac5b0020c30e5eb68e0384b2761e93727c8780c4a991
 	weak
 [file "Directory.Build.rsp"]
 	url = https://github.com/devlooped/oss/blob/main/Directory.Build.rsp
@@ -162,3 +162,13 @@
 	sha = 666a2a7c315f72199c418f11482a950fc69a8901
 	etag = 91ea15c07bfd784036c6ca931f5b2df7e9767b8367146d96c79caef09d63899f
 	weak
+[file "oss.cs"]
+	url = https://github.com/devlooped/oss/blob/main/oss.cs
+	sha = 9c2f8c729d7cd3dd052b5a09d12fb1f3926247e5
+	etag = e195cacdb0c6ea7ca768514ec94f8595d008c7f5aae805b39beec330895045e3
+	weak
+[file "readme.tmp.md"]
+	url = https://github.com/devlooped/oss/blob/main/readme.tmp.md
+	sha = 2cc4ada8059b1e2e3f32089e67dab27a8ddeb7fb
+	etag = c7c0694bd13d2d7fdc8b0530c80d5cf032cb9fdaaa5e1f814e951e9e6489746a
+	weak
diff --git a/oss.cs b/oss.cs
new file mode 100644
index 0000000..4288b77
--- /dev/null
+++ b/oss.cs
@@ -0,0 +1,100 @@
+// First run: dnx runfile https://github.com/devlooped/oss/blob/main/oss.cs --yes --alias oss
+// Subsequently: dnx runfile oss --yes
+#:package Spectre.Console@*
+#:package CliWrap@*
+
+using System;
+using System.IO;
+using System.Net.Http;
+using System.Runtime.InteropServices;
+using System.Threading.Tasks;
+using CliWrap;
+using Spectre.Console;
+
+string dotnet = Path.GetFullPath(
+    Path.Combine(RuntimeEnvironment.GetRuntimeDirectory(), "..", "..", "..",
+    RuntimeInformation.IsOSPlatform(OSPlatform.Windows) ? "dotnet.exe" : "dotnet"));
+
+AnsiConsole.Write(new FigletText("devlooped oss").Color(Color.Green));
+AnsiConsole.WriteLine();
+
+var projectName = AnsiConsole.Prompt(
+    new TextPrompt<string>("[green]Project name[/]:")
+        .PromptStyle("yellow")
+        .ValidationErrorMessage("[red]Project name cannot be empty[/]")
+        .Validate(v => !string.IsNullOrWhiteSpace(v)));
+
+var repoName = AnsiConsole.Prompt(
+    new TextPrompt<string>("[green]Repo name[/]:")
+        .PromptStyle("yellow")
+        .DefaultValue(projectName));
+
+var packageId = AnsiConsole.Prompt(
+    new TextPrompt<string>("[green]Package ID[/]:")
+        .PromptStyle("yellow")
+        .DefaultValue($"Devlooped.{projectName}"));
+
+AnsiConsole.WriteLine();
+AnsiConsole.Write(new Rule("[yellow]Setting up OSS project[/]").RuleStyle("grey").LeftJustified());
+AnsiConsole.WriteLine();
+
+await RunDotNet("file init https://github.com/devlooped/oss/blob/main/.netconfig", "Initializing dotnet file sync from devlooped/oss");
+await RunDotNet($"new classlib -n {projectName} -o src/{projectName} -f net10.0", $"Creating class library src/{projectName}");
+await RunDotNet($"new xunit -n Tests -o src/Tests -f net10.0", "Creating xUnit test project src/Tests");
+await RunDotNet($"add src/Tests/Tests.csproj reference src/{projectName}/{projectName}.csproj", $"Adding reference from Tests to {projectName}");
+await RunDotNet($"new solution -n {projectName}", $"Creating solution {projectName}.slnx");
+await RunDotNet($"sln {projectName}.slnx add src/{projectName}/{projectName}.csproj src/Tests/Tests.csproj", $"Adding projects to {projectName}.slnx");
+
+await AnsiConsole.Status()
+    .Spinner(Spinner.Known.Dots)
+    .SpinnerStyle(Style.Parse("green"))
+    .StartAsync("Downloading readme.md template...", async ctx =>
+    {
+        using var http = new HttpClient();
+        var readmeContent = await http.GetStringAsync(
+            "https://raw.githubusercontent.com/devlooped/oss/main/readme.tmp.md");
+
+        readmeContent = readmeContent
+            .Replace("{{PROJECT_NAME}}", projectName)
+            .Replace("{{PACKAGE_ID}}", packageId)
+            .Replace("{{REPO_NAME}}", repoName);
+
+        await File.WriteAllTextAsync("readme.md", readmeContent);
+        ctx.Status("Downloaded and processed readme.md");
+    });
+
+AnsiConsole.MarkupLine("[green]✓[/] Created [yellow]readme.md[/]");
+
+await File.WriteAllTextAsync(
+    Path.Combine("src", projectName, "readme.md"),
+    $"""
+    [![EULA](https://img.shields.io/badge/EULA-OSMF-blue?labelColor=black&color=C9FF30)](osmfeula.txt)
+    [![OSS](https://img.shields.io/github/license/devlooped/oss.svg?color=blue)](license.txt)
+    [![GitHub](https://img.shields.io/badge/-source-181717.svg?logo=GitHub)](https://github.com/devlooped/{repoName})
+
+    <!-- include ../../readme.md#content -->
+
+    <!-- include https://github.com/devlooped/.github/raw/main/osmf.md -->
+
+    <!-- include https://github.com/devlooped/sponsors/raw/main/footer.md -->
+
+    <!-- exclude -->
+    """);
+
+AnsiConsole.WriteLine();
+AnsiConsole.Write(new Rule("[green]Done![/]").RuleStyle("grey").LeftJustified());
+AnsiConsole.WriteLine();
+AnsiConsole.MarkupLine($"[bold]Project:[/] [yellow]{projectName}[/]");
+AnsiConsole.MarkupLine($"[bold]Repo:[/] [yellow]{repoName}[/]");
+AnsiConsole.MarkupLine($"[bold]Package ID:[/] [yellow]{packageId}[/]");
+
+async Task RunDotNet(string command, string description)
+{
+    AnsiConsole.MarkupLine($"[grey]{Markup.Escape(description)}...[/]");
+    await Cli.Wrap(dotnet)
+        .WithArguments(command)
+        .WithStandardOutputPipe(PipeTarget.ToStream(Console.OpenStandardOutput()))
+        .WithStandardErrorPipe(PipeTarget.ToStream(Console.OpenStandardError()))
+        .ExecuteAsync();
+    AnsiConsole.MarkupLine($"[green]✓[/] {Markup.Escape(description)}");
+}
\ No newline at end of file
diff --git a/readme.md b/readme.md
index c7b6376..66bb7a8 100644
--- a/readme.md
+++ b/readme.md
@@ -504,9 +504,7 @@ The versioning scheme for packages is:
 [![Jacob Foshee](https://avatars.githubusercontent.com/u/480334?v=4&s=39 "Jacob Foshee")](https://github.com/jfoshee)
 [![](https://avatars.githubusercontent.com/u/33566379?u=bf62e2b46435a267fa246a64537870fd2449410f&v=4&s=39 "")](https://github.com/Mrxx99)
 [![Eric Johnson](https://avatars.githubusercontent.com/u/26369281?u=41b560c2bc493149b32d384b960e0948c78767ab&v=4&s=39 "Eric Johnson")](https://github.com/eajhnsn1)
-[![David JENNI](https://avatars.githubusercontent.com/u/3200210?v=4&s=39 "David JENNI")](https://github.com/davidjenni)
 [![Jonathan ](https://avatars.githubusercontent.com/u/5510103?u=98dcfbef3f32de629d30f1f418a095bf09e14891&v=4&s=39 "Jonathan ")](https://github.com/Jonathan-Hickey)
-[![Charley Wu](https://avatars.githubusercontent.com/u/574719?u=ea7c743490c83e8e4b36af76000f2c71f75d636e&v=4&s=39 "Charley Wu")](https://github.com/akunzai)
 [![Ken Bonny](https://avatars.githubusercontent.com/u/6417376?u=569af445b6f387917029ffb5129e9cf9f6f68421&v=4&s=39 "Ken Bonny")](https://github.com/KenBonny)
 [![Simon Cropp](https://avatars.githubusercontent.com/u/122666?v=4&s=39 "Simon Cropp")](https://github.com/SimonCropp)
 [![agileworks-eu](https://avatars.githubusercontent.com/u/5989304?v=4&s=39 "agileworks-eu")](https://github.com/agileworks-eu)
@@ -514,15 +512,13 @@ The versioning scheme for packages is:
 [![Vezel](https://avatars.githubusercontent.com/u/87844133?v=4&s=39 "Vezel")](https://github.com/vezel-dev)
 [![ChilliCream](https://avatars.githubusercontent.com/u/16239022?v=4&s=39 "ChilliCream")](https://github.com/ChilliCream)
 [![4OTC](https://avatars.githubusercontent.com/u/68428092?v=4&s=39 "4OTC")](https://github.com/4OTC)
-[![Vincent Limo](https://avatars.githubusercontent.com/devlooped-user?s=39 "Vincent Limo")](https://github.com/v-limo)
 [![domischell](https://avatars.githubusercontent.com/u/66068846?u=0a5c5e2e7d90f15ea657bc660f175605935c5bea&v=4&s=39 "domischell")](https://github.com/DominicSchell)
-[![Justin Wendlandt](https://avatars.githubusercontent.com/u/1068431?u=f7715ed6a8bf926d96ec286f0f1c65f94bf86928&v=4&s=39 "Justin Wendlandt")](https://github.com/jwendl)
 [![Adrian Alonso](https://avatars.githubusercontent.com/u/2027083?u=129cf516d99f5cb2fd0f4a0787a069f3446b7522&v=4&s=39 "Adrian Alonso")](https://github.com/adalon)
-[![Michael Hagedorn](https://avatars.githubusercontent.com/u/61711586?u=8f653dfcb641e8c18cc5f78692ebc6bb3a0c92be&v=4&s=39 "Michael Hagedorn")](https://github.com/Eule02)
 [![torutek](https://avatars.githubusercontent.com/u/33917059?v=4&s=39 "torutek")](https://github.com/torutek)
-[![mccaffers](https://avatars.githubusercontent.com/u/16667079?u=739e110e62a75870c981640447efa5eb2cb3bc8f&v=4&s=39 "mccaffers")](https://github.com/mccaffers)
-[![Christoph Hochstätter](https://avatars.githubusercontent.com/u/17645550?u=01bbdcb84d03cac26260f1c951e046d24a324591&v=4&s=39 "Christoph Hochstätter")](https://github.com/christoh)
-[![ADS Fund](https://avatars.githubusercontent.com/u/202042116?v=4&s=39 "ADS Fund")](https://github.com/ADS-Fund)
+[![mccaffers](https://avatars.githubusercontent.com/u/16667079?u=110034edf51097a5ee82cb6a94ae5483568e3469&v=4&s=39 "mccaffers")](https://github.com/mccaffers)
+[![Seika Logiciel](https://avatars.githubusercontent.com/u/2564602?v=4&s=39 "Seika Logiciel")](https://github.com/SeikaLogiciel)
+[![Andrew Grant](https://avatars.githubusercontent.com/devlooped-user?s=39 "Andrew Grant")](https://github.com/wizardness)
+[![Lars](https://avatars.githubusercontent.com/u/1727124?v=4&s=39 "Lars")](https://github.com/latonz)
 
 
 <!-- sponsors.md -->
diff --git a/readme.tmp.md b/readme.tmp.md
new file mode 100644
index 0000000..1bd8e2f
--- /dev/null
+++ b/readme.tmp.md
@@ -0,0 +1,63 @@
+# {{PROJECT_NAME}}
+
+[![Version](https://img.shields.io/nuget/vpre/{{PACKAGE_ID}}.svg?color=royalblue)](https://www.nuget.org/packages/{{PACKAGE_ID}})
+[![Downloads](https://img.shields.io/nuget/dt/{{PACKAGE_ID}}.svg?color=darkmagenta)](https://www.nuget.org/packages/{{PACKAGE_ID}})
+[![EULA](https://img.shields.io/badge/EULA-OSMF-blue?labelColor=black&color=C9FF30)](https://github.com/devlooped/oss/blob/main/osmfeula.txt)
+[![License](https://img.shields.io/badge/license-MIT-blue.svg)](https://github.com/devlooped/oss/blob/main/license.txt)
+
+<!-- include https://github.com/devlooped/.github/raw/main/osmf.md -->
+## Open Source Maintenance Fee
+
+To ensure the long-term sustainability of this project, users of this package who generate 
+revenue must pay an [Open Source Maintenance Fee](https://opensourcemaintenancefee.org). 
+While the source code is freely available under the terms of the [License](license.txt), 
+this package and other aspects of the project require [adherence to the Maintenance Fee](osmfeula.txt).
+
+To pay the Maintenance Fee, [become a Sponsor](https://github.com/sponsors/devlooped) at the proper 
+OSMF tier. A single fee covers all of [Devlooped packages](https://www.nuget.org/profiles/Devlooped).
+
+<!-- https://github.com/devlooped/.github/raw/main/osmf.md -->
+<!-- #content -->
+## Usage
+*{{PROJECT_NAME}}*
+<!-- #content -->
+---
+<!-- include https://github.com/devlooped/sponsors/raw/main/footer.md -->
+# Sponsors 
+
+<!-- sponsors.md -->
+[![Clarius Org](https://avatars.githubusercontent.com/u/71888636?v=4&s=39 "Clarius Org")](https://github.com/clarius)
+[![MFB Technologies, Inc.](https://avatars.githubusercontent.com/u/87181630?v=4&s=39 "MFB Technologies, Inc.")](https://github.com/MFB-Technologies-Inc)
+[![SandRock](https://avatars.githubusercontent.com/u/321868?u=99e50a714276c43ae820632f1da88cb71632ec97&v=4&s=39 "SandRock")](https://github.com/sandrock)
+[![DRIVE.NET, Inc.](https://avatars.githubusercontent.com/u/15047123?v=4&s=39 "DRIVE.NET, Inc.")](https://github.com/drivenet)
+[![Keith Pickford](https://avatars.githubusercontent.com/u/16598898?u=64416b80caf7092a885f60bb31612270bffc9598&v=4&s=39 "Keith Pickford")](https://github.com/Keflon)
+[![Thomas Bolon](https://avatars.githubusercontent.com/u/127185?u=7f50babfc888675e37feb80851a4e9708f573386&v=4&s=39 "Thomas Bolon")](https://github.com/tbolon)
+[![Kori Francis](https://avatars.githubusercontent.com/u/67574?u=3991fb983e1c399edf39aebc00a9f9cd425703bd&v=4&s=39 "Kori Francis")](https://github.com/kfrancis)
+[![Uno Platform](https://avatars.githubusercontent.com/u/52228309?v=4&s=39 "Uno Platform")](https://github.com/unoplatform)
+[![Reuben Swartz](https://avatars.githubusercontent.com/u/724704?u=2076fe336f9f6ad678009f1595cbea434b0c5a41&v=4&s=39 "Reuben Swartz")](https://github.com/rbnswartz)
+[![Jacob Foshee](https://avatars.githubusercontent.com/u/480334?v=4&s=39 "Jacob Foshee")](https://github.com/jfoshee)
+[![](https://avatars.githubusercontent.com/u/33566379?u=bf62e2b46435a267fa246a64537870fd2449410f&v=4&s=39 "")](https://github.com/Mrxx99)
+[![Eric Johnson](https://avatars.githubusercontent.com/u/26369281?u=41b560c2bc493149b32d384b960e0948c78767ab&v=4&s=39 "Eric Johnson")](https://github.com/eajhnsn1)
+[![Jonathan ](https://avatars.githubusercontent.com/u/5510103?u=98dcfbef3f32de629d30f1f418a095bf09e14891&v=4&s=39 "Jonathan ")](https://github.com/Jonathan-Hickey)
+[![Ken Bonny](https://avatars.githubusercontent.com/u/6417376?u=569af445b6f387917029ffb5129e9cf9f6f68421&v=4&s=39 "Ken Bonny")](https://github.com/KenBonny)
+[![Simon Cropp](https://avatars.githubusercontent.com/u/122666?v=4&s=39 "Simon Cropp")](https://github.com/SimonCropp)
+[![agileworks-eu](https://avatars.githubusercontent.com/u/5989304?v=4&s=39 "agileworks-eu")](https://github.com/agileworks-eu)
+[![Zheyu Shen](https://avatars.githubusercontent.com/u/4067473?v=4&s=39 "Zheyu Shen")](https://github.com/arsdragonfly)
+[![Vezel](https://avatars.githubusercontent.com/u/87844133?v=4&s=39 "Vezel")](https://github.com/vezel-dev)
+[![ChilliCream](https://avatars.githubusercontent.com/u/16239022?v=4&s=39 "ChilliCream")](https://github.com/ChilliCream)
+[![4OTC](https://avatars.githubusercontent.com/u/68428092?v=4&s=39 "4OTC")](https://github.com/4OTC)
+[![domischell](https://avatars.githubusercontent.com/u/66068846?u=0a5c5e2e7d90f15ea657bc660f175605935c5bea&v=4&s=39 "domischell")](https://github.com/DominicSchell)
+[![Adrian Alonso](https://avatars.githubusercontent.com/u/2027083?u=129cf516d99f5cb2fd0f4a0787a069f3446b7522&v=4&s=39 "Adrian Alonso")](https://github.com/adalon)
+[![torutek](https://avatars.githubusercontent.com/u/33917059?v=4&s=39 "torutek")](https://github.com/torutek)
+[![mccaffers](https://avatars.githubusercontent.com/u/16667079?u=110034edf51097a5ee82cb6a94ae5483568e3469&v=4&s=39 "mccaffers")](https://github.com/mccaffers)
+[![Seika Logiciel](https://avatars.githubusercontent.com/u/2564602?v=4&s=39 "Seika Logiciel")](https://github.com/SeikaLogiciel)
+[![Andrew Grant](https://avatars.githubusercontent.com/devlooped-user?s=39 "Andrew Grant")](https://github.com/wizardness)
+[![Lars](https://avatars.githubusercontent.com/u/1727124?v=4&s=39 "Lars")](https://github.com/latonz)
+
+
+<!-- sponsors.md -->
+[![Sponsor this project](https://avatars.githubusercontent.com/devlooped-sponsor?s=118 "Sponsor this project")](https://github.com/sponsors/devlooped)
+
+[Learn more about GitHub Sponsors](https://github.com/sponsors)
+
+<!-- https://github.com/devlooped/sponsors/raw/main/footer.md -->
