Skip to content

NX Library 0.1.4.1: engine bd979ced, session card, mods and engine fixes - #8

Merged
Bium23 merged 8 commits into
mainfrom
codex/0.1.4.1
Nov 7, 2026
Merged

Bium23 merged 8 commits into
mainfrom
codex/0.1.4.1

Conversation

@Bium23

@Bium23 Bium23 commented Nov 7, 2026

Copy link
Copy Markdown
Owner

Hotfix 0.1.4.1: every change since 0.1.4 (main). Not released: no tag, no DMG, release.sh not run.

Engine

The pinned nxnative moves b2d46b86 → 7fe9fc4d → e5f03403 → bd979ced (69 upstream commits, each reviewed). The certified Metal compiler stays 32023.922 (Xcode 27.2 minimum), and there is nothing new to install or bundle. Upgrade notes:

  • b2d46b86 → 7fe9fc4d: adopted. The maintainer confirmed an Ocarina of Time rebuild without the dotted rows.
  • 7fe9fc4d → e5f03403: adopted. The maintainer confirmed an Ocarina of Time rebuild; adding an NSP with keys is still to check by hand.
  • e5f03403 → bd979ced: candidate, awaiting the maintainer's rebuild.

What players get:

  • Ocarina of Time (Switch 2):
    • no dotted rows across fog and light, no holes in the ground;
    • no white blotches in Kokiri Forest, and no white flashes in the foliage;
    • the right colours in the Poe Sisters' and Phantom Ganon's paintings;
    • a first start that prepares its pipelines before the first frame, and less memory.
  • Other games:
    • DRAGON BALL: Sparking! ZERO plays;
    • Pikmin 4 runs at 60 fps, up to 120 on the Mac;
    • upstream fixes for Ace Attorney Chronicles, Monster Jam Steel Titans 2, Little Nightmares II, Ori and the Will of the Wisps, Mario Kart World, Mario Kart 8 Deluxe's shader build time, and more (see the notes).
  • Controllers and display:
    • two identical controllers over USB are two players;
    • 30 fps in full screen is steadier;
    • rebuilt games get Press a button to join (Game options → Controls) and Pikmin 4's 120 fps choice through their launcher.json.
  • Cost: the shader chain moved, so every game translates its shaders again at its next build. Installed apps keep their engine until rebuilt.

NX Library changes the engine required:

  • Package reading. nxnative 5c4dc18f removed is_merged and package_title_reader. The metadata bridge now reads every package in one package_reader run, taking title IDs and versions from content metas, never file names. Earlier engines still use the older reader. A package the engine cannot read is skipped and named; keys that cannot open the packages stop the scan with the engine's line (the missing key's name, never a value).
  • Version to pack (-p). It is left out when NX Library staged the selected packages alone, so the engine picks by content meta, and a version an older scan took from a file name can't be refused. Merged packages, NUPs, dumps and folders used as they are still name it. A base game built alone is packed at its own version (v65536 for one served at 1.1.0).
  • Failure table. It reads the new "no game package with a readable content meta" message, and the old one.
  • Build log. The game and shaders_stale progress events stay out of it: a say with the same news follows each.
  • DM_CTRL_PROMPT_TEXT is not adopted yet. It belongs with the languages work.

Added

  • Session card. When a game closes, a card in the top right shows this session's and the total play time over the game's art and logo. It waits for NX Library to be in front, stays 8 s, takes no input, and is skipped for sessions under 10 s. It can be turned off in Settings → Games → Session card.
  • Back to NX Library when a game closes. A game quit while in front brings NX Library back, in its own Space: the main window is ordered front too, since activating alone left the screen on the desktop. Not if the player had moved to another app, or another library game is still open.

Changed

  • Mods that need a loader are left out. GameBanana file mods whose requirements name a loader or PC tool (exlaunch, Skyline, ARCropolis, TKMM, mod managers, TotK Recomp, ReShade) are not listed. A tool the author only recommends doesn't hide a mod.
  • A mod's panel shows its requirements (game version, other mods) under its version line. Notes about modded consoles or emulators are left out.
  • The DMG is made with diskutil image create from, falling back to hdiutil where it is missing.

