diff --git a/.editorconfig b/.editorconfig
index 0dba85e7..c3952afb 100644
--- a/.editorconfig
+++ b/.editorconfig
@@ -38,6 +38,7 @@ indent_size = 2
# C# files
[*.cs]
+dotnet_public_api_analyzer.require_api_files = true
#### .NET Coding Conventions ####
# Organize usings
diff --git a/Directory.Build.props b/Directory.Build.props
index 2b686253..b4e9df32 100644
--- a/Directory.Build.props
+++ b/Directory.Build.props
@@ -1,4 +1,7 @@
+
+
+
net8.0
@@ -12,5 +15,7 @@
1.9.0
false
+ true
+ true
diff --git a/Directory.Packages.props b/Directory.Packages.props
index 2ec36416..6d46db56 100644
--- a/Directory.Packages.props
+++ b/Directory.Packages.props
@@ -31,5 +31,8 @@
+
+
+
\ No newline at end of file
diff --git a/docs/images/public-api-warning-example.png b/docs/images/public-api-warning-example.png
new file mode 100644
index 00000000..853eab02
Binary files /dev/null and b/docs/images/public-api-warning-example.png differ
diff --git a/docs/public-api.md b/docs/public-api.md
new file mode 100644
index 00000000..5f92885f
--- /dev/null
+++ b/docs/public-api.md
@@ -0,0 +1,62 @@
+# Public API Management with Microsoft.CodeAnalysis.PublicApiAnalyzers
+
+We use `Microsoft.CodeAnalysis.PublicApiAnalyzers` in this repository. By using this analyzer, we can keep track of changes to the public API.
+
+## Integration Packages
+
+We have several packages called integration. For each of these packages, we add a public API. Each package should have the following files:
+- `PublicAPI.Shipped.txt`
+- `PublicAPI.Unshipped.txt`
+
+## Creating/Updating Public API Files
+
+### Steps for Contributors
+
+
+1. **Create these two files**:
+
+- `PublicAPI.Shipped.txt`
+- `PublicAPI.Unshipped.txt`
+
+If you're using nullable reference types, then add the following line at the top of each `PublicAPI.*.txt` file:
+```
+#nullable enable
+```
+
+2. **Add New Public API**:
+
+ - In `PublicAPI.Shipped.txt`, list all the public APIs you've given out.
+ - In `PublicAPI.Unshipped.txt`, list any preview or soon-to-change APIs. For example, if an API will soon be removed (marked with `[Obsolete]`), add it here so you remember to take it out later.
+
+ - Consider the following representative C# public class:
+ ```csharp
+ namespace Demo;
+
+ public class MyClass
+ {
+ public Task DoSomethingAsync(Uri uri, CancellationToken cancellationToken)
+ {
+ return Task.CompletedTask;
+ }
+ }
+
+ ```
+
+ Warnings issued by the Microsoft.CodeAnalysis.PublicApiAnalyzers package:
+
+ 
+
+ You can use `. + Ctrl` to open the code actions and see the available options. In this case, the warning is suggesting that we should add the `MyClass` type to the `PublicAPI.*.txt` files.
+3. **Update Existing Public API**:
+ - If you modify existing public API members, update the `PublicAPI.Unshipped.txt` file accordingly.
+ - Ensure that the changes reflect the new API surface.
+
+4. **Shipping Public API**:
+ - Once a version is released,We move the entries from `PublicAPI.Unshipped.txt` to `PublicAPI.Shipped.txt`.
+ - This indicates that the API changes are now part of a shipped version.
+
+By following these steps, we can maintain a consistent and accurate record of our public API changes.
+
+Additional resources:
+- [Microsoft.CodeAnalysis.PublicApiAnalyzers documentation.](https://github.com/dotnet/roslyn-analyzers/blob/main/src/PublicApiAnalyzers/PublicApiAnalyzers.Help.md)
+- [Microsoft.CodeAnalysis.PublicApiAnalyzers list of analysis rules.](https://github.com/dotnet/roslyn-analyzers/blob/main/src/PublicApiAnalyzers/Microsoft.CodeAnalysis.PublicApiAnalyzers.md)
\ No newline at end of file
diff --git a/eng/apicompat/PublicApiAnalyzer.props b/eng/apicompat/PublicApiAnalyzer.props
new file mode 100644
index 00000000..48e25308
--- /dev/null
+++ b/eng/apicompat/PublicApiAnalyzer.props
@@ -0,0 +1,8 @@
+
+
+
+
+ $(WarningsAsErrors);RS0016;RS0017;RS0022;RS0024;RS0025;RS0026;RS0027;RS0036;RS0037
+
+
+
\ No newline at end of file
diff --git a/eng/apicompat/PublicApiAnalyzer.targets b/eng/apicompat/PublicApiAnalyzer.targets
new file mode 100644
index 00000000..c3649d16
--- /dev/null
+++ b/eng/apicompat/PublicApiAnalyzer.targets
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
diff --git a/eng/apicompat/mark-shipped.cmd b/eng/apicompat/mark-shipped.cmd
new file mode 100644
index 00000000..ed286804
--- /dev/null
+++ b/eng/apicompat/mark-shipped.cmd
@@ -0,0 +1,2 @@
+@echo off
+powershell -noprofile -executionPolicy RemoteSigned -file "%~dp0mark-shipped.ps1"
\ No newline at end of file
diff --git a/eng/apicompat/mark-shipped.ps1 b/eng/apicompat/mark-shipped.ps1
new file mode 100644
index 00000000..71d90979
--- /dev/null
+++ b/eng/apicompat/mark-shipped.ps1
@@ -0,0 +1,49 @@
+[CmdletBinding(PositionalBinding=$false)]
+param ()
+
+Set-StrictMode -version 2.0
+$ErrorActionPreference = "Stop"
+
+function MarkShipped([string]$dir) {
+ $shippedFilePath = Join-Path $dir "PublicAPI.Shipped.txt"
+ $shipped = @()
+ $shipped += Get-Content $shippedFilePath
+
+ $unshippedFilePath = Join-Path $dir "PublicAPI.Unshipped.txt"
+ $unshipped = Get-Content $unshippedFilePath
+ $removed = @()
+ $removedPrefix = "*REMOVED*";
+ Write-Host "Processing $dir"
+
+ foreach ($item in $unshipped) {
+ if ($item.Length -gt 0) {
+ if ($item.StartsWith($removedPrefix)) {
+ $item = $item.Substring($removedPrefix.Length)
+ $removed += $item
+ }
+ else {
+ $shipped += $item
+ }
+ }
+ }
+
+ $shipped | Sort-Object -Unique |Where-Object { -not $removed.Contains($_) } | Out-File $shippedFilePath -Encoding Ascii
+ "#nullable enable`r`n" | Out-File $unshippedFilePath -Encoding Ascii
+}
+
+try {
+ Push-Location $PSScriptRoot\..\..
+
+ foreach ($file in Get-ChildItem -re -in "PublicApi.Shipped.txt") {
+ $dir = Split-Path -parent $file
+ MarkShipped $dir
+ }
+}
+catch {
+ Write-Host $_
+ Write-Host $_.Exception
+ exit 1
+}
+finally {
+ Pop-Location
+}
\ No newline at end of file
diff --git a/eng/apicompat/readme.md b/eng/apicompat/readme.md
new file mode 100644
index 00000000..5f780139
--- /dev/null
+++ b/eng/apicompat/readme.md
@@ -0,0 +1,12 @@
+# Mark-Shipped Tool
+========
+
+This tool should be run after every supported release that has API changes. It will
+merge the collection of PublicApi.Shipped.txt files with the PublicApi.Unshipped.txt
+versions. This will take into account `*REMOVED*` elements when updating the files.
+
+Usage:
+
+``` cmd
+mark-shipped.cmd
+```
\ No newline at end of file
diff --git a/examples/Directory.Build.props b/examples/Directory.Build.props
new file mode 100644
index 00000000..803b4f14
--- /dev/null
+++ b/examples/Directory.Build.props
@@ -0,0 +1,8 @@
+
+
+
+
+ false
+
+
+
\ No newline at end of file
diff --git a/src/Aspire.CommunityToolkit.Hosting.Azure.StaticWebApps/PublicAPI.Shipped.txt b/src/Aspire.CommunityToolkit.Hosting.Azure.StaticWebApps/PublicAPI.Shipped.txt
new file mode 100644
index 00000000..ab058de6
--- /dev/null
+++ b/src/Aspire.CommunityToolkit.Hosting.Azure.StaticWebApps/PublicAPI.Shipped.txt
@@ -0,0 +1 @@
+#nullable enable
diff --git a/src/Aspire.CommunityToolkit.Hosting.Azure.StaticWebApps/PublicAPI.Unshipped.txt b/src/Aspire.CommunityToolkit.Hosting.Azure.StaticWebApps/PublicAPI.Unshipped.txt
new file mode 100644
index 00000000..f087e543
--- /dev/null
+++ b/src/Aspire.CommunityToolkit.Hosting.Azure.StaticWebApps/PublicAPI.Unshipped.txt
@@ -0,0 +1,19 @@
+Aspire.Hosting.ApplicationModel.SwaApiEndpointAnnotation
+Aspire.Hosting.ApplicationModel.SwaApiEndpointAnnotation.Endpoint.get -> string!
+Aspire.Hosting.ApplicationModel.SwaApiEndpointAnnotation.SwaApiEndpointAnnotation(Aspire.Hosting.ApplicationModel.IResourceBuilder! resource) -> void
+Aspire.Hosting.ApplicationModel.SwaAppEndpointAnnotation
+Aspire.Hosting.ApplicationModel.SwaAppEndpointAnnotation.Endpoint.get -> string!
+Aspire.Hosting.ApplicationModel.SwaAppEndpointAnnotation.SwaAppEndpointAnnotation(Aspire.Hosting.ApplicationModel.IResourceBuilder! resource) -> void
+Aspire.Hosting.ApplicationModel.SwaResource
+Aspire.Hosting.ApplicationModel.SwaResource.SwaResource(string! name, string! workingDirectory) -> void
+Aspire.Hosting.SwaAppHostingExtension
+Aspire.Hosting.SwaResourceOptions
+Aspire.Hosting.SwaResourceOptions.DevServerTimeout.get -> int
+Aspire.Hosting.SwaResourceOptions.DevServerTimeout.set -> void
+Aspire.Hosting.SwaResourceOptions.Port.get -> int
+Aspire.Hosting.SwaResourceOptions.Port.set -> void
+Aspire.Hosting.SwaResourceOptions.SwaResourceOptions() -> void
+static Aspire.Hosting.SwaAppHostingExtension.AddSwaEmulator(this Aspire.Hosting.IDistributedApplicationBuilder! builder, string! name) -> Aspire.Hosting.ApplicationModel.IResourceBuilder!
+static Aspire.Hosting.SwaAppHostingExtension.AddSwaEmulator(this Aspire.Hosting.IDistributedApplicationBuilder! builder, string! name, Aspire.Hosting.SwaResourceOptions! options) -> Aspire.Hosting.ApplicationModel.IResourceBuilder!
+static Aspire.Hosting.SwaAppHostingExtension.WithApiResource(this Aspire.Hosting.ApplicationModel.IResourceBuilder! builder, Aspire.Hosting.ApplicationModel.IResourceBuilder! apiResource) -> Aspire.Hosting.ApplicationModel.IResourceBuilder!
+static Aspire.Hosting.SwaAppHostingExtension.WithAppResource(this Aspire.Hosting.ApplicationModel.IResourceBuilder! builder, Aspire.Hosting.ApplicationModel.IResourceBuilder! appResource) -> Aspire.Hosting.ApplicationModel.IResourceBuilder!
\ No newline at end of file
diff --git a/src/Aspire.CommunityToolkit.Hosting.Golang/PublicAPI.Shipped.txt b/src/Aspire.CommunityToolkit.Hosting.Golang/PublicAPI.Shipped.txt
new file mode 100644
index 00000000..7dc5c581
--- /dev/null
+++ b/src/Aspire.CommunityToolkit.Hosting.Golang/PublicAPI.Shipped.txt
@@ -0,0 +1 @@
+#nullable enable
diff --git a/src/Aspire.CommunityToolkit.Hosting.Golang/PublicAPI.Unshipped.txt b/src/Aspire.CommunityToolkit.Hosting.Golang/PublicAPI.Unshipped.txt
new file mode 100644
index 00000000..57f57500
--- /dev/null
+++ b/src/Aspire.CommunityToolkit.Hosting.Golang/PublicAPI.Unshipped.txt
@@ -0,0 +1,4 @@
+Aspire.Hosting.ApplicationModel.GolangAppExecutableResource
+Aspire.Hosting.ApplicationModel.GolangAppExecutableResource.GolangAppExecutableResource(string! name, string! workingDirectory) -> void
+Aspire.Hosting.GolangAppHostingExtension
+static Aspire.Hosting.GolangAppHostingExtension.AddGolangApp(this Aspire.Hosting.IDistributedApplicationBuilder! builder, string! name, string! workingDirectory, int port = 8080, string![]? args = null) -> Aspire.Hosting.ApplicationModel.IResourceBuilder!
\ No newline at end of file
diff --git a/src/Aspire.CommunityToolkit.Hosting.Java/PublicAPI.Shipped.txt b/src/Aspire.CommunityToolkit.Hosting.Java/PublicAPI.Shipped.txt
new file mode 100644
index 00000000..ab058de6
--- /dev/null
+++ b/src/Aspire.CommunityToolkit.Hosting.Java/PublicAPI.Shipped.txt
@@ -0,0 +1 @@
+#nullable enable
diff --git a/src/Aspire.CommunityToolkit.Hosting.Java/PublicAPI.Unshipped.txt b/src/Aspire.CommunityToolkit.Hosting.Java/PublicAPI.Unshipped.txt
new file mode 100644
index 00000000..2483caa0
--- /dev/null
+++ b/src/Aspire.CommunityToolkit.Hosting.Java/PublicAPI.Unshipped.txt
@@ -0,0 +1,35 @@
+Aspire.Hosting.ApplicationModel.JavaAppContainerResource
+Aspire.Hosting.ApplicationModel.JavaAppContainerResource.JavaAppContainerResource(string! name, string? entrypoint = null) -> void
+Aspire.Hosting.ApplicationModel.JavaAppContainerResourceOptions
+Aspire.Hosting.ApplicationModel.JavaAppContainerResourceOptions.Args.get -> string![]?
+Aspire.Hosting.ApplicationModel.JavaAppContainerResourceOptions.Args.set -> void
+Aspire.Hosting.ApplicationModel.JavaAppContainerResourceOptions.ContainerImageName.get -> string?
+Aspire.Hosting.ApplicationModel.JavaAppContainerResourceOptions.ContainerImageName.set -> void
+Aspire.Hosting.ApplicationModel.JavaAppContainerResourceOptions.ContainerImageTag.get -> string!
+Aspire.Hosting.ApplicationModel.JavaAppContainerResourceOptions.ContainerImageTag.set -> void
+Aspire.Hosting.ApplicationModel.JavaAppContainerResourceOptions.ContainerRegistry.get -> string?
+Aspire.Hosting.ApplicationModel.JavaAppContainerResourceOptions.ContainerRegistry.set -> void
+Aspire.Hosting.ApplicationModel.JavaAppContainerResourceOptions.JavaAppContainerResourceOptions() -> void
+Aspire.Hosting.ApplicationModel.JavaAppContainerResourceOptions.OtelAgentPath.get -> string?
+Aspire.Hosting.ApplicationModel.JavaAppContainerResourceOptions.OtelAgentPath.set -> void
+Aspire.Hosting.ApplicationModel.JavaAppContainerResourceOptions.Port.get -> int
+Aspire.Hosting.ApplicationModel.JavaAppContainerResourceOptions.Port.set -> void
+Aspire.Hosting.ApplicationModel.JavaAppContainerResourceOptions.TargetPort.get -> int
+Aspire.Hosting.ApplicationModel.JavaAppContainerResourceOptions.TargetPort.set -> void
+Aspire.Hosting.ApplicationModel.JavaAppExecutableResource
+Aspire.Hosting.ApplicationModel.JavaAppExecutableResource.JavaAppExecutableResource(string! name, string! command, string! workingDirectory) -> void
+Aspire.Hosting.ApplicationModel.JavaAppExecutableResourceOptions
+Aspire.Hosting.ApplicationModel.JavaAppExecutableResourceOptions.ApplicationName.get -> string?
+Aspire.Hosting.ApplicationModel.JavaAppExecutableResourceOptions.ApplicationName.set -> void
+Aspire.Hosting.ApplicationModel.JavaAppExecutableResourceOptions.Args.get -> string![]?
+Aspire.Hosting.ApplicationModel.JavaAppExecutableResourceOptions.Args.set -> void
+Aspire.Hosting.ApplicationModel.JavaAppExecutableResourceOptions.JavaAppExecutableResourceOptions() -> void
+Aspire.Hosting.ApplicationModel.JavaAppExecutableResourceOptions.OtelAgentPath.get -> string?
+Aspire.Hosting.ApplicationModel.JavaAppExecutableResourceOptions.OtelAgentPath.set -> void
+Aspire.Hosting.ApplicationModel.JavaAppExecutableResourceOptions.Port.get -> int
+Aspire.Hosting.ApplicationModel.JavaAppExecutableResourceOptions.Port.set -> void
+Aspire.Hosting.JavaAppHostingExtension
+static Aspire.Hosting.JavaAppHostingExtension.AddJavaApp(this Aspire.Hosting.IDistributedApplicationBuilder! builder, string! name, Aspire.Hosting.ApplicationModel.JavaAppContainerResourceOptions! options) -> Aspire.Hosting.ApplicationModel.IResourceBuilder!
+static Aspire.Hosting.JavaAppHostingExtension.AddJavaApp(this Aspire.Hosting.IDistributedApplicationBuilder! builder, string! name, string! workingDirectory, Aspire.Hosting.ApplicationModel.JavaAppExecutableResourceOptions! options) -> Aspire.Hosting.ApplicationModel.IResourceBuilder!
+static Aspire.Hosting.JavaAppHostingExtension.AddSpringApp(this Aspire.Hosting.IDistributedApplicationBuilder! builder, string! name, Aspire.Hosting.ApplicationModel.JavaAppContainerResourceOptions! options) -> Aspire.Hosting.ApplicationModel.IResourceBuilder!
+static Aspire.Hosting.JavaAppHostingExtension.AddSpringApp(this Aspire.Hosting.IDistributedApplicationBuilder! builder, string! name, string! workingDirectory, Aspire.Hosting.ApplicationModel.JavaAppExecutableResourceOptions! options) -> Aspire.Hosting.ApplicationModel.IResourceBuilder!
\ No newline at end of file
diff --git a/src/Aspire.CommunityToolkit.Hosting.NodeJS.Extensions/PublicAPI.Shipped.txt b/src/Aspire.CommunityToolkit.Hosting.NodeJS.Extensions/PublicAPI.Shipped.txt
new file mode 100644
index 00000000..ab058de6
--- /dev/null
+++ b/src/Aspire.CommunityToolkit.Hosting.NodeJS.Extensions/PublicAPI.Shipped.txt
@@ -0,0 +1 @@
+#nullable enable
diff --git a/src/Aspire.CommunityToolkit.Hosting.NodeJS.Extensions/PublicAPI.Unshipped.txt b/src/Aspire.CommunityToolkit.Hosting.NodeJS.Extensions/PublicAPI.Unshipped.txt
new file mode 100644
index 00000000..45a54671
--- /dev/null
+++ b/src/Aspire.CommunityToolkit.Hosting.NodeJS.Extensions/PublicAPI.Unshipped.txt
@@ -0,0 +1,7 @@
+Aspire.Hosting.NodeJSHostingExtensions
+static Aspire.Hosting.NodeJSHostingExtensions.AddPnpmApp(this Aspire.Hosting.IDistributedApplicationBuilder! builder, string! name, string! workingDirectory, string! scriptName = "start", string![]? args = null) -> Aspire.Hosting.ApplicationModel.IResourceBuilder!
+static Aspire.Hosting.NodeJSHostingExtensions.AddViteApp(this Aspire.Hosting.IDistributedApplicationBuilder! builder, string! name, string? workingDirectory = null, string! packageManager = "npm") -> Aspire.Hosting.ApplicationModel.IResourceBuilder!
+static Aspire.Hosting.NodeJSHostingExtensions.AddYarnApp(this Aspire.Hosting.IDistributedApplicationBuilder! builder, string! name, string! workingDirectory, string! scriptName = "start", string![]? args = null) -> Aspire.Hosting.ApplicationModel.IResourceBuilder!
+static Aspire.Hosting.NodeJSHostingExtensions.WithNpmPackageInstallation(this Aspire.Hosting.ApplicationModel.IResourceBuilder! resource) -> Aspire.Hosting.ApplicationModel.IResourceBuilder!
+static Aspire.Hosting.NodeJSHostingExtensions.WithPnpmPackageInstallation(this Aspire.Hosting.ApplicationModel.IResourceBuilder! resource) -> Aspire.Hosting.ApplicationModel.IResourceBuilder!
+static Aspire.Hosting.NodeJSHostingExtensions.WithYarnPackageInstallation(this Aspire.Hosting.ApplicationModel.IResourceBuilder! resource) -> Aspire.Hosting.ApplicationModel.IResourceBuilder!
\ No newline at end of file
diff --git a/src/Aspire.CommunityToolkit.Hosting.Ollama/OllamaResourceBuilderExtensions.cs b/src/Aspire.CommunityToolkit.Hosting.Ollama/OllamaResourceBuilderExtensions.cs
index 472ae32f..0ee47215 100644
--- a/src/Aspire.CommunityToolkit.Hosting.Ollama/OllamaResourceBuilderExtensions.cs
+++ b/src/Aspire.CommunityToolkit.Hosting.Ollama/OllamaResourceBuilderExtensions.cs
@@ -43,6 +43,7 @@ public static IResourceBuilder AddOllama(this IDistributedApplic
/// A reference to the .
/// This is to maintain compatibility with the Raygun.Aspire.Hosting.Ollama package and will be removed in the next major release.
[Obsolete("Use AddOllama without a model name, and then the AddModel extension method to add models.")]
+ [System.Diagnostics.CodeAnalysis.SuppressMessage("ApiDesign", "RS0026:Do not add multiple public overloads with optional parameters", Justification = "")]
public static IResourceBuilder AddOllama(this IDistributedApplicationBuilder builder,
string name = "Ollama", int? port = null, string modelName = "llama3")
{
diff --git a/src/Aspire.CommunityToolkit.Hosting.Ollama/PublicAPI.Shipped.txt b/src/Aspire.CommunityToolkit.Hosting.Ollama/PublicAPI.Shipped.txt
new file mode 100644
index 00000000..ab058de6
--- /dev/null
+++ b/src/Aspire.CommunityToolkit.Hosting.Ollama/PublicAPI.Shipped.txt
@@ -0,0 +1 @@
+#nullable enable
diff --git a/src/Aspire.CommunityToolkit.Hosting.Ollama/PublicAPI.Unshipped.txt b/src/Aspire.CommunityToolkit.Hosting.Ollama/PublicAPI.Unshipped.txt
new file mode 100644
index 00000000..c13099f3
--- /dev/null
+++ b/src/Aspire.CommunityToolkit.Hosting.Ollama/PublicAPI.Unshipped.txt
@@ -0,0 +1,20 @@
+Aspire.Hosting.ApplicationModel.OllamaResource
+Aspire.Hosting.ApplicationModel.OllamaResource.AddModel(string! modelName) -> void
+Aspire.Hosting.ApplicationModel.OllamaResource.ConnectionStringExpression.get -> Aspire.Hosting.ApplicationModel.ReferenceExpression!
+Aspire.Hosting.ApplicationModel.OllamaResource.DefaultModel.get -> string?
+Aspire.Hosting.ApplicationModel.OllamaResource.Models.get -> System.Collections.Generic.IReadOnlyList!
+Aspire.Hosting.ApplicationModel.OllamaResource.OllamaResource(string! name) -> void
+Aspire.Hosting.ApplicationModel.OllamaResource.PrimaryEndpoint.get -> Aspire.Hosting.ApplicationModel.EndpointReference!
+Aspire.Hosting.ApplicationModel.OllamaResource.SetDefaultModel(string! modelName) -> void
+Aspire.Hosting.ApplicationModel.OpenWebUIResource
+Aspire.Hosting.ApplicationModel.OpenWebUIResource.ConnectionStringExpression.get -> Aspire.Hosting.ApplicationModel.ReferenceExpression!
+Aspire.Hosting.ApplicationModel.OpenWebUIResource.OpenWebUIResource(string! name) -> void
+Aspire.Hosting.ApplicationModel.OpenWebUIResource.PrimaryEndpoint.get -> Aspire.Hosting.ApplicationModel.EndpointReference!
+Aspire.Hosting.OllamaResourceBuilderExtensions
+static Aspire.Hosting.OllamaResourceBuilderExtensions.AddModel(this Aspire.Hosting.ApplicationModel.IResourceBuilder! builder, string! modelName) -> Aspire.Hosting.ApplicationModel.IResourceBuilder!
+static Aspire.Hosting.OllamaResourceBuilderExtensions.AddOllama(this Aspire.Hosting.IDistributedApplicationBuilder! builder, string! name = "Ollama", int? port = null, string! modelName = "llama3") -> Aspire.Hosting.ApplicationModel.IResourceBuilder!
+static Aspire.Hosting.OllamaResourceBuilderExtensions.AddOllama(this Aspire.Hosting.IDistributedApplicationBuilder! builder, string! name, int? port = null) -> Aspire.Hosting.ApplicationModel.IResourceBuilder!
+static Aspire.Hosting.OllamaResourceBuilderExtensions.WithDataVolume(this Aspire.Hosting.ApplicationModel.IResourceBuilder! builder, string? name = null, bool isReadOnly = false) -> Aspire.Hosting.ApplicationModel.IResourceBuilder!
+static Aspire.Hosting.OllamaResourceBuilderExtensions.WithDefaultModel(this Aspire.Hosting.ApplicationModel.IResourceBuilder! builder, string! modelName) -> Aspire.Hosting.ApplicationModel.IResourceBuilder!
+static Aspire.Hosting.OllamaResourceBuilderExtensions.WithOpenWebUI(this Aspire.Hosting.ApplicationModel.IResourceBuilder! builder, System.Action!>? configureContainer = null, string? containerName = null) -> Aspire.Hosting.ApplicationModel.IResourceBuilder!
+static Aspire.Hosting.OllamaResourceBuilderExtensions.WithReference(this Aspire.Hosting.ApplicationModel.IResourceBuilder! builder, Aspire.Hosting.ApplicationModel.IResourceBuilder! ollama) -> Aspire.Hosting.ApplicationModel.IResourceBuilder!
\ No newline at end of file
diff --git a/src/Aspire.CommunityToolkit.OllamaSharp/PublicAPI.Shipped.txt b/src/Aspire.CommunityToolkit.OllamaSharp/PublicAPI.Shipped.txt
new file mode 100644
index 00000000..ab058de6
--- /dev/null
+++ b/src/Aspire.CommunityToolkit.OllamaSharp/PublicAPI.Shipped.txt
@@ -0,0 +1 @@
+#nullable enable
diff --git a/src/Aspire.CommunityToolkit.OllamaSharp/PublicAPI.Unshipped.txt b/src/Aspire.CommunityToolkit.OllamaSharp/PublicAPI.Unshipped.txt
new file mode 100644
index 00000000..ae1c48cd
--- /dev/null
+++ b/src/Aspire.CommunityToolkit.OllamaSharp/PublicAPI.Unshipped.txt
@@ -0,0 +1,11 @@
+Aspire.CommunityToolkit.OllamaSharp.OllamaSharpSettings
+Aspire.CommunityToolkit.OllamaSharp.OllamaSharpSettings.ConnectionString.get -> string?
+Aspire.CommunityToolkit.OllamaSharp.OllamaSharpSettings.ConnectionString.set -> void
+Aspire.CommunityToolkit.OllamaSharp.OllamaSharpSettings.Models.get -> System.Collections.Generic.IReadOnlyList!
+Aspire.CommunityToolkit.OllamaSharp.OllamaSharpSettings.Models.set -> void
+Aspire.CommunityToolkit.OllamaSharp.OllamaSharpSettings.OllamaSharpSettings() -> void
+Aspire.CommunityToolkit.OllamaSharp.OllamaSharpSettings.SelectedModel.get -> string?
+Aspire.CommunityToolkit.OllamaSharp.OllamaSharpSettings.SelectedModel.set -> void
+Microsoft.Extensions.Hosting.AspireOllamaSharpExtensions
+static Microsoft.Extensions.Hosting.AspireOllamaSharpExtensions.AddKeyedOllamaApiClient(this Microsoft.Extensions.Hosting.IHostApplicationBuilder! builder, string! connectionName, System.Action? configureSettings = null) -> void
+static Microsoft.Extensions.Hosting.AspireOllamaSharpExtensions.AddOllamaApiClient(this Microsoft.Extensions.Hosting.IHostApplicationBuilder! builder, string! connectionName, System.Action? configureSettings = null) -> void
\ No newline at end of file
diff --git a/tests/Aspire.CommunityToolkit.Hosting.Golang.Tests/AppHostTests.cs b/tests/Aspire.CommunityToolkit.Hosting.Golang.Tests/AppHostTests.cs
index 424ad700..faa7c331 100644
--- a/tests/Aspire.CommunityToolkit.Hosting.Golang.Tests/AppHostTests.cs
+++ b/tests/Aspire.CommunityToolkit.Hosting.Golang.Tests/AppHostTests.cs
@@ -6,7 +6,7 @@ namespace Aspire.CommunityToolkit.Hosting.Golang.Tests;
#pragma warning disable CTASPIRE001
public class AppHostTests(AspireIntegrationTestFixture fixture) : IClassFixture>
{
- [Theory]
+ [Theory(Skip = "https://github.com/CommunityToolkit/Aspire/issues/85")]
[InlineData("golang")]
public async Task ResourceStartsAndRespondsOk(string appName)
{
diff --git a/tests/Directory.Build.props b/tests/Directory.Build.props
index a20e51fc..8cef0811 100644
--- a/tests/Directory.Build.props
+++ b/tests/Directory.Build.props
@@ -1,6 +1,10 @@
+
+ false
+
+