Create custom mod cards for GPU Selector to distribute and install your mods easily.
Custom mod cards allow mod authors to create downloadable, installable mod packages that integrate directly with GPU Selector. Users can load multiple cards simultaneously from URLs or local files, and each card appears in the Mods tab with its own download, install, and launch capabilities.
versions can highlight and group games without downloadsGPU Selector supports loading multiple mod cards simultaneously. Each card operates independently with its own download state, install tracking, detection, and UI elements.
The name field is the card's unique identifier. Two cards cannot share the same name. Card names cannot be renamed after creation: the backend uses the name to key mod folders, download tracking, and install manifests.
Some cards are built into GPU Selector (e.g., Windower 4). Built-in cards are special:
Object.freeze) to prevent accidental mutationMod authors can set "locked": true in their card JSON to hide the View/Edit JSON option from the gear menu. This is useful for cards distributed to end users where you don't want them accidentally editing the raw JSON.
{
"cardVersion": "1.0",
"name": "My Mod",
"locked": true,
...
}
locked only hides the JSON editor from the UI. The card can still be deleted and re-added. It does not provide security: it's a convenience feature to reduce support requests from users who break their card JSON.
Cards with an empty "versions": [] array are valid. These "organizer" cards highlight and group games from the user's library without offering any downloads. They're useful for:
{
"cardVersion": "1.0",
"name": "DOOM",
"description": "Highlights your DOOM games",
"tagline": "Rip and Tear",
"versions": [],
"targetGames": [
{"match": "contains", "name": "DOOM"}
],
"ui": {
"buttonColor": "#b91c1c",
"buttonHoverColor": "#991b1b"
}
}
All runtime state is isolated per card. Each card maintains its own:
This means two cards can both target the same game without interfering with each other.
The play button (▶) next to each game in a mod card uses the game's full launch settings from the Games tab: including GPU selection, monitor preferences, launch arguments, pre/post scripts, and all other per-game settings. It does not bypass any game configuration.
.json) or a card package (.zip or .7z).Modding Utilities
Graphics wrappers, shader injectors, and add-on managers. Built-in cards maintained by GPU Selector.
Custom Cards or Modding Cards ← Your cards go here
Cards loaded with + Add Mod. You pick the place with Put them in.
Users switch between the two layers by clicking the title in the header. The Modding Cards layer includes:
The targetGames field lets you link your mod to specific games from the user's library. When a user has matching games installed, a scrollable game list appears on your card showing each matched game with per-game Install, Unload, and Play buttons.
Each entry in targetGames supports several match types, from most precise to broadest:
"targetGames": [
{"match": "exe_hash", "hash": "a1b2c3d4e5f6...64chars..."},
{"match": "id", "name": "steam_379720"},
{"match": "exact", "name": "DOOM", "store": "Steam"},
{"match": "contains", "name": "DOOM"},
{"match": "startsWith", "name": "DOOM"},
{"match": "pattern", "name": "*Dark Souls*"}
]
| Match Type | Behavior | Example |
|---|---|---|
"exe_hash" | Matches the SHA-256 hash of the game's executable (absolute precision) | Targets one specific game binary, regardless of name or store |
"id" | Matches the game's unique internal ID | "steam_379720" targets exactly one game |
"exact" | Game name must match exactly (case-insensitive) | "DOOM" matches only "DOOM" |
"contains" | Game name must contain the word as a whole word (word-boundary) | "DOOM" matches "DOOM Eternal" but not "GOSDOOMA" |
"startsWith" | Game name must start with the target string | "DOOM" matches "DOOM" and "DOOM Eternal" |
"pattern" | Wildcard matching with * (broadest) | "*Souls*" matches "Dark Souls III", etc. |
The "exe_hash" match type uses a SHA-256 hash of the game's executable file for absolute precision targeting. This is the most reliable way to identify a specific game, especially for non-store games or custom executables where names and IDs may vary between users.
{"match": "exe_hash", "hash": "a1b2c3d4e5f6..."}
"exe_hash" with a name-based fallback like "contains".
"store" field to restrict matches to a specific store. For example: {"match": "exact", "name": "DOOM", "store": "Steam"} will only match DOOM from Steam, not from GOG or Epic.
store_identifier (e.g., steam_379720, gog_123456, epic_DOOM). The "id" match type is useful when multiple games share the same name across different stores. For non-store games, use "exe_hash" or "exact" with "store": "Custom".
targetGames, users can find it by searching for game names in the search bar. For example, if your card targets "Elden Ring", typing "elden" in the search will show your card.
When targetGames is defined:
{game} to reference each game's folderEach target game entry can define its own installActions for game-specific files:
"targetGames": [
{
"match": "exact", "name": "FINAL FANTASY VII REMAKE",
"installActions": [
{"type": "copy", "from": "ff7r/dxgi.dll", "to": "{game}/dxgi.dll"}
],
"skipDefaultActions": true,
"logPatterns": ["*.log", "crash_*.txt"]
},
{"match": "contains", "name": "FINAL FANTASY"}
]
| Field | Description |
|---|---|
installActions | Array of game-specific install actions (max 5). Appended to top-level installActions. |
skipDefaultActions | If true, skips the top-level installActions for this game (only uses per-game ones). |
logPatterns | Array of glob patterns for mod log files (max 10). Used for auto-cleanup on unload. |
reshade | Suggested ReShade modes for this game: {"proxy": true, "opengl": "on", "vulkan": "off"}. Each game row has injection (Auto or Proxy), GL and VK buttons (the game's own settings); a suggestion that isn't set yet gets an amber dashed edge. Add "lock": true when you know the game's API: the modes are set for the user and locked on the card. |
hdr | true when the game needs Windows HDR (an HDR mod). When the user turns the card's add-on on for the game, its HDR box is ticked, so GPU Selector turns HDR on when it starts. It never unticks it. |
notes | Up to 8 short lines about this game, like settings it needs: ["Set Color Precision to High."]. The game's row gets a Notes button that opens them. Only people who have the game see them. |
All files installed to game folders are tracked in an install manifest. Users can:
logPatternstargetGames field entirely.
When launchExe is set, users see a security warning before the executable runs. This protects users from unexpected program launches. The warning shows the executable name and requires explicit confirmation.
{
"cardVersion": "1.0",
"name": "Example Mod",
"author": "Example Author",
"authorUrl": "https://github.com/example-author",
"website": "https://example.com",
"icon": "https://example.com/icon.png",
"backgroundArt": "https://example.com/background.jpg",
"description": "Smoother frame pacing and better input for your games",
"tagline": "A made-up mod, to show every field",
"license": "MIT License",
"licenseUrl": "https://github.com/example-author/example-mod/blob/main/LICENSE",
"sourceUrl": "https://github.com/example-author/example-mod",
"locked": false,
"versions": [
{"version": "1.1.0", "url": "https://example.com/example-mod-1.1.0.zip", "filename": "ExampleMod.zip", "password": ""},
{"version": "1.0.0", "url": "https://example.com/example-mod-1.0.0.zip"}
],
"targetGames": [
{"match": "exact", "name": "Elden Ring"},
{"match": "pattern", "name": "*Dark Souls*"},
{"match": "pattern", "name": "Sekiro*"}
],
"installActions": [
{"type": "extract", "from": "ExampleMod64.dll", "to": "{game}/dxgi.dll"},
{"type": "copy", "from": "default_ExampleMod.ini", "to": "{game}/ExampleMod.ini"}
],
"launchExe": "ExampleModLauncher.exe",
"launchArgs": "",
"ui": {
"buttonColor": "#10b981",
"buttonHoverColor": "#059669",
"downloadedButtonColor": "#22c55e",
"downloadedButtonHoverColor": "#16a34a",
"useRainbowButton": false,
"dropdowns": [
{"id": "wrapper", "label": "Wrapper DLL", "options": ["dxgi.dll", "d3d11.dll", "d3d9.dll"]}
],
"radioGroups": [
{"id": "installType", "label": "Install Type", "options": ["Per-Game", "Global"]}
],
"textInputs": [
{"id": "customPath", "label": "Custom Install Path", "placeholder": "Leave empty for default", "required": false}
],
"checkboxes": [
{"id": "backup", "label": "Backup existing DLLs", "default": true}
]
}
}
| Field | Required | Description |
|---|---|---|
cardVersion | Yes | Card schema version: "1.0", or "1.1" for cards with downloads, addons or modes |
name | Yes | Mod name (displayed in card header) |
author | No | Who made the mod or project (shown as "by ...") |
cardBy | No | Who made the card itself. Shown small in the bottom right as "Card by ..." |
cardByUrl | No | Link for the "Card by" name (HTTPS only), for example your GitHub page |
authorUrl | No | Link to the author's page (HTTPS only) |
website | No | Link to mod homepage (HTTPS only) |
icon | No | URL to mod icon (PNG/JPG, max 128x128 recommended) |
backgroundArt | No | URL to card background image |
description | Yes | Brief description of mod functionality |
tagline | No | A short line shown after the author in the card's header (up to 100 characters) |
license | No | License name (e.g., "MIT License", "GPL-3.0") |
licenseUrl | No | URL to full license text (HTTPS only) |
sourceUrl | No | URL to source code repository (HTTPS only) |
versions | Yes (leave it out when you use downloads) | Array of available versions (newest first). Can be empty [] for organizer-only cards. Give each version a "sha256" (the file's SHA256) so GPU Selector can check the download. Without one, only GitHub release downloads are checked (by GitHub's own checksum). |
targetGames | No | Array of games this mod supports (max 25, supports per-game installActions) |
installActions | No | Array of file operations after extraction (max 5) |
notice | No | A box near the top of the card, on every tab. For a disclaimer or an important warning (max 400 characters, plain text, \n for a new line) |
launchExe | No | Executable to launch from card (relative to mods folder) |
launchArgs | No | Command line arguments for launch exe |
allowCustomDrive | No | Not used. Kept so older cards still load. |
locked | No | If true, hides the View/Edit JSON option from the gear menu |
ui | No | Custom UI elements configuration (also modes). The controls (dropdowns, radio buttons, checkboxes, text boxes) pick between your card's own options with "when". They don't change a legacy installActions install. |
ui.buttonColor, ui.buttonHoverColor, ui.downloadedButtonColor, ui.downloadedButtonHoverColor | No | The main button's colours, as 6-digit hex like "#10b981". |
ui.hoverBorderColor | No | The card's edge colour when the mouse is over it (6-digit hex). Catalog cards also use it as their accent colour. |
ui.labels | No | Rename your card's buttons and headings: {"install": "Add", "play": "Start", "targetGames": "Games"}. Up to 30 characters each. Keys: targetGames, install, unload, play, cleanAll, cleanLogs, version, installation, download, getLatest, installAddons, reinstallAddons, installShaders, remove, checkUpdates, saveConfig, loadConfig, launch, guide, cardBy ("Card by"), by, chooseGames, found (the word in "5 found"), searchGames, notes, preset, installed, notInstalled, searching, guideTitle (the name of a step guide in guides that has no title). guide names the Guide button and the guide page. A key you leave out keeps its usual word. |
ui.tooltips | No | The hover tips of your buttons, with the same keys as ui.labels: {"play": "Start the game"}. Up to 120 characters each. |
ui.colors | No | Your card's colours, each like "#38bdf8". Keys: title, author, link (links on hover), accent (step numbers, the Target Games icon, notes), install, unload, play, save, load, notice. |
ui.order | No | The order of your card's parts: ["games", "description"]. Parts: description, guides, catalog, games, controls, detection, version. Parts you leave out keep their usual order after yours. |
ui.website | No | {"show": false} hides the website link (your modes' links too). {"label": "Our Site"} shows a name instead of the address of your website. A mode's own link shows its site's address. |
ui.iconShape | No | rounded (default), square, circle or none. |
ui.noticeStyle | No | The look of your notice box: warning (amber, default), info (blue) or tip (green). |
ui.backgroundFade | No | How much your backgroundArt is darkened behind the text: none, light, normal (default) or strong. |
ui.listRows | No | How many games the Target Games list shows before it scrolls: 2 (default) to 6. |
ui.modesStyle | The look of your tab switch: {"shape": "bar"} (default) or "pills", "offColor" (tabs not picked), "borderColor". | |
ui.guideStyle | The look of your step guides (guides): "titleColor", "textColor", "badge": circle (default), square or none. | |
ui.rowButtons | The order of the buttons on each Target Games row: ["play", "install", "modes"]. Default: install, modes, play. | |
ui.cleanAll | Where Clean All goes: left (default), right or hidden. People can still remove a mod from one game with Unload. | |
ui.cardByPosition | No | Where "Card by" goes: right (default), left or hidden. |
ui.guide | No | Your card's own guide: a Markdown file in your card's package. A Guide button shows at the bottom of the card. See Your card's guide. |
ui.gameLetter | No | One letter, A to Z, shown next to HDR on the games your card makes in the Games list, like "D". A mix always shows M. |
ui.font, ui.appTheme | No | Catalog cards only (see Catalog Cards). |
detection | No | Finds a program the user already has: {"installDirHint": "MyTool", "methods": [{"type": "path", "paths": ["C:\\MyTool"], "exe": "MyTool.exe"}, {"type": "process", "processName": "MyTool.exe"}]}. Shows an Installation box. Add "configFiles": [{"name", "path" or "relativePath", "format"}] for Save/Load Config: only config files (like .ini, .xml, .json), in the program's folder or the user's AppData, Documents or Saved Games. |
downloads | No | Files to get from GitHub (see Add-on Packages) |
addons | No | ReShade add-ons made from the downloads |
launch | No | A program from the downloads, with a Launch button (see "launch") |
requires | No | {"reshade": "6.8.0"}: the ReShade version the card needs |
shaderRepos | No | Shader packs installed through Shader Repositories |
guides | No | Collapsible step guides (max 12; see Collapsible Guides). "position": "bottom" on a guide puts it at the very bottom |
ui.modes | No | Tabs (see Mode Switch). "position": "top" goes on ui.modes |
ui.listCorners | No | "rounded" (default) or "square": the corners of the card's game list |
ui.autoColor | No | true: colors from the project's GitHub picture. A tab's own color still wins for that tab |
Old cards use versions and installActions (copy files into folders). New cards use downloads and addons. Don't mix the two systems in one card.
| Field | Required | Description |
|---|---|---|
version | Yes | Version string (e.g., "1.0.0", "24.1.1") |
url | Yes | Download URL (HTTPS only, must be ZIP) |
filename | No | Local filename (defaults to mod name + version) |
password | No | "login" or "ask": the download is locked, and the user types the key when they download it (see Locked Cards). A password written here is not secret: anyone can read the card. |
passwordHelp | No | One line shown in the unlock box, like where to get the key (up to 200 characters). |
| Field | Required | Description |
|---|---|---|
match | Yes | Match type: "exe_hash", "id", "exact", "contains", "startsWith", "pattern", or "preset" (games with a ReShade preset) |
name | Depends | Game name, ID, or pattern (required for all types except exe_hash) |
hash | Depends | 64-character SHA-256 hash of the exe (required for exe_hash) |
store | No | Optional store filter: "Steam", "GOG", "Epic", "Custom", etc. |
installActions | No | Per-game install actions (max 5). Appended to top-level unless skipDefaultActions is set. |
skipDefaultActions | No | If true, skips top-level installActions for this game entry |
logPatterns | No | Glob patterns for mod log files to clean on unload (max 10, e.g., "*.log") |
reshade | No | ReShade modes for this game: {"proxy": true, "opengl": "off", "vulkan": "off", "lock": true}. opengl and vulkan take "on", "off" or "auto". proxy true: ReShade loads as a DLL next to the game for that launch instead of being injected (only for games injection can't reach). opengl/vulkan "off" for DirectX games. lock: the user can't change them on the card |
hdr | No | true: turning the card's add-on on for this game also ticks its HDR box |
launchArgs | No | Start options for this game when your card's Play starts it, like ["-dx11"]. Plain words only. The user's own start options stay; yours are replaced each time. |
notes | No | Up to 8 plain text lines (200 characters each) shown under the game's Notes button. Plain text: links are not clickable, so write them like hdrmods.com/Cyberpunk |
eacBypass | No | true: the game starts offline, without Easy Anti-Cheat, while it uses the card's add-on (needed for add-ons in EAC games). The row shows an Offline chip; the user can turn it off. Online play is off while it is on |
reEngineBypass | No | true: GPU Selector's RE Engine bypass for this game, so ReShade can load (RE Engine games GPU Selector knows, like Resident Evil 4). The row shows an RE chip; the user can turn it off |
when | No | Only on some tabs or choices (see Mode Switch) |
hdr counts if any entry has it.| Field | Description |
|---|---|
type: "extract" | Extract file from ZIP to destination |
type: "copy" | Copy file to destination |
from | Source file (relative to extracted ZIP) |
to | Destination path (supports placeholders) |
Use these placeholders in installActions to target common locations:
| Placeholder | Resolves To | Example |
|---|---|---|
{game} | Selected game's install folder | C:\Games\Elden Ring |
{mods} | %LOCALAPPDATA%\GPUSelector\Mods\{ModName}\ | ...Mods\Example Mod\ |
{appdata} | %APPDATA% | C:\Users\...\AppData\Roaming |
{localappdata} | %LOCALAPPDATA% | C:\Users\...\AppData\Local |
{documents} | User's Documents folder | C:\Users\...\Documents |
{desktop} | Desktop folder | C:\Users\...\Desktop |
{programdata} | %PROGRAMDATA% | C:\ProgramData |
{reshadeShaders} | GPU Selector's shared ReShade shaders. Inject Mode loads them in every game. Shader files only (.fx, .fxh) | ...GPUSelector\Mods\ReShade\Injector eshade-shaders\Shaders\Custom |
{reshadeTextures} | The same, for textures (.png, .dds and so on) | ...reshade-shaders\Textures\Custom |
{programfiles} | %PROGRAMFILES% | C:\Program Files (shows warning) |
Add custom controls to your card (max 5 of each type):
"dropdowns": [
{"id": "variant", "label": "Variant", "options": ["Standard", "Lite", "Full"]}
]
"radioGroups": [
{"id": "installType", "label": "Install Type", "options": ["Global", "Per-Game", "Portable"]}
]
"textInputs": [
{"id": "customPath", "label": "Custom Path", "placeholder": "C:\\Games\\...", "required": false}
]
"checkboxes": [
{"id": "createShortcut", "label": "Create Desktop Shortcut", "default": false},
{"id": "backupFiles", "label": "Backup existing files", "default": true}
]
"ui": {
"buttonColor": "#10b981",
"buttonHoverColor": "#059669",
"downloadedButtonColor": "#22c55e",
"downloadedButtonHoverColor": "#16a34a",
"useRainbowButton": false
}
Set useRainbowButton: true for an animated rainbow gradient effect.
"listCorners": "square" gives the Target Games list square corners. The default is "rounded".
Don't want to pick colors? Add one line:
"ui": { "autoColor": true }
icon, the picture is used as the icon too.Which GitHub project it uses:
"autoColor": "owner/repo" picks one yourself.sourceUrl or website, when it is a github.com link."github".A card's backgroundArt stays when it has one. useRainbowButton keeps the rainbow button.
Button behavior after download:
launchExe is set: button changes to "Launch {name}" using downloadedButtonColorlaunchExe is empty or not set: button shows "Downloaded ✓" (users can re-download)Users can load cards in three ways:
When users click Download, a security warning dialog appears showing the mod name, author, download URL, and source. Users must confirm before any file is downloaded. This protects users from unverified content.
Use \n for a new line in description. GPU Selector lays the text out for easy reading:
1., 2. ... become numbered step boxes, like the 3DConsoleBridge card. They take the picked mode's color.Keep it short: one idea per line, about 5 to 10 lines. Use tabs for more.
These cards follow these rules: SR Loom, Windower 4, 3DConsoleBridge, Neural Rendering and RenoDX HDR. Use them as your style examples, so every card feels the same.
The Card Feature Test card only tests features. It is not a style example.
"position": "top" and short labels (one or two words).NVIDIA | NVIDIA + DLSS | AMD.HDR Mods | Setup | Game Notes, or About | Head Tracking | Keys.About | Use | Notes. Don't stack guides or one long list instead.notes (its Notes button)."position": "bottom"."notice": only for a real, important warning from the project's own docs. Never a notice you made up, like "made by AI" or "untested".backgroundArt out.icon out. Keep the project's github (it opens the project page): when its owner has no picture, GPU Selector draws a name icon in the card's color. Leave github out only when the project has no repo."autoColor": true.author (and each tab's author) is who made the project. Never yourself.cardBy and cardByUrl are you, the card maker. They show as "Card by" at the bottom right.github is the project that tab installs. Never another person's repo.targetGames: its Steam ID ("match": "id") and its exact name (other stores).hdr: true for HDR mods. reshade locks only when you know the game's API.Lock a card's download so only people with your key can install it, like your Patreon supporters or testers. You lock the file. GPU Selector only asks for the key.
.7z file with a password (7-Zip, AES-256).| Card type | Field | What it does |
|---|---|---|
A card with versions | "password": "login" | Asks for a username and a password. The file's real password is username:password (like shrimp:shrimp). |
"password": "ask" | Asks for one password. | |
"passwordHelp" | One line in the unlock box, like "Get your key on my Patreon." | |
A card with downloads | "locked": "login" or "password" | The same, for that download. |
"lockHelp" | One line in the unlock box. |
"versions": [
{
"version": "1.0",
"url": "https://example.com/ExampleMod.7z",
"filename": "ExampleMod.7z",
"password": "login",
"passwordHelp": "Get your username and password on my Patreon."
}
]
With 7-Zip (free, 7-zip.org):
"login" type username:password, like shrimp:shrimp..7z and put its link in your card.Or on the command line: 7z a -t7z -mhe=on -p"shrimp:shrimp" ExampleMod.7z ExampleMod.fx
Keys can't have quotes in them. A new key means a new locked file: make one, upload it, and give out the new key.
Example: the Locked Card Example in GPU Selector's example cards (cards/testing/locked-card-example). Its prize is Shrimp Vision, a small ReShade shader. Username shrimp, password shrimp.
Have your own website for your mods? A card can log in to it, show the files that user may get, and install them. You host the site. GPU Selector hosts nothing.
installActions put it in place."site": {
"url": "https://mymods.example",
"name": "My Mods",
"help": "Supporters: use your Patreon email and the password I sent you."
},
"installActions": [
{"type": "copy", "from": "MyShader.fx", "to": "{reshadeShaders}/MyShader.fx"}
]
| Field | What it is |
|---|---|
url | Your site. HTTPS only. For testing on your own PC, http://127.0.0.1:port or http://localhost:port works too. |
name | Its name in the box (up to 60). Default: the site's address. |
help | One line under the login, like where people get an account (up to 200). |
Three addresses under your url. All answers are JSON, except the file itself.
| Request | Your answer |
|---|---|
POST /gpuselector/loginbody: {"username": "...", "password": "..."} | {"ok": true, "token": "...", "message": "Welcome back!"}or {"ok": false, "message": "Wrong password."} |
GET /gpuselector/filesheader: Authorization: Bearer <token> | {"files": [{"id": "shrimp-vision", "title": "Shrimp Vision", "version": "1.0", "short": "A shrimp for your game.", "file": "ShrimpVision.zip", "size": 1234, "sha256": "..."}]}401 when the token ran out. |
GET /gpuselector/download/<id>header: Authorization: Bearer <token> | The file itself (.zip or .7z). 401 when the token ran out. |
id (letters, numbers, - and _), a title, a file name ending in .zip or .7z, and its sha256. Up to 100 files.A free starting point: the example cards repository has a Cloudflare Worker template (source/site-login-template). You run it on your own Cloudflare account.
url, once, when the user presses Log In.url itself. Your site can't send it somewhere else.Longer how-to steps can go in a guide: a closed "Setup Guide" row that opens into numbered step boxes, like the 3DConsoleBridge card. Use at most one per tab. Separate topics go in tabs (see Mode Switch), not in more guides.
"guides": [
{
"title": "Setup Guide",
"when": {"setup": "nv"},
"steps": [
{"title": "Connect your hardware", "text": "Plug the capture card into a USB 3 port.\nTurn the console on."},
{"title": "Play", "text": "Start a 3D game."}
]
}
]
"position": "bottom" puts a guide at the very bottom of the card, below the buttons. Good for notes people only need sometimes."when" per tab), 8 steps per guide, guide title 60 and step title 80 characters, step text 600 characters."when" shows a guide only for some choices, like a mode.A card can have a mode switch: a row of tabs under its name, like the 3D | AR | SR switch on the 3DConsoleBridge card.
"when"."position": "top" (on ui.modes) puts the switch in the top right, next to the folder button (like 3DConsoleBridge). Use it for short tab names. Without it, the switch gets its own row."gpu" and the switch starts on the one for the user's graphics card."gpu" belong to that brand. They only load in games that run on it (the GPU the game is pinned to, or the primary GPU). Users can install every tab, and each game gets the right add-on.dlss5-feed is only on the NVIDIA tab, where renodx-dlss5 also is, so it needs renodx-dlss5. renodx-dlss5 is also on the NVIDIA + DLSS tab, without the Feeder, so it needs nothing. An add-on with its own "games" is never part of a team."ui": {
"modes": {
"id": "setup",
"options": [
{"value": "nvidia", "gpu": "nvidia", "label": "NV", "icon": "🟩", "title": "NVIDIA RTX", "color": "#76b900",
"description": "Text shown on the card while this mode is picked."},
{"value": "amd", "gpu": "amd", "label": "AMD", "title": "AMD Radeon", "color": "#ed1c24",
"description": "Another description."}
]
}
}
| Field | Description |
|---|---|
id | The name "when" uses to read the picked mode |
value | Required. What "when" compares against |
label, icon | What the button shows (short!) |
title | Tooltip |
color | Color of the button while picked |
description | Replaces the card's description while picked |
author | Who made this mode's project. Replaces the card's "by" name while picked |
heading | Replaces the card's shown name while picked (max 60 characters). The card's real name stays its ID |
tagline | Replaces the card's tag line while picked (max 100 characters) |
github | "owner/repo" of the project the tab installs (leave it out when the project has no repo of its own: the card then draws a name icon; never use another person's repo). While picked, the card's link opens that project and the main icon is its owner's GitHub picture (and with autoColor, the card's colors too) |
image | A PNG or JPG (https or data:image) shown as the card's main icon while picked |
gpu | "nvidia", "amd" or "intel" (or a list). The switch starts on the first mode that fits the PC's primary GPU |
Put "when" on a dropdown, radio group, checkbox, text input, download or add-on.
true or false.launch, guides and controls. So each tab can have its own games and its own install button (or none)."when": {"setup": "nvidia"}
"when": {"setup": ["nvidia", "nvidia-dlss"], "extras": true}
"when" reads the card's choices only. It never reads the PC's real graphics card (that is the mode's "gpu" field)."default", else their first option.hdr still work when the user installs from another tab of the card.A card can download files from GitHub and add ReShade add-ons to GPU Selector. The card's button then says Install Add-ons.
Up to 10. Each has an "id". Files of a download are unpacked into a folder with that id.
"downloads": [
{"id": "feeder", "github": "owner/repo", "asset": "MyAddon-*.zip"},
{"id": "loose", "github": "owner/other-repo", "asset": ["*.addon64", "*.addon32", "*.fx"]},
{"id": "runtime", "url": "https://github.com/owner/repo/releases/download/v1.0/runtime.zip"},
{"id": "pinned", "github": "owner/repo", "tag": "v2.1.0", "asset": "*.zip", "when": {"setup": "nvidia"}}
]
| Field | Description |
|---|---|
id | Required. Letters, numbers, - and _. Can't start with repo_ |
github | owner/repo. Uses its newest release (test versions and drafts are skipped), or tag. Best choice: GitHub lists a SHA256 for each file, and the card can tell the user about updates |
asset | File name pattern, or a list of them. * = anything. Default *.zip. A pattern that matches no file stops the install with an error |
tag | Pin one release instead of the newest. Use it for repos that hold several products (like RankFTW/rhi-repo: dlss-, dlssnr-, renodx-dlss5- releases), so "newest" is not another product's release. A tag can also pin a test version (like RenoDX's snapshot, which "newest" skips) |
url | A fixed https link instead of github. GitHub release links (github.com/owner/repo/releases/download/...) still get GitHub's SHA256. Other links (github.io pages, raw files, other hosts) need sha256, or the user must agree to each file. The file keeps the last part of the link as its name (.../dlssnr_amd_pass1.dll stays dlssnr_amd_pass1.dll), so "from": "<id>/dlssnr_amd_pass1.dll" finds it |
sha256 | Optional. The file's SHA256, for links GitHub lists none for |
when | Optional. Only for some choices |
A download can be locked too: "locked": "login" (or "password"), with "lockHelp" for the line in the unlock box. See Locked Cards.
Up to 10. Paths are "<download id>/<pattern>".
/ matches a file name anywhere in that download./ matches the path inside the download."addons": [
{
"name": "MyAddon",
"from": "feeder/myaddon.addon*",
"shaders": ["feeder/*.fx", {"from": "feeder/shaders/include/*.fxh", "to": "include"}],
"besideAddon": ["runtime/helper.dll"],
"nextToGame": [],
"when": {"setup": "nvidia"}
}
]
| Field | Where the files go |
|---|---|
name | The add-on's name in GPU Selector. Letters, numbers, - and _. Use the add-on's own file name without the extension (renodx-dlss5, dlss5-feed): in each launch the file is named <name>.addon64, and some add-ons find each other by file name. The same add-on on two tabs: same name, same files |
from | The add-on: .addon64, .addon32 or .addon (both kept). Only list .addon32 when it works alone in 32-bit games. Add-ons that need a 64-bit helper program for 32-bit games: list only .addon64, and say on the card that 32-bit games are not covered |
shaders | Shaders and textures. Copied to the launch's add-on shader folder, which ReShade searches |
besideAddon | Files that must sit next to the add-on (for example a DLL it loads from its own folder). Copied for each launch |
nextToGame | Files that must sit next to the game's exe. Put there for that launch only. A game file with the same name is renamed to .gpusel_off and put back when the game closes |
Each list takes plain patterns, or {"from": ..., "to": "subfolder"} to keep a subfolder. Max 40 files per list.
besideAddon. Example: DLSS5-Feeder starts NVIDIA NGX with its own folder, so it needs nvngx_dlss.dll and nvngx_dlssnr.dll beside it.nextToGame. Example: RenoDX DLSS5 loads nvngx_dlssnr.dll from the game folder, and the AMD neural add-on its runtime and weights.Binaries\Win64\*-Shipping.exe) and puts the files there.An add-on made for one game (like an HDR mod) can name its games, in the same format as targetGames:
{"name": "RenoDXCyberpunk", "from": "renodx/renodx-cp2077.addon64",
"games": [{"match": "id", "name": "steam_1091500"}, {"match": "contains", "name": "Cyberpunk 2077"}]}
When the user picks Its Games after installing, each add-on is turned on only for its own games. Games I Pick then lists only these games, each with its add-on.
List the same games in targetGames too. That list is what shows on the card, with each game's notes, hdr and ReShade locks. An add-on's games only decide where it is turned on.
nextToGame only when the add-on really needs it. besideAddon keeps game folders untouched.
Some mods need things a card can't express. Don't work around these. Write the card for the parts it can do, and say the rest clearly.
| The mod needs | What the card does instead |
|---|---|
A DLL next to the game that is not a ReShade add-on (a "proxy" like version.dll, winmm.dll or dxgi.dll), or a file renamed to such a name | Not possible yet: a card only puts files next to the game as part of a ReShade add-on (nextToGame), with their own names. Leave that version out of the card, or make it a tab with only text: give the tab the project's github, so the card's link opens its page. Never tell users to copy files into the game folder by hand. |
| A DLL loaded into the game next to ReShade that is not a ReShade add-on | Not possible yet. Build it as a ReShade add-on if you can (see "Research first"). If not, tell the person it is missing. |
| A button on each game that runs a program for that game (with the game's ID or exe) | Not possible yet: launch has fixed start options. Explain the steps in the program itself, or in the card's text. |
| More than one program button, or running something before Play | Not possible yet: one launch per card. Pick the most useful one. |
A download with no add-on and no launch | Not possible: Install stops with "Nothing matched". Every install needs an add-on or a program. |
| A value in another program's .ini, or a ReShade.ini setting (like early add-on loading) | Not possible: only effect values in the preset (preprocessor). Write the setting as a step or a game note. |
| A GPU series (RTX 20/30 vs RTX 40, RDNA3 vs RDNA4) | gpu only knows the brand. Make one tab per series, put the series in the tab label, and start the description with "Needs an RTX 40 card." |
| A Windows setting or driver version (HAGS, a minimum driver) | A numbered step: "Turn on Hardware-accelerated GPU scheduling in Windows Settings > Display > Graphics." |
A game launch option (like +r_allowBlackListedLayers 1) | That game's notes. |
| "Only one of these mods per game" | Say it in notice and in the tab text. GPU Selector can't block other mods. |
A file in another folder of the game (not next to the exe), or a nextToGame file the user can choose | Not possible: nextToGame files always go next to the exe that runs. Write it as a step or a game note. |
| A project with no release files (only files in the repo) | A url to the raw file pinned to one commit (raw.githubusercontent.com/owner/repo/<commit>/file) with its sha256. It gets no update notices. |
Notes on a game that is on several tabs: the card shows the notes of the open tab's entries.
For a tool or app (not an add-on), download it and give the card a Launch button:
"downloads": [{"id": "app", "github": "owner/repo", "asset": "MyTool.exe"}],
"launch": {"from": "app/MyTool.exe", "label": "Launch My Tool"}
launch and addons together, or only launch."launch": {"from": "app/MyTool.exe", "args": ["--game", "quake"]}. Plain words only.from starts with a download's id: a card only launches a file from its own downloads. A helper you made yourself must be in a GitHub release first.launch per card. Give it "when" to show it only on some tabs."app/MyTool.exe" finds that name in any folder of the download. More than one? The one nearest the top wins. "app/bin/MyTool.exe" finds only that path.ui.labels.uninstall..addon32 / .addon64) and programs with launch. Other mod files (like a game's .pak files) use a catalog card, or installActions."requires": {"reshade": "6.8.0"}
"reshade" also asks for that version or newer. Write it as three numbers, like "6.8.0". Use the version the project's install guide asks for.A shader card can list every game that has a ReShade preset, and help it get the shaders the preset needs:
"targetGames": [{"match": "preset"}],
"shaderRepos": ["CeeJayDK/SweetFX", "prod80/prod80-ReShade-Repository"]
ReShade.ini points to (PresetPath), and any other .ini that is a preset, whatever its name. A file is a preset when its top part has a Techniques= line..fx) the preset turns on, and which of them no shader folder has (GPU Selector's, or the game's own reshade-shaders).shaderRepos hold them.shaderRepos (only packs whose authors allow it).Need a shader pack? Don't download it yourself. List its GitHub repository (or a Shader Repositories key):
"shaderRepos": [
"owner/some-shader-repo",
{"repo": "owner/other-shader-repo", "when": {"setup": "nv"}}
]
shaderRepos, with no downloads."https://github.com/owner/repo". The card shows each pack's result.Does your add-on need one effect from a built-in shader repo? Put this on the add-on instead of shaderRepos:
"repoShaders": {"repo": "lumenitefx", "files": ["lumenite_Kernel.fx"]}
lumenitefx. GPU Selector downloads it from its own link.ReShade.fxh and ReShadeUI.fxh are always there. Don't ship them.Does an effect need a preprocessor value set for your add-on? Put it on the add-on:
"preprocessor": {
"lumenite_Kernel.fx": {"IMAGE_SPACE": "1"},
"AMD_Neural_Feed.fx": {"AMDNR_MV_PROVIDER": "3"}
}
AMDNR_MV_PROVIDER 3 means "LumeniteFX Kernel gives the motion", and Kernel's IMAGE_SPACE=1 makes it work from the color picture, with no depth needed. The card sets IMAGE_SPACE=1 on both the NVIDIA (DLSS5-Feeder) and the AMD tab: tested in games, it is needed on both.GPU Selector applies these to every card. A card can't turn them off.
< > " ' ` \ &. A name can't collide with another card or a built-in one.#10b981. Links and pictures must be clean https links or PNG/JPG data pictures.nextToGame can't hold programs: .exe .bat .cmd .com .scr .ps1 .vbs .js .msi .lnk .pif .hta .reg, or ReShade's own ReShade.ini and ReShadePreset.ini. DLLs are allowed. The install dialog names every file that goes next to the game and every program file.gamebridge, srreshade, xinp, genericdepth, generic_depth, depth3dcursor or sd3dcursor in it.detection.configFiles may only read files inside the folder it detected.A catalog card lists mods for a game. People install, mix and play them one by one. The DOOM card is the big example. Copy the parts you need.
"catalog" object to the card."engine": "doom" (the default): DOOM-engine games. GPU Selector knows DOOM's game files (WADs), its ports and idgames."engine": "generic": any other game. You tell GPU Selector which game files to find, which file types are mods, and how to start the port (see Any game).ui.modes: values games, engine, mods, options, and "position": "top". Leave out a page you don't need.ui.modes? The catalog draws its own tab row. Pick its tabs, order and names with "tabs": [{"id": "mods", "label": "Mods"}, {"id": "games"}], and where it sits with "tabsAlign": left, center or right (default).games has Look Again and Pick a File. Without it, people can't fix "Needs ..." on a mod.options has 3D Settings and Reset 3D. Without it, the 3D button still works, with your stereo values."optionsOrder": ["ports", "stereo", "yours", "look"]):
"options": {"stereo": false}; the colours of "3D" with "stereoTitleColors": ["#ef4444", "#3b82f6"], or false for plain text)"adult": true), and the theme and font (only when the card has ui.appTheme or ui.font)"own": true). The Codex shows "Used by" with your card's name."stereo": true (GZDoom family) gets a 3D button on each mod: the 3D mode, Depth and ZPD come from 3D Settings.| Field | What it is |
|---|---|
engine | "doom" (default) or "generic". |
items | The mods (up to 500). See One mod. |
categories | The chips on the Mods page: [{"id":"tc","name":"Total Conversions"}] (up to 24). A chip with no items is hidden. |
ports | The programs that run the mods (up to 32). See Ports. |
gameData | The base games mods need (up to 20):
|
freeData | A free stand-in that installs like a mod (Freedoom):
|
steamGames | Games for the Your Games and Engine Games pages (up to 300):
|
steamGroups | The headings for steamGames (up to 6): {"id","name","note"}. Group engine goes on the Engine Games page. Group family gets its own switch on Your Games. Pick the page yourself with "tab": games, engine or family. Add "wip": "note" (or true) for a small WIP tag in the middle of the card's footer while that page is open, with the note on hover. |
codexGames, codexGamesTitle | Free games from the Modding Codex for the Engine Games page (up to 20): {"codex","name","engine","short","page"}. Add "args" (plain words) for its start options, and "stereo": true with "stereoPort" or "stereoArgs" for 3D, like steamGames. |
mixes | Preferred Mixes (up to 30). See Mixing mods. |
addonSets | Add-on Sets (up to 20): ready-made add-on bundles for any game, total conversions too. Each: {"id", "name", "note", "picks": [add-on ids]}. Picking a set ticks the add-ons that fit the game in the Mix. |
mix | How Mix works on your card (only your card):
|
options | Hide an Options sub card on your card: {"stereo": false}. Keys: stereo (3D Settings), yours (Your WADs or Your Files), addons (Your Add-ons), ports, look (Theme and Font). Parental Settings always shows when a mod has "adult": true. |
optionsOrder | The order of the Options sub cards: ["ports", "stereo", "yours", "look"]. Ones you leave out come after, in the usual order. |
tabs | Your catalog's own tab row (only without ui.modes): [{"id": "mods", "label": "Mods"}, {"id": "games"}]. Ids: games, engine, mods, options. The first one opens first. A tab without a label gets its number and usual name. |
colors | Colours inside your catalog, each like "#10b981". Keys: chipOff, chipOffText, chipOnText (chips and tabs), secondaryButton (the grey buttons), installed (the dot and "Installed"), busy, error, uses, needs (default: your accent), mixOn, mixHalf, mixOff (the M), stereo3, stereoD, stereoOff (the 3D button). |
listHeights | How tall the lists are before they scroll, in rem (6 to 40): {"mods": 16, "mix": 15, "games": 13, "idgames": 8} (these are the defaults). |
searchBar | {"position": "belowChips"} (default) or "aboveChips"; "mixToggle": "right" (default) or "left"; "showCount": false hides "320 mods". |
chipsOrder | These chips first, in this order: ["preferred", "installed"]. Chip ids: installed, preferred, favorite, cult, yours, and your categories ids. |
chipsHidden | These chips don't show: ["cult"]. |
portsShowAll | true: each mod's port list shows every port of your card. Ports that don't run that mod are greyed out and can't be picked. Default: only the mod's own ports. |
yoursLayout | How Your WADs and Your Add-ons sit together: auto (default: side by side when there is room, else stacked), side or stack. |
yoursDivider | false takes away the line between them. Default: true. |
tabsAlign | Where that tab row sits: left, center or right (default). |
stereoTitleColors | The colours of "3D" in 3D Settings: ["#ef4444", "#3b82f6"], or false for plain text. Not used when you rename it with text.stereoHeading. |
gameSuffix | The name after a played mod in the Games list, like Eviternity (DOOM). |
text | Change the page's words. See Any game. |
search | "idgames" (the DOOM mod archive) or "none". Default: "idgames" on DOOM cards, "none" on other cards. |
searchLinks | Other sites to search when a mod is not in your list (up to 4): [{"name": "Nexus Mods", "url": "https://www.nexusmods.com/games/quake/mods?keyword={query}"}]. A button opens that search in the browser. |
yourFilesPorts | The ports that play the user's own files: ["mygame-port"]. Default: UZDoom, GZDoom and DSDA on DOOM cards, every port on other cards. |
idgamesMirrors, idgamesCategory, idgamesPorts | For the idgames search: the mirrors to try, and the category and ports a found mod gets. |
stereo | Your 3D Settings (only your card):
|
addonGroups | Your add-on groups in the Mix view, by addonSlot: [{"upTo": 20, "name": "Textures", "beforeBase": true}, {"upTo": 101, "name": "Extras"}]. beforeBase: that group loads before the game. Default: Textures, Fonts and Sprites, HUD, Lights, Weather, Music. |
{"id","name","codex","family"}. codex is the Codex entry's exact name.family tells GPU Selector how to start it:
zdoom (UZDoom, GZDoom, LZDoom), zdoomrt, prboom, mbf, chocolate, helion, doom64, doomsdayplain: only -iwad and -filecustom: any program. You list its options in args (see Any game)."stereo": true: the port has its own 3D. It works for the zdoom and doomsday families (GPU Selector knows how to turn it on), and for a custom port with stereoArgs.custom port with 3D: "stereo": true plus "stereoArgs", groups like args with {mode}, {depth} (0-100), {zpd} (0.000-0.250), {swap} (1 or 0), {fov} and {crosshair} (0 to hide it in 3D, 1 to give it back once).
"stereoModes": {"sbs": "4", "tab": "11"}: your port's word for each 3D mode ({mode})."stereoOffArgs": what to send when 3D is off.stereoArgs a custom port gets no 3D button."label": the exact text in the dropdown (see ports in One mod)."extraArgs": the words always added for this port, instead of its family's. The ZDoom family adds +vid_preferbackend 0 +queryiwad 0 (OpenGL, no game picker); "extraArgs": ["+queryiwad", "0"] keeps Vulkan. [] adds nothing."note": a few words after its name, like "best for 3D"."exe": when one download has a program per game, the one to start (like "inter-hexen.exe")."own": true and "page" (HTTPS) instead of codex. The user installs it and picks its program once."download" (like a mod's, with sha256) and the card can install it. "exe" is then the program's name inside."fix": a file the card brings for its own port or a Modding Codex port (checked by SHA256 both ways), like the DOOM card's 3D fix for Doomsday:
{"file","sha256","replaces","original","keepOriginalAs"}original file (its SHA256) in the card's own copy of the port. That file is kept as keepOriginalAs.{"file","sha256","adds"} (like the DOOM card's 3D crosshair, dinput8.dll).
"oldVersions".zdoom or doomsday port get a 3D sound switch in 3D Settings by themselves. It turns on the port's own 3D sound for headphones (OpenAL with HRTF in the ZDoom family, sound-3d in Doomsday). Turning it off gives the port its own setting back."crosshairDot": true: the port's fix brings the 3D crosshair (laser dot). 3D Settings then offers the laser dot, mini circle, cross, and the game's own crosshair at depth, with Color, Dot Size and Dot Hover."mix": true (custom ports only): the port can load several mods, so it can play a mix."engine": "generic" in the catalog.gameData entry "files" (up to 10):
"files": [{"name":"duke3d.grp","minSize":10000000}]name is the file name. minSize, maxSize (bytes) and sha256 are optional checks."steamFolders": ["Duke Nukem 3D Twentieth Anniversary World Tour"] (folder names in steamapps\common). GOG games and the folders the user picks are searched too."gameFolders": [{"env": "QUAKEDIR"}, {"registry": "HKLM\\SOFTWARE\\Vendor\\Game", "value": "InstallPath"}, {"known": "Documents", "sub": "My Games\\Game"}]. known: Documents, SavedGames, ProgramFiles, ProgramFilesX86, LocalAppData, AppData, always with a sub folder. GPU Selector only reads these folders."fileTypes": [".grp", ".zip", ".map"]. Program types (like .exe and .dll) are never mod files."family": "custom" with "args", plus "codex" (a Modding Codex entry) or "own": true and "page" (the user installs it). "args" is a list of groups:
"args": [["-iwad","{game}"], ["-file","{files}"], ["-savedir","{saves}"]]{game} = the game file. {gamedir} = its folder. {files} = the mods, in load order. {saves} = a save folder for each mod. {portdir} = the port's own folder.{file} = one mod file: its whole group repeats for each file, like ["-g","{file}"] gives -g a.grp -g b.grp.{moddir} = the mod's own folder, {modname} = its folder name. For mods that are folders, like Quake's ["-game","{modname}"].-file).- + _ . / : = ,. GPU Selector adds the quotes."text": {"yourFiles": "Your Mods"}. Keys you can set:
yourFiles, filesWord, yourFilesInfo, addFilesTip, addFolderTip, looking, noneFound, gameFilesInfo, pickFileTip, pickFileExample, anyGame, fovNote, officialToggle, officialTip, familyToggle, familyTip, officialHeading, engineHeading, codexGames, engineFreeTip, engineStoreTip, modsUsually, gameName, zpdHelp, chipInstalled, chipPreferred, chipFavorite, chipCult, searchHint, modWord, modsWord, gameFilesHeading, gameFilesWhere, portsHeading, portsInfo, mixGameHelp, addonsHelp, mixTcNote, mixWarnNote, yourAddonsInfo, yourFileAuthor, yourFolderAuthor, and the Options headings: stereoHeading, yoursHeading, yourAddonsHeading, addonsWord, inCodex, lookHeading, parentalHeading, themeHeading, fontHeading.
Words on the mod rows and buttons: uses, needs, soldOnSteam, noGameFiles, comingSoon, installOnSteam, steamStore, playsInMix, btnInstall, btnPlay, btnInstallPlay, btnDownload, btnInstallDownload, btnGetIt.
Mix: preferredMixes, backToMods, playMix (default: "Play" and your Mix name), change, clear, noAddons, noAddonsTc, mixMark (the M: 1 or 2 characters).
Your Games, Steam and ports: noneYet, lookAgain, pickFile, getFree ({title} is the free game's name), installedWord, inLibrary, store, free, ready, failed, has3d, no3d.
3D Settings: depthLabel, depthHelp, zpdLabel, fovLabel, reset3d, swapEyes. Up to 300 characters each.search out, or set it to "none".ui.hoverBorderColor (the accent) and ui.buttonColor. Without them, DOOM cards are red and other cards are green.| Field | What it is |
|---|---|
id | Letters, numbers, - and _ (up to 40). It is also the mod's folder name. |
title, author, year, short | What the row shows. Title up to 100, author up to 80, short up to 200 characters. |
category | One of the categories ids. |
needs | The base game it needs (a gameData id), "standalone" when it brings its own, or "any". Default: doom2 (DOOM cards) or the first gameData (generic cards). |
iwadFile | For standalone mods: its own game file, like boa.ipk3. |
ports | The ports in this mod's dropdown, best first:
|
files | Load order, when it matters: ["mod.pk3","maps.wad"].
|
complevel | For Boom-style ports, as text: "2", "3", "4", "9", "11", "21", "vanilla", "boom", "mbf" or "mbf21". |
download |
|
page | Its web page. With no download, the row shows "Get It": the page opens, then the user picks the file they downloaded. |
browser | For sites that make a new link per click (ModDB, itch.io):
|
installAs | Rows that share one download (like the three Ashes games): the id of the row that holds the install. |
preferred, favorite, cult | true puts the mod in the Preferred, Fan Favs or Cult chip. Preferred mods come first. |
steam | A Steam app id: the row shows Install on Steam or the store page instead. |
base | true for the original game itself (nothing to download). |
status | "soon" shows "Coming soon". |
adult | true for adult mods. They stay hidden everywhere (list, chips, counts, Mix) until the user picks Yes in Options, Parental Settings ("Are you 18 or older?"). The default is No. |
mixRole | "gameplay" or "addon". Category gameplay or addon sets it too. See Mixing mods. |
addonFor | An add-on: the gameplay mod ids it fits. Leave it out (or ["*"]) for any. Add "none" when it fits a mix with no gameplay mod (like voxel monsters, which only work with DOOM's own monsters). |
addonSlot | An add-on's load order, 0 to 100 (default 60). Under 20 loads before the map (textures). 20 to 49 fonts and sprites, 50 HUD, 60 lights, 70 weather, 80 and up music. The gameplay mod is 30. |
tc | true: this is a total conversion (it takes no gameplay mod in a mix). Default: category tc or "needs": "standalone". |
mixTc | true: the add-on also fits total conversions (like lights and weather). |
requires | Item ids it needs too. Play Mix waits until they are picked. |
conflictsWith | Item ids that do the same job. Picking one removes the other. |
stacks | true: a gameplay mod that goes on top of another (like Corruption Cards). |
mixSafe | On a map pack: "warn" (its own monsters, a gameplay mod can break it) or "no" (no M on its row) or "yes" (never warn). On DOOM cards, DEH files and MBF21 maps get "warn" by themselves. |
"mix": true).stacks mod can go on top."category": "tc" or "needs": "standalone") takes no gameplay mod, only add-ons with mixTc."category": "addon") are not in the mod list. They only show in the Mix view.addonGroups). Each add-on is one line.page. Clicking the rest of the line ticks it."mixes": [{"id","name","base","picks":[...],"note"}]base is the game's item id. picks are item ids (up to 20). Name up to 40, note up to 200 characters."addonSets"):
[{"id","name","note","picks":[add-on ids]}], up to 20 sets of up to 12 add-ons.conflictsWith), the set's one replaces it.mix, options, text, engine, tabs, ui.colors, ui.order) only changes your card.ui.appTheme), but only the user turns it on.<card file name>_files: doom_card.json + doom_card_files\.doom_card_package.zip (a .7z works too). People load it with Load from File, or with Load from URL and a link to the package."ui": {"appTheme": "doom"}.starwars, alien, terminator, bladerunner, tron, dune, doom, quake, halflife, portal, bioshock, metalgear, darksouls, minecraft, residentevil, silenthill, castlevania, pacman, tetris, mario, pokemon, cyberpunk, witcher, skyrim, morrowind, halo, crysis, masseffect, eldenring, godofwar, gta, win95, dos, vaporwave, asheronscall, konami, osu, classicsteam, anaglyph, depth3d, unsc, blood, link, zelda, sonic, majora, matrix, fallout.lotr and warhammer40k. A card that names them is not loaded.GUIDE.md, and put it in your card's files folder (see Card packages)."ui": {"guide": {"file": "GUIDE.md", "sha256": "..."}}. Get the SHA256 with Get-FileHash GUIDE.md in PowerShell."position": "left" (the default, after your card's buttons) or "right" (next to "Card by").# headings (3 sizes), numbered lists, - lists, > tip boxes, **bold**, `code`, --- lines, and https links. Nothing else runs: no pictures, no scripts."ui": {"labels": {"guide": "Manual"}}.sha256 every time you change the file.ui.font.>) for the one thing to remember.GUIDE.md as an example."font": {"file":"MyFont.woff2","sha256":"...","name":"DOOM","credit":"...","license":"https://..."}."src":"data:font/woff2;base64,..." (300 KB or less).name is shown in Options, like DOOM font."startOff": true. Users can turn it on in Options.The goal: a card brings a project's good features into GPU Selector. It is more than a download button.
Before making the card, start a separate agent to research the project, in this order:
d3d12.dll or dxgi.dll)? That clashes with ReShade and GPU Selector's own DLLs."notice" for the big ones (bans, broken ReShade), in the text for the rest.d3d12.dll recorder or hook)? Build that part as a ReShade add-on (.addon64) instead. GPU Selector loads it with ReShade through Inject Mode, only in the games the user picks, and nothing stays in the game folder. The card installs it with addons.The research decides the card: what it downloads, which file it starts, its buttons, its tabs and its text. Write down what you found, and build the card from that.
Something the card needs but this guide has no field for? Don't work around it. Tell the person which part is missing.
You can ask an AI to make a card. Tell it:
cardBy is the person making the card, never "AI".github + asset, or a releases/download link). They have a SHA256 and get update notices. Avoid github.io and raw links. Other hosts only when the author's own installer uses them, with sha256.tag.name is its own file name without .addon64..fx files with shaders. For LumeniteFX use repoShaders. Never download a shader pack whose author does not allow sharing.preprocessor."gpu". Say which card series work, from the project's own notes.games. Put the same games in targetGames, with notes for game settings, hdr for HDR mods, and reshade locks when the API is known."eacBypass": true and say so in its notes. Online-only games: leave them out. RE Engine games: "reEngineBypass": true.The example cards were made this way. Point the AI at GPU-Selector-Cards: it has every example card by level, and AI.md tells an AI where to start.
{
"cardVersion": "1.0",
"name": "My Simple Mod",
"description": "A basic mod that does something cool",
"versions": [
{"version": "1.0.0", "url": "https://github.com/user/mod/releases/download/v1.0.0/mod.zip"}
]
}
{
"cardVersion": "1.0",
"name": "DOOM Collection",
"description": "Highlights all your DOOM games in one place",
"tagline": "Rip and Tear",
"versions": [],
"targetGames": [
{"match": "contains", "name": "DOOM"}
],
"ui": {
"buttonColor": "#b91c1c",
"buttonHoverColor": "#991b1b"
}
}
versions: [] array. They show matched games with play buttons but no download button. The play button uses each game's full launch settings from the Games tab.
installActions line tells GPU Selector:📁 BEFORE Install
Game Folder: +-- dxgi.dll (original) +-- game.exe
📁 AFTER Install
Game Folder: +-- dxgi.dll (YOUR mod) ✨ +-- game.exe
⚠️ No automatic backup! Tell users to back up files first. GPU Selector does not back them up for this kind of install.
Everything goes into the game folder. Easy!
📦 STEP 1: Your ZIP File
perfmod.zip
|
+-- dxgi.dll (your mod file)
+-- perfmod.ini (config file)
⚙️ STEP 2: The Install Action
"installActions": [
{
"type": "extract",
"from": "*", <-- Take ALL files
"to": "{game}" <-- Put in game folder
}
]
🎮 STEP 3: What Happens
YOUR ZIP GAME FOLDER
-------- -----------
C:\Games\Elden Ring\
perfmod.zip |
| |
+-- dxgi.dll ============> +-- dxgi.dll
+-- perfmod.ini ============> +-- perfmod.ini
+-- eldenring.exe
+-- (other game files)
{
"cardVersion": "1.0",
"name": "Performance Boost Mod",
"author": "ModAuthor",
"description": "Improves game performance by 20%",
"icon": "https://raw.githubusercontent.com/user/perfmod/main/icon.png",
"backgroundArt": "https://raw.githubusercontent.com/user/perfmod/main/banner.jpg",
"versions": [
{"version": "1.2.0", "url": "https://github.com/user/perfmod/releases/download/v1.2.0/perfmod.zip"}
],
"targetGames": [
{"match": "exact", "name": "Elden Ring"}
],
"installActions": [
{"type": "extract", "from": "*", "to": "{game}"}
]
}
Files go to DIFFERENT folders on the PC. Use subfolders in your ZIP!
📦 STEP 1: Organize Your ZIP with Subfolders
gfxmod.zip
|
+-- game_files/ <-- Folder 1: goes to game
| +-- Data/
| +-- SKSE/
|
+-- enb_preset/ <-- Folder 2: also goes to game
| +-- enbseries.ini
|
+-- user_config/ <-- Folder 3: goes to Documents
| +-- Skyrim.ini
| +-- SkyrimPrefs.ini
|
+-- cache_data/ <-- Folder 4: goes to AppData
+-- shaders/
⚙️ STEP 2: One Install Action Per Destination
"installActions": [
{"type": "extract", "from": "game_files/*", "to": "{game}"},
{"type": "extract", "from": "enb_preset/*", "to": "{game}"},
{"type": "extract", "from": "user_config/*", "to": "{documents}/My Games/Skyrim"},
{"type": "extract", "from": "cache_data/*", "to": "{localappdata}/Skyrim"}
]
from: folder name in your ZIP + /* (means all files inside)
to: where to put them on the user's PC
🗺️ STEP 3: Visual Map: Where Files End Up
ZIP FOLDER DESTINATION ON PC
---------- -----------------
game_files/* ==========> C:\Games\Skyrim\
+-- Data/ +-- Data/
+-- SKSE/ +-- SKSE/
enb_preset/* ==========> C:\Games\Skyrim\
+-- enbseries.ini +-- enbseries.ini
user_config/* ==========> C:\Users\You\Documents\My Games\Skyrim\
+-- Skyrim.ini +-- Skyrim.ini
+-- SkyrimPrefs.ini +-- SkyrimPrefs.ini
cache_data/* ==========> C:\Users\You\AppData\Local\Skyrim\
+-- shaders/ +-- shaders/
{
"cardVersion": "1.0",
"name": "Ultimate Graphics Overhaul",
"author": "GraphicsTeam",
"description": "HD textures, ENB preset, and optimized configs",
"icon": "https://raw.githubusercontent.com/user/gfxmod/main/icon.png",
"backgroundArt": "https://raw.githubusercontent.com/user/gfxmod/main/card-bg.jpg",
"versions": [
{"version": "3.0.0", "url": "https://github.com/user/gfxmod/releases/download/v3/gfxmod.zip"}
],
"targetGames": [
{"match": "exact", "name": "Skyrim Special Edition"},
{"match": "pattern", "name": "*Skyrim*"}
],
"installActions": [
{"type": "extract", "from": "game_files/*", "to": "{game}"},
{"type": "extract", "from": "enb_preset/*", "to": "{game}"},
{"type": "extract", "from": "user_config/*", "to": "{documents}/My Games/Skyrim Special Edition"},
{"type": "extract", "from": "cache_data/*", "to": "{localappdata}/Skyrim Special Edition"}
]
}
Your ZIP has one filename, but the game needs a different name.
✏️ Example: Rename DLL
YOUR ZIP GAME FOLDER
-------- -----------
mymod.zip C:\Games\SomeGame\
| |
+-- ExampleMod64.dll ==========> +-- dxgi.dll (RENAMED!)
"installActions": [
{
"type": "extract",
"from": "ExampleMod64.dll", <-- Original name in ZIP
"to": "{game}/dxgi.dll" <-- New name on PC (include filename!)
}
]
Sometimes ZIPs have an extra folder wrapping everything. Handle it!
🤔 Problem: Unwanted Parent Folder
BAD ZIP STRUCTURE WHAT YOU WANT
----------------- -------------
mymod-v1.0.zip Game Folder:
| +-- dxgi.dll
+-- mymod-v1.0/ <-- Extra! +-- config.ini
|
+-- dxgi.dll
+-- config.ini
"installActions": [
{
"type": "extract",
"from": "mymod-v1.0/*", <-- Include the parent folder name + /*
"to": "{game}"
}
]
The /* means "everything INSIDE this folder". The parent folder itself is skipped.
Files need to go into a specific subfolder of the game.
🎯 Example: Install to Game's "Mods" Subfolder
YOUR ZIP GAME FOLDER
-------- -----------
textures.zip C:\Games\Fallout4\
| |
+-- rocks.dds +-- Data/
+-- trees.dds | +-- Textures/ <-- Target!
+-- grass.dds | +-- rocks.dds
| +-- trees.dds
| +-- grass.dds
+-- Fallout4.exe
"installActions": [
{
"type": "extract",
"from": "*",
"to": "{game}/Data/Textures" <-- Add subfolders after {game}
}
]
❌ WRONG vs ✅ RIGHT
❌ WRONG: Forgetting the /*
"from": "game_files" <-- Missing /* = copies the folder itself!
✅ RIGHT:
"from": "game_files/*" <-- With /* = copies contents only
❌ WRONG: Missing quotes in JSON
{from: "files/*", to: {game}} <-- Keys need quotes!
✅ RIGHT:
{"from": "files/*", "to": "{game}"}
❌ WRONG: Backslashes in paths
"to": "{game}\Data\Textures" <-- Backslashes break JSON!
✅ RIGHT:
"to": "{game}/Data/Textures" <-- Always use forward slashes
❌ WRONG: HTTP instead of HTTPS
"url": "http://example.com/mod.zip" <-- Blocked for security!
✅ RIGHT:
"url": "https://example.com/mod.zip" <-- HTTPS required
✅ QUICK CHECKLIST BEFORE PUBLISHING
☐ All URLs use HTTPS (not HTTP) ☐ JSON is valid (test at jsonlint.com) ☐ ZIP file downloads correctly ☐ Icon is 128x128 PNG ☐ Background is about 960x480 JPG, under 500 KB ☐ Tested install on your own PC first ☐ Paths use forward slashes: / ☐ "from" paths end with /* for folders
{game}{documents}{localappdata}{appdata}Your GitHub Repo Structure
your-mod-repo/
|
+-- mod-card.json <-- Your card definition
|
+-- icon.png <-- Card icon (128x128)
|
+-- card-background.jpg <-- Card background (about 960x480)
|
+-- releases/
+-- mymod-v1.0.zip <-- Your mod ZIP file
How to Link Images in Your JSON
{
"icon": "https://raw.githubusercontent.com/YOUR-NAME/YOUR-REPO/main/icon.png",
========= =========
Your GitHub Your repo
username name
"backgroundArt": "https://raw.githubusercontent.com/YOUR-NAME/YOUR-REPO/main/card-background.jpg"
}
ICON
PNG format
Square shape
Transparent OK
BACKGROUND
JPG format
Wide rectangle
Under 500KB
mod-card.json file in your repositoryhttps://raw.githubusercontent.com/user/repo/main/mod-card.jsonHost the JSON file on any server that supports HTTPS. Ensure proper CORS headers if needed.
GPU Selector: Custom Mod Card System