Heroic Games Launcher
heroicgameslauncher.comOpen source game launcher for the Epic Games Store, GOG and Amazon Prime Gaming on Linux, Windows and Mac. Replaces the official proprietary clients, though it still connects to your third-party store accounts.
- Homepage:heroicgameslauncher.com
- GitHub:github.com/Heroic-Games-Launcher/HeroicGamesLauncher
- Discord:rHJ2uqdquK
- Web info:web-check.xyz/check/heroicgameslauncher.com
Heroic Games Launcher Source Code
Author
Description
A games launcher for GOG, Amazon and Epic Games for Linux, Windows and macOS.
Homepage
https://heroicgameslauncher.comRepository
- LicenseGPL-3.0
- Created30 Dec 20
- Primary languageTypeScript
- Size737,542 KB
- Stars12,615
- Forks719
- Watchers12,615
Top Contributors
@flavioislima (982)
@weblate (556)
@arielj (424)
@CommandMC (231)
@imLinguin (111)
@Nocccer (81)
@BananaWorks07 (80)
@redromnon (27)
@github-actions[bot] (27)
@dependabot[bot] (26)
@adityaruplaha (24)
@dawidgarus (16)
@veryprofessionaldodo (11)
@BrettCleary (8)
@D3SOX (8)
@wbrtm (6)
@PS-Professional (6)
@Linux4Good (6)
@Bobertesiak (5)
@casasfernando (5)
@TsukuragiHisano (5)
@TabulateJarl8 (5)
@Vidi0 (5)
@octoshrimpy (5)
@Flonky (5)
@jadewilk (5)
@biliesilva (5)
@rootBrz (5)
@Ishidawg (4)
@vitorhcl (4)
@IngrownMink4 (4)
@cwrd1031-blip (4)
@MrKingMichael (4)
@KaranDuggal (4)
@Giovix92 (4)
@a5ehren (4)
@NewtronReal (3)
@syto203 (3)
@rdbrschf (3)
@onadrog (3)
@djibux (3)
@lahtis (3)
@ianwijma (3)
@flegald (3)
@chandujr (3)
@BiRo96 (3)
@0xCmdrKeen (3)
@matte-schwartz (2)
@DarthMDev (2)
@niStee (2)
@DobPD (2)
@R1kaB3rN (2)
@RawToast225 (2)
@RuffledPlume (2)
@entaromia (2)
@neuromancer (2)
@zoli111 (2)
@soumyaDghosh (2)
@ruiaraujo (2)
@LenaWil (2)
@aidalgol (2)
@Sasikuttan2163 (2)
@connercsbn (2)
@dankxylese (2)
@DenysMb (2)
@kohend (2)
@WangEdward (2)
@EsalRider (2)
@JakobDev (2)
@Keksgesicht (2)
@J0anJosep (2)
@victorsouzaleal (2)
@Mariaboni (2)
@Kjell291 (2)
@reverb256 (1)
@Root-Core (1)
@sandepten (1)
@sanmont (1)
@SarthakD15 (1)
@sluedecke (1)
@TornadoRadon (1)
@SheffeyG (1)
@skovorodal10n (1)
@Skythrew (1)
@Snaggly (1)
@Snoodelz (1)
@StefanLobbenmeier (1)
@TenTeypek (1)
@theguy000 (1)
@SB2DD (1)
@kszkristof (1)
@Peheux (1)
@thepedroferrari (1)
@oersen (1)
@OctopusET (1)
@ocean-sudo (1)
@nikoandpiko (1)
@Newbytee (1)
@MuraPura (1)
@Moon-yungg (1)
Recent Commits
Biliane Silva(11 Nov 26)
feat(ui): add Storybook with component stories (#6054) * chore: set up storybook * refactor(styles): rename brand text tokens to brand tints * feat(styles): add semantic colour role tokens * fix(styles): derive theme text colours from their surface * fix(styles): point destructive actions at the error colour * fix(ui): restyle the button variants * fix(ui): fill badges instead of outlining them * fix(ui): shrink the game action button * fix(ui): point alert at the colour roles * refactor(ui): build anticheat on alert * fix(ui): restyle dismissible banners * refactor(ui): replace WarningMessage with Alert * fix(ui): rebuild the error screen * fix(ui): tone the offline banner and progress text * fix(ui): drop the uninstall dialog border * fix(ui): style the changelog markdown * fix(ui): use our button in winetricks * fix(ui): read the sidebar width on mount * test(ui): add stories for the UI components * test(styles): add foundations and contrast stories * ci: test stories on pull requests * docs: add a storybook guide * feat(i18n): add anticheat removed and error recovery strings * ci: run storybook job on ubuntu 24.04 * feat(styles): add the color primitive ramps * ci: test stories in the playwright image * fix(ui): contain overlay stories and show the info icon Overlay components render their MUI Dialog through a portal to the document body, so in autodocs the open modal escaped its story block and covered the page while the inline block stayed blank. Render those stories in their own bounded iframe so the dialog stays inside the docs. The info icon only got its colour from an unrelated settings stylesheet, leaving it invisible in Storybook; give it a colour in its own CSS and add a story with example texts. * test(e2e): tolerate google's cache-busting query param Google appends a ?zx=<timestamp> parameter to its URL, so the exact string assertion on the webview url input flaked. Match it with the same regex the later assertions in this spec already use.
Flavio F Lima(11 Nov 26)
[i18n] Regenerate all settings description keys with new names
Flavio F Lima(09 Nov 26)
[Chore]: Add itchio check to plausible events and remove copilot instructions
Weblate (bot)(08 Nov 26)
[i18n] Updated Translations (#6006) * [i18n] Updated translations (Irish) Currently translated at 77.2% (17 of 22 strings) Translated using Weblate (Irish) Currently translated at 99.3% (935 of 941 strings) Translated using Weblate (Irish) Currently translated at 100.0% (934 of 934 strings) Translated using Weblate (Irish) Currently translated at 100.0% (249 of 249 strings) Translated using Weblate (Irish) Currently translated at 92.0% (860 of 934 strings) Translated using Weblate (Irish) Currently translated at 93.9% (234 of 249 strings) Translated using Weblate (Irish) Currently translated at 98.8% (864 of 874 strings) Co-authored-by: Aindriú Mac Giolla Eoin <[email protected]> Co-authored-by: Hosted Weblate <[email protected]> Co-authored-by: Weblate Translation Memory <[email protected]> Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/gamepage/ga/ Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/globals/ga/ Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/login-page/ga/ Translation: Heroic Games Launcher Translation: Heroic Games Launcher/GamePage Translation: Heroic Games Launcher/Globals * [i18n] Updated translations (Galician) Currently translated at 72.7% (16 of 22 strings) Translated using Weblate (Galician) Currently translated at 91.4% (861 of 941 strings) Translated using Weblate (Galician) Currently translated at 92.0% (860 of 934 strings) Translated using Weblate (Galician) Currently translated at 93.9% (234 of 249 strings) Translated using Weblate (Galician) Currently translated at 98.7% (863 of 874 strings) Co-authored-by: Hosted Weblate <[email protected]> Co-authored-by: Weblate Translation Memory <[email protected]> Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/gamepage/gl/ Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/globals/gl/ Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/login-page/gl/ Translation: Heroic Games Launcher Translation: Heroic Games Launcher/GamePage Translation: Heroic Games Launcher/Globals * [i18n] Updated translations (Turkish) Currently translated at 72.7% (16 of 22 strings) Translated using Weblate (Turkish) Currently translated at 91.6% (862 of 941 strings) Translated using Weblate (Turkish) Currently translated at 92.1% (861 of 934 strings) Translated using Weblate (Turkish) Currently translated at 93.9% (234 of 249 strings) Translated using Weblate (Turkish) Currently translated at 98.8% (864 of 874 strings) Translated using Weblate (Turkish) Currently translated at 100.0% (868 of 868 strings) Co-authored-by: Erenay <[email protected]> Co-authored-by: Hosted Weblate <[email protected]> Co-authored-by: Weblate Translation Memory <[email protected]> Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/gamepage/tr/ Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/globals/tr/ Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/login-page/tr/ Translation: Heroic Games Launcher Translation: Heroic Games Launcher/GamePage Translation: Heroic Games Launcher/Globals * [i18n] Updated translations (Lithuanian) Currently translated at 77.2% (17 of 22 strings) Translated using Weblate (Lithuanian) Currently translated at 89.5% (843 of 941 strings) Translated using Weblate (Lithuanian) Currently translated at 90.1% (842 of 934 strings) Translated using Weblate (Lithuanian) Currently translated at 93.9% (234 of 249 strings) Translated using Weblate (Lithuanian) Currently translated at 96.7% (846 of 874 strings) Co-authored-by: Hosted Weblate <[email protected]> Co-authored-by: Weblate Translation Memory <[email protected]> Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/gamepage/lt/ Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/globals/lt/ Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/login-page/lt/ Translation: Heroic Games Launcher Translation: Heroic Games Launcher/GamePage Translation: Heroic Games Launcher/Globals * [i18n] Updated translations (Thai) Currently translated at 77.2% (17 of 22 strings) Translated using Weblate (Thai) Currently translated at 6.6% (63 of 941 strings) Translated using Weblate (Thai) Currently translated at 6.6% (62 of 934 strings) Translated using Weblate (Thai) Currently translated at 38.9% (97 of 249 strings) Co-authored-by: Hosted Weblate <[email protected]> Co-authored-by: Weblate Translation Memory <[email protected]> Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/gamepage/th/ Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/globals/th/ Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/login-page/th/ Translation: Heroic Games Launcher Translation: Heroic Games Launcher/GamePage Translation: Heroic Games Launcher/Globals * [i18n] Updated translations (Tamil) Currently translated at 77.2% (17 of 22 strings) Translated using Weblate (Tamil) Currently translated at 76.6% (721 of 941 strings) Translated using Weblate (Tamil) Currently translated at 77.0% (720 of 934 strings) Translated using Weblate (Tamil) Currently translated at 89.5% (223 of 249 strings) Translated using Weblate (Tamil) Currently translated at 82.7% (723 of 874 strings) Co-authored-by: Hosted Weblate <[email protected]> Co-authored-by: Weblate Translation Memory <[email protected]> Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/gamepage/ta/ Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/globals/ta/ Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/login-page/ta/ Translation: Heroic Games Launcher Translation: Heroic Games Launcher/GamePage Translation: Heroic Games Launcher/Globals * [i18n] Updated translations (Portuguese (Brazil)) Currently translated at 72.7% (16 of 22 strings) Translated using Weblate (Portuguese (Brazil)) Currently translated at 89.5% (843 of 941 strings) Translated using Weblate (Portuguese (Brazil)) Currently translated at 90.1% (842 of 934 strings) Translated using Weblate (Portuguese (Brazil)) Currently translated at 93.9% (234 of 249 strings) Translated using Weblate (Portuguese (Brazil)) Currently translated at 96.6% (845 of 874 strings) Co-authored-by: Hosted Weblate <[email protected]> Co-authored-by: Weblate Translation Memory <[email protected]> Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/gamepage/pt_BR/ Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/globals/pt_BR/ Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/login-page/pt_BR/ Translation: Heroic Games Launcher Translation: Heroic Games Launcher/GamePage Translation: Heroic Games Launcher/Globals * [i18n] Updated translations (German) Currently translated at 77.2% (17 of 22 strings) Translated using Weblate (German) Currently translated at 91.0% (857 of 941 strings) Translated using Weblate (German) Currently translated at 91.6% (856 of 934 strings) Translated using Weblate (German) Currently translated at 93.5% (233 of 249 strings) Translated using Weblate (German) Currently translated at 98.2% (859 of 874 strings) Translated using Weblate (German) Currently translated at 99.4% (863 of 868 strings) Co-authored-by: Hosted Weblate <[email protected]> Co-authored-by: Weblate Translation Memory <[email protected]> Co-authored-by: anon <[email protected]> Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/gamepage/de/ Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/globals/de/ Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/login-page/de/ Translation: Heroic Games Launcher Translation: Heroic Games Launcher/GamePage Translation: Heroic Games Launcher/Globals * [i18n] Updated translations (Danish) Currently translated at 72.7% (16 of 22 strings) Translated using Weblate (Danish) Currently translated at 72.6% (684 of 941 strings) Translated using Weblate (Danish) Currently translated at 73.1% (683 of 934 strings) Translated using Weblate (Danish) Currently translated at 90.7% (226 of 249 strings) Co-authored-by: Hosted Weblate <[email protected]> Co-authored-by: Weblate Translation Memory <[email protected]> Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/gamepage/da/ Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/globals/da/ Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/login-page/da/ Translation: Heroic Games Launcher Translation: Heroic Games Launcher/GamePage Translation: Heroic Games Launcher/Globals * [i18n] Updated translations (Greek) Currently translated at 72.7% (16 of 22 strings) Translated using Weblate (Greek) Currently translated at 75.8% (714 of 941 strings) Translated using Weblate (Greek) Currently translated at 76.3% (713 of 934 strings) Translated using Weblate (Greek) Currently translated at 88.7% (221 of 249 strings) Translated using Weblate (Greek) Currently translated at 81.9% (716 of 874 strings) Co-authored-by: Hosted Weblate <[email protected]> Co-authored-by: Weblate Translation Memory <[email protected]> Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/gamepage/el/ Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/globals/el/ Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/login-page/el/ Translation: Heroic Games Launcher Translation: Heroic Games Launcher/GamePage Translation: Heroic Games Launcher/Globals * [i18n] Updated translations (Basque) Currently translated at 77.2% (17 of 22 strings) Translated using Weblate (Basque) Currently translated at 47.1% (444 of 941 strings) Translated using Weblate (Basque) Currently translated at 67.8% (169 of 249 strings) Translated using Weblate (Basque) Currently translated at 47.4% (443 of 934 strings) Translated using Weblate (Basque) Currently translated at 50.4% (441 of 874 strings) Co-authored-by: Hosted Weblate <[email protected]> Co-authored-by: Weblate Translation Memory <[email protected]> Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/gamepage/eu/ Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/globals/eu/ Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/login-page/eu/ Translation: Heroic Games Launcher Translation: Heroic Games Launcher/GamePage Translation: Heroic Games Launcher/Globals * [i18n] Updated translations (Estonian) Currently translated at 72.7% (16 of 22 strings) Translated using Weblate (Estonian) Currently translated at 89.6% (844 of 941 strings) Translated using Weblate (Estonian) Currently translated at 90.2% (843 of 934 strings) Translated using Weblate (Estonian) Currently translated at 93.9% (234 of 249 strings) Translated using Weblate (Estonian) Currently translated at 96.7% (846 of 874 strings) Co-authored-by: Hosted Weblate <[email protected]> Co-authored-by: Weblate Translation Memory <[email protected]> Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/gamepage/et/ Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/globals/et/ Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/login-page/et/ Translation: Heroic Games Launcher Translation: Heroic Games Launcher/GamePage Translation: Heroic Games Launcher/Globals * [i18n] Updated translations (Russian) Currently translated at 77.2% (17 of 22 strings) Translated using Weblate (Russian) Currently translated at 91.6% (862 of 941 strings) Translated using Weblate (Russian) Currently translated at 92.1% (861 of 934 strings) Translated using Weblate (Russian) Currently translated at 93.9% (234 of 249 strings) Translated using Weblate (Russian) Currently translated at 98.8% (864 of 874 strings) Co-authored-by: Hosted Weblate <[email protected]> Co-authored-by: Weblate Translation Memory <[email protected]> Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/gamepage/ru/ Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/globals/ru/ Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/login-page/ru/ Translation: Heroic Games Launcher Translation: Heroic Games Launcher/GamePage Translation: Heroic Games Launcher/Globals * [i18n] Updated translations (Romanian) Currently translated at 72.7% (16 of 22 strings) Translated using Weblate (Romanian) Currently translated at 57.5% (542 of 941 strings) Translated using Weblate (Romanian) Currently translated at 57.9% (541 of 934 strings) Translated using Weblate (Romanian) Currently translated at 81.1% (202 of 249 strings) Translated using Weblate (Romanian) Currently translated at 61.3% (536 of 874 strings) Translated using Weblate (Romanian) Currently translated at 62.2% (540 of 868 strings) Co-authored-by: Hosted Weblate <[email protected]> Co-authored-by: Weblate Translation Memory <[email protected]> Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/gamepage/ro/ Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/globals/ro/ Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/login-page/ro/ Translation: Heroic Games Launcher Translation: Heroic Games Launcher/GamePage Translation: Heroic Games Launcher/Globals * [i18n] Updated translations (Bengali) Currently translated at 72.7% (16 of 22 strings) [i18n] Updated translations (Bengali) Currently translated at 100.0% (15 of 15 strings) Added translation using Weblate (Bengali) Co-authored-by: Ahanaf Rashid <[email protected]> Co-authored-by: Hosted Weblate <[email protected]> Co-authored-by: Weblate Translation Memory <[email protected]> Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/login-page/bn/ Translation: Heroic Games Launcher * [i18n] Updated translations (Belarusian) Currently translated at 72.7% (16 of 22 strings) Translated using Weblate (Belarusian) Currently translated at 74.3% (700 of 941 strings) Translated using Weblate (Belarusian) Currently translated at 74.8% (699 of 934 strings) Translated using Weblate (Belarusian) Currently translated at 85.1% (212 of 249 strings) Translated using Weblate (Belarusian) Currently translated at 80.3% (702 of 874 strings) Co-authored-by: Hosted Weblate <[email protected]> Co-authored-by: Weblate Translation Memory <[email protected]> Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/gamepage/be/ Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/globals/be/ Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/login-page/be/ Translation: Heroic Games Launcher Translation: Heroic Games Launcher/GamePage Translation: Heroic Games Launcher/Globals * [i18n] Updated translations (Bulgarian) Currently translated at 100.0% (22 of 22 strings) [i18n] Updated translations (Bulgarian) Currently translated at 100.0% (22 of 22 strings) Translated using Weblate (Bulgarian) Currently translated at 100.0% (948 of 948 strings) Translated using Weblate (Bulgarian) Currently translated at 100.0% (250 of 250 strings) Translated using Weblate (Bulgarian) Currently translated at 91.6% (862 of 941 strings) Translated using Weblate (Bulgarian) Currently translated at 92.1% (861 of 934 strings) Translated using Weblate (Bulgarian) Currently translated at 93.9% (234 of 249 strings) Translated using Weblate (Bulgarian) Currently translated at 98.8% (864 of 874 strings) Translated using Weblate (Bulgarian) Currently translated at 100.0% (868 of 868 strings) Translated using Weblate (Bulgarian) Currently translated at 100.0% (235 of 235 strings) Co-authored-by: Hosted Weblate <[email protected]> Co-authored-by: Weblate Translation Memory <[email protected]> Co-authored-by: Любомир Василев <[email protected]> Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/gamepage/bg/ Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/globals/bg/ Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/login-page/bg/ Translation: Heroic Games Launcher Translation: Heroic Games Launcher/GamePage Translation: Heroic Games Launcher/Globals * [i18n] Updated translations (Ukrainian) Currently translated at 77.2% (17 of 22 strings) Translated using Weblate (Ukrainian) Currently translated at 91.6% (862 of 941 strings) Translated using Weblate (Ukrainian) Currently translated at 92.1% (861 of 934 strings) Translated using Weblate (Ukrainian) Currently translated at 93.9% (234 of 249 strings) Translated using Weblate (Ukrainian) Currently translated at 98.8% (864 of 874 strings) Co-authored-by: Hosted Weblate <[email protected]> Co-authored-by: Weblate Translation Memory <[email protected]> Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/gamepage/uk/ Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/globals/uk/ Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/login-page/uk/ Translation: Heroic Games Launcher Translation: Heroic Games Launcher/GamePage Translation: Heroic Games Launcher/Globals * Translated using Weblate (Bosnian) Currently translated at 48.5% (453 of 934 strings) Translated using Weblate (Bosnian) Currently translated at 63.0% (157 of 249 strings) Translated using Weblate (Bosnian) Currently translated at 51.4% (450 of 874 strings) Co-authored-by: Hosted Weblate <[email protected]> Co-authored-by: Weblate Translation Memory <[email protected]> Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/gamepage/bs/ Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/globals/bs/ Translation: Heroic Games Launcher/GamePage Translation: Heroic Games Launcher/Globals * [i18n] Updated translations (Japanese) Currently translated at 77.2% (17 of 22 strings) Translated using Weblate (Japanese) Currently translated at 91.6% (862 of 941 strings) Translated using Weblate (Japanese) Currently translated at 92.1% (861 of 934 strings) Translated using Weblate (Japanese) Currently translated at 90.8% (849 of 934 strings) Translated using Weblate (Japanese) Currently translated at 93.9% (234 of 249 strings) Translated using Weblate (Japanese) Currently translated at 98.8% (864 of 874 strings) Co-authored-by: Hosted Weblate <[email protected]> Co-authored-by: Weblate Translation Memory <[email protected]> Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/gamepage/ja/ Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/globals/ja/ Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/login-page/ja/ Translation: Heroic Games Launcher Translation: Heroic Games Launcher/GamePage Translation: Heroic Games Launcher/Globals * [i18n] Updated translations (Catalan) Currently translated at 72.7% (16 of 22 strings) Translated using Weblate (Catalan) Currently translated at 91.4% (861 of 941 strings) Translated using Weblate (Catalan) Currently translated at 92.0% (860 of 934 strings) Translated using Weblate (Catalan) Currently translated at 93.9% (234 of 249 strings) Translated using Weblate (Catalan) Currently translated at 98.8% (864 of 874 strings) Co-authored-by: Hosted Weblate <[email protected]> Co-authored-by: Weblate Translation Memory <[email protected]> Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/gamepage/ca/ Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/globals/ca/ Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/login-page/ca/ Translation: Heroic Games Launcher Translation: Heroic Games Launcher/GamePage Translation: Heroic Games Launcher/Globals * [i18n] Updated translations (Czech) Currently translated at 72.7% (16 of 22 strings) Translated using Weblate (Czech) Currently translated at 100.0% (250 of 250 strings) Translated using Weblate (Czech) Currently translated at 99.3% (935 of 941 strings) Translated using Weblate (Czech) Currently translated at 100.0% (934 of 934 strings) Translated using Weblate (Czech) Currently translated at 100.0% (934 of 934 strings) Translated using Weblate (Czech) Currently translated at 100.0% (249 of 249 strings) Translated using Weblate (Czech) Currently translated at 93.9% (234 of 249 strings) Translated using Weblate (Czech) Currently translated at 98.8% (864 of 874 strings) Translated using Weblate (Czech) Currently translated at 100.0% (868 of 868 strings) Translated using Weblate (Czech) Currently translated at 100.0% (235 of 235 strings) Co-authored-by: Adam Havránek <[email protected]> Co-authored-by: Hosted Weblate <[email protected]> Co-authored-by: Weblate Translation Memory <[email protected]> Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/gamepage/cs/ Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/globals/cs/ Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/login-page/cs/ Translation: Heroic Games Launcher Translation: Heroic Games Launcher/GamePage Translation: Heroic Games Launcher/Globals * [i18n] Updated translations (Portuguese) Currently translated at 77.2% (17 of 22 strings) Translated using Weblate (Portuguese) Currently translated at 87.4% (823 of 941 strings) Translated using Weblate (Portuguese) Currently translated at 88.0% (822 of 934 strings) Translated using Weblate (Portuguese) Currently translated at 93.9% (234 of 249 strings) Translated using Weblate (Portuguese) Currently translated at 94.3% (825 of 874 strings) Co-authored-by: Hosted Weblate <[email protected]> Co-authored-by: Weblate Translation Memory <[email protected]> Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/gamepage/pt/ Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/globals/pt/ Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/login-page/pt/ Translation: Heroic Games Launcher Translation: Heroic Games Launcher/GamePage Translation: Heroic Games Launcher/Globals * [i18n] Updated translations (Vietnamese) Currently translated at 72.7% (16 of 22 strings) Translated using Weblate (Vietnamese) Currently translated at 75.7% (713 of 941 strings) Translated using Weblate (Vietnamese) Currently translated at 76.2% (712 of 934 strings) Translated using Weblate (Vietnamese) Currently translated at 88.3% (220 of 249 strings) Translated using Weblate (Vietnamese) Currently translated at 81.8% (715 of 874 strings) Co-authored-by: Hosted Weblate <[email protected]> Co-authored-by: Weblate Translation Memory <[email protected]> Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/gamepage/vi/ Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/globals/vi/ Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/login-page/vi/ Translation: Heroic Games Launcher Translation: Heroic Games Launcher/GamePage Translation: Heroic Games Launcher/Globals * [i18n] Updated translations (Croatian) Currently translated at 72.7% (16 of 22 strings) Translated using Weblate (Croatian) Currently translated at 51.8% (488 of 941 strings) Translated using Weblate (Croatian) Currently translated at 52.1% (487 of 934 strings) Translated using Weblate (Croatian) Currently translated at 65.8% (164 of 249 strings) Translated using Weblate (Croatian) Currently translated at 55.1% (482 of 874 strings) Co-authored-by: Hosted Weblate <[email protected]> Co-authored-by: Weblate Translation Memory <[email protected]> Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/gamepage/hr/ Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/globals/hr/ Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/login-page/hr/ Translation: Heroic Games Launcher Translation: Heroic Games Launcher/GamePage Translation: Heroic Games Launcher/Globals * [i18n] Updated translations (Hungarian) Currently translated at 77.2% (17 of 22 strings) Translated using Weblate (Hungarian) Currently translated at 91.6% (862 of 941 strings) Translated using Weblate (Hungarian) Currently translated at 92.1% (861 of 934 strings) Translated using Weblate (Hungarian) Currently translated at 93.9% (234 of 249 strings) Translated using Weblate (Hungarian) Currently translated at 98.8% (864 of 874 strings) Co-authored-by: Hosted Weblate <[email protected]> Co-authored-by: Weblate Translation Memory <[email protected]> Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/gamepage/hu/ Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/globals/hu/ Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/login-page/hu/ Translation: Heroic Games Launcher Translation: Heroic Games Launcher/GamePage Translation: Heroic Games Launcher/Globals * [i18n] Updated translations (Hebrew) Currently translated at 77.2% (17 of 22 strings) Translated using Weblate (Hebrew) Currently translated at 51.8% (488 of 941 strings) Translated using Weblate (Hebrew) Currently translated at 52.1% (487 of 934 strings) Translated using Weblate (Hebrew) Currently translated at 71.8% (179 of 249 strings) Translated using Weblate (Hebrew) Currently translated at 56.2% (492 of 874 strings) Co-authored-by: Hosted Weblate <[email protected]> Co-authored-by: Weblate Translation Memory <[email protected]> Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/gamepage/he/ Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/globals/he/ Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/login-page/he/ Translation: Heroic Games Launcher Translation: Heroic Games Launcher/GamePage Translation: Heroic Games Launcher/Globals * [i18n] Updated translations (Malayalam) Currently translated at 72.7% (16 of 22 strings) Translated using Weblate (Malayalam) Currently translated at 54.0% (509 of 941 strings) Translated using Weblate (Malayalam) Currently translated at 54.3% (508 of 934 strings) Translated using Weblate (Malayalam) Currently translated at 65.8% (164 of 249 strings) Translated using Weblate (Malayalam) Currently translated at 57.6% (504 of 874 strings) Co-authored-by: Hosted Weblate <[email protected]> Co-authored-by: Weblate Translation Memory <[email protected]> Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/gamepage/ml/ Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/globals/ml/ Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/login-page/ml/ Translation: Heroic Games Launcher Translation: Heroic Games Launcher/GamePage Translation: Heroic Games Launcher/Globals * [i18n] Updated translations (Polish) Currently translated at 100.0% (22 of 22 strings) [i18n] Updated translations (Polish) Currently translated at 100.0% (22 of 22 strings) Translated using Weblate (Polish) Currently translated at 100.0% (948 of 948 strings) Translated using Weblate (Polish) Currently translated at 100.0% (250 of 250 strings) Translated using Weblate (Polish) Currently translated at 94.8% (893 of 941 strings) Translated using Weblate (Polish) Currently translated at 94.8% (893 of 941 strings) Translated using Weblate (Polish) Currently translated at 98.3% (245 of 249 strings) Translated using Weblate (Polish) Currently translated at 92.1% (861 of 934 strings) Translated using Weblate (Polish) Currently translated at 93.9% (234 of 249 strings) Translated using Weblate (Polish) Currently translated at 98.8% (864 of 874 strings) Co-authored-by: Hosted Weblate <[email protected]> Co-authored-by: Kacper Skrzypek <[email protected]> Co-authored-by: Weblate Translation Memory <[email protected]> Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/gamepage/pl/ Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/globals/pl/ Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/login-page/pl/ Translation: Heroic Games Launcher Translation: Heroic Games Launcher/GamePage Translation: Heroic Games Launcher/Globals * [i18n] Updated translations (Italian) Currently translated at 72.7% (16 of 22 strings) Translated using Weblate (Italian) Currently translated at 88.5% (833 of 941 strings) Translated using Weblate (Italian) Currently translated at 89.0% (832 of 934 strings) Translated using Weblate (Italian) Currently translated at 93.9% (234 of 249 strings) Translated using Weblate (Italian) Currently translated at 95.5% (835 of 874 strings) Co-authored-by: Hosted Weblate <[email protected]> Co-authored-by: Weblate Translation Memory <[email protected]> Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/gamepage/it/ Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/globals/it/ Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/login-page/it/ Translation: Heroic Games Launcher Translation: Heroic Games Launcher/GamePage Translation: Heroic Games Launcher/Globals * [i18n] Updated translations (Arabic) Currently translated at 77.2% (17 of 22 strings) Translated using Weblate (Arabic) Currently translated at 68.5% (645 of 941 strings) Translated using Weblate (Arabic) Currently translated at 68.9% (644 of 934 strings) Translated using Weblate (Arabic) Currently translated at 93.1% (232 of 249 strings) Translated using Weblate (Arabic) Currently translated at 73.9% (646 of 874 strings) Translated using Weblate (Arabic) Currently translated at 99.5% (234 of 235 strings) Co-authored-by: Hosted Weblate <[email protected]> Co-authored-by: Weblate Translation Memory <[email protected]> Co-authored-by: Youssef Ahmed <[email protected]> Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/gamepage/ar/ Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/globals/ar/ Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/login-page/ar/ Translation: Heroic Games Launcher Translation: Heroic Games Launcher/GamePage Translation: Heroic Games Launcher/Globals * [i18n] Updated translations (Azerbaijani) Currently translated at 72.7% (16 of 22 strings) Translated using Weblate (Azerbaijani) Currently translated at 45.6% (430 of 941 strings) Translated using Weblate (Azerbaijani) Currently translated at 45.9% (429 of 934 strings) Translated using Weblate (Azerbaijani) Currently translated at 76.7% (191 of 249 strings) Translated using Weblate (Azerbaijani) Currently translated at 48.9% (428 of 874 strings) Co-authored-by: Hosted Weblate <[email protected]> Co-authored-by: Weblate Translation Memory <[email protected]> Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/gamepage/az/ Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/globals/az/ Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/login-page/az/ Translation: Heroic Games Launcher Translation: Heroic Games Launcher/GamePage Translation: Heroic Games Launcher/Globals * [i18n] Updated translations (Indonesian) Currently translated at 77.2% (17 of 22 strings) Translated using Weblate (Indonesian) Currently translated at 91.3% (860 of 941 strings) Translated using Weblate (Indonesian) Currently translated at 91.9% (859 of 934 strings) Translated using Weblate (Indonesian) Currently translated at 93.9% (234 of 249 strings) Translated using Weblate (Indonesian) Currently translated at 98.6% (862 of 874 strings) Translated using Weblate (Indonesian) Currently translated at 99.7% (866 of 868 strings) Co-authored-by: Arif Budiman <[email protected]> Co-authored-by: Hosted Weblate <[email protected]> Co-authored-by: Weblate Translation Memory <[email protected]> Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/gamepage/id/ Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/globals/id/ Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/login-page/id/ Translation: Heroic Games Launcher Translation: Heroic Games Launcher/GamePage Translation: Heroic Games Launcher/Globals * [i18n] Updated translations (Dutch) Currently translated at 72.7% (16 of 22 strings) Translated using Weblate (Dutch) Currently translated at 74.3% (700 of 941 strings) Translated using Weblate (Dutch) Currently translated at 74.8% (699 of 934 strings) Translated using Weblate (Dutch) Currently translated at 83.9% (209 of 249 strings) Translated using Weblate (Dutch) Currently translated at 80.3% (702 of 874 strings) Co-authored-by: Hosted Weblate <[email protected]> Co-authored-by: Weblate Translation Memory <[email protected]> Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/gamepage/nl/ Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/globals/nl/ Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/login-page/nl/ Translation: Heroic Games Launcher Translation: Heroic Games Launcher/GamePage Translation: Heroic Games Launcher/Globals * [i18n] Updated translations (Spanish) Currently translated at 77.2% (17 of 22 strings) Translated using Weblate (Spanish) Currently translated at 87.3% (822 of 941 strings) Translated using Weblate (Spanish) Currently translated at 87.9% (821 of 934 strings) Translated using Weblate (Spanish) Currently translated at 93.9% (234 of 249 strings) Translated using Weblate (Spanish) Currently translated at 94.3% (825 of 874 strings) Co-authored-by: Hosted Weblate <[email protected]> Co-authored-by: Weblate Translation Memory <[email protected]> Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/gamepage/es/ Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/globals/es/ Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/login-page/es/ Translation: Heroic Games Launcher Translation: Heroic Games Launcher/GamePage Translation: Heroic Games Launcher/Globals * [i18n] Updated translations (French) Currently translated at 77.2% (17 of 22 strings) Translated using Weblate (French) Currently translated at 91.3% (860 of 941 strings) Translated using Weblate (French) Currently translated at 91.9% (859 of 934 strings) Translated using Weblate (French) Currently translated at 90.6% (847 of 934 strings) Translated using Weblate (French) Currently translated at 93.5% (233 of 249 strings) Translated using Weblate (French) Currently translated at 98.6% (862 of 874 strings) Co-authored-by: Hosted Weblate <[email protected]> Co-authored-by: Weblate Translation Memory <[email protected]> Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/gamepage/fr/ Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/globals/fr/ Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/login-page/fr/ Translation: Heroic Games Launcher Translation: Heroic Games Launcher/GamePage Translation: Heroic Games Launcher/Globals * [i18n] Updated translations (Swedish) Currently translated at 72.7% (16 of 22 strings) Translated using Weblate (Swedish) Currently translated at 87.1% (820 of 941 strings) Translated using Weblate (Swedish) Currently translated at 87.6% (819 of 934 strings) Translated using Weblate (Swedish) Currently translated at 90.7% (226 of 249 strings) Translated using Weblate (Swedish) Currently translated at 94.0% (822 of 874 strings) Co-authored-by: Hosted Weblate <[email protected]> Co-authored-by: Weblate Translation Memory <[email protected]> Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/gamepage/sv/ Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/globals/sv/ Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/login-page/sv/ Translation: Heroic Games Launcher Translation: Heroic Games Launcher/GamePage Translation: Heroic Games Launcher/Globals * [i18n] Updated translations (Persian) Currently translated at 72.7% (16 of 22 strings) Translated using Weblate (Persian) Currently translated at 50.3% (474 of 941 strings) Translated using Weblate (Persian) Currently translated at 50.6% (473 of 934 strings) Translated using Weblate (Persian) Currently translated at 68.2% (170 of 249 strings) Translated using Weblate (Persian) Currently translated at 53.7% (470 of 874 strings) Co-authored-by: Hosted Weblate <[email protected]> Co-authored-by: Weblate Translation Memory <[email protected]> Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/gamepage/fa/ Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/globals/fa/ Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/login-page/fa/ Translation: Heroic Games Launcher Translation: Heroic Games Launcher/GamePage Translation: Heroic Games Launcher/Globals * [i18n] Updated translations (Finnish) Currently translated at 72.7% (16 of 22 strings) Translated using Weblate (Finnish) Currently translated at 89.5% (843 of 941 strings) Translated using Weblate (Finnish) Currently translated at 90.1% (842 of 934 strings) Translated using Weblate (Finnish) Currently translated at 93.9% (234 of 249 strings) Translated using Weblate (Finnish) Currently translated at 96.6% (845 of 874 strings) Co-authored-by: Hosted Weblate <[email protected]> Co-authored-by: Weblate Translation Memory <[email protected]> Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/gamepage/fi/ Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/globals/fi/ Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/login-page/fi/ Translation: Heroic Games Launcher Translation: Heroic Games Launcher/GamePage Translation: Heroic Games Launcher/Globals * [i18n] Updated translations (Georgian) Currently translated at 27.2% (6 of 22 strings) Translated using Weblate (Georgian) Currently translated at 17.2% (162 of 941 strings) Translated using Weblate (Georgian) Currently translated at 17.2% (161 of 934 strings) Translated using Weblate (Georgian) Currently translated at 35.3% (88 of 249 strings) Translated using Weblate (Georgian) Currently translated at 18.1% (159 of 874 strings) Co-authored-by: Hosted Weblate <[email protected]> Co-authored-by: Weblate Translation Memory <[email protected]> Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/gamepage/ka/ Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/globals/ka/ Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/login-page/ka/ Translation: Heroic Games Launcher Translation: Heroic Games Launcher/GamePage Translation: Heroic Games Launcher/Globals * Translated using Weblate (Serbian) Currently translated at 51.0% (477 of 934 strings) Translated using Weblate (Serbian) Currently translated at 60.6% (151 of 249 strings) Translated using Weblate (Serbian) Currently translated at 54.2% (474 of 874 strings) Co-authored-by: Hosted Weblate <[email protected]> Co-authored-by: Weblate Translation Memory <[email protected]> Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/gamepage/sr/ Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/globals/sr/ Translation: Heroic Games Launcher/GamePage Translation: Heroic Games Launcher/Globals * [i18n] Updated translations (Korean) Currently translated at 77.2% (17 of 22 strings) Translated using Weblate (Korean) Currently translated at 66.2% (623 of 941 strings) Translated using Weblate (Korean) Currently translated at 66.5% (622 of 934 strings) Translated using Weblate (Korean) Currently translated at 81.1% (202 of 249 strings) Translated using Weblate (Korean) Currently translated at 71.5% (625 of 874 strings) Co-authored-by: Hosted Weblate <[email protected]> Co-authored-by: Weblate Translation Memory <[email protected]> Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/gamepage/ko/ Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/globals/ko/ Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/login-page/ko/ Translation: Heroic Games Launcher Translation: Heroic Games Launcher/GamePage Translation: Heroic Games Launcher/Globals * [i18n] Updated translations (Slovak) Currently translated at 72.7% (16 of 22 strings) Translated using Weblate (Slovak) Currently translated at 66.0% (622 of 941 strings) Translated using Weblate (Slovak) Currently translated at 66.4% (621 of 934 strings) Translated using Weblate (Slovak) Currently translated at 81.9% (204 of 249 strings) Translated using Weblate (Slovak) Currently translated at 71.5% (625 of 874 strings) Co-authored-by: Hosted Weblate <[email protected]> Co-authored-by: Weblate Translation Memory <[email protected]> Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/gamepage/sk/ Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/globals/sk/ Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/login-page/sk/ Translation: Heroic Games Launcher Translation: Heroic Games Launcher/GamePage Translation: Heroic Games Launcher/Globals * [i18n] Updated translations (Slovenian) Currently translated at 77.2% (17 of 22 strings) Co-authored-by: Hosted Weblate <[email protected]> Co-authored-by: Weblate Translation Memory <[email protected]> Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/login-page/sl/ Translation: Heroic Games Launcher * [i18n] Updated translations (Chinese (Traditional Han script)) Currently translated at 72.7% (16 of 22 strings) Translated using Weblate (Chinese (Traditional Han script)) Currently translated at 57.2% (539 of 941 strings) Translated using Weblate (Chinese (Traditional Han script)) Currently translated at 57.6% (538 of 934 strings) Translated using Weblate (Chinese (Traditional Han script)) Currently translated at 73.8% (184 of 249 strings) Translated using Weblate (Chinese (Traditional Han script)) Currently translated at 61.2% (535 of 874 strings) Co-authored-by: Hosted Weblate <[email protected]> Co-authored-by: Weblate Translation Memory <[email protected]> Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/gamepage/zh_Hant/ Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/globals/zh_Hant/ Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/login-page/zh_Hant/ Translation: Heroic Games Launcher Translation: Heroic Games Launcher/GamePage Translation: Heroic Games Launcher/Globals * [i18n] Updated translations (Chinese (Simplified Han script)) Currently translated at 72.7% (16 of 22 strings) Translated using Weblate (Chinese (Simplified Han script)) Currently translated at 83.2% (783 of 941 strings) Translated using Weblate (Chinese (Simplified Han script)) Currently translated at 83.7% (782 of 934 strings) Translated using Weblate (Chinese (Simplified Han script)) Currently translated at 92.7% (231 of 249 strings) Translated using Weblate (Chinese (Simplified Han script)) Currently translated at 89.8% (785 of 874 strings) Translated using Weblate (Chinese (Simplified Han script)) Currently translated at 99.1% (233 of 235 strings) Co-authored-by: Hosted Weblate <[email protected]> Co-authored-by: PetitH3ros <[email protected]> Co-authored-by: Weblate Translation Memory <[email protected]> Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/gamepage/zh_Hans/ Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/globals/zh_Hans/ Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/login-page/zh_Hans/ Translation: Heroic Games Launcher Translation: Heroic Games Launcher/GamePage Translation: Heroic Games Launcher/Globals * [i18n] Updated translations (Norwegian Bokmål) Currently translated at 95.4% (21 of 22 strings) [i18n] Updated translations (Norwegian Bokmål) Currently translated at 95.4% (21 of 22 strings) Translated using Weblate (Norwegian Bokmål) Currently translated at 94.4% (889 of 941 strings) Translated using Weblate (Norwegian Bokmål) Currently translated at 95.0% (888 of 934 strings) Translated using Weblate (Norwegian Bokmål) Currently translated at 95.0% (888 of 934 strings) Translated using Weblate (Norwegian Bokmål) Currently translated at 100.0% (249 of 249 strings) Translated using Weblate (Norwegian Bokmål) Currently translated at 92.5% (864 of 934 strings) Translated using Weblate (Norwegian Bokmål) Currently translated at 100.0% (236 of 236 strings) Translated using Weblate (Norwegian Bokmål) Currently translated at 99.8% (873 of 874 strings) Translated using Weblate (Norwegian Bokmål) Currently translated at 98.7% (863 of 874 strings) Translated using Weblate (Norwegian Bokmål) Currently translated at 100.0% (868 of 868 strings) Translated using Weblate (Norwegian Bokmål) Currently translated at 99.5% (864 of 868 strings) Translated using Weblate (Norwegian Bokmål) Currently translated at 98.2% (853 of 868 strings) Co-authored-by: Hosted Weblate <[email protected]> Co-authored-by: Telaneo <[email protected]> Co-authored-by: Weblate Translation Memory <[email protected]> Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/gamepage/nb/ Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/globals/nb/ Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/login-page/nb/ Translation: Heroic Games Launcher Translation: Heroic Games Launcher/GamePage Translation: Heroic Games Launcher/Globals * Translated using Weblate (Uzbek) Currently translated at 41.8% (391 of 934 strings) Co-authored-by: Hosted Weblate <[email protected]> Co-authored-by: Weblate Translation Memory <[email protected]> Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/globals/uz/ Translation: Heroic Games Launcher/Globals --------- Co-authored-by: Aindriú Mac Giolla Eoin <[email protected]> Co-authored-by: Weblate Translation Memory <[email protected]> Co-authored-by: Erenay <[email protected]> Co-authored-by: anon <[email protected]> Co-authored-by: Ahanaf Rashid <[email protected]> Co-authored-by: Любомир Василев <[email protected]> Co-authored-by: Adam Havránek <[email protected]> Co-authored-by: Kacper Skrzypek <[email protected]> Co-authored-by: Youssef Ahmed <[email protected]> Co-authored-by: Arif Budiman <[email protected]> Co-authored-by: PetitH3ros <[email protected]> Co-authored-by: Telaneo <[email protected]>
Flávio Fearn(07 Nov 26)
[Feat] Add itch.io store integration (#5706) * feat(itchio): scaffold itch.io store manager backed by butlerd Adds the foundation for itch.io as a fourth first-party store alongside Epic, GOG and Amazon. itch.io exposes its functionality through butlerd, a long-lived JSON-RPC 2.0 daemon, so this commit introduces a small JSON-RPC client wrapper rather than the per-command CLI spawning pattern used by legendary/gogdl/nile. Backend: - New `src/backend/storeManagers/itchio/` mirroring the nile layout (constants, electronStores, user, library, games, setup) plus a `butlerdClient.ts` that spawns butlerd, handles the secret handshake, and exposes `call()` / `on()` for requests and notifications. - `itchio` registered in `gameManagerMap`, `libraryManagerMap`, and `initStoreManagers()`. Every GameManager/LibraryManager method exists with a logged "not yet implemented" stub so the contract type-checks while real butlerd calls land in a follow-up PR. - `getButlerBin()` helper in `utils.ts` matching `getNileBin()`, with `altButlerBin` override in `AppSettings`. - `LogPrefix.Itchio` and `RunnerToLogPrefixMap['itchio']`. - IPC handlers: `getItchioUserInfo`, `getItchioLoginData`, `authItchio`, `logoutItchio`. - `itchio` added to `save_sync.getDefaultSavePath` (no-op — itch.io has no first-party save sync) and to the umu store mapping (excluded from umu lookups, like sideload). Frontend: - `itchio` added to `Runner`, `Category`, `StoresFilters`, library filter resets, `RunnerToStore` labels, and storesFilters defaults. - `itchioLoginPath` constant in the Login screen (UI button wiring comes with the auth implementation). - `itchioCategories` helper for the legacy `category`->stores migration. Common types: - New `src/common/types/itchio.ts` with butlerd-derived types (`ItchioUserData`, `ItchioLoginData`, `ItchioGame`, `ItchioCave`, `ItchioInstallInfo`, etc.). - `itchioConfigStore` added to `StoreStructure`. No user-visible changes yet: itch.io has no login button, no library entries, and all operations short-circuit to logged warnings. This is PR #1 of a three-step plan; PR #2 implements auth + library, PR #3 installs/launch/updates + UI. https://claude.ai/code/session_01XmrSomR65i9t4GqMcMhC6j * feat(itchio): add itch.io to sidebar Stores submenu Adds the itch.io Store link in the sidebar's Stores submenu, wires /store/itchio to https://itch.io in the WebView URL map, and teaches validStoredUrl about the itchio store so its last-url session storage round-trips correctly. Browsing the itch.io site works without authentication; the login flow is still pending (no /loginweb/itchio route, no itchio context state). https://claude.ai/code/session_01XmrSomR65i9t4GqMcMhC6j * chore(i18n): extract itchio-store key Generated by pnpm i18n after adding the itch.io sidebar entry. https://claude.ai/code/session_01XmrSomR65i9t4GqMcMhC6j * feat(itchio): implement auth via butlerd Profile.LoginWithAPIKey Wires the first real butlerd path: pasting a personal API key into a modal authenticates the user against itch.io and persists the resulting profile. Backend: - New butlerd.ts wraps getButlerdClient() with the Heroic-resolved butler binary, db path, and user-agent so manager files don't repeat that plumbing. - user.ts now calls Profile.LoginWithAPIKey, Profile.UseSavedLogin and Profile.Forget. getUserData() refreshes the saved butlerd session on app start and falls back to the local cache when butlerd is offline. - setup.ts creates itchioConfigPath so butlerd can open its SQLite db on first launch. - IPC handlers (getItchioUserInfo / getItchioLoginData / authItchio / logoutItchio) hooked up via the preload api/misc bridge. Common types: - ItchioLoginData / ItchioRegisterData reshaped for an API-key paste flow (itch.io's OAuth isn't CORS-friendly for desktop clients and would need a local HTTP callback). - itchioConfigStore now also persists profileId so logout can call Profile.Forget with the right id. Frontend: - itchio added to ContextProvider, GlobalState (loadItchioLibrary, itchioLogin / itchioLogout / getItchioLoginData, refresh, initial user check in componentDidMount, ContextProvider value). - itchioLibraryStore and itchioConfigStore added to electronStores. - New ItchioLogin modal mirrors SIDLogin: links the user to https://itch.io/user/settings/api-keys, lets them paste the key, and feeds it to itchio.login(). Reuses SIDLogin's CSS to keep visual parity. - Login screen renders a new <Runner class="itchio"> entry. Runner now accepts an optional loginAction callback so the primary button can open the paste modal instead of navigating to a webview. - Sidebar loggedIn check + initial library refresh now consider itch.io. - New itchio-logo.svg asset (simplified itch.io mark). https://claude.ai/code/session_01XmrSomR65i9t4GqMcMhC6j * feat(itchio): fetch library from butlerd into the Heroic cache Real library.ts: walks butlerd's paginated Fetch.ProfileGames until the cursor drains, maps each ItchioGame to a GameInfo, persists the array into libraryStore, and seeds an in-memory map that getGameInfo() reads from. initItchioLibraryManager() rehydrates from the cache so the UI is populated even before the network round-trip lands. Also implements getInstallInfo: calls Fetch.GameUploads, picks the best upload for the requested platform (linux/osx/windows boolean flags, falling back to the largest upload), and caches the result in installStore. installState/changeGameInstallPath/getLaunchOptions are now real reads/writes against the in-memory + persisted library so the contract is satisfied end-to-end. Type plumbing to slot ItchioInstallInfo into the InstallInfo union: - ItchioInstallInfo gains a structural `manifest: { disk_size, download_size }` matching what DownloadDialog reads off every variant. - ItchioGame gains a required `owned_dlc: []` so the union narrowing in DownloadDialog stays strict; itch.io has no DLC concept so the array is always populated empty. - ItchioInstallInfo added to ModifyInstallModal's accepted prop union. Update detection and install/uninstall/launch still stubbed; arrive in the next commits. https://claude.ai/code/session_01XmrSomR65i9t4GqMcMhC6j * feat(itchio): implement install / uninstall via butlerd install() calls Fetch.GameUploads first to lock in a specific upload (so butlerd never has to call back asking the client to pick one), then runs Install.Queue followed by Install.Perform. A per-call Progress subscription is piped to sendFrontendMessage('progressUpdate') in the same shape the existing GameStatus consumers expect (percent, eta, downSpeed). The resolved cave_id is stashed on the in-memory GameInfo so uninstall/launch can find it later. uninstall() looks up the cave_id and calls Uninstall.Perform with hard=deleteFiles (default true). forceUninstall() just wipes local state without talking to butlerd. Also wires: - isGameAvailable: checks the cached install path, then falls back to Fetch.Cave for the recorded cave_id. - isNative: derived from the upload's linux/osx booleans. - moveInstall: records the new install_path via library's changeGameInstallPath; the actual file move is handled by the caller (Heroic's install manager already does cross-volume copies). - repair: re-runs install() against the cached install path. - getExtraInfo: surfaces store_url and short_text from the cached GameInfo so the GamePage has something to render. Launch (Launch RPC + bidirectional pick callbacks) and update detection land in their own commits. https://claude.ai/code/session_01XmrSomR65i9t4GqMcMhC6j * feat(itchio): implement launch via butlerd's Launch RPC The Launch flow needs bidirectional RPC because butlerd may call back asking the client to pick a manifest action, accept a license or acknowledge a prereq result. Two pieces: butlerdClient.ts: - handleMessage() now distinguishes server-initiated REQUESTS (have both id and method) from notifications (method only) and responses (id only). - New handle(method, fn) API mirrors on(method, fn) but for requests: the handler's resolved value is serialized back as the RPC result; unhandled methods are answered with a -32601 error so butlerd doesn't hang waiting for a response. games.ts: - launch() registers default-pick handlers for PickManifestAction, AcceptLicense, PrereqsFailed and AllowSandboxSetup — covering the common cases without requiring a UI round-trip. If a LaunchOption with a `name` is supplied, PickManifestAction picks the matching action. - Subscribes to LaunchRunning / LaunchExited and emits sendGameStatusUpdate({ status: 'playing' | 'done' }) so the library/game page reflect running state. The reported pid is cached per appName. - stop() uses the tracked pid to SIGTERM the running game (butlerd's Launch RPC owns the child, so the pid is the only reliable handle Heroic has). https://claude.ai/code/session_01XmrSomR65i9t4GqMcMhC6j * feat(itchio): implement update detection and installation library.ts: - listUpdateableGames() collects the cave_id of every installed game in memory, sends them in a single CheckUpdate call, and maps the returned cave_ids back to appNames. Empty list short-circuits when the user isn't logged in or has nothing installed. games.ts: - update() pulls a fresh ItchioInstallInfo (so we pick up new upload metadata), then runs Install.Queue with reason='update' followed by Install.Perform against the existing cave_id. Reuses the same per-call Progress subscription and frontend progressUpdate plumbing as install(), so the UI shows download progress for updates the same way it does for fresh installs. End state: itch.io games installed via Heroic are now eligible for the periodic checkGameUpdates run, and clicking "Update" on a game page triggers a real butlerd update flow. https://claude.ai/code/session_01XmrSomR65i9t4GqMcMhC6j * chore(itchio): satisfy lint and prettier on the new manager files - Drop unused JsonRpcResponse / JsonRpcNotification interfaces in butlerdClient.ts (handleMessage now parses into an inline shape). - Simplify RequestHandler return type (was `unknown | Promise<unknown>` which collapses to `unknown` and tripped no-redundant-type-constituents). - Drop trailing unused parameters (launch's `_args` / `_skipVersionCheck`, stop's `_stopWine`) and unused interfaces (PrereqsParams, AcceptLicenseParams) — the GameManager contract is satisfied via structural subtyping. - Drop the unused `platformFromUpload` helper and the `_options` param on library.getInstallInfo, propagating the simpler call sites. - prettier --write on the new files. https://claude.ai/code/session_01XmrSomR65i9t4GqMcMhC6j * chore(i18n): extract itch.io login keys Generated by pnpm i18n: itchio.instructions, itchio.paste_key, button.itchio_error and login.itchio. https://claude.ai/code/session_01XmrSomR65i9t4GqMcMhC6j * feat(itchio): bundle butler binary via download-helper-binaries butler is itch.io's official CLI/daemon; butlerd (its JSON-RPC mode) is what the itch.io store manager talks to. Heroic now downloads it the same way it downloads legendary/gogdl/nile/comet: - `pnpm download-helper-binaries` now also fetches butler from broth.itch.zone (itch.io's official binary distribution) for the arch/platform combos Heroic ships: linux-x64, darwin-x64, darwin-arm64, windows-x64. - butler is distributed as a zip that contains the binary plus a couple of native helper libraries (libc7zip and friends). The whole zip is extracted into `public/bin/<arch>/<platform>/` so butler can resolve those siblings at runtime; archSpecificBinary('butler') keeps resolving to the binary itself. - Version pinned at 15.21.0 via RELEASE_TAGS so compareDownloadedTags() invalidates cleanly when we bump it later. extract-zip (already a transitive dep of electron-builder) is promoted to a direct devDependency so meta/downloadHelperBinaries.ts can import it explicitly. After this lands, on a fresh checkout `pnpm download-helper-binaries` populates public/bin/x64/darwin/butler (and the other arch/platform combos) automatically — no more manual butler install needed for the itch.io integration to work. https://claude.ai/code/session_01XmrSomR65i9t4GqMcMhC6j * fix: update butler version to 15.27.0 and reorder patched dependencies in pnpm workspace * fix(itchio): drain butlerd's pre-handshake log lines from stdout butlerd emits structured log entries on stdout *before* the listen-notification it uses to advertise its TCP port and shared secret, e.g. on startup: {"type":"log","level":"debug","message":"Current DB version is …"} {"type":"log","level":"debug","message":"Latest migration is …"} {"type":"butlerd/listen-notification","secret":"…","tcp":{…}} The previous stdout handler processed only the first newline-terminated line per `data` event and returned. When all three lines arrived in a single chunk — which is what happens on Apple Silicon's fast startup — two log lines were drained on successive `data` events, but the third (the actual handshake) sat in the buffer forever because no further data ever arrived. Login spun forever and the logs showed the two "Unexpected handshake message from butlerd: {…log…}" warnings. Fix: loop through every newline-terminated line in the buffer per `data` event, skip non-listen-notification entries at debug level (they're routine, not warnings), and only resolve once we see the real handshake. Parse failures are logged but no longer reject the whole connect promise so one malformed log line doesn't kill login. https://claude.ai/code/session_01XmrSomR65i9t4GqMcMhC6j * fix(itchio): use camelCase JSON keys for all butlerd RPC payloads butlerd JSON-RPC uses camelCase field names throughout (apiKey, profileId, gameId, caveId, installFolder, stagingFolder, displayName, coverUrl, shortText, …). My earlier code mixed in snake_case keys — working from a wrong assumption — which butlerd validated as missing fields. The user-visible symptom on login was: butlerd error -32603: apiKey: cannot be blank with the literal `apiKey` field name in the error confirming butlerd's casing. The same bug would have surfaced as silent failures or "missing field" errors on every subsequent call (Fetch.ProfileGames, Install.*, Launch, CheckUpdate, Uninstall.Perform, Fetch.Cave). Changes: - user.ts: Profile.LoginWithAPIKey {apiKey}, Profile.Forget {profileId}, Profile.UseSavedLogin {profileId}. - library.ts: Fetch.ProfileGames {profileId}, Fetch.GameUploads {gameId, profileId}, CheckUpdate {caveIds}, and read camelCase responses (game.coverUrl/stillCoverUrl/shortText, user.displayName, update.caveId). - games.ts: Install.Queue {installFolder, caveId}, Install.Perform {stagingFolder}, Uninstall.Perform {caveId}, Launch {caveId}, Fetch.Cave {caveId}; reads queued.installFolder / queued.stagingFolder / queued.caveId; Fetch.Cave now reads through result.cave.installInfo.installFolder (butlerd's actual Cave shape is nested, not flat). - common/types/itchio.ts: types describing butlerd wire shapes (ItchioUserData, ItchioGameUser, ItchioGame, ItchioUpload, ItchioCave) use camelCase. The synthetic ItchioInstallInfo type keeps its Heroic-style snake_case keys (install_size, manifest. disk_size, ...) because those are read by Heroic's own UI layer. ItchioCave reshaped to match butlerd's actual structure (id + installInfo nested) instead of a flattened guess. Heroic-owned fields on `GameInfo` (app_name, install_path, is_installed, folder_name, …) are unchanged — those are Heroic's snake_case, not butlerd's. The caveId Heroic stashes on the in-memory GameInfo to find a cave later was renamed from `cave_id` to `caveId` for consistency with the underlying butlerd field name (it's just an in-memory key, not a wire field, but the consistency makes future debugging easier). https://claude.ai/code/session_01XmrSomR65i9t4GqMcMhC6j * fix(itchio): include itchio.library in Library composition and filters The library refresh persisted itchio games into the cache but the Library screen never composed them into the displayed list, and the filter dropdown had no itchio toggle. After login the cache populated silently but the UI showed nothing. Three places had to learn about itchio: 1. `makeLibrary()` in screens/Library/index.tsx now appends itchio.library to the concatenated list and treats it the same as the other stores: only included when storesFilters.itchio is on AND itchio.username is set. Adds an explicit `showItchio` gate so the empty-store and "filter intersection" cases match the existing per-store logic. 2. The `favourites` useMemo iterates itchio.library too, so itch.io games can show up in the Recently Played / Favourites strip. 3. components/UI/LibraryFilters/index.tsx renders a `storeToggle('itchio')` entry next to the other store toggles, gated on `itchio.username`. If the library is still empty after this, the backend log `[Itchio]: itch.io library refreshed: N games` will say so (N = number of ProfileGames butlerd returned). If that's 0, the issue is on the butlerd / itch.io side rather than in Heroic's display layer. https://claude.ai/code/session_01XmrSomR65i9t4GqMcMhC6j * fix(itchio): fetch owned download keys, not profile-uploaded games `Fetch.ProfileGames` returns games the profile *uploaded* as a developer — almost always empty for players. The correct call for the "My Library > Bought, claimed & gifts" set is `Fetch.ProfileOwnedKeys`, which returns DownloadKey records, each wrapping the actual Game. Symptom: log line `itch.io library refreshed: 0 games` even though the account had many owned games. Swapping the method (and reshaping the item-record type accordingly) makes the refresh populate the cache from the user's real library. The Game inside each DownloadKey has the same shape we were already mapping, so gameToGameInfo() is unchanged. https://claude.ai/code/session_01XmrSomR65i9t4GqMcMhC6j * fix(itchio): register Heroic's install path as a butlerd install location butlerd's Install.Queue won't accept a raw filesystem path — it identifies destinations by id and rejects the call with: butlerd error -32603: When caveId is unspecified, installLocationId must be set …when neither caveId nor installLocationId is supplied. (Passing installFolder alone has no effect for new installs.) New helper `ensureInstallLocationId(path)`: 1. Calls Install.Locations.List 2. Returns the id of an existing location whose path matches 3. Otherwise registers a new one via Install.Locations.Add and returns the id butlerd hands back The Heroic-supplied path becomes the parent location; butlerd creates the per-game subdirectory inside it on Install.Perform — same UX as the other stores where the user picks a base directory and the runner creates a game folder underneath. https://claude.ai/code/session_01XmrSomR65i9t4GqMcMhC6j * feat(itchio): launch like sideload + platform-aware install butlerd's Launch RPC insists on a prereqsDir and runs Windows redistributable scaffolding even on macOS/Linux, which doesn't fit itch.io's DRM-free model. Replace it with the sideload-style direct- executable launch path, with two prerequisites: (a) we have to know the real installed platform so the right Wine path is chosen, and (b) we have to know which file in the install folder to spawn. Library / type changes - ItchioGame gains an optional `platforms` map (windows / linux / osx → truthy). butlerd already populates this on the Game payload inside every DownloadKey, so refresh now propagates it. - gameToGameInfo() turns those into Heroic's GameInfo.is_mac_native / is_linux_native, which the InstallModal reads to decide which radio buttons to render. The native-Linux flag is force-suppressed on Linux hosts so the modal only offers the Windows-via-Wine path there (deliberate scope-limit: native Linux uploads vary too much). - pickUploadForPlatform() is now strict — it returns undefined when no upload matches the requested platform instead of silently picking the largest one. The previous fallback is exactly how a user's "I installed Windows but got macOS" bug happened. Install - After Install.Perform, call Fetch.Cave to read butlerd's canonical view of the install: real installFolder, the upload that was actually installed, and the verdict.candidates list of launchable binaries. - Record install.platform from the installed upload's platforms map (Mac / linux / Windows) rather than parroting whatever platformToInstall came in as. This fixes the platform mismatch the user saw on screen. - Pick a launch candidate using pickLaunchCandidate(): prefers candidates whose `flavor` matches the installed platform, falls back to largest. The chosen candidate's path is joined onto installFolder and stored as install.executable. - Warns (rather than fails) when butlerd's verdict is empty; the user can still set Target Executable manually in game settings. Launch / isNative / stop - launch() now delegates entirely to storeManagerCommon's launchGame helper — the same path sideload uses. That helper handles prepareLaunch / prepareWineLaunch / wrappers / chmod and reads install.executable / install.platform directly. - isNative() reads install.platform (mirroring sideload) instead of the cached upload's platforms map; that map was lost when only the ItchioInstallInfo (not the full Cave) was cached. - stop() kills by exe-name pattern and shuts wine down on non-native hosts, replacing the now-gone butlerd LaunchRunning pid tracking. Net effect: the InstallModal shows the same Platform dropdown GOG/ Sideload show, gated on what the upload actually supports; installing records reality, not the request; and launching uses Heroic's standard wine/native path so games that need a wine prefix go through it without butlerd's Windows-prereqs detour. https://claude.ai/code/session_01XmrSomR65i9t4GqMcMhC6j * fix: platform mixed up * feat(itchio): update itchio logo and add it to StoreLogos component * feat(itchio): enhance progress logging during install and update processes * feat(itchio): enhance logging for butlerd process and include itchio in log settings * refactor: cleanup files * fix: uninstall statuses * feat(itchio): integrate itchio library into game management and filtering * tech: cleaner install games approach * ui: add tooltips for import button in MainButton and DownloadDialog for itch.io games * feat: enhance SIDLogin amd ITCH-IO component with clipboard support and close button * fix: prettier * i18n: updated keys * fix: lint * fix: improve main exe targer * feat: add installer detection and silent install support for itch.io games * feat: add itch.io support to DownloadManagerItem and getStoreName * ui: use a realistic Chrome user-agent in store webviews to avoid Cloudflare HTTP2 errors * ui: intercept itch.io webview login/register and show API key guidance itch.io's /login and /register pages sit behind a Cloudflare challenge that the embedded browser can't pass (endless reloads / ERR_HTTP2_PROTOCOL_ERROR). Stop the navigation on will-navigate/did-navigate and show a modal pointing users to the API key login instead. * fix: lint * fix: remove duplicate patchedDependencies entry in pnpm-workspace.yaml * fix: refactor and fixes * style: format code for better readability in persistInstalledCave function * feat: implement add and remove shortcuts for Itchio games * feat: implement import of already installed games for Itchio * fix: fixes linux only install and more * fix: library refresh and others * fix: login fixes * fix: prevent itch.io Cloudflare challenge loop in webview - Never persist Cloudflare challenge URLs as the store's last URL - Stop overriding itch.io's user agent, which triggered the challenge - Stop intercepting itch.io login/register and showing the warning * feat: add itch.io OAuth login via internal webview - Generate PKCE values and exchange the authorization code through butlerd - Intercept itch://oauth-callback in the main process and webview - Make OAuth the primary itch.io login and keep the API key as fallback * feat: move itch.io store above Amazon in sidebar * feat: add game input mode to itch.io webview - Focus the webview so keyboard input reaches HTML5 games\n- Ignore host gamepad navigation while the mode is active\n- Add a toggle to the webview toolbar for itch.io pages * style: use filled gamepad icon when game input mode is active * fix: download native Linux arm64 butler Map the linux-arm64 butler channel so the itch.io integration works on ARM64 builds without relying on box64. * fix(ui): prevent long settings labels from overlapping toggles The redesigned SettingRow lost the pre-line whitespace handling and did not allow labels to shrink below their longest word, so long values like Wine prefix paths ran underneath the ToggleSwitch control in the uninstall modal. Preserve newlines, allow long words to wrap, and restore spacing between the modal's toggle rows. * test(e2e): isolate user data and wait for the app shell E2E runs shared Electron's userData directory with the developer's local setup, so a non-English language or stored settings leaked into the tests and made selectors such as the Settings sidebar item fail. Point userData at the per-run temporary folder already used for the config when CI=e2e, and wait for the app shell to mount before handing the page to tests to avoid 'Execution context was destroyed' races. --------- Co-authored-by: Flavio F Lima <[email protected]>
Flávio Fearn(06 Nov 26)
[UI] Add settings to disable Discounts and GOG affiliates links (#6051) * Add affiliate banners and settings to disable Deals page and GOG affiliate link * style: use spacing variables in DismissibleBanner * feat: make GOG affiliate links opt-in with a first-visit prompt * fix: apply GOG affiliate consent immediately
Flávio Fearn(06 Nov 26)
[Chore] Update Electron to v45.1.0 (#6027) * Update Electron to 45.1.0 and related packages electron 43.1.1 -> 45.1.0 electron-builder 26.8.1 -> 26.18.0 electron-updater 6.8.3 -> 6.8.11 Clipboard read/write methods are async since Electron 44, so await them and update the IPC contract accordingly. * Update i18next-http-backend to 4.0.6 Fixes Dependabot alerts #252 (path traversal / URL injection via unsanitised lng/ns) and #415 (incomplete URL validation permitting SSRF), plus GHSA-9jhj-wvmw-cfx5 and GHSA-3cmx-xjww-583x. v4 drops the cross-fetch dependency and expects a host-provided fetch, which is available in the renderer. * fix(build): use the PNG source for the Linux app icon electron-builder 26.18's icon tool only reads PNG-encoded ICNS frames, so the JPEG2000-encoded icon.icns broke Linux icon generation and the AppImage build. --------- Co-authored-by: Flavio F Lima <[email protected]>
Bili Moreira(06 Nov 26)
feat(ui): redesign game page and settings on shared components (#5964) * feat(library): redesign library with Heroic Theme and Outfit font Adds the first pass of the library UI redesign: - New "Heroic Theme" (dark minimal, cyan accent) in themes.scss and registered in the theme selector. - Replace Rubik + Cabin with Outfit as the single app font family (default for both --primary-font-family and --secondary-font-family). - Swap MUI filled icons to Outlined variants in GameCard, SideloadDialog, and Library root (ArrowDropUp). FA structural icons in ActionIcons unchanged — the free pack does not ship regular variants for them. - Restyle GameCard: softer 12px radius, refined hover (translateY + layered shadow), pill-shaped store badge and status chip with blur overlay, smoother title reveal with gradient. - Tighten library grid spacing and pill the "number of games" badge. - Add --card-overlay-bg variable and a nord-light override so badges remain legible on light themes. * feat(library): pill search bar with / shortcut - Restyle SearchBar: pill shape, subtle border, hover/focus states with accent ring - Styled autocomplete dropdown (rounded, shadowed, hover highlight) - Add "/" keyboard shortcut to focus search globally (Esc to blur) - Kbd hint rendered inside the input when empty, hidden while focused * feat(library): lucide icons, pill filters, sidebar sections, action hover - Add lucide-react as the primary outlined icon library - Swap Library + Sidebar + filter buttons to Lucide icons - Restyle CategoryFilter + LibraryFilters as pill-shaped dropdown buttons (Dropdown gains a .pill button variant) - Restyle Sidebar: narrower default width (350 -> 240), section labels (LIBRARY / ACCOUNT / COMMUNITY), modern rounded active pill items, section grouping reflects design - Reorganize SidebarItem: accepts ReactNode icon (was FA-only) - Refined AlphabetFilter spacing/typography - AddGameButton: ghost pill with + icon - GameCard: floating circular action on hover, store badge moved to top-left (clearer corner hierarchy), status chip offset to the right * fix(library): larger cards, bigger fonts/icons, lighter secondary text - Grid min column width 168 -> 220px for a more standard card size - Sidebar items: font-size --text-sm -> --text-md, icon 18 -> 22px, padding bumped to 10px vertical - ActionIcons icon 18 -> 20px - Dropdown pill buttons (Filters, Categories): font --text-sm -> --text-md, padding 10x16, inline icons 16 -> 18px - SearchBar: input font --text-sm -> --text-md, search icon 18 -> 20px, padding 6x12 -> 8x14 - AddGameButton: font --text-sm -> --text-md, Plus icon 14 -> 16 - LibraryHeader count pill: --text-sm -> --text-md with more padding - GameCard title: --text-md -> --text-lg, wider horizontal padding - AlphabetFilter: 12 -> 13px, text-tertiary -> text-secondary, wider hits - Heroic Theme: lighten secondary/tertiary text and navbar-inactive (#a6b1c5 -> #c4cedd, #6e7a90 -> #8f99ad / #b4beca for sidebar) * feat(sidebar): Heroic wordmark, cyan active pill, downloads count badge - Wordmark: "Heroic" (title) + "Launcher" (uppercase tag) beside the shield icon; collapses to icon-only when the sidebar is narrow. - Active item: accent-colored text with a subtle tinted background + inset ring (replaces the darker-only active bg), matching the design. - Downloads item: shows a count badge on the right when there are active or queued installs in libraryStatus (reuses existing state). - SidebarItem extended with an optional badge prop (ReactNode). All existing sidebar items (Patreon, Ko-fi, Quit, etc.) preserved. * style(sidebar): enlarge brand and center stacked layout * style: pixel-perfect typography scale; bump sidebar & search sizing * style(search): force explicit 24px search / 20px clear icon sizes * style(search): enlarge icons (28px search / 24px clear) and kbd chip * style(search): remove / keyboard shortcut hint * feat(library): chip-based filters popover, move triggers next to search * style: smaller fonts/icons/logo, reduce card min-width, fix unused var * style(sidebar): lighter bg (#171c24), smaller collapsed logo, normalize collapsed icons * refactor(sidebar): accounts/launcher reorg, rename manage, drop show prefix, shrink fonts * refactor(sidebar): merge all nav into Launcher section, gear icon for Settings * style(sidebar): brand = Heroic only, rename Launcher section to General * feat(sidebar): custom outlined Discord and Patreon brand icons * Revert "feat(sidebar): custom outlined Discord and Patreon brand icons" This reverts commit dff9f664831b904c3816f829c7059ec1dd16c073. * style(header): match search bar and pill buttons height (44px) * feat(library): restructure game card with caption, cyan hover ring, gear settings icon, big play CTA on hover * feat(library): follow the redesign layout for header, filters and cards - Library header: title with a games count subtitle and a solid Add Game button on the right; search, categories, filters and the view controls are grouped in a single toolbar row underneath it - Alphabet filter: letters render as chips, dimmed when unavailable - GameCard: one surface with the caption inside the card, store badge on a light rounded square, rounded-square action button that grows into a labelled pill on hover and an accent ring around the whole card - GameCard: show total hours played under the title - GameCard: replace the settings shortcut with a kebab that opens the context menu already available on right click * refactor(ui): shared Button, Icon and field components across the app Every button now goes through the new Button component instead of the legacy `.button` class, which mixed `--text-tertiary` text on coloured backgrounds and left "Select All" and "Manage Categories" unreadable. Four variants with proper contrast: primary, secondary, ghost and danger. New components under components/UI: - Button, Chip, Icon, Playtime, StoreBadge, FilterSection, GameActionButton - GameActionButton unifies the grid and list game actions and keeps the class names gamepad.ts and ControllerHints rely on Also in this pass: - All icons moved to lucide through the Icon atom; the remaining Font Awesome ones are the brand marks lucide does not ship - Form fields share a --field-* token set, declared on body so theme colours resolve (on :root the colour tokens are not defined yet, which left inputs with no border or background) - List layout rebuilt as row cards with artwork, playtime and last played - Library header, filters, categories dropdown and context menu restyled - Manage Categories and Add Game dialogs brought in line, including the select popover and close button spacing - Refresh button keeps its spinner visible long enough to be seen; the library refresh resolves before React can paint the pending state * style(ui): bring the checkbox in line with the rest of the form controls The fake checkbox drawn by ToggleSwitch used a 3px accent border and an Arial check glyph, so it stood out even when unchecked and did not match the inputs around it. It now uses the shared --field-* tokens, a 6px radius and the Lucide check rendered through a mask, and the checked state is carried by the box instead of recolouring the label. Also drops a hover rule that painted the label with the background colour, and moves the last Font Awesome icon in WineSelector to Lucide. * style(ui): reduce the checkbox indent to 8px * feat(ui): add atomic Modal component and restyle all modals Replace the Dialog component with a reusable Modal atom (size, tone, fullHeight and stacked/inline footer variants) and migrate every modal to it. Add a Button atom with a destructive variant, align modal footers to the start with the confirmation first, and round the modal corners. * fix(ui): unblock the lint and e2e checks ts-prune was failing on exports nothing consumes: the Header re-export in the UI barrel, now that LibraryHeader imports it directly, plus the ButtonSize, IconSize, DEFAULT_STROKE and GameAction types that are only used inside their own module. The categories e2e test was hitting a strict mode violation because the Categories dropdown repeated "Categories" as a section label while the trigger button already says it. Dropped the redundant label. * feat(ui): add surface and typography design tokens Introduce a surface-aware token layer so text stays readable on every bundled theme instead of depending on each theme's palette. - `styles/_surfaces.scss`: derive `--on-panel*` / `--on-nav*` ink from the surface lightness, so primary text resolves to white on dark themes and black on light ones with no per-theme overrides. Hue is reserved for links, status and the active nav item. - Add `--panel-background`, `--panel-glass` and `--panel-border` so panels read as boxes on a plain page and as translucent surfaces over artwork. - Rework the type scale to 12/14/16/18/20/24/32/40/48 and expose semantic tokens (`--body-*`, `--title-*`, `--display-*`, `--eyebrow`, `--button-*`) so components pick a role rather than a pixel size. Drop the 36px and 56px steps and the unused `.text--*` utility classes. - Line heights become ratios; the previous `--space-*` values are em-based and scaled with font size. * refactor(ui): extract shared playtime and release date helpers Both the game page and the discounts screen formatted playtime and release dates inline. Pull them into a shared helper and hook so the two screens stay consistent. * feat(ui): add shared layout and feedback components Add the atoms the redesigned screens are built from, so layout and spacing live in one place instead of being repeated per screen. Layout: `Panel`, `SettingsCard`, `SettingRow`, `SpecCard`, `StatCard`, `PageHeader`, `Tabs`, `DetailList`, `MenuItem`, `BackButton`. Feedback: `Alert` (neutral/info/success/warning/error), `Badge`, `Score`, `Rating`, `ProgressBar`, `Skeleton`, `Tooltip`, `InfoTooltip`. `Panel` carries the surface tones, including a translucent one for panels that sit over game artwork; `SettingRow` owns the label/description/control rhythm shared by every settings field. * refactor(ui): move existing components onto the shared tokens Update the components that already existed so they use the semantic type and surface tokens rather than raw values, and share the new layout atoms. - `Button`: variants for primary/secondary/ghost/danger/dangerSubtle/warning, contrast-safe ink on coloured fills, and a self-contained warning fill that no longer depends on whatever sits behind it. - `ToggleSwitch` renders through `SettingRow` and shows its help text as a description instead of hiding it behind a hover tooltip. - `WarningMessage` renders through `Alert`; `TwoColTableInput` drops the table layout for a list plus an add row, so the headers, values and inputs share one text origin. - Form fields, selects and the remaining components pick up the shared field tokens. * style(sidebar): use neutral ink and centre the version row Switch the sidebar to the `--on-nav*` tokens so item labels keep enough contrast on themes whose nav surface differs from the page, and keep the accent on the active item so the classic themes stay distinguishable. The version row is centred rather than left aligned; its horizontal margin moved to the wrapper, which was what pushed the row off the sidebar's axis. * style(library): tighten game cards and the library header - The card's link wrapper used `aspect-ratio: 173/250` while the cover image inside it is `3/4`, so the wrapper was always ~25px taller than the artwork and left a dead strip above the title. Both now use the cover's ratio. - Drop the playtime line from the card and reserve two lines for the title, so long names wrap into that space and every cover stays aligned across a row. - Header, filters and search move onto the shared tokens and a max width so the grid does not stretch on wide displays. * feat(game-page): redesign the game page around the shared panels Rebuild the page as a hero panel plus a tabbed content panel, both using the translucent surface so the cover art reads through without the text losing contrast. - Hero: title, play actions, and Time Played / Last Played stat cards. Play and Play with Logs are separate buttons; options, settings and favourite sit beside them, with a tooltip on the settings button. - Overview tab holds the description, game details and the report-a-problem action; installation info moves to its own tab. - Replace the bespoke markup with `Panel`, `StatCard`, `DetailList`, `Tabs` and `Score` so spacing comes from the shared atoms. - Body copy on the translucent panels uses primary ink, which is what lets those panels stay see-through while meeting AA over bright artwork. * feat(settings): rebuild the settings screens on cards and rows Give every settings screen the same structure: a page header matching its sidebar entry, then cards that group related settings, each row carrying a label, a description and its control. - Replace the ad-hoc markup with `SettingsCard`, `SettingRow`, `Alert`, `PageHeader` and `Tabs`; help text that was only visible on hover now renders as a description. - System Information is rebuilt on `SpecCard`: a two column grid with centred content, our `ProgressBar` for memory, and a skeleton while the first (uncached) hardware scan runs. - The log view moves into a card, and the game settings modal gets a title and the same spacing as the pages. - Destructive actions get an explanation and a subdued fill instead of large solid red buttons. * style(discounts): use the shared release date helper and tokens * chore(i18n): extract strings for the redesigned screens * chore(ui): drop code orphaned by the redesign `ts-prune` flagged exports left behind by the previous commits: - `SmallInfo` was only used by `TimeContainer` and `GameScore` only by the old `Scores`, both of which the game page redesign replaced. - `Rating` was added but never consumed; the game page uses `Score`. - `DotsMenu`, `MainButton` and `SettingsButton` are imported directly by `GameActions`, so re-exporting them from the barrel was redundant. - `AlertVariant` and `BadgeVariant` are only referenced inside their own module, so they no longer need to be exported. * fix(settings): restore the page subtitles The per-page subtitles were nested under `settings.subtitle`, which was already a string, so i18next resolved the key to an object and every page rendered "returned an object instead of string" in place of its subtitle. Move all five under `settings.pageSubtitle.*` so no key is both a string and a parent. * refactor(ui): put component spacing on the fixed scale Component padding, gaps and radii were written as raw pixels on no consistent rhythm (2, 3, 5, 6, 9, 10, 14, 18px all appeared). Rebuild `--space-*-fixed` as a 4px scale (2/4/8/12/16/20/24/32/40/48/72) and move the components onto it, snapping the off-rhythm values to the nearest step. The em-based `--space-*` scale is unchanged and still drives type-relative spacing, which scales with font size. `--space-lg-fixed` was 19.2px and unused, so it becomes 20px; the previous `xl`/`2xl` steps (40px/72px) keep their values under the names `3xl`/`5xl`, and their eleven call sites are remapped so nothing shifts. * fix(i18n): format dates in the app language, not the OS locale `Intl.DateTimeFormat` and `Intl.RelativeTimeFormat` were constructed with an `undefined` locale, which resolves to the operating system's locale. On a machine set to pt-BR the game page showed "Last Played: semana passada" while the rest of the interface was in English. Pass `i18n.language` instead, so dates follow the language chosen in Settings. Affects the game page stats, the playtime label and the download manager entries. * fix(i18n): format release dates in the app language `getReleaseDate` and the build selector called `toLocaleDateString` with an undefined locale, so the game page showed "14 de maio de 2019" on a machine set to pt-BR while the interface was in English. The helper now takes the locale from its caller. * style(settings): make field labels readable Labels above a field were 12px in a muted tone, which is hard to read and smaller than the setting labels beside their controls. A setting's label is the same thing in both layouts, so both now use `--body-md` in primary ink. * feat(ui): show loading states as a progress bar The loading indicator was a spinning icon with no sense of progress. `ProgressBar` gains an indeterminate mode and an optional percentage, and the loading component renders through it: a determinate bar with a percentage when a caller knows how far along it is, and an animated indeterminate bar when it does not. It announces itself with `role="status"`, and the indeterminate animation stops under `prefers-reduced-motion`. * fix(library): fill the toolbar width and raise chip contrast The search field was capped at 720px, so on a wide window the toolbar left a large gap between the filters and the action icons. It now absorbs the leftover width and the row spans edge to edge. `Chip` also used the raw `--text-secondary`, which falls to 4.27:1 on dracula. It uses the surface-aware `--on-panel` instead. * style(library): make the card status badge readable over artwork The downloading status sat on the cover as green text on a lightly tinted pill, which disappeared against pale artwork. `Badge` gains an `onOverlay` variant: the tint composites over an opaque backing rather than transparency, with overlay ink, a stronger border and a shadow. The card status and update badges now render through it instead of carrying their own one-off styles. * style(game-page): give install progress a clearer bar `ProgressBar` gains a `md` size, and the install progress uses it with the percentage rendered by the component. The status line drops the percentage it was duplicating and keeps the size and ETA, in a muted tone so the bar carries the emphasis instead of a block of green text. * style(ui): keep the progress percentage next to its bar The value reserved 4 characters and aligned to the end, so short readings drifted away from the bar: "0%" sat about 30px clear of it while "100%" sat beside it. Aligning to the start keeps the number 8px from the bar at every value, and the reserved width still stops the bar resizing as it counts up. * style(settings): use the Alert component for cloud save notices The beta warning and the "not supported" notice were hand-rolled divs with a solid orange fill, so they looked nothing like the alerts on the settings pages. Both now render through `Alert` — warning for the beta notice, info for the unsupported one. * style(game-page): move Sync Saves into the installation grid Sync Saves sat in its own panel below Installation Info, which left a card holding a single row. `CloudSavesSync` becomes a hook that contributes a detail item plus its quick-saves menu, so the row joins the existing two column grid underneath Wine. * fix(settings): stop cards flattening alerts A card gives each direct child its vertical rhythm and a divider, and strips the first child's top padding. An `Alert` draws its own box, so that left the beta warning with `padding-top: 0` and squashed against its border whenever it led a card. Components with their own box are now excluded from the row rhythm and get a margin instead. * fix(ui): keep disabled setting labels readable A disabled toggle faded the whole row to 55% opacity, which left labels like "Autosync Saves" barely legible. Only the switch dims now; the text drops to the muted tone, which still meets AA. * style(settings): rebuild cloud saves on the shared components The section still used the pre-redesign markup: the save folder status was a clickable line of small text, the sync control put its button inside the select, and the guidance sat in a trailing "Help" box. - Folder status becomes an `Alert` with a "Detect again" action. - The save folder is a labelled field whose tooltip carries the guidance that was in the `InfoBox`. - Manual sync is a `SettingRow` with the select and Sync button in its control slot, so the button no longer floats mid-row. - Tooltip lists get spacing so the guidance is readable. * feat(ui): theme-aware scrollbars The scrollbar was styled ad-hoc in `index.scss` against the raw `--text-faint`, so it read as a pale grey strip that did not follow the theme — most obvious against the game settings modal. Add `styles/_scrollbars.scss`: a token layer deriving the thumb from `--on-panel`, so it resolves to near-white on dark themes and near-black on light ones, with hover and active states and a rounded inset thumb. The tab strip hides its bar through the shared `scrollbar--none` utility rather than its own rules. Chromium drops `::-webkit-scrollbar` styling as soon as `scrollbar-color` is set, so the pseudo-elements are used alone to keep the rounded thumb. * style(game-page): match the requirements cards to the other tabs The System Requirements columns used the default panel tone, so they sat at 94% while every other card on the page is translucent over the artwork. They now use the same glass tone. * fix(settings): keep the game settings modal a fixed width The modal reuses the install modal's dialog class, which sets `min-width: fit-content` so that dialog can size to its content. `min-width` wins over `max-width`, so a long save path on the Cloud Saves tab stretched the dialog to 932px while every other tab sat at 880px. Pin `min-width: 0` on the settings dialog so its own cap governs. All four tabs now measure 880px and nothing overflows. * feat(library): use the Tooltip component on the toolbar icons The six icon buttons relied on the browser's native `title` tooltip, which appears after a delay and ignores the theme, and the tour button used MUI's default tooltip, so three different styles were in play. All of them now use the `Tooltip` component. It gained an `asChild` option that attaches to the child directly instead of wrapping it in a span, which matters here because the segmented control styles its buttons with direct child selectors. The labels move to `aria-label` so there is no second native tooltip. * fix(settings): align the modal title with its tabs The dialog title renders inside DialogContent, which already supplies the horizontal padding, so its own padding indented the title 40px past the tabs and cards below it. * chore(ui): drop source comments * style(settings): give the Wine tools the standard row layout The three tools were bare uppercase outline buttons with no explanation, unlike every other section. Each is now a `SettingRow` with a label, a description of what the tool does, and its action on the right, matching Performance above it. * fix(library): make list rows uniform and clickable Two problems in the list layout: - Titles had no clamp, because the clamping lives on the grid card's class and a row is one or the other. Long names ran to three lines and rows in the same grid row did not match height. Rows now stretch and titles clamp to two lines. - Only the 56px thumbnail was a link, so clicking the row did nothing. The link now stretches over the row, with the menu and action button above it. * chore(i18n): extract strings for the Wine tools rows * fix(library): align the recent card art with its box The "Played Recently" lane's first card sets its own aspect ratio, and that ratio was 275/205 while .justPlayedImg is 16/10. The link box came out 51px taller than the artwork it holds, so the card had an empty strip between the cover and the title and its play button sat below the art instead of over it. Both the art link and the icon overlay now use 16/10, which is what the gamepad variant already resolved to. Also drops a duplicated icon rule and a dead .gameListItem .Playtime override that a later rule in the same file already contradicted. * fix(i18n): pass a valid BCP-47 tag to every Intl formatter Heroic's language codes come from i18next's supportedLngs, which uses underscores for regional variants: pt_BR, nb_NO, zh_Hans. Those are not valid language tags, so Intl.DateTimeFormat throws a RangeError on them. Launching a game on a pt_BR install crashed the whole renderer from the Playtime component. getIntlLocale canonicalises the tag and falls back to en, so an unknown code degrades to English instead of taking the app down. The backend already did the same replace inline in two places. Also guards the date parsing: hasPlaytime stores an empty string for a game that has never been played, and formatting Invalid Date throws the same way. * fix(settings): keep the log footer and sidebar inside the window On a narrow window the log actions sat in a nowrap row, so the Discord button fell off the right edge and the page scrolled horizontally. The row wraps now, and the rule that already tried to wrap it is gone: it targeted .logs-wrapper .footerFlex, but the footer is a sibling of that wrapper, so it never matched. The sidebar scrolled as a whole once the settings submenu was expanded, taking the Heroic version out of view. Only the link list scrolls now, with the brand and version pinned. * feat(ui): add an EmptyState atom and card header slots SettingsCard takes a meta slot for a count and an actions slot, so a section card can carry a badge and a button next to its title. * feat(downloads): rebuild the downloads page on the shared components - The page now uses PageHeader, Panel, SettingsCard, Badge, StoreBadge, ProgressBar, StatCard and EmptyState instead of its own markup. - The download in progress gets a hero card with cover, status badge, progress and its actions, next to the speed chart and the speed cards. - Queue and completed rows line up under column labels, show their queue position and a status badge, and collapse to two lines on narrow windows. - Actions are lucide icon buttons with tooltips, the sidebar download uses the ProgressBar atom, and rows no longer disappear when a game is missing from the store libraries. * style(sidebar): keep only the logo mark The wordmark took a third of the menu height and pushed the links into a scrollbar. The links now scroll on their own, so the logo and the version line stay in place and the sidebar itself never scrolls. * style(library): move the recent lane below the filters Played Recently now sits between the toolbar and the game grid, and the list rows got room for the playtime line instead of crowding it against the title. * feat(settings): move the section menu out of the sidebar Expanding Settings pushed five more rows into the sidebar, which then scrolled and hid the Heroic version. The sections now live in a nav rail on the settings page itself, next to the content, and the sidebar keeps a single Settings entry. NavList is the new atom behind the rail: a vertical list of routes with an optional icon and an active state driven by NavLink. Below 1100px it collapses to a wrapping row of pills so the rail does not eat the height it was meant to save. The page header is sticky, so the title, description and copy button stay in place while the sections scroll, and the rail sticks just below it. Every section now offers Back to Library, not only General. * feat(settings): add a jump control to the log viewer Reading a long log meant dragging the scrollbar to the bottom and back. A button now sits in the corner of the log box: it scrolls to the end, and once there it scrolls back to the start. It only renders when the log actually overflows. The box is wrapped so the button can be positioned against it. That wrapper takes over the grid placement and needs min-height 0, since the box's own overflow no longer blockifies the grid item, and the box is explicitly display block now that it is no longer a grid child. * style(settings): move the defaults hint below the tabs On Game Defaults the warning sat between the page description and the Wine/Other/Advanced tabs, so it read as a note about the page rather than about the panel it applies to. It now sits under the tabs, directly above the cards it is warning about. * style(settings): use the Tabs atom for the narrow section menu Below 1100px the section rail stacked above the content as a column of full-width rows, which cost more height than the rail saved. It renders as Tabs there instead, picked by a new useMediaQuery hook rather than by hiding one of two trees, so only one tablist is ever in the accessibility tree. The tabs wrap at that width instead of scrolling sideways: all five fit on two rows, and nothing ends up off screen. * fix(library): make the card play button clickable again The icon overlay on a grid card is pointer-events none, and a single rule gave the events back to its children — but it selected .svg-button, which the play, install and update buttons stopped being when they moved to GameActionButton. The click fell through to the cover image inside the card's link, so pressing Play opened the game page instead of launching. The rule selects every button in the overlay now, which also covers the settings cog that kept working by accident. * fix(settings): stop the page scrolling behind the game settings dialog The modal and the page under it both showed a scrollbar. MUI does lock the body while a modal is open, but it does so with an inline style, and body carries an `overflow: auto !important` that outranks it. That !important is deliberate — it keeps the library context menu from shifting the layout — so it stays, and a more specific rule locks the body only while a MuiDialog is mounted. Menus do not match it, and the context menu was checked to still open with no shift. * feat(library): give each library lane its own section header Played Recently was a small heading while the library title sat at the very top of the page, above the search bar, so the two lanes did not read as siblings. Both now carry the same header: a title with the number of games under it, placed directly above the lane it describes. SectionHeader is the atom behind it, and Favourites uses it too, in place of a bare h3. The library toolbar keeps the Add Game button and the search row, and the game count moved out of it into a countGames helper the lanes share. * fix(library): stop the category only shortcut covering its pill The shortcut was absolutely positioned over the right end of the pill, and the pill reserved a fixed 52px for it on hover. In English that just fit; in Portuguese "SOMENTE" is wider than the reservation and printed straight over the category name. It sits beside the pill now and grows from zero width on hover, so the reserved space always matches the word whatever the language. * style(library): rebalance the list row The row showed playtime under the title, an update button with a full label, and action buttons whose 28px icon dwarfed a 12px label. The title now sits above the store name, matching the grid card. The update button is icon only, so a row with an update pending does not push the play button off its line. Action buttons use a 18px icon with a 14px label and an 8px gap, so icon and text read at the same weight. Playtime leaves the card entirely: the game page keeps its Time Played and Last Played cards, and the component only ever rendered that card line, so it goes with it. * style(game): show a pending update as an icon, not a sentence The game page spelled the update out under the action row: "Installed - New Version Available! (Click to Update)". It competed with the title for attention and the only way to act on it was to click the sentence. An update now appears as a refresh button next to the favourite one, marked with a green dot, and the sentence is gone. GameStatus keeps the states that describe work in progress and no longer needs the update props. * style(library): match the list row icon buttons The icon-only update button kept the ghost variant's transparent fill while the menu button next to it sat on the dark surface, so the pair read as two different controls. Both now use the same fill, border and hover accent. * test(e2e): assert the webview origin, not google's query string The webview spec navigated to https://www.google.com/ and asserted the url bar matched it exactly. Google answers the forward navigation with a cache busting ?zx=<timestamp> parameter, so the assertion compared against a value that changes on every run and the job failed twice in a row on it. Both assertions that follow a real navigation now match the origin with a regex. The first one, right after the src is set by hand, still compares exactly, since nothing has been fetched at that point. * fix(settings): leave the game settings dialog a single scrollbar The dialog showed two bars side by side on a short window. The content carried min-height 64vh, which a flex child cannot shrink below, so once the paper was capped at calc(100% - 64px) the content no longer fit and the paper grew its own scrollbar next to the content's. The floor moves to the paper, where it is capped by that same max-height, and the content sizes from the free space with min-height 0 so it can shrink. The paper hides its overflow, so only the content can ever scroll. Checked at 1000, 760, 640 and 560px tall: one bar, nothing clipped. * fix(search): make the hovered suggestion readable on every theme The hovered suggestion filled with --accent but kept --text-muted for its ink, a colour meant for text on a panel. On the light themes that put dark text on a dark fill, and on the dark ones light text on a bright one: nord-light measured 2.05:1. Ink comes from --ink-on-accent now, which resolves to black or white against the accent's own lightness. The fill moves to --navbar-accent so it matches the colour that token is derived from, otherwise the themes whose navbar accent differs from the page accent still miss: nord-light measured 2.05 with --accent as the fill and 7.80 with --navbar-accent. Worst case across the 15 themes is now 6.71:1 on the store label. * fix(ui): card actions, stores login placement and the downloads store column (#6029) * fix(library): let the card action buttons take their own clicks The overlay that holds them is click-through so the cover link stays clickable, and only .svg-button re-enabled pointer events. Play and Install are Button elements now, so every click landed on the link behind them and opened the game page instead of launching or installing. * style(sidebar): move the stores login under settings It sat above the library while it is an account action, and the label did not say what it logs into. * style(downloads): make the store column read as a column The badge was shrunk to 28px and sat on the start edge of a column whose label is centred. * fix(downloads): line the rows up with the column labels The rows carry negative inline margins so they bleed to the card edges, but width: 100% sized them against the padded card instead, leaving every row 16px narrower than the label row and every column off by a few pixels. * style(ui): keep the store plate white in every theme It followed --text-default, so the plate flipped to a dark square with a light mark on light themes. The store marks are brand assets. * feat(ui): rebuild of the Wine Manager ui (#6028) feat(ui): add a Table component and rebuild the Wine Manager on it The Wine Manager drew its list by hand: a `gameListHeader` div with four hardcoded grid percentages, a `wineItem` row that repeated the same track sizes, and a second copy of both in a media query. Nothing about it was reusable, and the download manager carries a near-identical layout. Add a `Table` component to the shared UI set. Columns declare their header, renderer, alignment, width and whether they collapse on a narrow content area; the component owns the semantic table markup, the sticky header, the hover and divider treatment, and the loading and empty states. It renders `Skeleton` rows while loading, so a screen no longer has to swap in a separate loading component. Rebuild the Wine Manager on it, together with the components the rest of the redesign already uses: `PageHeader` for the title and toolbar, `Tabs` for the repository switcher, `Alert` for the per-repository explanation, `Panel` for the list surface, and `Button`, `Icon` and `Tooltip` for the row actions. `WineItem` is replaced by two cells that subscribe to the download state on their own, so a progress tick still only re-renders the row it belongs to. Release dates are now formatted in the app language instead of being printed as the raw `YYYY-MM-DD` string. * style(accessibility): rebuild the page on the settings cards (#6030) * style(accessibility): rebuild the page on the settings cards The accessibility page was the last screen still drawing settings by hand: a flat list of `span.setting` wrappers, a raw `input[type=range]` with its own unscoped track and thumb styling, a `zoomHint` row of hardcoded numbers, and a `font-size: var(--text-xl) !important` rule that made every label on the page larger than the same label in Settings. Group the controls into `SettingsCard` sections the way the settings screens do - Appearance, Fonts, Library, Motion & Interaction - and let `PageHeader` draw the title. The zoom control becomes a `SliderField`, which already carries the marks and the label treatment the rest of the app uses, so the custom range styling and the hint row can go. `SliderField` joins the UI barrel alongside the other field components. The page keeps every setting it had; only the layout changes. * fix(ui): keep slider mark labels clear of the row divider MUI draws a slider's mark labels absolutely at `top: 24px`, outside the slider's own box, so they sat below the field wrapper's content edge. Inside a settings card, where every row draws a bottom border, the divider ran straight through "60%", "100%" and the rest. Reserve the space the labels need when the slider actually has marks, so the wrapper contains them and the divider lands underneath. Affects the zoom control on the accessibility page and both gamepad sliders in the advanced settings. * style(ui): put the merged modals back on lucide icons CategoriesManager and EnvVariablesTable came across in the merge still drawing with Font Awesome and MUI icons, which the rest of the app had already left behind. They use the Icon atom again: check, pencil, trash, plus and x in the category manager; list, eraser and plus in the variables table, whose raw SvgButtons become Button and whose InfoBox becomes the inline InfoTooltip. Two things the Modal atom needed once the settings modal moved onto it: the header stacks its title and subtitle again, and the tabs no longer collapse to a hairline, since a flex column shrinks any child that does not opt out. * fix(ui): keep TableAlign out of the public surface ts-prune fails the build on an export nothing outside the module reads. TableColumn still exposes the alignment through its align field. * fix(ui): let a short modal size itself again The categories e2e test failed on a row that was in the DOM but out of view: the row sat at y=440 while its own scroll container started at y=501 and was 48px tall inside a 221px dialog. Modal__content had flex-basis 0, added here so the settings modal could shrink below its content and scroll. A zero basis also means no intrinsic height, so a modal whose paper sizes to its content collapsed instead. flex-basis goes back to auto and min-height 0 stays, which covers both: the content takes its natural height when the paper has room, and shrinks when the paper is capped. Checked at 1000, 760 and 560px tall, the settings modal still shows a single scrollbar.
Bili Moreira(06 Nov 26)
feat(ui): add atomic Modal component and restyle all modals (#5932) Replace the Dialog component with a reusable Modal atom (size, tone, fullHeight and stacked/inline footer variants) and migrate every modal to it. Add a Button atom with a destructive variant, align modal footers to the start with the confirmation first, and round the modal corners.
Bili Moreira(06 Nov 26)
feat(library): redesign library with Heroic Theme and Outfit font (#5489) * feat(library): redesign library with Heroic Theme and Outfit font Adds the first pass of the library UI redesign: - New "Heroic Theme" (dark minimal, cyan accent) in themes.scss and registered in the theme selector. - Replace Rubik + Cabin with Outfit as the single app font family (default for both --primary-font-family and --secondary-font-family). - Swap MUI filled icons to Outlined variants in GameCard, SideloadDialog, and Library root (ArrowDropUp). FA structural icons in ActionIcons unchanged — the free pack does not ship regular variants for them. - Restyle GameCard: softer 12px radius, refined hover (translateY + layered shadow), pill-shaped store badge and status chip with blur overlay, smoother title reveal with gradient. - Tighten library grid spacing and pill the "number of games" badge. - Add --card-overlay-bg variable and a nord-light override so badges remain legible on light themes. * feat(library): pill search bar with / shortcut - Restyle SearchBar: pill shape, subtle border, hover/focus states with accent ring - Styled autocomplete dropdown (rounded, shadowed, hover highlight) - Add "/" keyboard shortcut to focus search globally (Esc to blur) - Kbd hint rendered inside the input when empty, hidden while focused * feat(library): lucide icons, pill filters, sidebar sections, action hover - Add lucide-react as the primary outlined icon library - Swap Library + Sidebar + filter buttons to Lucide icons - Restyle CategoryFilter + LibraryFilters as pill-shaped dropdown buttons (Dropdown gains a .pill button variant) - Restyle Sidebar: narrower default width (350 -> 240), section labels (LIBRARY / ACCOUNT / COMMUNITY), modern rounded active pill items, section grouping reflects design - Reorganize SidebarItem: accepts ReactNode icon (was FA-only) - Refined AlphabetFilter spacing/typography - AddGameButton: ghost pill with + icon - GameCard: floating circular action on hover, store badge moved to top-left (clearer corner hierarchy), status chip offset to the right * fix(library): larger cards, bigger fonts/icons, lighter secondary text - Grid min column width 168 -> 220px for a more standard card size - Sidebar items: font-size --text-sm -> --text-md, icon 18 -> 22px, padding bumped to 10px vertical - ActionIcons icon 18 -> 20px - Dropdown pill buttons (Filters, Categories): font --text-sm -> --text-md, padding 10x16, inline icons 16 -> 18px - SearchBar: input font --text-sm -> --text-md, search icon 18 -> 20px, padding 6x12 -> 8x14 - AddGameButton: font --text-sm -> --text-md, Plus icon 14 -> 16 - LibraryHeader count pill: --text-sm -> --text-md with more padding - GameCard title: --text-md -> --text-lg, wider horizontal padding - AlphabetFilter: 12 -> 13px, text-tertiary -> text-secondary, wider hits - Heroic Theme: lighten secondary/tertiary text and navbar-inactive (#a6b1c5 -> #c4cedd, #6e7a90 -> #8f99ad / #b4beca for sidebar) * feat(sidebar): Heroic wordmark, cyan active pill, downloads count badge - Wordmark: "Heroic" (title) + "Launcher" (uppercase tag) beside the shield icon; collapses to icon-only when the sidebar is narrow. - Active item: accent-colored text with a subtle tinted background + inset ring (replaces the darker-only active bg), matching the design. - Downloads item: shows a count badge on the right when there are active or queued installs in libraryStatus (reuses existing state). - SidebarItem extended with an optional badge prop (ReactNode). All existing sidebar items (Patreon, Ko-fi, Quit, etc.) preserved. * style(sidebar): enlarge brand and center stacked layout * style: pixel-perfect typography scale; bump sidebar & search sizing * style(search): force explicit 24px search / 20px clear icon sizes * style(search): enlarge icons (28px search / 24px clear) and kbd chip * style(search): remove / keyboard shortcut hint * feat(library): chip-based filters popover, move triggers next to search * style: smaller fonts/icons/logo, reduce card min-width, fix unused var * style(sidebar): lighter bg (#171c24), smaller collapsed logo, normalize collapsed icons * refactor(sidebar): accounts/launcher reorg, rename manage, drop show prefix, shrink fonts * refactor(sidebar): merge all nav into Launcher section, gear icon for Settings * style(sidebar): brand = Heroic only, rename Launcher section to General * feat(sidebar): custom outlined Discord and Patreon brand icons * Revert "feat(sidebar): custom outlined Discord and Patreon brand icons" This reverts commit dff9f664831b904c3816f829c7059ec1dd16c073. * style(header): match search bar and pill buttons height (44px) * feat(library): restructure game card with caption, cyan hover ring, gear settings icon, big play CTA on hover * feat(library): follow the redesign layout for header, filters and cards - Library header: title with a games count subtitle and a solid Add Game button on the right; search, categories, filters and the view controls are grouped in a single toolbar row underneath it - Alphabet filter: letters render as chips, dimmed when unavailable - GameCard: one surface with the caption inside the card, store badge on a light rounded square, rounded-square action button that grows into a labelled pill on hover and an accent ring around the whole card - GameCard: show total hours played under the title - GameCard: replace the settings shortcut with a kebab that opens the context menu already available on right click * refactor(ui): shared Button, Icon and field components across the app Every button now goes through the new Button component instead of the legacy `.button` class, which mixed `--text-tertiary` text on coloured backgrounds and left "Select All" and "Manage Categories" unreadable. Four variants with proper contrast: primary, secondary, ghost and danger. New components under components/UI: - Button, Chip, Icon, Playtime, StoreBadge, FilterSection, GameActionButton - GameActionButton unifies the grid and list game actions and keeps the class names gamepad.ts and ControllerHints rely on Also in this pass: - All icons moved to lucide through the Icon atom; the remaining Font Awesome ones are the brand marks lucide does not ship - Form fields share a --field-* token set, declared on body so theme colours resolve (on :root the colour tokens are not defined yet, which left inputs with no border or background) - List layout rebuilt as row cards with artwork, playtime and last played - Library header, filters, categories dropdown and context menu restyled - Manage Categories and Add Game dialogs brought in line, including the select popover and close button spacing - Refresh button keeps its spinner visible long enough to be seen; the library refresh resolves before React can paint the pending state * style(ui): bring the checkbox in line with the rest of the form controls The fake checkbox drawn by ToggleSwitch used a 3px accent border and an Arial check glyph, so it stood out even when unchecked and did not match the inputs around it. It now uses the shared --field-* tokens, a 6px radius and the Lucide check rendered through a mask, and the checked state is carried by the box instead of recolouring the label. Also drops a hover rule that painted the label with the background colour, and moves the last Font Awesome icon in WineSelector to Lucide. * style(ui): reduce the checkbox indent to 8px * fix(ui): unblock the lint and e2e checks ts-prune was failing on exports nothing consumes: the Header re-export in the UI barrel, now that LibraryHeader imports it directly, plus the ButtonSize, IconSize, DEFAULT_STROKE and GameAction types that are only used inside their own module. The categories e2e test was hitting a strict mode violation because the Categories dropdown repeated "Categories" as a section label while the trigger button already says it. Dropped the redundant label. * refactor(ui): consolidate window breakpoints The nine live media queries used seven different thresholds, all picked by hand: 480, 700, 730, 800, 850, 1024 and 1100px. They now go through three mixins anchored on the real window floor of 600x345 from main_window.ts. The 480px query is gone: it sits below the minimum window width, so it could never match. Six stylesheets became .scss, since Sass mixins do not work in plain CSS and that is where most of these queries lived. * fix(ui): make the fixed spacing scale match the relative one The two scales share names but had drifted apart: --space-2xs is 0.375em while --space-2xs-fixed resolved to 4px, --space-lg-fixed used 1.2 against a 1.5em twin, and --space-xl-fixed used 2.5 against 3em. Each -fixed step now mirrors its relative counterpart, and the missing -3xs-fixed and -3xl-fixed steps are filled in. * feat(ui): add a border radius scale There was no radius scale: 104 hand-written values across twelve distinct sizes (10px alone appeared 28 times), plus 29 places using spacing tokens as a radius, which is wrong because those are in em and make the curve grow with the font size. All 136 declarations now use the scale. Where 10px sat exactly between two steps, controls went to --radius-sm and surfaces to --radius-md. Nested radii use the subtraction rule. * refactor(ui): semantic typography tokens The px scale is renamed to --font-size-* and components now pick a token by intent: --heading-*, --title, --body-*, --caption-*, --button-*, --menu-*. Every token points at the value that was already there, so nothing changes visually; what changes is that resizing a caption is one line instead of a find and replace. Weights and line heights became tokens too, which removed 49 raw font-weight and 34 raw line-height declarations. --line-height-none exists because "no leading" is a real need the three-step scale did not cover. The colour tokens keep the --text-* namespace: community themes loaded from customThemesPath depend on those names. * fix(a11y): bring text and icon contrast up to WCAG AA across themes An audit of the computed colours found 103 failures in the four themes I checked first, several at 1:1 — invisible text. The root cause was --text-tertiary, which means opposite things per theme: a mid grey in Heroic Theme, near black in Midnight Mirage, near white in Nord Light. Components that wanted "muted text" now use --text-secondary, which is legible everywhere. Three tokens cover the structural cases, each defaulting to the value used before so only the themes that needed it changed: - --text-on-accent, because --background-darker is light in light themes - --accent-text and --primary-text, for accents too dark to read as text Also: all four platform tags failed with white text, Dracula had no --text-secondary of its own and an active sidebar colour at 3.79:1, and the Font Awesome brand icons in the sidebar rendered black in every theme because nothing set fill to currentColor. 18 themes across 5 screens now pass, text and icons. * fix(ui): play buttons follow the theme colour The buttons used --navbar-accent, which is the sidebar accent and is deliberately near white in several themes (#f9f5d7 in Gruvbox, #eae8e5 in Dracula Classic, --text-default in Midnight Mirage), so they rendered white. They now use --primary-action, which resolves to --primary-button and falls back to --accent. Gruvbox gets the bright yellow from its own palette: no colour in it reaches 4.5:1 against the dark yellow accent. The game page buttons were never migrated off the legacy .button classes — their class name is built with classNames(), which my earlier sweep did not match — so they still showed the old green and purple. They use the Button component now, with the variant following the game state. Restores the alt play popup markup: wrapping it in the Button component put a span around the children and broke the absolute positioning of the hover popup. * fix(ui): tighten the game card caption spacing * feat(ui): add an EmptyState atom and use it in the library
github-actions[bot](15 Oct 26)
Update bug report template with latest release (#5980) Co-authored-by: flavioislima <[email protected]>
Flavio F Lima(15 Oct 26)
[Release] 2.22.4
Weblate (bot)(15 Oct 26)
[i18n] Updated Translations (#5960) * Translated using Weblate (Galician) Currently translated at 99.8% (867 of 868 strings) Translated using Weblate (Galician) Currently translated at 100.0% (235 of 235 strings) Co-authored-by: Hosted Weblate <[email protected]> Co-authored-by: PTTS Program <[email protected]> Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/gamepage/gl/ Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/globals/gl/ Translation: Heroic Games Launcher/GamePage Translation: Heroic Games Launcher/Globals * Translated using Weblate (Lithuanian) Currently translated at 97.9% (850 of 868 strings) Co-authored-by: Džiugas Januševičius <[email protected]> Co-authored-by: Hosted Weblate <[email protected]> Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/globals/lt/ Translation: Heroic Games Launcher/Globals * Translated using Weblate (Russian) Currently translated at 100.0% (868 of 868 strings) Translated using Weblate (Russian) Currently translated at 100.0% (235 of 235 strings) Co-authored-by: Hosted Weblate <[email protected]> Co-authored-by: Максим Бортников <[email protected]> Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/gamepage/ru/ Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/globals/ru/ Translation: Heroic Games Launcher/GamePage Translation: Heroic Games Launcher/Globals * Translated using Weblate (Romanian) Currently translated at 62.0% (539 of 868 strings) Translated using Weblate (Romanian) Currently translated at 88.0% (207 of 235 strings) Co-authored-by: Hosted Weblate <[email protected]> Co-authored-by: MarianIoan <[email protected]> Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/gamepage/ro/ Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/globals/ro/ Translation: Heroic Games Launcher/GamePage Translation: Heroic Games Launcher/Globals * Translated using Weblate (Spanish) Currently translated at 100.0% (235 of 235 strings) Co-authored-by: Hosted Weblate <[email protected]> Co-authored-by: PTTS Program <[email protected]> Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/gamepage/es/ Translation: Heroic Games Launcher/GamePage --------- Co-authored-by: PTTS Program <[email protected]> Co-authored-by: Džiugas Januševičius <[email protected]> Co-authored-by: Максим Бортников <[email protected]> Co-authored-by: MarianIoan <[email protected]>
CommandMC(14 Oct 26)
fix: Don't trust `isUmuSupported`'s return value if we're running a native game (#5915) A native game's Wine Version might still be set (due to... fun issues in the config system), which will make `isUmuSupported` return true. In turn, this causes us to use umu for those games. In principle this even *works*, but it should certainly not happen without the user's involvement.
Ariel Juodziukynas(14 Oct 26)
[FIX] Unset custom user agent to fix GOG login cloudflare check (#5979)
CommandMC(12 Oct 26)
fix: Update discord-rpc to fix dev build (#5929) * fix: Use fork of discord-rpc to fix dev build * chore: Update version instead of using fork
CommandMC(12 Oct 26)
chore: Update to pnpm 12 (#5928) * chore: Update to pnpm 12 * chore: Update pnpm setup workflow
Matthew Schwartz(09 Oct 26)
[TECH] Add support for building ARM64 flatpak (#5891) * flatpak: Add architecture-aware x86_64 and aarch64 builds Generate manifests for the selected architecture and keep i386 extensions specific to x86_64. Archive local unpacked application output so cross builds do not need to execute an AppImage during extraction. Select matching release AppImages and fail clearly when an architecture is unavailable. Add native CI jobs and packaging tests for both targets. * wine: Select compatible downloads and refresh cached artifacts Select ARM64 CachyOS archives and pair each archive with its matching checksum. Skip releases without a compatible artifact and handle empty catalogs without creating unusable latest entries. Refresh cached versioned URLs as well as latest aliases. Preserve installed state, flag changed artifacts for update, and reject incompatible cached downloads before performing installation I/O. Add regression coverage for both architectures, legacy archives, missing assets, and cache migrations with and without checksums. * ci: Publish Linux ARM64 release packages Build both Linux architectures in the release workflow. Select the supported AppImage explicitly in the downstream updater so adding ARM64 assets cannot pair the wrong checksum with an x86_64 URL. Use the requested release tag consistently for package URLs and metadata, including manual workflow dispatch. Cover asset selection and release metadata with regression tests. * wine: Refresh cached releases after architecture changes A cached latest release can still point to another architecture even when its date matches upstream. Refresh its metadata at startup so compatible downloads become available without a manual refresh. Cover migration in both directions and preserve lazy loading and the existing date-based update checks. * flatpak: Update release sources for both Linux architectures Pin architecture-scoped tarballs when the downstream manifest uses heroic-sources.json. Require both release assets and compute their checksums before changing source pins, while retaining support for the older AppImage manifest. Accept an optional packaging checkout path for local release preparation and cover missing or failed ARM64 downloads. * flatpak: Include local archive checksums in build cache keys Local archives reuse the same path for a given version. Without a source checksum, flatpak-builder can reuse an older application after rebuilding Heroic. Hash the completed archive before publishing it and include its SHA256 in the manifest. Verify that unchanged payloads keep their checksum and changed payloads invalidate the cache on both architectures.
wehrwolfmann(07 Oct 26)
[i18n] Add Russian translations to the .desktop and .metainfo files (#5793) The Russian Comment= generated from electron-builder.yml is brought in line with the Flatpak .desktop file as well, which until now carried a different wording. Co-authored-by: Wehrwolfmann <[email protected]>
Weblate (bot)(07 Oct 26)
[i18n] Updated Translations (#5890) * Translated using Weblate (Irish) Currently translated at 100.0% (868 of 868 strings) Translated using Weblate (Irish) Currently translated at 97.8% (849 of 868 strings) Translated using Weblate (Irish) Currently translated at 99.2% (847 of 853 strings) Co-authored-by: Aindriú Mac Giolla Eoin <[email protected]> Co-authored-by: Hosted Weblate <[email protected]> Co-authored-by: Weblate Translation Memory <[email protected]> Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/globals/ga/ Translation: Heroic Games Launcher/Globals * Translated using Weblate (Galician) Currently translated at 92.9% (807 of 868 strings) Translated using Weblate (Galician) Currently translated at 94.3% (805 of 853 strings) Co-authored-by: Hosted Weblate <[email protected]> Co-authored-by: Weblate Translation Memory <[email protected]> Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/globals/gl/ Translation: Heroic Games Launcher/Globals * Translated using Weblate (Turkish) Currently translated at 97.8% (849 of 868 strings) Translated using Weblate (Turkish) Currently translated at 99.2% (847 of 853 strings) Co-authored-by: Hosted Weblate <[email protected]> Co-authored-by: Weblate Translation Memory <[email protected]> Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/globals/tr/ Translation: Heroic Games Launcher/Globals * Translated using Weblate (Lithuanian) Currently translated at 97.6% (848 of 868 strings) Translated using Weblate (Lithuanian) Currently translated at 99.1% (846 of 853 strings) Co-authored-by: Hosted Weblate <[email protected]> Co-authored-by: Weblate Translation Memory <[email protected]> Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/globals/lt/ Translation: Heroic Games Launcher/Globals * Translated using Weblate (Tamil) Currently translated at 83.7% (727 of 868 strings) Translated using Weblate (Tamil) Currently translated at 84.9% (725 of 853 strings) Co-authored-by: Hosted Weblate <[email protected]> Co-authored-by: Weblate Translation Memory <[email protected]> Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/globals/ta/ Translation: Heroic Games Launcher/Globals * Translated using Weblate (Portuguese (Brazil)) Currently translated at 97.8% (849 of 868 strings) Translated using Weblate (Portuguese (Brazil)) Currently translated at 99.2% (847 of 853 strings) Co-authored-by: Hosted Weblate <[email protected]> Co-authored-by: Weblate Translation Memory <[email protected]> Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/globals/pt_BR/ Translation: Heroic Games Launcher/Globals * Translated using Weblate (German) Currently translated at 97.2% (844 of 868 strings) Translated using Weblate (German) Currently translated at 98.7% (842 of 853 strings) Co-authored-by: Hosted Weblate <[email protected]> Co-authored-by: Weblate Translation Memory <[email protected]> Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/globals/de/ Translation: Heroic Games Launcher/Globals * Translated using Weblate (Danish) Currently translated at 80.0% (695 of 868 strings) Co-authored-by: Hosted Weblate <[email protected]> Co-authored-by: Weblate Translation Memory <[email protected]> Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/globals/da/ Translation: Heroic Games Launcher/Globals * Translated using Weblate (Greek) Currently translated at 83.1% (722 of 868 strings) Translated using Weblate (Greek) Currently translated at 84.4% (720 of 853 strings) Co-authored-by: Hosted Weblate <[email protected]> Co-authored-by: Weblate Translation Memory <[email protected]> Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/globals/el/ Translation: Heroic Games Launcher/Globals * Translated using Weblate (Basque) Currently translated at 51.3% (446 of 868 strings) Translated using Weblate (Basque) Currently translated at 52.1% (445 of 853 strings) Co-authored-by: Hosted Weblate <[email protected]> Co-authored-by: Weblate Translation Memory <[email protected]> Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/globals/eu/ Translation: Heroic Games Launcher/Globals * Translated using Weblate (Estonian) Currently translated at 97.9% (850 of 868 strings) Translated using Weblate (Estonian) Currently translated at 97.8% (849 of 868 strings) Translated using Weblate (Estonian) Currently translated at 99.2% (847 of 853 strings) Co-authored-by: Gert Oja <[email protected]> Co-authored-by: Hosted Weblate <[email protected]> Co-authored-by: Weblate Translation Memory <[email protected]> Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/globals/et/ Translation: Heroic Games Launcher/Globals * Translated using Weblate (Russian) Currently translated at 99.5% (864 of 868 strings) Translated using Weblate (Russian) Currently translated at 97.3% (845 of 868 strings) Translated using Weblate (Russian) Currently translated at 98.8% (843 of 853 strings) Co-authored-by: Hosted Weblate <[email protected]> Co-authored-by: Weblate Translation Memory <[email protected]> Co-authored-by: Максим Бортников <[email protected]> Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/globals/ru/ Translation: Heroic Games Launcher/Globals * Translated using Weblate (Romanian) Currently translated at 59.7% (519 of 868 strings) Co-authored-by: Hosted Weblate <[email protected]> Co-authored-by: Weblate Translation Memory <[email protected]> Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/globals/ro/ Translation: Heroic Games Launcher/Globals * Translated using Weblate (Belarusian) Currently translated at 81.4% (707 of 868 strings) Translated using Weblate (Belarusian) Currently translated at 82.6% (705 of 853 strings) Co-authored-by: Hosted Weblate <[email protected]> Co-authored-by: Weblate Translation Memory <[email protected]> Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/globals/be/ Translation: Heroic Games Launcher/Globals * Translated using Weblate (Bulgarian) Currently translated at 100.0% (868 of 868 strings) Translated using Weblate (Bulgarian) Currently translated at 97.8% (849 of 868 strings) Translated using Weblate (Bulgarian) Currently translated at 99.2% (847 of 853 strings) Co-authored-by: Hosted Weblate <[email protected]> Co-authored-by: Weblate Translation Memory <[email protected]> Co-authored-by: Любомир Василев <[email protected]> Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/globals/bg/ Translation: Heroic Games Launcher/Globals * Translated using Weblate (Ukrainian) Currently translated at 100.0% (868 of 868 strings) Translated using Weblate (Ukrainian) Currently translated at 97.8% (849 of 868 strings) Translated using Weblate (Ukrainian) Currently translated at 99.2% (847 of 853 strings) Co-authored-by: Dan <[email protected]> Co-authored-by: Hosted Weblate <[email protected]> Co-authored-by: Weblate Translation Memory <[email protected]> Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/globals/uk/ Translation: Heroic Games Launcher/Globals * Translated using Weblate (Bosnian) Currently translated at 52.3% (454 of 868 strings) Co-authored-by: Hosted Weblate <[email protected]> Co-authored-by: Weblate Translation Memory <[email protected]> Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/globals/bs/ Translation: Heroic Games Launcher/Globals * Translated using Weblate (Japanese) Currently translated at 100.0% (868 of 868 strings) Translated using Weblate (Japanese) Currently translated at 100.0% (235 of 235 strings) Translated using Weblate (Japanese) Currently translated at 91.1% (791 of 868 strings) Translated using Weblate (Japanese) Currently translated at 92.4% (789 of 853 strings) Co-authored-by: Hosted Weblate <[email protected]> Co-authored-by: Tak-attack <[email protected]> Co-authored-by: Weblate Translation Memory <[email protected]> Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/gamepage/ja/ Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/globals/ja/ Translation: Heroic Games Launcher/GamePage Translation: Heroic Games Launcher/Globals * Translated using Weblate (Catalan) Currently translated at 100.0% (868 of 868 strings) Translated using Weblate (Catalan) Currently translated at 97.8% (849 of 868 strings) Translated using Weblate (Catalan) Currently translated at 99.2% (847 of 853 strings) Co-authored-by: Ecron <[email protected]> Co-authored-by: Hosted Weblate <[email protected]> Co-authored-by: Weblate Translation Memory <[email protected]> Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/globals/ca/ Translation: Heroic Games Launcher/Globals * Translated using Weblate (Czech) Currently translated at 100.0% (868 of 868 strings) Translated using Weblate (Czech) Currently translated at 100.0% (868 of 868 strings) Translated using Weblate (Czech) Currently translated at 97.8% (849 of 868 strings) Translated using Weblate (Czech) Currently translated at 99.2% (847 of 853 strings) Co-authored-by: Adam Havránek <[email protected]> Co-authored-by: Elviska <[email protected]> Co-authored-by: Hosted Weblate <[email protected]> Co-authored-by: Weblate Translation Memory <[email protected]> Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/globals/cs/ Translation: Heroic Games Launcher/Globals * Translated using Weblate (Portuguese) Currently translated at 95.5% (829 of 868 strings) Translated using Weblate (Portuguese) Currently translated at 96.9% (827 of 853 strings) Co-authored-by: Hosted Weblate <[email protected]> Co-authored-by: Weblate Translation Memory <[email protected]> Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/globals/pt/ Translation: Heroic Games Launcher/Globals * Translated using Weblate (Vietnamese) Currently translated at 82.8% (719 of 868 strings) Translated using Weblate (Vietnamese) Currently translated at 84.0% (717 of 853 strings) Co-authored-by: Hosted Weblate <[email protected]> Co-authored-by: Weblate Translation Memory <[email protected]> Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/globals/vi/ Translation: Heroic Games Launcher/Globals * Translated using Weblate (Croatian) Currently translated at 55.8% (485 of 868 strings) Translated using Weblate (Croatian) Currently translated at 56.6% (483 of 853 strings) Co-authored-by: Hosted Weblate <[email protected]> Co-authored-by: Weblate Translation Memory <[email protected]> Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/globals/hr/ Translation: Heroic Games Launcher/Globals * Translated using Weblate (Hungarian) Currently translated at 100.0% (868 of 868 strings) Translated using Weblate (Hungarian) Currently translated at 97.8% (849 of 868 strings) Translated using Weblate (Hungarian) Currently translated at 99.2% (847 of 853 strings) Co-authored-by: Hosted Weblate <[email protected]> Co-authored-by: Weblate Translation Memory <[email protected]> Co-authored-by: therealmate <[email protected]> Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/globals/hu/ Translation: Heroic Games Launcher/Globals * Translated using Weblate (Hebrew) Currently translated at 57.1% (496 of 868 strings) Translated using Weblate (Hebrew) Currently translated at 58.0% (495 of 853 strings) Co-authored-by: Hosted Weblate <[email protected]> Co-authored-by: Weblate Translation Memory <[email protected]> Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/globals/he/ Translation: Heroic Games Launcher/Globals * Translated using Weblate (Malayalam) Currently translated at 58.4% (507 of 868 strings) Translated using Weblate (Malayalam) Currently translated at 59.3% (506 of 853 strings) Co-authored-by: Hosted Weblate <[email protected]> Co-authored-by: Weblate Translation Memory <[email protected]> Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/globals/ml/ Translation: Heroic Games Launcher/Globals * Translated using Weblate (Polish) Currently translated at 100.0% (868 of 868 strings) Translated using Weblate (Polish) Currently translated at 95.5% (829 of 868 strings) Translated using Weblate (Polish) Currently translated at 95.5% (829 of 868 strings) Translated using Weblate (Polish) Currently translated at 96.9% (827 of 853 strings) Co-authored-by: Hosted Weblate <[email protected]> Co-authored-by: Kacper Skrzypek <[email protected]> Co-authored-by: Marcin Pająk <[email protected]> Co-authored-by: Weblate Translation Memory <[email protected]> Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/globals/pl/ Translation: Heroic Games Launcher/Globals * Translated using Weblate (Italian) Currently translated at 96.6% (839 of 868 strings) Translated using Weblate (Italian) Currently translated at 98.1% (837 of 853 strings) Co-authored-by: Hosted Weblate <[email protected]> Co-authored-by: Weblate Translation Memory <[email protected]> Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/globals/it/ Translation: Heroic Games Launcher/Globals * Translated using Weblate (Arabic) Currently translated at 74.7% (649 of 868 strings) Translated using Weblate (Arabic) Currently translated at 75.8% (647 of 853 strings) Co-authored-by: Hosted Weblate <[email protected]> Co-authored-by: Weblate Translation Memory <[email protected]> Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/globals/ar/ Translation: Heroic Games Launcher/Globals * Translated using Weblate (Azerbaijani) Currently translated at 49.8% (433 of 868 strings) Co-authored-by: Hosted Weblate <[email protected]> Co-authored-by: Weblate Translation Memory <[email protected]> Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/globals/az/ Translation: Heroic Games Launcher/Globals * Translated using Weblate (Indonesian) Currently translated at 97.6% (848 of 868 strings) Translated using Weblate (Indonesian) Currently translated at 99.1% (846 of 853 strings) Co-authored-by: Hosted Weblate <[email protected]> Co-authored-by: Weblate Translation Memory <[email protected]> Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/globals/id/ Translation: Heroic Games Launcher/Globals * Translated using Weblate (Dutch) Currently translated at 81.3% (706 of 868 strings) Translated using Weblate (Dutch) Currently translated at 82.5% (704 of 853 strings) Co-authored-by: Hosted Weblate <[email protected]> Co-authored-by: Weblate Translation Memory <[email protected]> Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/globals/nl/ Translation: Heroic Games Launcher/Globals * Translated using Weblate (Spanish) Currently translated at 95.5% (829 of 868 strings) Translated using Weblate (Spanish) Currently translated at 96.9% (827 of 853 strings) Co-authored-by: Hosted Weblate <[email protected]> Co-authored-by: Weblate Translation Memory <[email protected]> Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/globals/es/ Translation: Heroic Games Launcher/Globals * Translated using Weblate (French) Currently translated at 99.7% (866 of 868 strings) Translated using Weblate (French) Currently translated at 99.5% (234 of 235 strings) Translated using Weblate (French) Currently translated at 83.8% (728 of 868 strings) Translated using Weblate (French) Currently translated at 85.1% (726 of 853 strings) Co-authored-by: Hosted Weblate <[email protected]> Co-authored-by: Vassili <[email protected]> Co-authored-by: Weblate Translation Memory <[email protected]> Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/gamepage/fr/ Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/globals/fr/ Translation: Heroic Games Launcher/GamePage Translation: Heroic Games Launcher/Globals * Translated using Weblate (Swedish) Currently translated at 95.1% (826 of 868 strings) Translated using Weblate (Swedish) Currently translated at 96.6% (824 of 853 strings) Co-authored-by: Hosted Weblate <[email protected]> Co-authored-by: Weblate Translation Memory <[email protected]> Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/globals/sv/ Translation: Heroic Games Launcher/Globals * Translated using Weblate (Persian) Currently translated at 54.4% (473 of 868 strings) Translated using Weblate (Persian) Currently translated at 55.3% (472 of 853 strings) Co-authored-by: Hosted Weblate <[email protected]> Co-authored-by: Weblate Translation Memory <[email protected]> Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/globals/fa/ Translation: Heroic Games Launcher/Globals * Translated using Weblate (Finnish) Currently translated at 97.8% (849 of 868 strings) Translated using Weblate (Finnish) Currently translated at 99.2% (847 of 853 strings) Co-authored-by: Hosted Weblate <[email protected]> Co-authored-by: Weblate Translation Memory <[email protected]> Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/globals/fi/ Translation: Heroic Games Launcher/Globals * Translated using Weblate (Georgian) Currently translated at 18.3% (159 of 868 strings) Co-authored-by: Hosted Weblate <[email protected]> Co-authored-by: Weblate Translation Memory <[email protected]> Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/globals/ka/ Translation: Heroic Games Launcher/Globals * Translated using Weblate (Serbian) Currently translated at 55.2% (480 of 868 strings) Translated using Weblate (Serbian) Currently translated at 56.1% (479 of 853 strings) Co-authored-by: Hosted Weblate <[email protected]> Co-authored-by: Weblate Translation Memory <[email protected]> Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/globals/sr/ Translation: Heroic Games Launcher/Globals * Translated using Weblate (Korean) Currently translated at 72.3% (628 of 868 strings) Translated using Weblate (Korean) Currently translated at 73.3% (626 of 853 strings) Co-authored-by: Hosted Weblate <[email protected]> Co-authored-by: Weblate Translation Memory <[email protected]> Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/globals/ko/ Translation: Heroic Games Launcher/Globals * Translated using Weblate (Slovak) Currently translated at 87.2% (205 of 235 strings) Translated using Weblate (Slovak) Currently translated at 86.8% (204 of 235 strings) Translated using Weblate (Slovak) Currently translated at 72.4% (629 of 868 strings) Translated using Weblate (Slovak) Currently translated at 72.4% (629 of 868 strings) Translated using Weblate (Slovak) Currently translated at 73.5% (627 of 853 strings) Co-authored-by: Bartolomej Zajac <[email protected]> Co-authored-by: Hosted Weblate <[email protected]> Co-authored-by: Jozef Musil <[email protected]> Co-authored-by: Weblate Translation Memory <[email protected]> Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/gamepage/sk/ Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/globals/sk/ Translation: Heroic Games Launcher/GamePage Translation: Heroic Games Launcher/Globals * Translated using Weblate (Chinese (Traditional Han script)) Currently translated at 62.0% (539 of 868 strings) Translated using Weblate (Chinese (Traditional Han script)) Currently translated at 62.9% (537 of 853 strings) Co-authored-by: Hosted Weblate <[email protected]> Co-authored-by: Weblate Translation Memory <[email protected]> Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/globals/zh_Hant/ Translation: Heroic Games Launcher/Globals * Translated using Weblate (Chinese (Simplified Han script)) Currently translated at 90.8% (789 of 868 strings) Translated using Weblate (Chinese (Simplified Han script)) Currently translated at 92.2% (787 of 853 strings) Co-authored-by: Hosted Weblate <[email protected]> Co-authored-by: Weblate Translation Memory <[email protected]> Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/globals/zh_Hans/ Translation: Heroic Games Launcher/Globals * Translated using Weblate (Norwegian Bokmål) Currently translated at 95.1% (826 of 868 strings) Co-authored-by: Hosted Weblate <[email protected]> Co-authored-by: Weblate Translation Memory <[email protected]> Translate-URL: https://hosted.weblate.org/projects/heroic-games-launcher/globals/nb_NO/ Translation: Heroic Games Launcher/Globals --------- Co-authored-by: Aindriú Mac Giolla Eoin <[email protected]> Co-authored-by: Weblate Translation Memory <[email protected]> Co-authored-by: Gert Oja <[email protected]> Co-authored-by: Максим Бортников <[email protected]> Co-authored-by: Любомир Василев <[email protected]> Co-authored-by: Dan <[email protected]> Co-authored-by: Tak-attack <[email protected]> Co-authored-by: Ecron <[email protected]> Co-authored-by: Adam Havránek <[email protected]> Co-authored-by: Elviska <[email protected]> Co-authored-by: therealmate <[email protected]> Co-authored-by: Kacper Skrzypek <[email protected]> Co-authored-by: Marcin Pająk <[email protected]> Co-authored-by: Vassili <[email protected]> Co-authored-by: Bartolomej Zajac <[email protected]> Co-authored-by: Jozef Musil <[email protected]>
CommandMC(19 Sept 26)
fix: Don't try to `chmod` native Linux/macOS binaries on exit (#5918)
CommandMC(19 Sept 26)
chore: Add missing newlines in output of AUR update script (#5904)
CommandMC(19 Sept 26)
chore: Require AI disclosure in pull requests (#5916) * fix: Actually make the comment a comment * chore: Add instructions about AI disclosure
github-actions[bot](16 Sept 26)
Update bug report template with latest release (#5903)
Flavio F Lima(16 Sept 26)
[Release] 2.22.3
CommandMC(16 Sept 26)
chore: Re-use the existing AUR PKGBUILD instead of hardcoding it in the workflow (#5902) * chore: Make it possible to have `*.mts` files in `meta` * chore: Re-use the existing AUR PKGBUILD instead of hardcoding it in the workflow
CommandMC(16 Sept 26)
fix: Don't nest umu if `steamRuntime` ends up enabled on a non-native game (#5894)
Flávio Fearn(15 Sept 26)
fix: clean up release notes generated for the Flathub metainfo (#5896) Co-authored-by: Flavio F Lima <[email protected]>
github-actions[bot](15 Sept 26)
Update bug report template with latest release (#5892) Co-authored-by: flavioislima <[email protected]>
Flavio F Lima(15 Sept 26)
[Release] 2.22.2
Heroic Games Launcher Website
Website
Heroic Games Launcher — Free Epic, GOG & Amazon Games Launcher
Heroic is a free and open source launcher for Epic Games, GOG and Amazon Prime Games. Play your games on Linux, Windows, macOS and the Steam Deck.
Redirects
Does not redirect
Security Checks
All 65 security checks passed
Server Details
- IP Address172.67.198.99
- LocationSan Francisco,California,United States of America,NA
- ISPCloudFlare Inc.
- ASNAS13335
Associated Countries
US
Safety Score
Website marked as safe
100%
Trackers
No known trackers found
Blacklist Check
heroicgameslauncher.com was found on 0 blacklists
- AntiSocial Blacklist
- Artists Against 419
- Badbitcoin
- Bambenek Consulting
- CERT Polska
- CoinBlockerLists
- CRDF
- CryptoScamDB
- EtherAddressLookup
- EtherScamDB
- Fake Website Buster
- MetaMask EthPhishing
- NABP Not Recommended Sites
- OpenPhish
- PetScams
- PhishFeed
- PhishFort
- Phishing.Database
- PhishStats
- PhishTank
- Phishunt
- RPiList Not Serious
- Scam.Directory
- SecureReload Phishing List
- Spam404
- StopGunScams
- Suspicious Hosting IP
- ThreatFox
- ThreatLog
- TweetFeed
- URLhaus
- ViriBack C2 Tracker
Website Preview
Heroic Games Launcher Socials
Heroic Games Launcher Reviews
More Gaming
⚠️ This section is still a work in progress ⚠️
Check back soon, or help us complete it by submiting a pull request on GitHub.
Or submit an entry here
About the Data: Heroic Games Launcher
Change History
- Added #650
Edit Heroic Games Launcher Data
You can edit Heroic Games Launcher's entry in this section of awesome-privacy.yml by submitting a PR to our GitHub repo.
Note that some of the information shown above has been aggregated from external
sources, a list of these can be found data documentation.
Origin Data
Modify Data
API
You can access Heroic Games Launcher's data programmatically via our API. Simply make a GET request to:
https://api.awesome-privacy.xyz/v1/services/heroic-games-launcherThe REST API is free, no-auth and CORS-enabled. To learn more, view the API Docs or read the API Usage Guide.
Share Heroic Games Launcher
Help your friends compare Gaming, and pick privacy-respecting software and services.
Share Heroic Games Launcher and Awesome Privacy with your network!