Skip to content

Changelog

Granit maintains a CHANGELOG.md file in the repository root following the Keep a Changelog format combined with Conventional Commits.

The canonical changelog lives at the repository root:

granit-dotnet/
CHANGELOG.md <-- version history
src/
tests/
...

Each release section uses the following structure:

## [1.2.0] - 2026-03-10
### Added
- feat(notifications): add WhatsApp delivery channel (`Granit.Notifications.WhatsApp`)
- feat(templating): add Scriban `date.to_iso` custom function
### Changed
- refactor(persistence): improve `AuditedEntityInterceptor` batching performance
### Deprecated
- deprecate(caching): `IDistributedCacheManager.Remove()` -- use `RemoveAsync()` instead
### Fixed
- fix(identity): correct Keycloak token refresh race condition
- fix(blob-storage): handle S3 multipart upload timeout on large files
### Security
- security(vault): rotate transit encryption keys on startup when key age exceeds threshold
### Breaking Changes
- breaking(core): rename `IGranitModule.Initialize()` to `OnApplicationInitialization()`
- **Migration**: rename the method override in your module classes
CategoryWhen to use
AddedNew features, new packages, new public APIs
ChangedNon-breaking changes to existing functionality
DeprecatedAPIs marked with [Obsolete], scheduled for removal
RemovedAPIs removed (major versions only)
FixedBug fixes
SecurityVulnerability patches, security improvements
Breaking ChangesChanges that require consumer action (major versions only)

The scope in parentheses maps to the Granit module area:

ScopePackages
coreGranit.Core, Granit.Timing, Granit.Guids
persistenceGranit.Persistence, Granit.Persistence.Migrations
cachingGranit.Caching, Granit.Caching.Hybrid, Granit.Caching.StackExchangeRedis
identityGranit.Identity, Granit.Identity.Keycloak, Granit.Identity.EntityFrameworkCore
notificationsAll Granit.Notifications.* packages
templatingGranit.Templating, Granit.Templating.Scriban, Granit.DocumentGeneration
blob-storageGranit.BlobStorage, Granit.BlobStorage.S3
securityGranit.Security, Granit.Authentication.*, Granit.Authorization.*
vaultGranit.Vault, Granit.Encryption
observabilityGranit.Observability, Granit.Diagnostics
workflowAll Granit.Workflow.* packages
data-exchangeAll Granit.DataExchange.* packages
localizationAll Granit.Localization.* packages

Given version 1.2.3:

  • 1 (major) — incrementing this means breaking changes exist. Read the “Breaking Changes” section carefully.
  • 2 (minor) — new features were added. Your existing code continues to work without changes.
  • 3 (patch) — bug fixes only. Safe to upgrade without reviewing the changelog in detail.

Changelog entries are derived from Conventional Commit messages. The commit types map directly to changelog categories:

Commit prefixChangelog category
feat:Added
refactor:, perf:Changed
fix:Fixed
security:Security
docs:Not included (documentation-only changes)
test:, ci:, chore:Not included

Commits with a BREAKING CHANGE: footer or a ! after the type (e.g., feat!:) are additionally listed under Breaking Changes.