Package and release

Metadata, artifacts, dependency licenses and release gates.

On this page

Ship an application as a traceable build with clear requirements and a tested lifecycle. A good release tells another developer exactly what was built, how it was validated and which features remain conditional.

Application package layout#

A conventional application package can contain:

Plain text
switch/
  myapp/
    myapp.nro
    README.txt
    licenses/

This is a suggested distribution convention. Keep mutable settings and downloaded content outside the archive's overwrite-sensitive files. Include required external assets only when their distribution is authorized; otherwise explain how the user supplies them.

For the environment itself, the verified kaiHEN archive contains bootstrap.bin, hbmenu.nro, ro/main, hen/main, game/main, programs/ounceshell.nro and license files. These are different artifacts from an application's own .nro. kaiHEN 20261114c release

Metadata and artifact identity#

Use an unambiguous artifact name such as myapp-switch2-v0.1.0.nro. Populate application title, author and version through NACP generation, and retain a recognizable icon. The reference Makefile documents those fields and NRO asset options. GLES example NRO build pipeline

Generate SHA-256 hashes for the distributable and preserve its unstripped ELF and linker map privately or as developer artifacts. Record source commits for the application and the static runtime/driver dependencies. Use the downloadable build record template and hardware test record to preserve the exact environment and results.

Separate release version from tested environment. An application version may be unchanged while a rebuild adopts a new OunceVK. Indicate that dependency change explicitly, because the binary's graphics behavior can change even when application source does not.

Minimum release notes#

FieldUseful content
PurposeWhat the application does and its primary workflow
RequirementsNative Switch 2 environment, runtime/devkit baseline, required services
InstallationExact SD directory and external assets
ControlsConfirm, cancel, exit and optional pointer/touch actions
DataWhere settings, logs and user content are stored
ValidationFirmware, host title, artifact hash and scenarios tested
LimitationsUnsupported functions and recoverable failure behavior
ChangesApplication and dependency changes
SourcesRepository and exact source revision

Avoid “works on all Switch 2 consoles” unless the evidence actually supports that scope. A correct narrower statement is more useful to a developer diagnosing a mismatch.

Dependency licenses#

The inspected projects declare different licenses:

ComponentDeclared license or license family
kaiHEN coreGPL-2.0-only with the repository's named exemption
libkaihenISC
libounce and inherited libnx codeISC; bundled mimalloc is MIT
ounce-devkit packagingMIT
hbloader and hbmenuISC, with separately licensed bundled dependencies
OunceShellGPL-3.0-or-later, with separately licensed dependencies
OunceVK/MesaPer-file and bundled license texts

Use the exact license files for the revisions you ship; the runtime release's licenses/ directory is a useful inventory example. This table records project declarations and does not resolve a particular product's redistribution obligations. kaiHEN core license libkaihen license libounce inherited runtime license Devkit packaging license Loader license Menu license OunceShell and VitaShell license Mesa licensing reference

For a release pipeline, inventory what actually links into the binary rather than relying on only the top-level repository license. Preserve notices and review third-party assets, fonts and codecs alongside code dependencies.

Continuous integration#

A practical CI pipeline builds portable host targets, runs meaningful host tests, cross-compiles the native application, stores logs and symbols, and assembles a versioned artifact with hashes. Hardware acceptance remains a separate recorded step unless a reliable device test rig exists.

Pin toolchain and source inputs. Keep the host test build separate from the cross build so a host library cannot accidentally satisfy a target dependency. Fail the release when required assets are missing, the expected NRO is absent or a hash manifest does not match the artifact being uploaded.

If CI cannot run the application, label that limitation directly. “CI passed” then means the configured checks passed, not that gameplay, audio or GPU execution succeeded.

Suggested milestone roadmap#

MilestoneDeliverableAcceptance gate
0 Platform baselineRecorded console/runtime/toolchain combinationEnvironment reproducible and source pins saved
1 Native diagnosticSmall NRO with status and exitLaunch, exit and relaunch on hardware
2 Portable coreMain algorithms and data modelHost fixtures and known data agree
3 Interaction and assetsUI/input with real contentController fallback and file errors handled
4 Rendering and soundRepresentative frame and audioSustained use without corruption or underruns
5 Optional servicesNetwork, decoder, JIT or pluginIndependent feature probes and cleanup pass
6 ReliabilityRecovery paths and resource trackingRepeated mixed-application cycles pass
7 Release candidatePackage, manifest and notesArtifact identity and hardware matrix reviewed

These are suggested gates, not estimated completion dates. A small utility may skip several optional systems; an emulator or streaming client will spend more time on their interactions.

Maintaining compatibility#

When adopting a new runtime or devkit, rebuild from clean directories, compare link maps, run the minimal diagnostic, then repeat representative workloads and lifecycle tests. Record regressions against the last known-good artifact.

Track upstream changes by subsystem. A graphics fix suggests rendering and presentation tests; a loader cleanup change suggests repeated-launch tests; a plugin protocol change suggests discovery and payload tests. This is more efficient than retesting every scenario for every documentation edit, while still responding to consequential code changes.

Release-readiness decision#

Publish when the application's main workflow, failure behavior and exit path have been observed on the stated environment, and the package can be reproduced from its inputs. Keep experiments available as clearly labeled developer builds when those gates remain open. The label should tell users what evidence exists, not hide uncertainty behind a generic beta designation.