Installed game detection utility for Linux. Built to be simple and scriptable.
Can you tell I'm not a graphic designer?
This utility is a CLI front-end for lib_game_detector. It is
intended to be used in scripts, especially with picker programs (e.g. rofi, dmenu, fzf,
etc.) in order to launch games, or perform some other action with the game's details.
I find that searching for games from different sources (e.g. Steam, Heroic, Lutris) is slow, as is just visually searching through a UI. However, detecting games with this tool is fast (~3ms on my machine™), as is searching through those games using fuzzy search. This allows me to waste less time looking for what game I want to play, and more time actually playing.
This program in particular is made as a more basic alternative to another project of mine, rofi-games, making it more universally useful. It is very scriptable and can be used with any picker. Check out the extras directory for some examples.
Simply named for the short acronym that isn't used by anything else I'm familiar with: Rolv's Game Detector.
Cargo
cargo install rgd --lockedOr, directly from source:
cargo install --git https://github.com/rolv-apneseth/rgd --lockedAUR
paru -S rgdManual
-
Download the tarball corresponding to your computer's architecture (probably
x86_64) from the releases page -
Unpack the tarball, e.g.:
tar -xf rgd-x86_64-unknown-linux-gnu.tar.gz
-
Place the
rgdbinary in your$PATH
rgd listrgd list --fields="title"rgd list --fields="title,path-icon" --source "steam"rgd list --json | jqsh -c "$(rgd list | fzf -d $'\t' --with-nth 1 | cut -d$'\t' -f2)"rgd get --fields="path-game-dir" "the finals" | xdg-openNote: the matching is case-insensitive
- Logs are written to
$XDG_STATE_HOME/rgd/logs - Log level can be changed using the
RUST_LOGenv var, e.g.RUST_LOG="trace"
Examples of basic setups to launch games with different picker programs. You can find more useful scripts in the extras directory - treat the below as a quickstart.
dmenu
sh -c "$(rgd list --fields="title" | dmenu -i | rgd get --fields="launch-command")"fzf
sh -c "$(rgd list | fzf -d $'\t' --with-nth 1 | cut -d$'\t' -f2)"rofi
sh -c "$(rgd list | rofi -dmenu -display-columns 1 -i | cut -d$'\t' -f2)"fuzzel
sh -c "$(rgd list | fuzzel --dmenu --counter --with-nth 1 | cut -d$'\t' -f2)"wofi
sh -c "$(rgd list | wofi -i --dmenu --pre-display-cmd="echo \"text:%s:\" | cut -f1" | cut -f2)"bemenu
sh -c "$(rgd list --fields="title" | bemenu --list 10 --ignorecase | rgd get --fields="launch-command")"tofi
sh -c "$(rgd list --fields="title" | tofi | rgd get --fields="launch-command")"yofi
sh -c "$(rgd list --fields="title" | yofi dialog | rgd get --fields="launch-command")"All contributions are welcome. If you run into any problems, or have any suggestions/feedback, feel free to open an issue.
Note, however, that for e.g. support for additional launchers/sources, or game(s) not being detected, lib_game_detector is the correct place to open an issue.
This project is written in Rust, so for contributing features / fixes:
-
Ensure rustup is installed - this project uses the stable toolchain for most things, but nightly for the formatting.
-
Make your changes and ensure they work as expected -
cargo run -- your_args_here. -
Lint + format + run tests:
cargo clippy --all -- -W clippy::all && cargo +nightly fmt && cargo test
I like just, so I keep some utility commands in the justfile. Check that out for additional checks which are run in the CI.
- rofi-games: if you use
rofi, it's worth checking out. Additional features include sorting based on access and a full configuration file for modifying detected games, or adding fully custom entries to the list.
- All the dependencies of this project, and all their dependencies too. This would not be possible without the fantastic Rust ecosystem.
This code is licensed under the AGPLv3.
See the LICENSE file for more details.

