Skip to content

Provider Compatibility

Granit is developed and tested against PostgreSQL and the Grafana LGTM observability stack. Other providers are supported through EF Core’s provider abstraction or dedicated packages, but receive varying levels of testing.

This page documents the current support status for each infrastructure dimension.

StatusMeaning
SupportedActively tested in CI (unit + integration tests)
CompatibleUses provider-agnostic EF Core APIs; expected to work but not tested in CI
PartialKnown limitations or missing features for this provider
Provider packageRequires installing a dedicated Granit provider package
N/AModule does not use this infrastructure
InfrastructurePrimary (tested)Secondary (compatible)
DatabasePostgreSQLSQL Server, SQLite (via EF Core)
CacheMemory (IDistributedCache)Redis (StackExchange.Redis), HybridCache (L1+L2)
Blob storageS3-compatible (MinIO, AWS S3)Azure Blob, Google Cloud Storage
Identity providerKeycloakEntra ID (Azure AD), AWS Cognito, Google Cloud Identity Platform, custom (IIdentityProvider)
MessagingPostgreSQL (Wolverine)SQL Server (Wolverine), RabbitMQ (Wolverine)
ObservabilityGrafana LGTM (Loki/Tempo/Mimir)Any OTLP-compatible backend
EncryptionHashiCorp Vault TransitAzure Key Vault (Granit.Vault.Azure), AWS KMS (Granit.Vault.Aws), Google Cloud KMS (Granit.Vault.GoogleCloud)

All *.EntityFrameworkCore packages use EF Core’s provider-agnostic APIs and do not contain provider-specific SQL. The database provider is chosen by the application at registration time (e.g., opts.UseNpgsql(connectionString)).

PostgreSQL is the only provider with integration tests. SQL Server is expected to work based on EF Core compatibility, but is not verified in CI. SQLite may work for development scenarios but lacks support for some features used by Granit (e.g., DateTimeOffset handling, concurrent migrations).

ModulePostgreSQLSQL ServerSQLite
Granit.PersistenceSupportedCompatibleCompatible
Granit.Persistence.MigrationsSupportedCompatibleNot tested
Granit.Authorization.EntityFrameworkCoreSupportedCompatibleCompatible
Granit.Settings.EntityFrameworkCoreSupportedCompatibleCompatible
Granit.Features.EntityFrameworkCoreSupportedCompatibleCompatible
Granit.Identity.EntityFrameworkCoreSupportedCompatibleCompatible
Granit.Localization.EntityFrameworkCoreSupportedCompatibleCompatible
Granit.ReferenceData.EntityFrameworkCoreSupportedCompatibleCompatible
Granit.BlobStorage.EntityFrameworkCoreSupportedCompatibleCompatible
Granit.Notifications.EntityFrameworkCoreSupportedCompatibleCompatible
Granit.Webhooks.EntityFrameworkCoreSupportedCompatibleCompatible
Granit.Workflow.EntityFrameworkCoreSupportedCompatibleCompatible
Granit.Timeline.EntityFrameworkCoreSupportedCompatibleCompatible
Granit.Templating.EntityFrameworkCoreSupportedCompatibleCompatible
Granit.DataExchange.EntityFrameworkCoreSupportedCompatibleCompatible
Granit.BackgroundJobs.EntityFrameworkCoreSupportedCompatibleCompatible
Granit.Querying.EntityFrameworkCoreSupportedCompatibleCompatible
Granit.Authentication.ApiKeys.EntityFrameworkCoreSupportedCompatibleCompatible

Wolverine’s transactional outbox and durable messaging require a provider-specific package. These are not interchangeable via EF Core abstractions.

PackagePostgreSQLSQL Server
Granit.Wolverine.PostgresqlSupportedN/A
Granit.Wolverine.SqlServerN/AProvider package

