All notable changes to this project will be documented in this file.
This format follows:
- Keep a Changelog
- Semantic Versioning
- Version numbers are produced by MinVer from Git tags.
See prereleases below.
See prereleases below.
UlidTool project to provide a command-line interface for generating and parsing ULIDs. The tool is built on top of the vm2.Ulid library and can be used for quick ULID generation or parsing without writing code.
- build pipeline changes to include the new UlidTool project in the CI process and package it for release.
Update dependencies to .NET SDK 10.0.3 and latest build pipeline templates from vm2.DevOps.
See prereleases below.
- build pipeline changes
- build pipeline changes
- Moved to the latest build pipeline templates from vm2.DevOps.
- IClock interface and SystemClock implementation to get the current time used by UlidFactory (testsbility!).
- JSON serializers for both
System.Text.JsonandNewtonsoft.Json - Method
public readonly bool TryWriteUtf8(in Span<byte> destination)(see also Changed below) - Implicit conversion to/from
stringandGuid - Unit tests for the new features above and the fixed bug below.
- A lot of CI/CD workflow improvements and scripts to automate the release process (see also Internal below).
Small API changes that clarify the semantic of some input parameters:
- Change the constructor
public Ulid(in ReadOnlySpan<byte> bytes)topublic Ulid(in ReadOnlySpan<byte> bytes, bool isUtf8). The constructor used to guess whether the input is raw bytes or UTF-8 sequence of characters by the length of the parameterbytes. Now, let the caller state their intention explicitly. - Similar change for
public readonly bool TryWrite(Span<byte> destination, bool asUtf8)- added the explicit parameterasUtf8. - Keeping the semantics of the
ParseandTryParsemethods: always parsing either UTF-16 characters (ReadOnlySpan<char>) or UTF-8 characters (ReadOnlySpan<byte>). - Minor stylistic code changes.
- Fixed bug where the UlidFactory could produce non-monotonic ULIDs when called within the same millisecond and the last byte of
the previous ULID was
0xFF.
- Small optimization of
UlidToString(): Using the newstring.Create(thank you Stephen Toub!). - build pipeline changes
- Suppress creation of packages for the example project(s).
- Changed the package name from
vm2.UlidtoVm.Ulid. - Changed also in the README.md and other documentation files.
- The initial version.
- For every change, prefer small bullet points written in the imperative mood (e.g. "Add …", "Fix …").
- Group changes under the appropriate heading above; add new headings only when needed.
- Before creating a stable tag:
- Move items from
Unreleasedinto a new## [vX.Y.Z] - YYYY-MM-DDsection. - Update the comparison links at the bottom if a major/minor line starts a new baseline.
- Move items from
- Do not rewrite history of published versions—append corrections in a new entry if needed.
| Category | Use for |
|---|---|
| Added | New public APIs, features, options |
| Changed | Backward-impacting behavior changes (document clearly) |
| Fixed | Bug fixes |
| Performance | Measurable speed / memory improvements |
| Removed | Deprecated APIs removed; breaking removals |
| Security | Vulnerability fixes, hardening, dependency CVE responses |
| Internal | Build, CI, tooling, refactors without API / behavior change |
When you create a stable tag (e.g. v1.2.0):
- Add the dated section.
- Adjust
[Unreleased]link to compare new tag toHEAD. - Add a new link definition for the released version.
(Adjust initial tag if your first stable differs.)