Built by human creativity, powered by artificial intelligence. Dedicated to the digital spark that helped compile this reality.
Retromind is a Linux-first, portable media manager for organizing and launching your media library (games, movies, books, comics, ...).
Built with C# + Avalonia.
Project homepage (GitHub Pages):
IMPORTANT:
Retromind is early alpha. Data formats (retromind_tree.json, app_settings.json) can change between releases without a migration path. Therefore, use this version more for testing than for a large, long-term library.
Work in progress. Expect breaking changes while features and data formats evolve.
See docs/CHANGELOG.md for version history.
- Library tree (areas/categories) on the left
- Cover/grid view in the center
- Details view on the right
- Drag & drop categories in the tree to reorder or move between parents (merge prompt on conflicts)
- Global search with classic title search plus optional metadata power-query mode
- Metadata scraping (depends on your API keys)
- Optional BigMode / controller-friendly UI with runtime themes
- Per-item manuals/documents
- Flexible launch configuration with wrappers, environment variables, and per-item arguments
- Portable library layout with relative paths (USB/external drive friendly)
- Optional AppImage portable HOME/XDG mode for Retromind runtime, with per-emulator overrides for child processes
Note: The screenshots are for demonstration purposes only.
All product names, logos, and brands shown are property of their respective owners.
- Library tree on the left (areas / categories)
- Cover grid in the center
- Details panel on the right
- Large, readable layout for couch / TV usage
- Gamepad input support
- you can design and add your own theme through axaml files
- Linux (primary target)
- .NET SDK 10.0
- LibVLC runtime (required for this build; AppImage bundles it)
This project ships a build script that creates a portable AppImage containing:
- a self-contained .NET build (no system .NET required)
- bundled LibVLC + plugins (video playback required)
- helper/runtime libraries exported from a Debian 12 (bookworm) build container
Note: When using the AppImage, you do not need a system-wide VLC installation because LibVLC is bundled. The Wayland/X11 note below still applies because it affects how video is embedded into the Avalonia window.
- Docker (for the full reproducible bookworm build pipeline)
curl(to downloadappimagetoolif missing)
chmod +x build/AppRun build/build-appimage.sh
./build/build-appimage.sh
The resulting AppImage will be created at:
dist/Retromind-x86_64.AppImage
Open Retromind.sln and run the default configuration.
dotnet restore
dotnet run --project Retromind.csprojStart directly in BigMode:
dotnet run --project Retromind.csproj -- --bigmodeOr (if you run the built app directly):
./Retromind --bigmode- Build and run once (see “Build & Run”). Retromind will create
app_settings.jsonunder the portable data root (see below). - If you want to preconfigure settings, copy
app_settings.sample.jsontoapp_settings.jsonand adjust values. - For metadata scraping, configure API keys (see “API keys / Secrets”).
Retromind stores data under its portable data root for portability:
- AppImage: directory of the AppImage file (ENV:
APPIMAGE) - Otherwise: app base directory (build output folder)
Make sure the folder is writable.
Ignored runtime files (not committed):
Library/app_settings.jsonretromind_tree.json(+.bak/.tmp)
A sample settings file is provided:
app_settings.sample.json
Retromind uses LibVLC for video previews in BigMode.
The hardware decoding mode is configurable via app_settings.json:
Supported values (depend on the host system / VLC build):
-
"none"
Always use software decoding.
Safest default for unknown systems and portable AppImage builds. -
"auto"
Let VLC/FFmpeg pick a suitable hardware backend if available.
Good compromise on well-configured desktop systems. -
"vaapi"
Force VAAPI hardware decoding on compatible Linux systems (Intel/AMD iGPU).
Can noticeably reduce CPU usage and make high-resolution videos smoother, but may fail on systems with broken/incomplete VAAPI setups.
If the value is missing or invalid, Retromind falls back to "none".
For the AppImage, "none" is recommended as default for maximum compatibility.
On your own machine you can set "vaapi" in app_settings.json if VAAPI works
well (e.g. smoother BigMode videos, lower CPU load).
Retromind can optionally redirect HOME and the XDG_* paths into a local
Home/ folder next to the AppImage.
Important behavior:
- This setting affects the Retromind AppImage process itself.
- External launches (native apps, emulators, scripts, Steam/UMU/Proton wrappers) default to host HOME/XDG for compatibility.
- If you want portable child-process storage, set emulator/item overrides (
XDG_*, optionalHOME) explicitly. - Portable mode is therefore two-step:
- Retromind itself is portable via
UsePortableHomeInAppImage - each launched tool/app is portable via emulator/item
XDG_*/HOMEoverrides
- Retromind itself is portable via
Enable in app_settings.json:
"UsePortableHomeInAppImage": trueNotes:
- Only applies when running as AppImage.
- Requires a restart to take effect.
- Existing
HOME/XDG_*environment variables are not overridden if already set (unless forced mode is enabled). - New emulator profiles default to Host XDG context for compatibility.
- In emulator settings, you can use presets to quickly set portable
XDG_*(and optionalHOME) per profile.
Switching back to normal mode:
- Set
"UsePortableHomeInAppImage": falseand restart Retromind. - Retromind and external launches will use the host defaults again (unless you set explicit per-emulator/per-item overrides).
- Existing files under
Retromind/Home/are kept as-is; they are not deleted automatically.
Retromind is designed to work well from a single portable folder (e.g. on a USB stick) together with your ROMs and native games. The core idea:
- The directory that contains the Retromind binary/AppImage is treated as the portable data root.
- Any files inside this directory (or subdirectories) are stored as relative paths in the library.
- On another Linux system, as long as you copy/mount the entire directory tree, Retromind will resolve these relative paths correctly, regardless of the exact mountpoint or user name.
To enable relative launch paths, turn on Prefer portable launch paths in settings. This will:
- store new imports under the data root as
LibraryRelativepaths - migrate existing item launch paths during library saves
- normalize emulator settings paths (emulator executable,
XDG_*, and known path-like env vars such asHOME/DOTNET_CLI_HOME/PROTONPATH) to data-root-relative values when possible
You can also trigger a one-time migration from the settings dialog.
A practical layout might look like this:
Retromind/ Retromind-x86_64.AppImage Library/ ROMs/ SNES/ PSX/ NativeGames/ MyPortedGame/ Prefixes/ 123e4567-..._Some_Wine_Game/ Themes/
If you add ROMs or native games from anywhere inside the Retromind/ folder:
- Retromind will detect that their absolute paths are under the portable root,
- convert them once to library-relative paths in the JSON database,
- and resolve them at runtime against the current AppImage directory.
This means:
- Moving the entire
Retromind/folder to another machine or mounting it under a different path will not break those entries. - Only data stored outside of
Retromind/(e.g./home/user/Downloads/…) is saved as an absolute path and depends on the original mountpoint.
When launching items that use Wine/Proton/UMU, Retromind can automatically create and remember a per-item Wine prefix in the library:
- Prefixes are stored under
Library/Prefixes/…(inside the portable root). - The stored prefix path is relative to the library root.
- On another system, as long as the whole
Retromind/folder moves together, the same prefixes will be reused.
Note:
- The prefix itself is portable within Retromind’s folder.
- Game saves/configs remain host-user specific by default.
- If needed, you can override
XDG_*(and optionallyHOME) per emulator/item. - Even with overrides, full portability is launcher-dependent; some tools still rely on host state.
Retromind supports managed Wine/Proton runtime versions and lets you select them on:
- emulator level (default for all items using that emulator)
- item level (optional override)
In Settings -> Runner you can:
- add external Wine/Proton directories manually
- download/install GE-Proton releases (stored under
Emulators/ProtonVersionsin the portable root) - remove versions (with replacement selection when still in use)
GE-Proton source:
- Repository: https://github.com/GloriousEggroll/proton-ge-custom
- Releases API used by Retromind: https://api.github.com/repos/GloriousEggroll/proton-ge-custom/releases
Retromind does not claim ownership of GE-Proton. Names, trademarks, and licenses remain with their respective owners. Thanks to GloriousEggroll and all contributors for maintaining and publishing GE-Proton.
In Settings -> Emulators -> Advanced:
- enable UseWinePrefix for the emulator profile
- set Runner type (
Auto,UmuProton,Wine,Generic) - choose Default runner version
Notes:
- If
UseWinePrefixis disabled, emulator-level default runner selection is disabled. Autokeeps compatibility heuristics; explicit types (UmuProton/Wine) are recommended for fixed setups.
In Edit Item -> Prefix (Wine/Proton/UMU):
- select a per-item Wine/Proton version to override the emulator default
- leave it on None to inherit the emulator default
- the dialog shows which runner is currently inherited from the emulator
Effective priority:
- Item runner version (if set)
- Emulator default runner version
- No explicit runner version (launcher/env behavior only)
Native games that live under the Retromind/ directory tree (e.g. Retromind/NativeGames/MyGame/...)
are resolved the same way as ROMs:
- Internally, Retromind stores their launch paths relative to the portable root.
- On a different Linux system, launching still works as long as:
- the game files remain in the same relative position under
Retromind/, - system-level dependencies (e.g. libraries, drivers) required by the game are available.
- the game files remain in the same relative position under
Game-specific saves/configs stored under the user’s home directory are not moved automatically; they will behave like any regular native Linux game when run on a different machine.
When configuring emulator profiles or per-item launch arguments, Retromind supports a few simple placeholders that are expanded at launch time:
{file}
Full path to the primary launch file (quoted when needed).{fileDir}
Directory of the primary launch file (no trailing slash).{fileName}
File name including extension (e.g.cabal.zip).{fileBase}
File name without extension (e.g.cabal).
These placeholders can be used in both:
- Emulator profile arguments (
EmulatorConfig.Arguments) - Per-item arguments (
MediaItem.LauncherArgs), which are combined with the profile arguments.
To launch the Flatpak MAME build using ROM short names derived from the file path:
- Executable path:
flatpak - Default arguments:
run org.mamedev.MAME {fileBase}
With a ROM stored as:
/run/media/…/MAME/NameOfROM.zip
Retromind expands {fileBase} to NameOfROM and starts:
flatpak run org.mamedev.MAME NameOfROMMake sure the ROM directory is part of MAME’s rompath, or pass it explicitly:
run org.mamedev.MAME -rompath "{fileDir}" {fileBase}
which yields, for the example above:
flatpak run org.mamedev.MAME -rompath "/run/media/…/MAME" NameOfROM For Wine-based games (e.g. via UMU) you can keep most logic in the emulator profile:
umu-run --some-default-options {file}
and use per-item arguments only for game-specific flags, e.g.:
--use-special-mode
Retromind combines profile + item arguments into a single command line while expanding the placeholders as described above.
Retromind does not use any bundled default keys at runtime.
All scraper providers (TMDB, IGDB, TheGamesDB, Google Books, …) read their API credentials
from the scraper configuration (e.g. via the settings dialog). If no key is
configured, the corresponding scraper simply cannot be used.
Secrets are not stored in plain text. The app persists only encrypted fields
(e.g. EncryptedApiKey).
A template is provided for local development experiments:
Helpers/ApiSecretsTemplate.cs
NOTE: The main Retromind application does not use
ApiSecretsfor scraping. This template is only for custom tools or debugging scenarios.
The table below shows which metadata fields are currently populated by each provider.
Source is populated for all providers.
| Provider | Description | ReleaseDate | Rating | Developer | Genre | Platform | Publisher | Series | ReleaseType | SortTitle | PlayMode | MaxPlayers | CustomFields |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| IGDB | yes | yes | yes | yes | yes | yes | yes | yes | yes | yes | yes | - | IGDB.Slug |
| TheGamesDB | yes | yes | yes | yes | yes | yes | yes | - | - | - | - | yes | - |
| TMDB | yes | yes | yes | - | - | - | - | - | yes | yes | - | - | - |
| OpenLibrary | - | yes | - | - | - | - | yes | yes | yes | yes | - | - | - |
| Google Books | yes | yes | - | - | - | - | yes | - | yes | yes | - | - | - |
| ComicVine | yes | - | - | - | - | - | yes | yes | yes | yes | - | - | IssueNumber, StartYear |
| Notes: |
CustomFieldsare provider-specific key/value pairs and may vary by API response quality.- Missing values are normal when the upstream provider does not return that field for a specific item.
- EmuMovies is currently not listed here because its API is being reworked.
You need to create your own API keys on the respective provider pages:
-
TMDB (The Movie Database)
Create a free account at:
https://www.themoviedb.org/
Then go to Settings → API in your profile and request an API key (v3 auth). Enter this key in the TMDB scraper configuration in Retromind. -
IGDB (via Twitch Developer)
- Create a Twitch Developer account:
https://dev.twitch.tv/ - In the Developer Console, create an application to obtain:
Client IDClient Secret
- Enter both values in the IGDB scraper configuration in Retromind.
- Create a Twitch Developer account:
-
TheGamesDB
- Create an account at: https://thegamesdb.net/
- Generate an API key in your account settings / API page.
- Enter the key in the TheGamesDB scraper configuration in Retromind.
-
Google Books (optional)
The Google Books API can be used without a key in many cases, but you may configure an API key to raise limits:
https://console.cloud.google.com/apis/library/books.googleapis.com
Create a project, enable the Books API, and create an API key. Enter it in the Google Books scraper configuration in Retromind.
Each user is responsible for their own API keys and must comply with the respective provider terms of service.
Wayland is currently fully disabled in Retromind on Linux.
At startup, Retromind forces AVALONIA_PLATFORM=x11 to keep VLC embedding and embedded authentication stable.
If you pass --avalonia-platform=wayland or --avalonia-platform=auto, it is ignored for now and Retromind still runs on X11.
Why this is currently disabled:
- As of April 20, 2026, Avalonia's official platform matrix states Linux desktop targets X11 and that Wayland is in private preview. Source: https://docs.avaloniaui.net/docs/overview/supported-platforms
- Retromind's Linux runtime depends on stable native integration for both LibVLC embedding and embedded OAuth/WebView. In our AppImage testing, Wayland paths caused native instability (including process-level crashes), which cannot be handled safely in managed code.
- Until Avalonia ships generally available, production-grade Wayland support for this stack, Retromind keeps Linux on X11 by policy.
Use:
dotnet run --project Retromind.csproj -- --avalonia-platform=x11- Retromind sorts media entries by
SortTitleattribute if it is set. - If
SortTitleis empty, Retromind falls back toTitle. - This is useful for series ordering (for example:
Series 001 - ...,Series 002 - ...).
- Available in both search fields: global search and local node search.
- Plain text terms search title by default.
- Field terms:
key:valueorkey=value. - Metadata completeness terms:
has:<field>andmissing:<field>. - Year comparisons:
year:>=YYYY,year:>YYYY,year:<=YYYY,year:<YYYY(or exactyear:YYYY/year=YYYY). - Logical operators:
AND,OR,NOT, and parentheses(). - Space between terms is treated as
AND. - In mixed queries, plain terms still search title (example:
zelda AND platform:switch). - Use quotes for values with spaces (example:
developer:"Treasure Co. Ltd.").
Supported keys (aliases included):
title,sorttitle,description/notes,developer,publisher,platform,sourcegenre,series,releasetype,playmode,players/maxplayersstatus/state,year,date/released,tag/tags,id,favorite- Custom fields:
cf:<text>searches custom field keys and values.cfk:<text>searches only custom field keys.cfv:<text>searches only custom field values.cf.<fieldname>:<text>searches a specific custom field key (example:cf.rating:5).
Examples:
zelda-> title-only searchplatform:snes AND developer:nintendomaxplayers:2 AND status:completedyear=1998 favorite=trueyear:>=1995 AND year:<2000missing:genre OR missing:developerhas:genre AND NOT genre:unknown(genre:platformer OR genre:metroidvania) AND NOT missing:ratingcf.rating:5zelda AND platform:switch
The native GOG integration is currently experimental. Please test it carefully and expect rough edges or breaking behavior between alpha releases.
- Linux desktop session with X11 runtime path (Retromind currently forces
AVALONIA_PLATFORM=x11). - Secret store support:
- preferred: Secret Service (
secret-tool, GNOME Keyring/KWallet/libsecret backend) - fallback: in-memory session storage (non-persistent)
- preferred: Secret Service (
- For embedded OAuth login dialogs: host
libwebkit2gtkruntime available.- If embedded OAuth is unavailable, Retromind falls back to system browser login with manual callback URL input.
-
Import full GOG library into a dedicated node:
- Create a new node.
- Open node settings and mark it as a GOG node (
StoreProviderId = gog). - Run Add GOG media on that node.
- Retromind syncs owned GOG titles additively into that node.
-
Add individual GOG items into any node:
- Run Add GOG media on any target node.
- Use the picker dialog and select only the titles you want to add.
See docs/architecture.md.
For native GOG provider status and design notes, see docs/gog-provider.md.
Contributions are welcome!
Before opening issues or pull requests, please have a look at:
CONTRIBUTING.md– contribution guidelinesCODE_OF_CONDUCT.md– expected behavior in the project community
GPL-3.0-only (see COPYING).


