Skip to main content
The AI•Pkg server is derived from NuGetGallery but radically simplified. The public surface exposes only a JSON API under /v3/. OData V2, OWIN, Autofac, and all Razor view infrastructure are removed.

Technology Stack

LayerTechnologyNotes
Runtime.NET 10LTS release
Public APIASP.NET Core 10 Minimal APIsRegistry endpoints only
Web UIBlazor SSR + Interactive ServerSee Frontend Implementation
Admin APIOData Restier via EasyAFInternal only; not on public surface
ORMEF Core 10 (Database-First)Entities generated by EasyAF tooling
Database schemaSQL Server Database Project (.sqlproj)Source of truth for schema
AuthGitHub OAuth + PBKDF2 API keys + OIDCPort existing PBKDF2 system
StorageAzure Blob StorageExisting abstraction renamed .nupkg.aipkg
SearchAzure AI SearchNew AipkgSearchDocument model
DIASP.NET Core built-in DIAutofac removed
Configappsettings.json + environment variablesNo custom XML config
CDNAzure CDNKeep existing stats parsing jobs

Rationale

Why .NET 10 (not .NET 9)

.NET 10 is the next LTS release and will be the stable foundation for the duration of Phase 0–4. Starting on LTS avoids an in-project upgrade mid-migration.

Why Minimal APIs (not Controllers)

NuGetGallery used MVC controllers with complex filter pipelines. Minimal APIs are explicit, AOT-friendly, and map directly to the endpoint-per-file structure used in the new AI•Pkg.Server/Api/V3/ directory.

Why EasyAF (not hand-written EF migrations)

The NuGetGallery migration history is ~200 migrations deep and contains schema changes we’re discarding. Starting from a .sqlproj as the schema source of truth means:
  • No migration history cruft
  • Schema is auditable by any SQL developer, not just .NET developers
  • Schema publishes are idempotent (dacpac deployment)
  • Entity classes are regenerated, not hand-maintained

Why Blazor SSR (not Next.js, React, etc.)

Single .NET 10 stack: the team already owns C# and the V3 API is in the same process. No separate frontend build pipeline, no CORS concerns for authenticated pages, no hydration mismatches.

Why Azure AI Search (not Elasticsearch, Typesense, etc.)

NuGetGallery already has a mature Azure AI Search integration in NuGet.Services.AzureSearch. The port is a schema adaptation, not a rewrite.

What to Delete from NuGetGallery

These items will not exist in the AI•Pkg repo. Delete them when setting up the fork.
CategoryItems to Delete
V2/OData public APIAll ODataV1, ODataV2 controllers and routes
OWINAll OWIN startup, middleware, and pipeline code
AutofacAll Autofac container setup, modules, and registrations
Razor viewsAll .cshtml files, _ViewImports, _Layout, tag helpers
jQuery / Bootstrap scriptsAll .js and .css bundle files from old MVC stack
Symbol packagesNuGet.Services.Symbols.*, all snupkg handling code
Functional testsNuGetGallery.FunctionalTests.sln and related projects
Python toolingAll .py scripts in the repo
Legacy migrationsEF migration history predating the SLNX rewrite

What to Keep and Adapt

CategoryKeepAdaptation
V3 API logicRegistration, flatcontainer, search, push, autocompleteRename, update schemas
CDN stats jobssrc/Stats.*Adapt for .aipkg download events
GitHub vulnerability jobssrc/GitHubVulnerabilities2Db/Adapt package ID resolution
PBKDF2 API key systemAuth/ApiKeyV4 logicPort to new project
Azure Blob storage abstractionICoreFileStorageServiceRename types
Azure AI Search integrationNuGet.Services.AzureSearchNew document model
License scanning jobssrc/NuGet.Jobs.Validation.PackageSigning.*Evaluate; lower priority