NULD is a launcher that runs on a real PS2. It lists your games with their covers, starts them through Neutrino, and adds what a modern console menu has: covers downloaded by the console itself, 3D save icons, virtual memory cards per game, an in-game menu, games served from a home server, and RetroAchievements on real hardware. Spanish and English.
Website, screenshots and videos: https://danielnuld.github.io/nuld/ Videos: trailer · setup guide Download: latest release
Called ORBIT until v1.1. Upgrading keeps everything: the first boot moves orbit/ to nuld/, keeps
BOOT/ORBIT.ELF up to date next to the new BOOT/NULD.ELF, and keeps using VMC/ORBIT.bin as the shared card.
- Three views of your library (carousel, grid, list) at 60 frames per second, with filters (All, PS2, PS1, Apps) and an animated splash. Measured on the console: a median frame takes under 5 ms of the 16.7 ms budget.
- Covers downloaded by the PS2, over HTTPS from xlenore/ps2-covers, decoded and dithered on the console, saved to the USB. No PC step.
- 3D save icons: the newest save of each game, read from the memory card, spinning on the detail card.
- Every source Neutrino knows: USB, internal HDD (exFAT or HD Loader), MX4SIO, iLink, MMCE, UDPBD, and a home game server (udpfs + NULD's catalog service) whose games list instantly and keep every feature.
- Virtual memory cards, one per game (or one shared), created on first play, on the game's own device.
- Per-game options (△): video mode forced to 480p or 1080i, compatibility modes, memory card. No 720p: the GS only scales lines by whole numbers, so a game's ~448 lines would come out squashed or cropped; 1080i fills an HDTV best.
- CRT TVs: the menu is 720p, which a CRT shows as a black screen. Press L2+R2 together (it works blind) to
switch it to 480i (576i on PAL consoles) and back; it is saved as
[video] pantallainconfig.ini. In 480i the games default to their native mode too. - In-game menu: hold L1+L2+R1+R2+START+SELECT in any game to pause it and restart or power off; plus direct restart and power-off combos (In Game Reset).
- RetroAchievements on the console: the launcher identifies each game (rcheevos-compatible hash), shows how many achievements it has (○ opens the full list with your progress), and while you play an agent inside the game streams its memory to the xeRAbora client on your home network, which unlocks the achievements on your profile.
- Discs, PS1 and apps: boots the disc in the drive, PS1 games through POPStarter, and homebrew from
APPS/. - Spanish or English (
config.ini [ui] idioma), including the in-game menu and the config file's comments. - Companion app: ORBIT Jellyfin, your Jellyfin library on the PS2.
- Copy the release zip's contents to the root of a FAT32 or exFAT USB drive:
launcher.elfandneutrino/. Put your PS2 ISOs inDVD/(and CD games inCD/). - Start
mass0:/launcher.elffrom uLaunchELF or FreeMcBoot (for example as FMCB's autoboot). - Set up: the first boot opens the setup wizard (START reopens it): language, game sources, memory card,
video, network, the memory card for
BOOT/NULD.ELFand how FreeMcBoot 1.966 starts it (autoboot, a button or its menu; the originalFREEMCB.CNFis kept as.bak). Every setting is also innuld/config.ini, commented. - Play: pick a game, press ✕.
Optional:
- Covers: plug in the network cable; missing covers download at boot. If you see "No DNS", set
[red] dns = 1.1.1.1in config.ini. Your own covers:python3 tools/covers.py IN_DIR OUT_DIR(numpy, Pillow) turns PNG/JPG files named by serial (SLUS-21376.png) into the.c16pair that goes inmass0:/covers/. - Back to NULD from a game: with FMCB set to autoboot
BOOT/NULD.ELF(the wizard does it), "Restart" in the in-game menu brings you back. - MemCard PRO 2 / SD2PSX: they switch to the game's own card when a game starts. To save there instead of the
USB's virtual card, set the game's memory card to
fisica(△, or[memorycard] modo = fisicafor every game). - Achievements: run the xeRAbora client (signed in to your RetroAchievements account) on a PC or server on the same network. Use v0.1.0-alpha.9, the version NULD is tested with: xeRAbora is in active development and newer releases may change the protocol.
- Home game server: on a Linux box, run Neutrino's
udpfs_server.pyand NULD'sserver/nuld_catalog.py(zip,server/) over<root>/DVD; set[juegos] origen = usb, udpfsandservidor = <server IP>. Use a cable. Any other udpfs server (Server2PS2, ...): leaveservidorempty and set a fixed[red] ip; no online covers or achievements then. - From an MMCE instead of a USB (SD2PSX, MemCard PRO 2): copy the same files to the card's SD and start
mmce0:/launcher.elf(point FMCB's autoboot straight at it). Settings, covers and Neutrino live on the card; PS1 games need NULD on a USB; MX4SIO can't be used alongside. - Status: SELECT shows each game source (games found, or why it failed) and the network.
The full guide is on the website and in the setup video.
- A PS2 that can run homebrew (FreeMcBoot or similar). Tested on a slim SCPH-75001.
- A USB drive (FAT32; exFAT for ISOs over 4 GB).
- Network (optional): built-in Ethernet on slim models, the network adapter on fat ones. Wired.
Toolchain: ps2dev v2.0 (with the wolfSSL and libjpeg ports) on Linux or WSL.
./build.sh APP=launcher # launcher.elf
./build.sh test # host selftests
tools/build_neutrino.sh # the Neutrino fork: neutrino.elf, ee_core.elf, raagent.irx (dist/neutrino)
./build.sh nuld_hash # the game server's helper (static)
How it was built, phase by phase, is in openspec/ (specs and archived changes) and docs/ (results measured on
the console).
- Neutrino by Maximus32 (AFL-3.0), which loads the games; NULD ships a
fork with the in-game menu and the achievements agent (
third_party/neutrino-igr, AFL-3.0). - Open PS2 Loader (AFL-3.0): the In Game Reset technique.
- xeRAbora (MIT client): the RetroAchievements protocol and PC client; rcheevos (MIT): the hash algorithm.
- ps2sdk, wolfSSL, libjpeg; covers from xlenore/ps2-covers; fonts Unbounded, Sora, Space Mono (SIL OFL).
- Developed with Claude Code (Anthropic) as the coding assistant, with the OpenSpec, Ponytail and CodeGraph plugins.
GPL-3.0 (the launcher statically links wolfSSL, GPL-3.0+). The Neutrino fork in third_party/neutrino-igr is
AFL-3.0, as Neutrino.