Fixed

  • Newest engine can be updated in place. When main moves past the commit in use, the row offers Update beside Back to tested and says how many commits newer main is. A main that needs another Metal compiler is still refused.
    • In the upstream list, the commit in use is tagged In use (green) and those above it New (orange).
    • With the keyboard or a controller, Left and Right move the focus between the two buttons, which carry a focus ring, and Return or A presses the one in focus. This replaces an earlier A/Y mapping.
  • Installed GameBanana mods always show in the Mods band, with Update, even when GameBanana leaves them out of the game's list or past the first twelve.
  • Damaged library file is kept as library.json.damaged-… instead of being written over.
  • Library save failures (a full disk, say) are reported instead of losing recent changes in silence.
  • prod.keys private copy is created 0600 from its first byte (open(O_CREAT|O_EXCL, 0600)), not made private after the write.
  • Play totals no longer shrink past the 200-session trim. Trimmed sessions fold into play-sessions-totals.json, and play-sessions.json stays a bare array that older versions read.
  • .NET in ~/.dotnet (Microsoft's install script) is found by Setup and builds, after the system folders, as the engine does.

Housekeeping

  • Docs: CHANGELOG, README (current engine), docs/architecture.md, docs/file-map.md, the upgrade-notes index.
  • Old local worktrees and merged branches removed (local only).
  • Issue Screen resolution #7 answered: games render at the Switch's resolution and are scaled to the window.

Verification

  • swift test: 1127 tests passed, including PortingFailureEngineTests and EngineRuntimeRequirementsTests against bd979ced.
  • The metadata bridge was run against the real engine with NX Library Dev's bundled runtime: nx_extract built, non-packages reported unreadable, checkout left clean.
  • scripts/build_app.sh passed; codesign --verify --deep --strict passed on NX Library Dev; publication checks passed.
  • Maintainer-confirmed in NX Library Dev:
    • Ocarina of Time rebuilt and played with 7fe9fc4d and with e5f03403;
    • the session card;
    • back to front after a game closes;
    • mods and requirements;
    • Settings;
    • Newest engine Update with a controller (earlier mapping).
  • Awaiting human validation:
    • the Ocarina rebuild with bd979ced (shaders translate again, no foliage flashes);
    • adding an NSP, NSZ or XCI game with keys;
    • Left and Right between Update and Back to tested, which can only show once main passes the pin.

🤖 Generated with Claude Code

Bium23 and others added 8 commits November 7, 2026 16:51
- Pin nxnative 7fe9fc4d: Ocarina of Time's dotted rows, terrain holes
  and white blotches are gone (maintainer-confirmed rebuild).
- GameBanana: hide mods that need a loader or PC tool, show a mod's
  requirements, always list installed mods (with Update).
- Newest engine: Update beside Back to tested once main moves on;
  In use / New tags in the upstream list.
- Data safety: keep an unreadable library aside, report save
  failures, create the prod.keys copy as 0600 from the first byte.
- DMG made with diskutil image; small concurrency cleanups.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- When a game closes, a Selene-style card in the top right shows this
  session's and the total play time over the game's art and logo
  (Settings -> Games -> Session card, on by default; none under 10 s).
- A game quit while in front brings NX Library back, including to its
  full-screen Space: macOS makes it active but leaves the desktop on
  screen, so the main window is brought forward too. Not when another
  app was in front or another library game is open.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Sessions dropped from play-sessions.json (it keeps the latest 200) now
fold into per-game totals in play-sessions-totals.json, so a game's
total play time and last played date no longer shrink. The sessions
file stays a bare array that older versions can read.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
On the Newest engine row, A now takes Update once main has moved on
(it used to go back to the tested engine), and Y goes back to tested,
named in the hints bar. Settings rows can carry a second action for Y.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…tons

Re-pin nxnative 7fe9fc4d -> e5f03403 (Ocarina prewarm and memory, Press a
button to join, Ace Attorney, DRAGON BALL: Sparking! ZERO, Ori and more).

nxnative 5c4dc18f removed is_merged and package_title_reader: the metadata
bridge now reads every package in one package_reader run, keeps the older
reader for earlier engines, and reports the engine's keys message. A base
game alone is packed at its own version (-p). The failure table reads the
new "no game package with a readable content meta" message; the game and
shaders_stale progress events stay out of the log.

Settings: on a row with two buttons (Update and Back to tested), Left and
Right move the focus between them and Return or A presses the one in focus,
replacing Y.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A workspace NX Library staged with the selected packages alone holds no
other version, so -p is left out and the engine picks by content meta: a
version stored by an older scan, taken from a file name, can no longer be
refused. Merged packages, NUPs, dumps and folders used as they are still
name the selection.

The tool PATH ends with ~/.dotnet, where Microsoft's install script puts
.NET and the engine also looks, so Setup no longer reports it missing.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Re-pin nxnative e5f03403 -> bd979ced: mesh shaders' position is invariant,
so Ocarina of Time's foliage no longer flashes white; Unreal's fixed frame
rate is found where the engine is made (Pikmin 4 at 60 fps, up to 120 on
the Mac; Sparking! ZERO); GPU counter timestamps from one host sample.
Same Metal compiler and CLI; the shader chain moves, so games translate
their shaders again at their next build. Candidate until the maintainer's
rebuild.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@Bium23
Bium23 merged commit 77f31ce into main Nov 7, 2026
4 checks passed
@Bium99
Bium99 deleted the codex/0.1.4.1 branch November 7, 2026 19:01
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant