RetroDisc is an open game media standard for portable Windows games on Linux.
RetroDisc brings back the simplicity of classic game consoles.
A RetroDisc game behaves like a physical game release:
- 💿 Connect a disc, USB drive, SSD, HDD, microSD card or other storage device.
▶️ Launch the included RetroDisc launcher.- 🎮 Play the game.
A RetroDisc release contains the information and files required to launch a Windows game on a compatible Linux system:
- Game launcher
- Game manifest
- Runtime configuration
- Compatibility configuration
- Original game files
- Optional bundled Wine prefix
RetroDisc does not replace Wine or Proton.
Instead, it provides a standardized way to package and launch Windows games while keeping the original release separate from writable user data.
| Feature | Description |
|---|---|
| 🎮 Plug & Play | Launch games directly from portable storage |
| 💾 Portable Releases | Move games between compatible drives and systems |
| 🔒 Game Preservation | Keep original game files unchanged whenever possible |
| 📂 Standard Layout | Every RetroDisc title follows the same basic structure |
| 💾 Persistent Saves | Store writable game data separately from the original release |
| 🔧 Writable Separation | Separate runtime changes from the original game files |
| 🧪 Temporary Runtime | Use a temporary writable filesystem while the game is running |
| 📦 Bundled Prefix | Optionally include a preconfigured Wine prefix |
| ⚙️ Automatic Configuration | Create persistent config.json automatically when required |
RetroDisc is built around four principles.
A RetroDisc game is designed to run directly from portable storage.
Games can be stored on USB drives, external SSDs, HDDs, optical media, SD cards or other supported storage devices. The launcher prepares the required runtime environment before starting the game.
The original game release normally does not need to be modified.
If compatibility modifications are required, they are applied to the persistent writable game-data layer rather than the original release whenever possible.
The original game files are treated as the read-only base of the runtime filesystem.
While the game is running, changes are written to a separate writable layer. This allows games to run from read-only media while still supporting saves, configuration files and other writable data.
The original release therefore remains also suitable for archival.
A RetroDisc release contains the files required to identify and launch a game.
The release can be copied or moved between compatible storage devices without installing the original game into a traditional system-wide location.
Persistent user data may either remain on the Linux system or be stored on portable writable media.
Every RetroDisc title follows a common structure:
RetroDisc Game/
├── RetroDisc
├── manifest.json
├── gamedata/
├── config.json (optional)
└── pfx/ (optional)
The RetroDisc launcher.
It reads the game metadata and runtime configuration, prepares the runtime filesystem and compatibility environment, launches the game and performs cleanup afterwards.
Contains the basic metadata required to identify and launch the game.
Example:
{
"game": {
"id": "example-game",
"name": "Example Game",
"executable": "gamedata/Game.exe"
},
"runtime": "wine"
}The manifest defines:
- Game ID
- Game name
- Executable
- Default runtime
Runtime-specific settings are stored separately in the persistent game-data directory.
An optional release configuration containing runtime and compatibility settings for the game.
The RetroDisc launcher contains a default configuration embedded in the launcher itself. A config.json placed next to the launcher is optional and can be used to provide or override the release configuration.
If no external config.json is present, RetroDisc uses the configuration embedded in the launcher.
The selected release configuration is used as the template for the user's persistent config.json.
Contains the original game files.
RetroDisc treats this directory as the original release and does not normally modify it during execution.
An optional bundled Wine prefix.
If included, it provides a preconfigured starting environment for the game. It is copied to the persistent game-data directory when no persistent prefix exists.
The bundled prefix itself is never modified directly.
RetroDisc stores writable game data separately from the original release.
By default, the persistent directory is:
~/Games/RetroDisc/<gameId>/
When --datapath is supplied, the specified directory is used instead:
<datapath>/
A typical persistent directory looks like:
~/Games/RetroDisc/
└── <gameId>/
├── config.json
├── gamedata/
└── pfx/
Persistent data may contain:
- Runtime configuration
- Wine/Proton prefix
- Registry changes
- Windows user profile
- Save data
- Game configuration files
- Persistent game modifications
The persistent directory is reused between launches.
RetroDisc does not recreate persistent data on every launch.
The original gamedata/ is used as a read-only base for a temporary fuse-overlayfs filesystem.
Conceptually:
RetroDisc Release
│
│ read-only
▼
gamedata/
│
│ fuse-overlayfs
▼
Temporary Runtime
│
├── game changes
├── temporary files
└── runtime modifications
│
▼
Persistent Writable Layer
~/Games/RetroDisc/<gameId>/
│
├── gamedata/
└── ...
The writable upper layer is stored in:
~/Games/RetroDisc/<gameId>/gamedata/
or:
<datapath>/gamedata/
Temporary overlay directories are created under /tmp and removed after the game exits whenever cleanup succeeds.
Typical temporary paths are:
/tmp/RetroDisc_<pid>/
/tmp/RetroDiscWork_<pid>/
If temporary directories cannot be removed during shutdown, they are expected to disappear when the system cleans /tmp, typically after a restart.
Each game has a persistent config.json.
By default:
~/Games/RetroDisc/<gameId>/config.json
With --datapath:
<datapath>/config.json
If the persistent configuration does not exist when the game is started, RetroDisc creates it from the configuration embedded in the RetroDisc release.
Once created, the configuration is persistent.
RetroDisc reuses the existing configuration on subsequent launches and does not recreate or overwrite it automatically.
The generated configuration provides default settings but does not guarantee that the game will run correctly.
Depending on the game, additional compatibility settings may be required, such as:
- DLL overrides
- Windows version
- Graphics settings
- Synchronization settings
- Custom launch arguments
- Other Wine/Proton settings
The persistent config.json can be edited manually.
{
"runtime": "wine",
"launch": {
"arguments": [
"-fullscreen"
]
},
"environment": {
"DXVK_HUD": "0"
},
"wine": {
"windowsVersion": "win10",
"graphics": {
"renderer": "vulkan",
"videoMemory": 4096,
"strictDrawOrdering": false
},
"sync": {
"esync": true,
"fsync": true,
"ntsync": false
}
}
}RetroDisc keeps the persistent Wine/Proton user profile independent of the actual Linux username.
The persistent Windows user is:
RetroDisc
At runtime, RetroDisc determines the current Linux/Steam user and creates a temporary symbolic link inside the Wine prefix:
drive_c/users/<runtime-user>
└──> RetroDisc
This allows Windows applications to see the expected runtime username while persistent data remains inside the RetroDisc profile.
The temporary link is removed after the game exits.
RetroDisc supports both Wine and Proton.
For:
{
"runtime": "wine"
}RetroDisc launches the configured executable using Wine and the persistent game prefix.
For:
{
"runtime": "proton"
}RetroDisc locates the configured Proton installation through Steam and uses the persistent game prefix.
A specific Proton installation can be selected through the game configuration.
RetroDisc therefore acts as the packaging and runtime-preparation layer rather than replacing Wine or Proton.
When a RetroDisc game is launched, the launcher:
- Determines the RetroDisc release directory.
- Loads
manifest.json. - Determines the persistent game-data directory.
- Loads the persistent
config.json. - Creates
config.jsonfrom the release configuration if necessary. - Selects the configured Wine or Proton runtime.
- Creates or reuses the persistent game-data directory.
- Creates a temporary
fuse-overlayfsfilesystem forgamedata/. - Verifies that the configured executable is available through the overlay.
- Creates the temporary runtime Wine user link.
- Applies environment variables and compatibility settings.
- Launches the game.
- Removes the temporary runtime user link.
- Unmounts the temporary filesystem.
- Removes temporary files.
The original game release remains unchanged whenever the game does not require direct modification.
RetroDisc is storage independent.
- Internal SSDs
- External SSDs
- USB flash drives
- SD / microSD cards
- NAS storage (theoretically; currently untested)
- ISO images
- HDDs
- Blu-Ray
- DVD-ROM
- CD-ROM
Loading performance depends primarily on the underlying storage device and filesystem.
The impact varies by game. Some games frequently access many small files, while others primarily load a smaller number of large files.
Therefore, total game size alone does not determine loading performance.
RetroDisc itself is designed to have only a small number of system dependencies.
- Wine or Proton, depending on the game
fuse-overlayfsfuse3/fusermount3findmntfromutil-linux
On Arch Linux:
sudo pacman -S --needed fuse-overlayfs fuse3 util-linuxFor Wine:
sudo pacman -S --needed wineFor Proton:
sudo pacman -S --needed steamThe RetroDisc launcher itself does not require CMake, GCC or the nlohmann-json development package at runtime.
Individual games may additionally require:
- Proton
- Vulkan drivers
- DXVK
- Gamescope
- Discord
Not every RetroDisc title requires every optional component.
Discord integration is optional. If Discord is unavailable, RetroDisc continues launching the game normally.
RetroDisc follows these rules for persistent data:
- Original
gamedata/is not used as a writable Wine prefix. - Original game files are not directly modified during normal execution.
- Runtime changes are written through the temporary overlay.
- Persistent writable data is stored separately.
- Persistent configurations are reused instead of recreated.
- Persistent Wine/Proton prefixes are reused between launches.
- A bundled prefix is copied only when no persistent prefix exists.
- An existing persistent prefix is never automatically overwritten.
- An incomplete persistent prefix is not automatically replaced.
This separation allows the original RetroDisc release to remain portable, reproducible and suitable for preservation.
RetroDisc is licensed under the GNU General Public License v3.0 (GPL-3.0).
Everyone is free to use, study, modify and redistribute RetroDisc under the terms of the GPL.