Granit.Wolverine.Postgresql is the primary and fully tested transport. Granit.Wolverine.SqlServer exists as a dedicated package but receives less testing.

  • PostgreSQL is the recommended and fully supported provider. All integration tests, CI pipelines, and production deployments use PostgreSQL.
  • SQL Server should work for all EF Core modules because Granit avoids provider-specific SQL. The Granit.Wolverine.SqlServer package provides the Wolverine transport for SQL Server.
  • SQLite is suitable only for local development or unit tests. It does not support concurrent migrations, and some EF Core behaviors differ (e.g., DateTimeOffset storage). Granit unit tests use Microsoft.EntityFrameworkCore.InMemory, not SQLite.

Granit.Caching provides a layered caching architecture. The base module registers IDistributedCache with an in-memory implementation. Provider packages replace or augment this.

PackageProviderRole
Granit.CachingMemory (MemoryDistributedCache)Default, no external dependency
Granit.Caching.StackExchangeRedisRedis (StackExchange.Redis)Replaces IDistributedCache with RedisCache
Granit.Caching.HybridHybridCache (L1 memory + L2 distributed)Two-tier cache with stampede protection

When CachingOptions.EncryptValues is enabled, Granit.Caching.StackExchangeRedis automatically applies AES-256 encryption to cached values at rest in Redis.

The following modules use IDistributedCache or IHybridCache internally and benefit from provider upgrades:

  • Granit.Features (hybrid cache for feature flag resolution)
  • Granit.Idempotency (Redis required for distributed idempotency keys)
  • Granit.RateLimiting (Redis required for distributed rate limiting)
PackageProviderStatus
Granit.BlobStorage.S3Any S3-compatible API (MinIO, AWS S3, Scaleway, etc.)Supported
Granit.BlobStorage.AzureBlobAzure Blob StorageSupported
Granit.BlobStorage.GoogleCloudGoogle Cloud StorageSupported

Granit.BlobStorage uses a Direct-to-Cloud architecture with presigned URLs. The Granit.BlobStorage.S3 package implements this via AWSSDK.S3. Any service that exposes an S3-compatible API is supported.

There is no local filesystem provider. For local development, use MinIO in a container.

PackageProviderStatus
Granit.Authentication.KeycloakKeycloakSupported
Granit.Authentication.EntraIdMicrosoft Entra ID (Azure AD)Supported
Granit.Authentication.CognitoAWS CognitoSupported
Granit.Authentication.GoogleCloudGoogle Cloud Identity Platform (Firebase Auth)Supported
Granit.Authentication.JwtBearerAny OIDC/JWT issuerSupported (base layer)
Granit.Identity.KeycloakKeycloak Admin APISupported
Granit.Identity.EntraIdMicrosoft Graph APISupported
Granit.Identity.CognitoAWS Cognito User Pool APISupported
Granit.Identity.GoogleCloudFirebase Admin SDKSupported
Granit.Identity (abstractions)Custom via IIdentityProviderImplement your own
  • Authentication packages handle JWT validation and claims transformation at the HTTP middleware level.
  • Identity packages implement IIdentityProvider for user lookup, role management, and cache synchronization via the Admin APIs of each provider.

Keycloak, Entra ID, AWS Cognito, and Google Cloud Identity Platform all have dedicated packages for both layers.

PackageTransportStatus
Granit.Wolverine.PostgresqlPostgreSQL (Wolverine durable messaging)Supported
Granit.Wolverine.SqlServerSQL Server (Wolverine durable messaging)Provider package
Granit.WolverineIn-process (Wolverine local queues)Supported

Wolverine natively supports RabbitMQ via the WolverineFx.RabbitMQ package. Granit does not provide a wrapper package for RabbitMQ because no Granit-specific configuration is needed. Add the Wolverine RabbitMQ package directly in your application if needed.

The following modules integrate with Wolverine for asynchronous processing:

  • Granit.Notifications.Wolverine (notification fan-out)
  • Granit.Webhooks.Wolverine (webhook delivery)
  • Granit.DataExchange.Wolverine (import job processing)
  • Granit.BackgroundJobs.Wolverine (scheduled job execution)
  • Granit.Persistence.Migrations.Wolverine (migration progress tracking)
  • Granit.Privacy (GDPR erasure cascading)
