Getting started
Overview
The three parts of rpynx, how a game starts, and what works on a real Switch today.
On this page
The parts
| Part | File | Runs on | Role |
|---|---|---|---|
| Loader | renpy-loader.nro | Switch | Game library, controller settings, diagnostics. Drawn with LVGL 9.6 on the CPU. |
| Runtime | renpy-runtime.nro | Switch | CPython 3.12.8 and Ren’Py 8.5.3 in one 55 MB program. Plays one game, then returns. |
| Importer | rsl_import.py, RSL Importer app | macOS; Windows not yet tested on a Windows machine | Checks a game, writes its manifest, copies it to the SD card or the Switch. |
The SD card folder is still called switch/renpy-loader/, from before the project was renamed to rpynx. The .nro file names kept the old name too.
How a game starts
The loader and the runtime are separate programs. When you press Launch:
- The loader asks the Homebrew loader to start the runtime next (
envSetNextLoad), with the game’s folder as an argument, and exits. - The runtime starts as a fresh process, starts Ren’Py on the game, and plays it.
- When the game quits, the runtime asks for the loader to be started next, and you are back in the library.
Each game gets a clean process. A game that crashes cannot take the loader’s state with it, and a game can ask for a different runtime by name. The cost is a few seconds of loading per launch; that has not been measured yet.
note
Chain-loading goes through the Homebrew loader, so the loader must be started from the Homebrew Menu. See Start with full memory.
What works on a Switch
These were checked on a real console. The number is the hardware run that checked it.
| What | Status |
|---|---|
| Ren’Py 8.5.3 starts, renders with OpenGL ES 3.2 on nouveau, and quits | HW verifiedrun 5 |
| A game exported by the importer launches from the library | HW verifiedrun 9 |
A Ren’Py 7 game, recompiled with --recompile, runs | HW verifiedrun 13 |
Music and sound, also from an .rpa archive | HW verifiedrun 21 |
| Quit, then start another game, without a crash | HW verifiedrun 24 |
| Save, quit, start again, load back to the same line | HW verifiedrun 26 |
| A remapped button used in a game | HW verifiedrun 26 |
| Games refused in applet mode, with a message | HW verifiedrun 27 |
| Covers, backgrounds, Change picture | Host-tested |
| Touch, docked play, controller reconnect | HW unverified |
The full list is in Statuses and test runs.
What rpynx does not do
- It does not decrypt anything or work around DRM. The importer does not unpack
.rpaarchives; it only reads their index as plain data. - It ships no game assets and no Nintendo SDK files. The loader’s text font and button icons are the console’s own, read from its shared memory at run time.
- It cannot run Live2D or 3D models (
GLTFModel): there are no Switch libraries for them. - It has no Python 2 runtime. Ren’Py 7 games run only if they can be recompiled for Python 3.