How it works
The detection mechanism, the safety boundaries, and what each part of the download does
Discord decides a game is running by looking for a process with a known executable name. Zycord supplies exactly that process, and nothing else.
The detection mechanism
Discord maintains a list of detectable applications. Each entry carries an application id, a display name, one or more executable names, and often a folder fragment. When a game is running, Discord compares the processes on the computer against that list. A match turns the game into a running activity, which is what PLAY_ON_DESKTOP quest progress depends on.
The comparison is on the process name and its location, not on the game's content. Zycord therefore does not need the game, only a process that satisfies the same check.
A file name that is not on the list cannot match, whatever else is true of it. That is why a custom game appears as activity only when its executable name is one Discord already lists.
What Zycord does with that
For the game you choose, the launcher reads the executable entry from the catalog, builds a path under your local application data, copies the stub to that path with the expected filename, and starts it.
Discord sees a process with the name it expects, in a folder shaped like the real game's, and treats the game as running. The stub holds its process name and does nothing else.
The path Zycord takes
Every start follows the same sequence, with a validation step before each write.
Validate the application id
It must be one to 25 digits. Anything else is refused before a path is built.
Reduce the catalog entry to a relative path
Backslashes are normalised, empty and dot segments dropped, and the result rejected if it is absolute, contains a drive letter, contains a parent segment, has an invalid character, is longer than eight segments, or does not end in one of the eight extensions Windows starts as a program.
Build the target inside the games folder
The path is %LOCALAPPDATA%\Zycord\games\<app_id>\ plus the validated relative path.
Re-check containment
The resolved target must still sit strictly inside the games folder, or the start is refused.
Copy and start
The stub is copied over any previous copy for that game, then started with the game name and application id as arguments.
Record the process id
The session table stores the id, the exact file path, the start time and any auto stop deadline.
Why the location matters
Some detectable entries include a path fragment, not just a filename. Discord
is more likely to match a process that sits in a folder shaped like the one
the real game uses. The catalog keeps those fragments, and the launcher
recreates the folder structure beneath
%LOCALAPPDATA%\Zycord\games. Entries that could
escape that folder are rejected when the catalog is built and again when a
session starts.
Stopped by id, never by name
Some tools stop a session by image name, which terminates every process with that name, including a real game you have open. Zycord records the process id it started. Before terminating anything it confirms that the process with that id still points at the file Zycord created. If the id has been reused, nothing is stopped.
The stub follows the launcher
Each stub receives the launcher's process id and waits on it. If the launcher exits or crashes, the stub closes itself. A session cannot outlive the interface that can stop it.
The parts of the download
| Zycord.exe | A .NET Framework 4 application that hosts the interface in WebView2 and performs every file and process operation. |
|---|---|
| stub.exe | The session process, about 36 KB. Copied and renamed once per game, then started. |
| ui/index.html | The interface. It has no privileged access; it sends commands to the launcher and renders the replies. |
| ui/catalog.json | 10,465 games with their application ids, aliases, themes and executable entries. |
| WebView2 DLLs | Three assemblies that let the launcher render the interface with the Edge WebView2 runtime. |
Where data is stored
| Settings | %LOCALAPPDATA%\Zycord\settings.json |
|---|---|
| Prepared games | %LOCALAPPDATA%\Zycord\games\ |
| Logs | %LOCALAPPDATA%\Zycord\logs\ |
| WebView2 profile | %LOCALAPPDATA%\Zycord\webview\ |
Deleting %LOCALAPPDATA%\Zycord removes
everything the application has stored.
The catalog is fixed, not fetched
The catalog was built once from Discord's public detectable application endpoint and is stored with the application. The launcher does not refresh it, so it never depends on anyone's server staying online. The only remote request the interface makes is for game icons. The trade-off is real: games added to Discord's list after a release will not appear until a new release ships with an updated catalog.