PackageChannelExternal dependency
Granit.Notifications.Email.SmtpEmail (SMTP)Any SMTP server (MailKit)
Granit.Notifications.Email.AwsSesEmail (AWS)Amazon Simple Email Service
Granit.Notifications.Email.AzureCommunicationServicesEmail (Azure)Azure Communication Services
Granit.Notifications.BrevoEmail, SMS, WhatsAppBrevo Transactional API
Granit.Notifications.Email.SendGridEmail (SendGrid)SendGrid API (Twilio)
Granit.Notifications.Email.ScalewayEmail (Scaleway)Scaleway Transactional Email
Granit.Notifications.SmsSMS (abstractions)Requires a provider (Brevo)
Granit.Notifications.Sms.AzureCommunicationServicesSMS (Azure)Azure Communication Services
Granit.Notifications.WhatsAppWhatsApp (abstractions)Requires a provider (Brevo)
Granit.Notifications.WebPushWeb PushVAPID keys (Lib.Net.Http.WebPush)
Granit.Notifications.MobilePush.GoogleFcmMobile Push (FCM)Firebase Cloud Messaging
Granit.Notifications.MobilePush.AzureNotificationHubsMobile Push (Azure)Azure Notification Hubs
Granit.Notifications.Sms.AwsSnsSMS (AWS)Amazon SNS
Granit.Notifications.MobilePush.AwsSnsMobile Push (AWS)Amazon SNS platform applications
Granit.Notifications.TwilioSMS, WhatsApp (Twilio)Twilio Messaging API
Granit.Notifications.SignalRReal-time (WebSocket)Redis backplane for multi-pod

Brevo and Twilio are multi-channel providers. Brevo implements email, SMS, and WhatsApp through a single integration. Twilio covers SMS and WhatsApp via the Twilio Messaging API, while SendGrid (a Twilio company) provides a dedicated email provider. The SMTP provider is an alternative for email-only scenarios.

The SMS and WhatsApp abstraction packages define ISmsSender and IWhatsAppSender interfaces. Additional providers can be implemented against these interfaces.

Azure Communication Services provides email and SMS through two dedicated packages. Azure Notification Hubs provides multi-platform mobile push. Amazon SNS provides SMS and mobile push through two dedicated packages.

See also: Cloud Providers for all packages organized by cloud provider.

SignalPackageExport protocol
LogsSerilog + Serilog.Sinks.OpenTelemetryOTLP
TracesOpenTelemetry.Instrumentation.AspNetCore/Http/EFCoreOTLP
MetricsOpenTelemetryOTLP

All three signals are exported via OTLP (OpenTelemetry Protocol). The target backend is configurable at the application level.

BackendSignalStatus
Grafana LokiLogsSupported (production)
Grafana TempoTracesSupported (production)
Grafana MimirMetricsSupported (production)
Any OTLP-compatible collectorAllCompatible

Because Granit exports standard OTLP, any backend that accepts OTLP should work (e.g., Datadog, New Relic, Elastic APM, Jaeger). Only the Grafana LGTM stack is verified in production.

Infrastructure services used by specific modules

Section titled “Infrastructure services used by specific modules”

Some modules require specific infrastructure services regardless of provider choice.

ModuleRequires
Granit.Vault.HashiCorpHashiCorp Vault (VaultSharp)
Granit.Vault.AzureAzure Key Vault (DefaultAzureCredential)
Granit.Vault.AwsAWS KMS + Secrets Manager
Granit.Vault.GoogleCloudGoogle Cloud KMS + Secret Manager
Granit.IdempotencyRedis (StackExchange.Redis)
Granit.RateLimitingRedis (StackExchange.Redis)
Granit.Notifications.SignalRRedis backplane (for multi-pod deployments)
Granit.BlobStorage.S3S3-compatible object storage
Granit.BlobStorage.AzureBlobAzure Blob Storage
Granit.BlobStorage.GoogleCloudGoogle Cloud Storage