Importer
Desktop app
The importer window on macOS and Windows: the Library, the Import page and the target.
On this page
The window is a web page (importer/rsl_import_gui.html) shown by pywebview in the system’s own web view: WebKit on macOS, Edge WebView2 on Windows. Every check and copy is done by the same rsl package the command line uses.
Start it
People without Python can use the built app: RSL Importer.app on macOS or RSL Importer.exe on Windows (see Build the app). With Python, install pywebview once:
python3 -m pip install pywebviewpython3 importer/rsl_import_gui.pyOn Windows: py -m pip install pywebview, then py importer\rsl_import_gui.py.
note
On macOS’s /usr/bin/python3 (3.9), pip may pick a yanked pyobjc 12.0 and compile it, which needs the Xcode Command Line Tools. The built app, or Python 3.10+ from python.org, avoids that.
Target
Where the library is read from and where games go:
- SD card: choose its top folder,
E:\on Windows or/Volumes/<name>on macOS. A mounted drive that already has aswitch/folder is offered, and chosen if it is the only one. - Switch over Wi-Fi (FTP): type the address sphaira shows, for example
192.168.1.20:5000, and press Connect. See Upload over FTP.
Library
Lists the games already on the target, read from each manifest.json. Each card shows the game’s cover as the loader does, and a status chip:
| Chip | Meaning |
|---|---|
| Experimental | No warnings and no Switch performance issues. |
| Review | Experimental, with warnings or performance issues to read first. |
| Unsupported | The manifest’s reasons say why. |
| No manifest | Copied by hand, or not by this importer. |
Click a card for its report, its background, and:
- Change cover… and Change background…: pick a picture, and it is converted and written to the target at once. See Covers and backgrounds.
- Delete…: asks first, then removes
games/<id>/. Its saves inswitch/renpy-loader/saves/<id>/stay unless Also delete its saves is ticked. Logs are kept.
Compare with folder… checks a folder of game sources on your computer against the library and changes nothing on either side:
| State | Meaning |
|---|---|
| Same | Matches what the manifest recorded from its source. |
| Different | File count, total size, or an .rpa/.rpyc hash differs. |
| Not on the Switch | No game in the library matches it. |
| Only on the Switch | No source in the folder matches this library game. |
| Can’t compare | A match without a usable manifest.json. |
| Not a game | The importer cannot read it as a Ren’Py game. |
The file count and total size are compared first; if both match, every .rpa and .rpyc is hashed (SHA-256). A change to images, audio or .rpy files that keeps the count and size is not found.
Import
- Drop a game folder,
.zip,.7zor.raron the window, or use Choose folder… / Choose archive…. It is analyzed at once. - Set options: Optimize (
--optimize), Recompile (--recompile), Decompile (--decompile, with the decompiler chosen under it), Game id (--id, blank to make it from the title). Changing one clears the report; press Analyze again. - When the analysis finds something an option fixes, an alert under that option says why, and its Turn on button ticks the option and analyzes again.
- Tools shows whether 7-Zip,
ffprobe,ffmpeg, unrpyc and rpycdec were found. Tools folder… is--tools. - Read the report: status, Ren’Py version, the pictures, warnings, Switch performance issues and the
Checked:line. - Replace is
--replace. Export copies file by file with a progress bar.
Cancel stops after the current file: the half-made copy is removed, and an existing export stays as it was. Closing the window during an export does the same before the program quits. Export is disabled for unsupported games.
note
Text from a game (title, report, paths) is put on the page as plain text, never as HTML, so a title in options.rpy cannot inject script into a page that can export.
Windows setup
- Use RSL Importer.exe (no Python needed), or install Python 3.9+ from python.org and run
py -m pip install pywebview. The window uses Microsoft Edge WebView2, which Windows 11 has; on Windows 10, install the “Evergreen” WebView2 Runtime if the window does not open. - Install 7-Zip from 7-zip.org. It is found in
C:\Program Files\7-Zipwithout further setup. - Install FFmpeg:
winget install Gyan.FFmpegputs it onPATH. Or unzip a build and choose itsbinfolder with Tools folder…. - Put the SD card in the PC and choose its drive, for example
E:\.
What differs on Windows:
- Archive entries Windows cannot create under their own name are refused: device names (
CON,NUL.txt,COM1),:,<>"|?*, and names ending in a dot or a space. - 7-Zip, FFmpeg and the decompilers run without a console window popping up.
- Paths longer than 260 characters need Windows’ long-path setting; the importer does not work around it.
warning
Windows support is tested on macOS with Windows faked (ntpath, a cp1252 console, mocked tool calls), not on a Windows machine yet. The window has run on macOS only; its WebView2 backend and the one-file .exe are untested.
Build the app
PyInstaller turns the window into one program. It does not cross-compile: build the .exe on Windows and the .app on a Mac.
python -m pip install pyinstaller pywebviewpython importer/build_app.py| Platform | Output |
|---|---|
| Windows | dist\importer\RSL Importer.exe, a single file |
| macOS | dist/importer/RSL Importer.app (24 MB; built with Python 3.12 and pywebview 6.2.1, launched on macOS 15.7) |
The app is not signed. Windows SmartScreen shows “Windows protected your PC”: click More info, then Run anyway. On macOS, right-click the app and choose Open the first time.
7-Zip and FFmpeg are not bundled. They have their own licences, and installing them separately keeps those terms off the app and lets you update them.