Beta Release — v1.0.0-beta
DejaTop is a zero-dependency C++17 CLI tool that automatically generates .desktop entries for Linux native apps, AppImages, GOG games, and Windows games run through Wine or Steam Proton (including GE-Proton).
No configuration files. No GUI. One command.
| Feature | Details |
|---|---|
| Zero Dependencies | Pure C++17, no GTK/Qt/ncurses/Python |
| One-Shot Magic | Instant desktop entries, zero prompts |
| Smart Prefix Discovery | Auto-detects existing prefixes from Steam, Heroic, Lutris |
| Flatpak Steam Support | Scans both native and Flatpak Steam userdata |
| GE-Proton Priority | Prefers GE-Proton → Experimental → Official Proton |
| Smart Icon Discovery | Recursively picks best .ico/.png icon, or extracts directly from .exe files if icoutils is installed |
| Case-Insensitive Management | --delete, --replace-icon work with partial names |
| Tab Completion | Bash completion script included for all commands, flags, and existing entries |
make
make installInstalls to ~/.local/bin/dejatop and man page to ~/.local/share/man/man1/.
To uninstall:
make uninstall# Windows game — auto-discovers Proton + existing prefix
dejatop /mnt/Games/ACIII/ACIII.exe --name "Assassin's Creed III"
# Native / GOG / AppImage — no Proton logic, pure exec
dejatop ~/GOG-Games/Portal/start.sh --name "Portal"
# With all overrides
dejatop /path/to/game.exe --name "My Game" --icon /path/to/icon.png --runner proton --prefix ~/.local/share/Steam/steamapps/compatdata/12345For .exe files, DejaTop will:
- Scan Steam (native + Flatpak), Heroic, and Lutris for an existing prefix
- If none found, prompt
[Y/n]to create a shared DejaTop prefix - Pick the best Proton version (GE-Proton first)
- Auto-select the best icon from the game directory
- Generate the
.desktopentry and Proton wrapper script
# Swap a wrong icon (case-insensitive)
dejatop --replace-icon "assassin" /path/to/icon.png
# Delete an entry
dejatop --delete "portal"
# List all managed entries
dejatop --listman dejatopFor .exe files, Proton is selected in this priority order:
- Latest GE-Proton (e.g.
GE-Proton9-27) from~/.steam/root/compatibilitytools.d/ - Proton - Experimental or latest official Proton from Steam
- Error — if nothing is found, DejaTop exits cleanly with a clear message
.shand.AppImagefiles are always treated as native — Proton/prefix logic is never triggered for them.
- Steam native —
~/.local/share/Steam/userdata/*/config/shortcuts.vdf - Steam Flatpak —
~/.var/app/com.valvesoftware.Steam/data/Steam/userdata/ - Heroic —
~/.config/heroic/GamesConfig/*.json - Lutris —
~/.config/lutris/games/*.yml - Prompt — if nothing is found, asks
[Y/n]to create a shared prefix
-
.exeicon extraction — Icons baked inside.exefiles can be extracted directly ificoutils(wrestool+icotool) is installed. - Steam Flatpak — Proton execution — Flatpak Steam prefix discovery works. However, running a Proton binary that lives inside the Flatpak sandbox from outside it requires a
flatpak runwrapper (not yet implemented). Native Steam Proton works fine. - GOG Galaxy prefix detection — GOG game prefixes are not yet auto-discovered (GOG uses its own config location).
- Standalone Wine prefix detection — Wine prefixes created without Heroic or Lutris (e.g. raw
WINEPREFIX=...usage) are not scanned. -
--deletedoes not remove the wrapper script —--deleteremoves the.desktopfile but leaves the wrapper.shin~/.local/share/DejaTop/wrappers/. Cleanup not yet implemented. -
--listshows raw sanitized names —--liststrips thedejatop_prefix and.desktopsuffix from the filename, but shows the sanitized name (e.g.AssassinsCreedIII) instead of the human-readableName=field from inside the file. - Runner detection for unknown extensions — Files without
.exe,.sh, or.AppImageextensions (e.g. bare binaries with no extension) are always treated as native. There is no fallback prompt to let the user choose the runner. -
--runner winehas no prefix management — When--runner wineis passed manually, theExec=is set towine "path/to/game.exe"directly with no wrapper script and no prefix handling. - Heroic JSON parsing is naive — The Heroic parser does a simple string search for
"winePrefix":in the file. If Heroic changes its JSON schema or uses nested configs it may miss the prefix. -
sanitizeNamestrips all special characters — Game names with spaces, dots, or unicode (e.g. "DOOM (2016)") get heavily sanitized, making filenames likeDOOM2016with no separator. A smarter slug function would preserve readability. -
--deleteand--replace-iconmatch on filename, notName=— Searching"portal"matchesdejatop_Portal.desktopby filename. If the user names their entry something different from the filename (via--name), the lookup may fail or match the wrong entry. - Library Batch Mode — Add a
--batchcommand to scan entire game directories (e.g.,~/GOG Games/) and generate entries for all installed games in a single pass. - Entry Management — Add
--renameto seamlessly change the name of existing entries, and--updateto refresh the selected Proton version. - Dry-Run Previews — Add
--dry-runto safely preview the generated desktop entry and wrapper script without writing anything to disk. - Enhanced Launcher Discovery — Improve detection logic for Heroic Games Launcher, Lutris, and standalone Wine prefixes.
- Custom Environment Variables — Support reading Steam's per-game launch options, and add a
--envflag to pass custom variables (likeMANGOHUD=1) to any runner. - Robustness & Validation — Add strict verification using
desktop-file-validateto ensure 100% standard compliance, and fix edge cases involving paths with special characters.