Releases & Versioning

Latest tagged release: 0.1.0-alpha.1  ·  tagged 20 August 2026  ·  documented here as well: development snapshot c1c316b9 (9 October 2026, branch apple/m4-stabilization)

⚠

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 c1c316b9 on the apple/m4-stabilization branch, 3,687 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 version0.1.0-alpha.1
Git tagv0.1.0-alpha.1
Resolved commit1bb2145d99ed572dd4eb15009c34e2e5f410fcf0
Tag date2026-08-20 19:06:23 +0200
Release statusFirst 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 apple/m4-stabilization branch, chosen so that every claim can be checked against one immutable tree:

Commitc1c316b9c7a846ce8002809c151fcd1af14942c9 (short: c1c316b9)
Branchapple/m4-stabilization
Commit date2026-10-09 17:22 +0200
Product version string0.1.0-alpha.1 — unchanged; CNA_VERSION_STRING was not bumped and there is no newer tag
Distance from the tag3,687 commits after v0.1.0-alpha.1 (1,299 on the first-parent line, 65 merges); git describe reads v0.1.0-alpha.1-3687-gc1c316b9c
Size of the change7,463 changed paths; about +1.40 million and −0.49 million lines
Release statusUnreleased 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 c1c316b9; 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/apple/m4-stabilization or a commit permalink such as .../tree/c1c316b9c7a846ce8002809c151fcd1af14942c9.

What "7,463 changed paths" counts

The 7,463 figure comes from git diff --shortstat v0.1.0-alpha.1 c1c316b9 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,212 additions, 1,483 deletions, 2,704 modifications and 64 renames. git diff --no-renames --name-status counts every rename as a deletion plus an addition and lists 7,527 records (3,276 / 1,547 / 2,704). 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 wantCommandsNotes
The development snapshot these docs describegit clone -b apple/m4-stabilization https://github.com/libcna/cna.git
git -C cna checkout c1c316b9c7a846ce8002809c151fcd1af14942c9
git -C cna submodule update --init
The second line pins the exact documented commit; the branch keeps moving. sharp-runtime must also be its apple/m4-stabilization branch (git clone -b apple/m4-stabilization 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 releasegit clone -b v0.1.0-alpha.1 https://github.com/libcna/cna.gitAlso 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 c1c316b9. 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 c1c316b9. 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 c1c316b9), and every claim is defined precisely on the page it links to. Test figures are static source counts, not pass results.

AreaAlpha.1Snapshot c1c316b9Where
RenderersA much broader surface: 50 public identities over 46 implementation familiesCurated: 14 public identities over 12 families. A name outside the 14 is a configure-time error, never a silent fallbackRenderers
Platform implementations4 (SDL3, SDL2, HEADLESS, TERMINAL)3: SDL3 (the one windowing platform, reaching Windows, X11 and Wayland through SDL’s video drivers), HEADLESS and TERMINALPlatforms
Audio implementations3 (SDL3, SDL2, NULL)3: SDL3, NULL and native ALSA with CNA’s own mixerPlatforms
ContentRead-side XNB loader with 50 built-in readers61 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 toolsNoneNew optional Diagnostics (CNA_DIAGNOSTICS=OFF|STATS|FULL) and Inspector (CNA_BUILD_INSPECTOR) modulesDiagnostics, Inspector
XNA API representationEverything except Framework.Design331 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 behaviorXNA Compatibility
Graphics capabilities14 GraphicsCapability members19 members plus the RendererCapabilityProfile API (32 features, 22 limits, per-format usage, report)Renderers
Native C ABI0.7.0 (final library could not compile)0.46.0: 60 headers, 3,210 routes; not built by CNA’s CI; built and tested on a physical Mac mini M4, and built and used on Linux (and, as local evidence, macOS) by the C# binding CNA.NETExperimental C API
Language bindingsC ABI onlyThe C# binding CNA.NET (beta) over C ABI 0.46.0; eight further bindings archived in CNA LabLanguage bindings
Gamer ServicesLocal persistence onlyLocal offline profiles by default, plus an optional self-hosted server for accounts, friends, leaderboards and relayed online sessionsGamer Services & Avatars
Tests (static source counts)568 files, 8,263 definitions813 files, 11,380 definitions (same counting method)Verification
CI workflow files2118 (24 jobs; 16 files run automatically; no C API build, no Android 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 14 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.46.0 at snapshot c1c316b9, 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 C renderer table and the canonical set now agree). No CNA CI job builds the C library; CNA’s Apple campaign built and tested it on a physical Mac mini M4, and the C# binding CNA.NET builds and uses it on Linux. 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 c1c316b9c7a846ce8002809c151fcd1af14942c9. 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.