Releases & Versioning
This is an alpha pre-release. CNA is now versioned, but neither the C++ API nor the experimental C ABI is promised stable before 1.0. Pin the tag or commit you build against.
Two revisions, one version string. The release history below (v0.1.0-alpha.1) is unchanged. Most pages on this site now document a later revision — the development snapshot b0e97bb1 on the next branch, 3,333 commits after that tag — and that snapshot still reports itself as 0.1.0-alpha.1. It is not a new release, has no tag and no release notes of its own; see the snapshot section.
The first tagged release
| Product version | 0.1.0-alpha.1 |
|---|---|
| Git tag | v0.1.0-alpha.1 |
| Resolved commit | 1bb2145d99ed572dd4eb15009c34e2e5f410fcf0 |
| Tag date | 2026-08-20 19:06:23 +0200 |
| Release status | First tagged pre-release |
The leading v belongs to the Git tag. The product version reported by CMake and C++ is 0.1.0-alpha.1 without it. Browse the immutable tagged source or its release changelog. There is no GitHub Release object for it (or for anything else): the repository publishes Git tags only (v0.1.0-alpha.1 and an audit marker, audit-2026-07-complete).
The post-alpha.1 development snapshot
Development did not stop at the tag. The site’s reference revision is a commit on the next branch, chosen so that every claim can be checked against one immutable tree:
| Commit | b0e97bb1bb876f9b3edd6f4ff1ef3067908ae8ac (short: b0e97bb1) |
|---|---|
| Branch | next |
| Commit date | 2026-10-04 13:20 +0200 |
| Product version string | 0.1.0-alpha.1 — unchanged; CNA_VERSION_STRING was not bumped and there is no newer tag |
| Distance from the tag | 3,333 commits after v0.1.0-alpha.1 (945 on the first-parent line, 65 merges); git describe reads v0.1.0-alpha.1-3333-gb0e97bb1b |
| Size of the change | 7,436 changed paths; about +1.48 million and −0.47 million lines |
| Release status | Unreleased development snapshot. It is not a release, carries no compatibility promise and has no changelog entry of its own beyond the repository’s [Unreleased] section |
Because the version string did not change, CNA::getVersionString() cannot tell the two revisions apart. If you need to know which one you built, record the Git commit (git rev-parse HEAD), not the product version. Where these docs say “this snapshot” they mean b0e97bb1; where they say “alpha.1” they mean the tag.
GitHub’s default branch is still alpha.1. The repository’s default branch is develop, and it points at the alpha.1 commit; main does too. A plain git clone https://github.com/libcna/cna.git therefore gives you alpha.1, and links of the form .../blob/develop/... or .../blob/master/... show alpha.1 content (master does not exist, and such links land on the default branch). Link to the snapshot with .../tree/next or a commit permalink such as .../tree/b0e97bb1bb876f9b3edd6f4ff1ef3067908ae8ac.
What "7,436 changed paths" counts
The 7,436 figure comes from git diff --shortstat v0.1.0-alpha.1 b0e97bb1 with Git's default rename detection. That count treats each detected rename as one path. For a range this large, Git skips exhaustive rename detection and prints a diff.renameLimit warning. At these two commits Git's default name-status listing contains 3,435 additions, 1,428 deletions, 2,507 modifications and 66 renames. git diff --no-renames --name-status counts every rename as a deletion plus an addition and lists 7,502 records (3,501 / 1,494 / 2,507). Both figures are correct. The first counts files as Git pairs them; the second counts paths that appeared or disappeared. A comparison with another range should use the same flag and state it.
How to obtain each revision
| You want | Commands | Notes |
|---|---|---|
| The development snapshot these docs describe | git clone -b next https://github.com/libcna/cna.gitgit -C cna checkout b0e97bb1bb876f9b3edd6f4ff1ef3067908ae8acgit -C cna submodule update --init | The second line pins the exact documented commit; next keeps moving. sharp-runtime must also be its next branch (git clone -b next https://github.com/libcna/sharp-runtime.git): its main and develop branches lack the Resources and Xml.Serialization components this snapshot requires. easy-gl and meta-gl use their default develop branch. |
| alpha.1, the tagged release | git clone -b v0.1.0-alpha.1 https://github.com/libcna/cna.git | Also what an unqualified clone of the default branch gives you. Older tutorials and the alpha.1 numbers on this page refer to this revision. |
Layout, system packages and the sibling checkouts are the same as in Getting Started and Building; the only difference between the two rows above is which CNA and sharp-runtime branch you check out.
Which sharp-runtime revision goes with alpha.1
CNA's build does not pin sharp-runtime. The root CMakeLists.txt adds whatever checkout CNA_SHARP_RUNTIME_ROOT points at (default ../sharp-runtime); see which sharp-runtime a CNA build uses. For the tag, the "Dependency pins" part of the [0.1.0-alpha.1] entry in CHANGELOG.md records the revision the release was developed and verified against:
sharp-runtime 625476d5b5fff5fa89f392c3c9af8638ff237692 (develop, 2026-08-19)
The changelog calls this record a stopgap: it documents the pin but does not enforce it. It also announces a configure-time check or a submodule as the real mechanism. Neither exists at b0e97bb1. To rebuild alpha.1 against its recorded sibling, check that commit out in a separate worktree and point the option at it, instead of moving the sibling directory. The following commands are illustrative and were not executed:
git -C sharp-runtime worktree add ../sharp-runtime-alpha1 625476d5b5fff5fa89f392c3c9af8638ff237692
cmake -S cna -B cna/build -DCNA_SHARP_RUNTIME_ROOT="$PWD/sharp-runtime-alpha1"
The third-party submodules need no such step. The gitlinks of third_party/SDL, third_party/SDL_image, third_party/SDL_mixer, third_party/draco and vendor/googletest are identical at the tag and at b0e97bb1. So git submodule update --init selects the same third-party revisions for both rows of the table above. This was checked with git ls-tree at both commits.
What changed since alpha.1, at a glance
The table lists the changes a reader is most likely to notice. Every number is measured at the two revisions (alpha.1 tag and snapshot b0e97bb1), and every claim is defined precisely on the page it links to. Test figures are static source counts, not pass results.
| Area | Alpha.1 | Snapshot b0e97bb1 | Where |
|---|---|---|---|
| Renderers | A much broader surface: 50 public identities over 46 implementation families | Curated: 18 public identities over 14 families. A name outside the 18 is a configure-time error, never a silent fallback | Renderers |
| Platform implementations | 4 (SDL3, SDL2, HEADLESS, TERMINAL) | 6: SDL3, HEADLESS, TERMINAL and native X11, WAYLAND and WIN32, which use no SDL | Platforms |
| Audio implementations | 3 (SDL3, SDL2, NULL) | 3: SDL3, NULL and native ALSA with CNA’s own mixer | Platforms |
| Content | Read-side XNB loader with 50 built-in readers | 61 built-in XNB readers, plus a build-time content pipeline (cna-content) that writes CNA’s .cnb container and XNB (including LZX) | Content Pipeline, Command-Line Tools |
| Development tools | None | New optional Diagnostics (CNA_DIAGNOSTICS=OFF|STATS|FULL) and Inspector (CNA_BUILD_INSPECTOR) modules | Diagnostics, Inspector |
| XNA API representation | Everything except Framework.Design | 331 of 331 public types and 3,627 of 3,627 documented runtime members are represented (Framework.Design converters are an opt-in module). Representation, not behavior | XNA Compatibility |
| Graphics capabilities | 14 GraphicsCapability members | 19 members plus the RendererCapabilityProfile API (32 features, 22 limits, per-format usage, report) | Renderers |
| Native C ABI | 0.7.0 (final library could not compile) | 0.44.0: 60 headers, 3,210 routes; not built by CNA’s CI, built and used on Linux by the C# binding CNA.NET | Experimental C API |
| Language bindings | C ABI only | The C# binding CNA.NET (beta) over C ABI 0.44.0; eight further bindings archived in CNA Lab | Language bindings |
| Gamer Services | Local persistence only | Local offline profiles by default, plus an optional self-hosted server for accounts, friends, leaderboards and relayed online sessions | Gamer Services & Avatars |
| Tests (static source counts) | 568 files, 8,263 definitions | 852 files, 12,021 definitions (same counting method) | Verification |
| CI workflow files | 21 | 18 (26 jobs; 16 run automatically; no C API build, no Android or Wayland job) | Verification |
The renderer curation is the largest single change to what a downstream project can select. Do not carry alpha.1 CNA_GRAPHICS_RENDERER values across without checking them against the 25 current identities.
Semantic Versioning before 1.0
CNA follows Semantic Versioning 2.0.0. The alpha.1 suffix has lower precedence than a final 0.1.0. During the 0.y.z phase, minor releases may change the API; alpha, beta and release-candidate identifiers communicate increasing release maturity, not an ABI guarantee. The snapshot above has not been given a new identifier: until a tag is created, the pre-release label alpha.1 and the commit hash together are the only identity it has.
Reading the product version
The root project(CNA VERSION 0.1.0) and CNA_VERSION_PRERELEASE are the build source of truth. CMake generates CNA/Version.hpp in the build tree.
#include "CNA/Version.hpp"
static_assert(CNA_VERSION_MAJOR == 0);
static_assert(CNA_VERSION_MINOR == 1);
static_assert(CNA_VERSION_PATCH == 0);
static_assert(CNA::isPreReleaseVersion());
std::string_view version = CNA::getVersionString(); // "0.1.0-alpha.1"
std::string_view label = CNA::getVersionPreRelease(); // "alpha.1"
The generated header also provides CNA_VERSION_PRERELEASE, CNA_VERSION_STRING, and constexpr major/minor/patch accessors. Because it is generated, use the configured build's include directories rather than copying the template into a consumer. Both alpha.1 and the development snapshot produce the values above.
Product version versus C ABI
The experimental native C interface declares its own ABI identity, and that identity moves independently of the product version: 0.7.0 at the alpha.1 tag, 0.44.0 at snapshot b0e97bb1, while the product version stayed 0.1.0-alpha.1 throughout. Several of the minor steps in between were incompatible changes; the ABI history table is on the C API page.
At the alpha.1 tag the C library could not be produced at all: its C renderer table had 49 entries against the canonical 50, and a deliberate static_assert stopped compilation, so 0.7.0 identified a checked-in contract rather than a consumable binary. That blocker is resolved in the snapshot’s source (the table and the canonical set are both 18). No CNA CI job builds the C library; the C# binding CNA.NET builds and uses it on Linux from source identical to this snapshot. Treat both version numbers as identities of a source contract, not as evidence of a shipped binary.
#include <CNA/C/abi.h>
uint32_t runtime_abi = cna_get_abi_version();
if (runtime_abi != CNA_ABI_VERSION) {
/* refuse or use an explicitly supported compatibility path */
}
See Experimental C API for the measured source scope, the package design, the version history and the boundary with external language bindings (which pin an older ABI, 0.21.x, independently).
Exact source boundary for this site
The alpha.1 edition of this site audited changes from ae0be4b5211957efaef60f2f23627ae5a9ddda23 through the resolved tag commit above. This edition additionally audits the range from that tag to snapshot b0e97bb1bb876f9b3edd6f4ff1ef3067908ae8ac. In both, claims come from the final tree's implementation, CMake configuration, headers, registries and tests. Repository plans and changelog entries are discovery aids, not overrides for contradictory code; CNA’s own CHANGELOG.md is known to omit several of the changes listed above (it has no entries for Diagnostics, Inspector or the content pipeline).
Consumer projects (the samples, demos, showcase games and language bindings) are evidence only for their own pinned revisions, not for either CNA revision described here.
Deep dives on this topic
Long-form pages that explain the exact semantics, invariants and evidence behind this subject.
- CNA and XNA 4.0: what the compatibility promise covers — What CNA translates and cannot load, which reference settles a disputed XNA question, what CNA deliberately is not at snapshot b0e97bb1, and its Ms-PL licence and FNA provenance.
- Project records as evidence: plans, ledgers, versions, handoffs and re-audits — How to use and write CNA's plans, handoffs, audits and gates as evidence: roles, stable task IDs, executable ledgers, version coordinates, defect-ledger rules and documentation re-audits.