emulator: Skyline type: standalone core_classification: other source: "https://archive.softwareheritage.org/browse/revision/dc20a615275f66bee20a4fd851ef0231daca4f14/" upstream: "https://archive.softwareheritage.org/browse/revision/dc20a615275f66bee20a4fd851ef0231daca4f14/" profiled_date: "2026-08-12" source_commit: "dc20a615275f66bee20a4fd851ef0231daca4f14" core_version: "0.0.3" display_name: "Nintendo - Switch (Skyline)" cores: - "skyline" - "SKYLINE" systems: - nintendo-switch mode: standalone notes: | The GitHub repository skyline-emu/skyline was replaced by an archival notice on 2026-08-18, so the pinned revision is served by Software Heritage; the same tree is in the archive.org bundle github.com_skyline-emu_bundles_20230508, and the signed edge-69 APK carries the built assets. Every path below reads against that revision. Nintendo Switch emulator for ARMv8 Android, written from scratch in C++ and Kotlin. Android package skyline.emu, versionCode 3, minSdk 29, with the debug variant taking a .dev suffix (build.gradle:23,28-29,120-121). ES-DE reaches it through its SKYLINE find rule and starts it with android.intent.action.VIEW on the content URI of the game. Development ceased and the README at the pinned commit records it; the code is split across skyline and skyline-dev, whose external file surface is identical (key_store.cpp :10-13 and shared_font_core.h:40-47 in both). NCA, NRO, NSO, NSP and XCI are loaded (loader/). Two key files are read, from keys/ under the application internal files directory, which os.cpp:35 hands to the key store as its root. Both arrive through the in-app importer, which accepts only the two names and rewrites the trimmed pairs into that directory (KeyReader.kt:25-26,56-60); nothing else is consulted for keys, and there is no dev.keys or console.keys path. No firmware is installed and none is read. The system version is answered from a hardcoded 9.0.0-4.0 structure (ISystemSettingsServer.cpp:9-10) and the system data archives a game asks for through OpenDataStorageByDataId are served as stub RomFS images from the application assets (IFileSystemProxy.cpp:84-90). Two are carried: 0100000000000806, the NgWord filter, holding 0.txt through 15.txt plus common.txt and version.dat, and 0100000000000823, NgWord2, holding ac_<0-15>_b1_nx, ac_<0-15>_b2_nx and ac_<0-15>_not_b_nx. A data id without a matching asset opens nothing. The six shared fonts are the one place where a firmware file replaces a built-in one. Each is looked for in fonts/ under the application external files directory, which resolves to /storage/emulated/0/Android/data/skyline.emu/files/ (SkylineApplication.kt :19,41), and only when it is absent does the asset of the same name serve instead (shared_font_core.h:40-47). The emulator writes the shared font header itself, a magic followed by the length XORed with a key derived at shared_font_core.h:36-38, and then copies the whole file after it (shared_font_core.h:51-55), so the file it expects is the raw TTF payload rather than the headered form the firmware stores. Sizes are taken from the file and never checked, and the six together have to fit the 0x140A000 shared memory block. A custom Vulkan driver can be loaded through adrenotools from gpu_drivers/