What’s new in v0.11.0
Acts on an external .NET developer’s review. Several items are breaking, and every deliberate departure from .NET convention is explained in Design decisions. Five packages instead of two - a console app no longer drags in the configuration pipeline it never uses:- BREAKING -
AddWestyx()moved toWestyxNexus.Extensions.Configuration. Add the package reference; the namespace is unchanged, so no code edit. - BREAKING - multi-targeted
net8.0;net10.0. .NET 8 goes out of support on 2026-11-10; .NET 10 is the current LTS (to 2028-11-14). NexusConfig.LoggerFactorytakes a standardILoggerFactory;INexusLoggeris obsolete but still bridged. Log statements are structured, under the categoriesWestyx.Nexus.NexusClient,Westyx.Nexus.StreamandWestyx.Nexus.Wif.- Async startup.
AddWestyxNexus()runs the initial sync in anIHostedServiceinstead of blocking a thread-pool thread. NexusConfig.PooledConnectionLifetime(default 2 minutes). The framework default is infinite, so an application-lifetime singleton never recycled a connection and never observed a DNS change.IConfigurationbinding fixed twice - dotted keys are now section-navigable (GetSection("database")used to come back empty and bind nothing), and JSON objects and arrays are flattened instead of stored as one opaque string.AddWestyxNexusSecrets<T>()binds secrets toIOptions<T>with live re-bind, without putting them inIConfiguration.AddWestyxNexusFeatureManagement()serves Nexus flags toIFeatureManagerfrom the in-memory cache.
- File-type secrets are now written owner-readable only (
0600). They previously used the process umask - typically0644on Linux, readable by every local user on the machine. - Two clients holding the same secret no longer share one temp file; the first disposed used to delete it out from under the other.
- The post-sync notification is additive - it was a single slot, so using both the configuration provider and the secrets binder silently disabled live reload on one of them.
What’s new in v0.10.0
- Version alignment across the Westyx Nexus SDK suite.
What’s new in v0.9.0
aws_iamWIF provider (AWS IAM Caller Identity) - authenticates non-EKS AWS compute (ECS/Fargate, Lambda, plain EC2) that has IAM credentials but no OIDC token. The SDK SigV4-signs an STSGetCallerIdentityrequest (never sent to AWS) and posts it to/v1/auth/token-exchange; Nexus replays it against a pinned STS endpoint to prove your IAM role. The signedX-Nexus-Server-IDis your service’s own base-URL host - a captured request is valid for that one service only, and there is nothing to configure. UsesAWSSDK.Corefor the credential/region chain only. See Workload identity.- Azure Workload Identity (AKS) - the
Azureprovider now prefers the projected federated token file ($AZURE_FEDERATED_TOKEN_FILE) before falling back to IMDS; auto-detection probes the file too. - Probe-based auto-detection - auto-detect now stats the Kubernetes / AWS-IRSA / Azure token files and live-probes the GCP and Azure metadata servers (~1 s timeout), instead of keying on environment variables absent on real cloud nodes.
- Security hardening -
NexusClient.CreateAsyncrejects plain-httpBaseUrls (loopback excepted); the Azure IMDS path refuses the generic default audience (must beapi://<client-id>); expired WIF sessions fail closed; the metadata client disables redirects and the system proxy; metadata/exchange reads are bounded.
What’s new in v0.8.0
WestyxNexus.OpenFeatureNuGet sub-package - installWestyxNexus.OpenFeaturealongsideWestyxNexusand registerNexusProvideras an OpenFeature provider. Feature flags resolve viaResolveBooleanValue; configs viaResolveString/Double/Integer/StructureValue. All reads are cache-backed. See OpenFeature integration.
What’s new in v0.7.0
- ASP.NET Core
IConfigurationintegration -builder.Configuration.AddWestyx(nexusConfig)plugs Nexus into the standard configuration pipeline. All config values are accessible viaIConfiguration, bindable viaIOptions<T>, and live-reloaded viaIOptionsMonitor<T>when SSE is enabled — no restart needed. See ASP.NET Core configuration.
What’s new in v0.5.1
- Requires .NET 8 or later - target framework widened to
net8.0. Supports .NET 8, 9, 10, and later. - Security improvements - response bodies are no longer embedded in exception messages;
file-type secret paths are fully hashed; key names are never stored on the filesystem. - Reliable
GetSecretAsync- all code paths return a properly awaitableTask, consistent with async/await conventions throughout the SDK. - Thread-safe WIF session - concurrent token refresh calls are serialised to prevent redundant token exchanges.
- CI - test stage runs on every MR; publish is restricted to
main-branch tags.
What’s new in v0.5.0
- Write API -
SetSecretAsync,DeleteSecretAsync,DeleteSecretVersionAsyncfor programmatic secret management. secret keys only; public keys throwNexusPublicKeyExceptionimmediately without a network call. NexusRateLimitedException- new exception for HTTP 429 on write endpoints.
What’s new in v0.3.1
Retry-After-aware SSE 429 handling -RunStreamAsyncnowawait Task.Delay-s the indicated duration (clamped[5 s, 5 min]) and reconnects automatically when the server returns429with a parseableRetry-Afterheader (delta-seconds or HTTP-date form). WithoutRetry-After, the legacy terminate-on-429 + TTL polling fallback is preserved.
What’s new in v0.3.0
- AB Testing add-on - new
EvaluateABAsync(keys, userId, attributes, ct)for batch per-user flag evaluation. ThrowsNexusAbAddonNotAvailableExceptionon 403. - File-type secrets - secrets now carry a
typefield;file-type values are materialised to temp files underPath.GetTempPath()and exposed viaGetSecretFilePath(key). Temp files are cleaned up byDispose().
What’s new in v0.2.0
- Workload Identity Federation - Kubernetes / AWS IRSA / GCP / Azure auto-detected; bearer-JWT auth with automatic refresh.
- Stream observer hooks - opt-in
IStreamObserverfor ops dashboards and load-test tooling. - Service kind awareness -
GetSecretAsyncblocked withNexusServiceKindMismatchExceptiononkind=frontendservices. - 402 Payment Required handling -
NexusBillingExceptionthrown,BillingOverdueflag set, background sync halted, cache served. - Split HTTP clients - a short consumer timeout no longer truncates the SSE stream.
Highlights
- .NET 8.0+ - single package, minimal dependencies
- Thread-safe TTL cache with atomic snapshot replacement and ETag/304 support
- Background refresh - request handlers are never blocked on cache expiry
- SSE live updates - propagates remote changes within milliseconds; falls back to TTL polling after 3 transport errors
- Public-key vs secret-key access control - public-key clients cannot fetch secrets
- ASP.NET Core
IConfigurationintegration (v0.7.0) -AddWestyx()extension method;IOptions<T>binding;IOptionsMonitor<T>live reload - OpenFeature provider (v0.8.0) -
WestyxNexus.OpenFeaturesub-package;NexusProviderwraps an existing client and implements the standardFeatureProviderinterface - Workload Identity Federation (v0.2.0) - Kubernetes / AWS IRSA / GCP / Azure auto-detection; bearer JWT auth; AWS IAM (
aws_iam) for ECS/Fargate/Lambda/plain-EC2 (v0.9.0) - Stream observer hooks (v0.2.0) - structured callbacks for SSE lifecycle events
- AB Testing add-on (v0.3.0) - per-user flag evaluation via
EvaluateABAsync - File-type secrets (v0.3.0) - materialised as temp files with automatic update detection and cleanup
Package
Hosted on the GitLab NuGet Package Registry. Install:ILogger and IHttpClientFactory adoption, IConfiguration binding fixes, secrets binding, FeatureManagement provider).
