* [Fix] Declare errors array before use in prepareImagesForSteam
* [Fix] Write shortcuts.vdf atomically to avoid corruption
* [Fix] Match Steam shortcuts by launch url instead of title
* [Fix] Use executable directory as Steam shortcut StartDir
* [Feat] Block Steam shortcut changes while Steam is running
* [Feat] Manage Steam shortcuts via SteamClient API when Steam is running
* [Feat] Add Steam shortcuts via the steam url handler when the SteamClient API is unavailable
* [Fix] Improve Steam detection and report removal result to the frontend
* [Fix] Set Steam artwork for shortcuts added via the steam url handler
* [Fix] Read shortcuts from the Steam client stores since GetAllShortcuts was removed
* [Fix] Log when the Steam client debugging interface is not reachable
* [Fix] Read memory info from /proc/meminfo instead of spawning free
* [Fix] Prefer exact title match when searching PCGamingWiki
* [Fix] Never match Steam shortcuts created by other tools
---------
Co-authored-by: Flavio F Lima <flavioislima@users.noreply.github.com>
* [Fix] Make GOG wishlist a client-side filter (#5588)
Add a new getGogWishlist IPC handler that returns the user's wishlist
product IDs from embed.gog.com, and drop the wishlist=eq:true query from
getGogDiscounts. The frontend will now apply the wishlist filter against
the locally fetched product list instead of re-fetching from GOG, which
prevents the deals grid from emptying when nothing in the wishlist is on
sale.
* ui: keep Deals filter bar visible when wishlist returns no matches (#5588)
Apply wishlistOnly as a client-side filter using the IDs fetched from the
new getGogWishlist endpoint, and render the filter bar whenever filters
are active even if no products match. Previously, toggling "Wishlist
only" triggered a backend refetch that wiped the products list and hid
the filter bar entirely, leaving the user no way to untoggle without
changing the store region.
* ui: ignore wishlist/hide-owned filters while logged out of GOG (#5588)
Both checkboxes are already hidden from the filter bar when the user is
not signed in, but their persisted localStorage state still drove the
filtering and the discounts refetch. That caused two confusing outcomes
after logging out: the grid could appear empty for no visible reason,
and getGogDiscounts was called with hideOwned=true which the backend
silently turns off — adding noise to the logs. Treat both toggles as
off whenever isGogLoggedIn is false while preserving the underlying
preference for the next login.
---------
Co-authored-by: Flavio F Lima <flavioislima@users.noreply.github.com>
* fix: sign windows binaries during build via SignPath
* feat: publish windows release artifacts directly from appveyor tag builds
* fix: harden signpath module install and add signing timeout
* fix: sign bundled helper binaries as well
* feat: move windows signing and release to github actions
* fix: only sign first party binaries
* fix: use test signing policy for non-tag builds
* fix: set signing policy to release-signing for draft releases
* fix: update GitHub token usage in draft release workflow
* fix: installers slug
* chore: remove testing branch name
---------
Co-authored-by: Flavio F Lima <flavioislima@users.noreply.github.com>
* [Fix] Correct reversed A/B and X/Y buttons on Nintendo controllers
Nintendo Switch Pro Controllers and Joy-Cons report the Chromium
"standard" mapping by physical position, so the bottom button (labeled
B) is buttons[0] and the right button (labeled A) is buttons[1]. The
input handling treated buttons[0] as the main action and buttons[1] as
back, so pressing A triggered back and B triggered select, contradicting
the on-screen glyphs.
Add a dedicated Switch Pro layout that swaps the face buttons for main
navigation, and make Console Mode's confirm/back button indices
layout-aware so the overlays match too.
* fix: dead code
* fix: address pr comments
---------
Co-authored-by: Flavio F Lima <flavioislima@users.noreply.github.com>
* fix: show Rosetta warning when Rosetta is not installed
* refactor: simplify rosetta check, spawn failure alone means rosetta is missing
---------
Co-authored-by: Flavio F Lima <flavioislima@users.noreply.github.com>
* [UX] Gamepad navigation inside store webviews
Stores (Epic, GOG, Amazon, Zoom) opened in the embedded webview did not
respond to the gamepad: D-pad/sticks/A/B/X/Y reached only the host
window because mainWindow.webContents.sendInputEvent does not target the
guest WebContents. This made the launcher hard to use in Console Mode.
The webview preload now polls the Gamepad API directly inside the guest
and runs spatial focus navigation, with a visible focus ring injected as
CSS. Mapping: D-pad/left stick move focus, A clicks, B goes back (or
hands focus to the host when history is empty), X focuses the URL bar,
Y focuses the first search input, L1/R1 navigate webview history,
right stick scrolls, Guide toggles Console Mode. Coordination with the
host gamepad helper is done via a webview focus/blur flag plus
ipcRenderer.sendToHost so input is never double-processed.
ControllerHints is extended to show webview-specific labels and the new
L1/R1 slots whenever the user is on /store, /loginweb, /wiki, or
/store-page, with matching bumper icons for the four controller layouts.
* [Chore] Satisfy lint, prettier and i18n hooks
- Apply prettier formatting to the new webview preload and WebView
screen so `pnpm prettier` passes.
- Replace the empty ConsoleMode placeholder handlers and `catch {}`
with no-op definitions / explanatory comments so the project lint
has zero errors again.
- Regenerate the English translation file via `pnpm i18n` so it picks
up the previously missing `status.installed` key referenced in
ConsoleMode/Game pages.
* [UX] Add "Go to store home" button in webview controls
* [Fix] Keep webview controls in sync when switching stores
Store the webview element in state via a callback ref instead of a
mutable ref. Passing ref.current to children doesn't trigger a
re-render when the element remounts on a store switch, so
WebviewControls kept a stale webview reference: the URL bar still
showed the previous store, the Home button acted on the wrong webview,
and did-navigate updates were lost. The effects now depend on the
reactive webview state as well.
* fix: Pr comments
* feat: enhance webview navigation with exit command and controller hints
* fix: dead code
* fix: address pr comments
---------
Co-authored-by: Flavio F Lima <flavioislima@users.noreply.github.com>
* [Feat] Resolve GOG Deals region from the user's GOG account
* Add missing ZA translation key
* chore: cleanup
---------
Co-authored-by: Flavio F Lima <flavioislima@users.noreply.github.com>
* Add Humble Bundle discounts (backend, IPC, store config)
* ui: show Humble Bundle deals on the Discounts screen
* Move GMG discounts feed to the deals-listing repo
* ui: render Humble Bundle covers in landscape
* ui: add grid/list view toggle to the Discounts screen
* ui: update Humble Bundle logo to new design
* tech: mark Humble deals as Windows-only and drop unused platformFromSku
* chore: add aria-labels to the Discounts view toggle buttons
* chore: remove dead Humble DRM handling (feed never provides it)
* tech: drop dead feed pagination and persist deals in a CacheStore
* tech: rename withAffiliate to withGogAffiliate, drop redundant assertion
* fix: pr comments
---------
Co-authored-by: Flavio F Lima <flavioislima@users.noreply.github.com>
* feat: add Green Man Gaming discounts source
Fetch GMG's discounted products from a static per-currency feed mirror,
normalize them to the CatalogProduct shape and expose them through the
new getGmgDiscounts IPC handler with a daily in-memory cache.
* chore: add workflow to mirror the GMG product feed
Daily GitHub Action that pulls GMG's per-currency catalogs from the
impact.com partner API (credentials stay in Actions secrets) and
publishes discounted items as static JSONs on the gmg-feed branch.
* ui: show GMG deals on the Discounts screen
Store tabs (All/GOG/GMG), store logo on each card, currency selector
for GMG catalogs, platform filter with Xbox, DRM surfaced through the
Features filter, and GMG links opening in the external browser.
GOG-only filters are hidden and skipped on the GMG tab.
* ci: update actions/checkout to version 7
* chore: exclude the GMG mirror script from eslint typed linting
* ui: sync en translation for the platform filter label
* chore: drop unused Manufacturer and StockAvailability from the GMG feed
* fix: keep store filters consistent across the Discounts tabs
- Show GOG-only filters (rating, PEGI, genre, release year, DLC) only when
the shown set is GOG-only, so they no longer silently exclude GMG items on
the All tab.
- Hide and skip the price filter on the mixed All tab, where GOG and GMG
prices are in different currencies.
- Re-seed the price and release-year ranges on tab change and stop
persisting them, since their scale is tab/currency-specific.
- Apply only the OS and feature values the active tab offers, so a selection
carried over from another tab can't empty the grid invisibly.
* fix: dead code
---------
Co-authored-by: Flavio F Lima <flavioislima@users.noreply.github.com>
* Point Plausible to the self-hosted analytics instance
- Send events to the self-hosted analytics.heroicgameslauncher.com endpoint
- Let Plausible parse the OS natively from a browser-like User-Agent instead of
sending it as a custom property (arch/distro stay as props since Plausible has
no native dimension for them)
* ui: note that Plausible is self-hosted by the Heroic team in the consent dialog
---------
Co-authored-by: Flavio F Lima <flavioislima@users.noreply.github.com>
* tech: add electron store for game overrides
* tech: add game overrides types and methods
* feat: add edit game dialog for all runners
* fix: delay to show new cover art on restart
* refactor: adjust EditGameDialog layout, image dimensions, and reorder image previews.
* tech: convert EditGameDialog SCSS to CSS
* tech: store overrides as gameInfo.overrides instead of overwriting fields
* tech: move gameOverrides state from GlobalState to Zustand
* tech: copy picked override images into user data so Flatpak portal paths persist
* feat: search SteamGridDB for cover and square art in EditGameDialog
* feat: add reset-to-default button to EditGameDialog
* fix: clean up override images when override is replaced or removed
* feat: search SteamGridDB by clicking the preview images, use heroes for cover art
* feat: fix EditGameDialog width at 700px so SteamGridDB picker doesn't resize it
* feat: hide cover and square URL inputs behind an Advanced summary
* fix: reset-to-default clears the form without saving or closing the dialog
* feat: add Edit Game item to GameCard context menu in the library
* feat: extract WarningMessage component and use for SGDB key warning in both dialogs
* fix: drop Trans wrapper so the SGDB warning link click is registered
* feat: move SteamGridDB API key to the top of advanced settings
* feat: hint that the SideloadDialog image is clickable for SteamGridDB search
* feat: add hero/cover art to SideloadDialog with its own SteamGridDB picker
* feat: hide square and cover URL inputs behind an Images summary in SideloadDialog
* fix: SideloadDialog stays at fixed size when SteamGridDB picker opens
* fix: lint
* fix: prettier
* feat: implement clipboard paste functionality for cover and square images in EditGameDialog
* feat: add placeholder text for image URL input in EditGameDialog
* refactor: cleanup
---------
Co-authored-by: Flavio F Lima <flavioislima@users.noreply.github.com>
* Add hideWindowOnProtocolLaunch setting definition
New AppSettings field (default false) that will be read by the protocol
handler to decide whether to skip showing the main window on heroic://
launches.
* Skip Heroic window on heroic:// launches (#5154)
Support two ways to launch a game via the heroic:// protocol without
popping up the main window:
- per-URL `gui=false` (also `gui=0` / `gui=no`) query parameter
- the new `hideWindowOnProtocolLaunch` global setting
The hide logic runs in three places: startup (include it in the
`headless` computation), second-instance (skip the forced
`mainWindow.show()`), and inside `handleLaunch` (hide the already-visible
window after dispatching the launch). When the game is not installed,
the install dialog still needs the window, so it is shown.
* Add settings toggle for hideWindowOnProtocolLaunch
New toggle under General settings so users can opt into skipping the
Heroic window for all heroic:// launches, plus the matching English
translation string.
* Add HideWindowOnProtocolLaunch component to AdvancedSettings and remove from GeneralSettings
* Add InfoIcon help text to hide-window-on-protocol-launch toggle
Briefly explains the use case (launching from external shortcuts like
Steam's 'Add to Steam') so users know what the toggle does without
having to read the docs.
---------
Co-authored-by: Flavio F Lima <flavioislima@users.noreply.github.com>
* feat: allow updating or launching games with updates from Console Mode
Replace the dismiss-only update notice with a two-button warning that
mirrors the GamePage update dialog. Reuse the gamepage:box.update.* and
gamepage:box.yes/no keys so no new translations are needed. Users can
now start the update or launch without it directly from Console Mode.
* i18n: drop unused console.update keys after Console Mode update notice rewrite
* feat: show game status and download progress on Console Mode cards
Extract the card into a dedicated ConsoleCard component that uses
hasStatus/hasProgress to surface active states (installing, updating,
playing, queued, etc.) as a bottom overlay. For installing and updating
games the overlay includes a progress bar with the current percentage.
The existing "Needs update" badge is hidden while an active status is
shown to avoid duplicate signals.
* feat: ask to cancel ongoing update when launching a downloading game
Previously clicking a game that was downloading or updating would fall
through to the "update available" prompt and try to launch it. Now we
detect the in-progress status from libraryStatus and surface a separate
prompt to confirm cancellation, which calls sendKill on the runner.
The existing UpdateNotice is generalized into a ConfirmDialog component
so it can drive both the update-available and cancel-update prompts
without duplicating the overlay, focus, and gamepad handling.
* feat: ask to remove a queued game from the queue when clicked in Console Mode
Clicking a queued game now opens a confirmation prompt that removes it
from the download queue (and clears the matching localStorage entry)
rather than falling through to the launch/update flow.
* fix: use namespace-prefixed gamepage keys in Console Mode dialogs
i18next-parser was routing the file's translation keys to the gamepage
namespace when a second useTranslation('gamepage') was added, which
moved existing console.* keys into gamepage.json. Drop the second
useTranslation call and reference gamepage entries via the
'gamepage:key' prefix so the parser keeps console.* under the default
translation namespace.
* i18n: add console keys for cancel-update and remove-from-queue dialogs
* fix: lint
* fix: clean up Console Mode install/launch overlay lint errors
Drop dead onOverlayKeyDown/onOverlayKeyUp handlers and JSX attrs from
LaunchOverlay, void the launch() promise so it isn't floating, and
disable exhaustive-deps where the launch is intentionally fire-on-mount.
In InstallOverlay, inline the escape handler so the useEffect deps are
clean, void the install() promise, drop the dead `label` variable, and
log thrown errors via window.api.logError instead of swallowing them.
* feat: show install-specific wording when cancelling an active install
Clicking an installing game opened the same "Cancel update?" dialog as
clicking an updating game. Branch the dialog on the in-flight status so
installs surface a "Cancel installation?" prompt with install-specific
wording while updates keep theirs unchanged. The cancel itself still
goes through sendKill, which the abort controller wires up for both.
* i18n: add console cancel-install keys and status.installed
* feat: add platform, wine, and install path controls to Console install dialog
The pre-install overlay now shows where the game will land, lets the
user step through the compatible platforms with </> arrows when more
than one is available, and offers the same chevron selector for the
Wine version when the game has to run through Wine/Proton. Up/Down
moves between rows, Left/Right cycles the focused selector, Enter
confirms and Esc/B dismisses. The Wine choice is persisted via
writeConfig before install() so it's picked up by the launcher.
* i18n: add console install dialog keys (platform, wine, path)
* refactor: tighten Console Mode install overlay and cancel-download dialog
- Replace the two nested ternaries that picked cancel-download dialog
copy with a CANCEL_DOWNLOAD_COPY lookup keyed by kind.
- Fold cyclePlatform/cycleWine into a single cycle() factory.
- Stash live handler state in a ref so the InstallOverlay keydown
listener stays attached for the overlay's lifetime instead of
detaching/reattaching on every focus change.
- Drop unconditional wine-list/index reset when hasWine flips false
and drop two narrative comments that just restated the code.
* fix: lint
* fix: route in-progress installs/queue clicks to the cancel dialog
Clicking a game that was currently installing (or queued) reopened the
install confirmation overlay because the !is_installed guard ran before
the libraryStatus check. Reorder activateGame so the active-status
branches (queued/installing/updating) run first; the install overlay
only fires for genuinely uninstalled games.
* feat: add a cancel option to the Console Mode update notice
Clicking a game with an available update offered "Update" or "Launch
without update", with Esc/B treated as the launch path. Add a third
"Cancel" button that simply closes the dialog so the user can back out
without committing to either action. Esc/B now maps to this dismiss
path; the launch and update buttons keep their original behavior.
ConfirmDialog gains optional dismissLabel/onDismiss props; the existing
two-button call sites are unchanged.
---------
Co-authored-by: Flavio F Lima <flavioislima@users.noreply.github.com>
chore: include system arch and distro in Plausible analytics
Extends the App Loaded event with process.arch and the distribution
name/version from getOsInfo(), so we can see the split between x64 and
arm64 users and which Linux distros are in use. Also updates the
opt-in dialog wording to disclose the new fields.
Co-authored-by: Flavio F Lima <flavioislima@users.noreply.github.com>
* [UI] Put Import button on the side of Install
* fix: small screens gap
* fix: gameConfigContainer on small screens
* refactor: simplify button disable logic in MainButton component
* style: update media query for installButtons to use container query
* feat: show wine picker modal on importing
* feat: add importing state and update MainButton logic for install and import actions
* refactor: simplify path dialog title and label in DownloadDialog component
* style: adjust button alignment and layout in GamePage CSS
* refactor: remove unused import and state related to game importing
* feat: enhance importGame handler with additional parameters and update game settings
* tech: moved the import dialog to its own component again
* chore: lint
---------
Co-authored-by: Flavio F Lima <flavioislima@users.noreply.github.com>
* feat: add fullscreen toggle listener for main window
* feat: add fullscreen functionality to IPC and preload API
* feat: add support for Xbox Guide / PS button to toggle Console Mode
* feat: add Console Mode support with sidebar link and routing
* feat: implement Console Mode UI with game filtering and launching functionality
* ui: add navigation with thumbs and hints and cancelation button
* feat: enhance Console Mode toggle functionality with improved button handling
* feat: restore Console Mode link in Sidebar with proper icon and label
* i18n: updated keys
* fix: lint
* i18n: remove useless keys
* feat: add controller hints and improve button handling in Console Mode
* ui: move title to the top of the grid
* fix: chips text colors on some themes
* i18n: updated keys
* feat: add console mode settings and update related UI components
* feat: add CLI console mode detection and update initialization logic
* i18n: fix and update keys
* feat: default Console Mode controller hints to Xbox
* refactor: split components from consoleMode screen
* chore: show store filters only if there are games installed from it
* feat: deal with games with updates
* feat: add danger button for quitting the application in Console Mode
* feat: enhance keyboard navigation in Console Mode top bar
* i18n: updated keys
* feat: refactor controller button images using a layout configuration
* feat: simplify back button label handling for controller layouts
* refactor: move useEffects to its own hooks for reusability
* i18n: move console mode keys to the right namespace
Cancel hints and launching label were added to gamepage.json but the
LaunchOverlay reads them via the default namespace, so they were dead
keys. Move them to translation.json to match the namespace used.
* refactor: drop identity runner-to-store map in Console Mode
The map was an identity function over Runner values, so every usage
collapses to a direct g.runner comparison. Tighten StoreKey to
`Runner | 'all'` and use g.runner directly.
* refactor: centralize Console Mode gamepad button indices
Button indices were duplicated across index.tsx (BTN_BACK, BTN_L1, etc.)
and UpdateNotice (DISMISS_BUTTON_INDEX === 1). Move them to controller.ts
so both read from the same source.
* refactor: extract shared BackHint component
LaunchOverlay and UpdateNotice both rendered the same prefix/kbd/suffix
hint with identical gamepadConnected-to-Esc fallback. Move it into a
tiny BackHint component so the shape is declared once.
* style: share :disabled styles between Console Mode buttons
consoleChip and consoleQuitButton both had the same :disabled rule
(cursor + opacity). Extract it into a %consoleButtonDisabled placeholder.
* style: simplify consoleFooter flex layout
The footer wraps a single child (ControllerHints), so flex-direction,
align-items, gap and text-align were all no-ops. Keep only the
centering it actually needs.
* style: drop redundant text-align on consoleTitleBar
justify-content: center on the flex container already centers the
single title child; text-align was a no-op.
* style: avoid double blur when launching
The background's blur(3px)/saturate(0.6) stacked with the overlay's
backdrop-filter: blur(10px) over a 70% opaque fill. Keep just the
opacity fade on the background and let the overlay blur the rest.
* refactor: move Start in Console Mode out of TraySettings
The toggle has nothing to do with the system tray. Extract it into
its own StartInConsoleMode component and mount it directly in the
General settings section.
* refactor: drop redundant L3/R3 store cycling
L1/R1 already cycle the store filter; clicking the analog sticks to do
the same thing is easy to trigger by accident while navigating.
* i18n: make the parser resolve LaunchOverlay keys correctly
The i18next parser only scans calls on a plain \`t\` identifier and
doesn't follow the renamed \`tGame\` from a second useTranslation hook,
so every run was moving console.cancel.* and console.launching back
into gamepage.json. Use a single \`t\` with explicit \`gamepage:\`
namespace prefixes for status keys, matching the getStatusLabel
convention used elsewhere in the codebase.
---------
Co-authored-by: Flavio F Lima <flavioislima@users.noreply.github.com>
* feat: add discounts types and helpers
* feat: add new Discounts screen
* feat: implement DiscountCard component with styling
* feat: update SidebarLinks to include Discounts section
* feat: add translations for discounts section in translation.json
* fix: currency map
* feat: enhance discount fetching logic with fallback locale and logging
* feat: implement DiscountPagination component with navigation and styling
* feat: add DiscountFilters component with sorting, price range, and genre selection
* feat: enhance Discounts page with filtering, sorting, and pagination features
* feat: enhance discounts localization with filtering, sorting, and pagination support
* feat: add rating display to DiscountCard with styling and layout adjustments
* feat: enhance Discounts page with OS, features, and rating filters
* ui: improve filters
* ui: improve genres selection
* feat: implement region selection for discounts with localization support
* feat: add search functionality to Discounts page with clear option
* feat: add collapsible section and toggle for additional filters on Discounts page
* feat: update tooltip behavior for selected genres on Discounts page
* feat: update discounts title and improve error handling in Discounts page
* feat: deduplicate products in fetchAllDiscounts to avoid React key conflicts
* feat: update tooltip behavior to show features only when more than three are selected
* feat: reset filters and sorting options on region change in Discounts page
* feat: reorganize DLC translations and enhance discounts section with filter options
* feat: add option to hide DLCs in Discounts filters
* feat: add page size selection to Discounts filters
* feat: enhance Discounts page with accessibility improvements and localization updates
* feat: update productType filter and rename labelFallback to label in RegionOption
* fix: price filter not resetting on region change
* refactor: re-use search bar and other components from MUI
* feat: add release year filter to Discounts page
* feat: add age rating filter to Discounts page with PEGI options
* style: adjust margins and padding in Discounts page styles
* feat: add release date sorting options to Discounts page
* feat: implement persisted filter state for Discounts page
* feat: add rating sorting options to Discounts page
* feat: rename Discounts to GOG Deals and update related translations
* i18n: updated keys
* fix: dead code
* feat: update currency codes for regions to align with GOG's supported currencies
* feat: add localized country names for region selection on Discounts page
* feat: remove count display from GOG Deals header
* fix: i18n parser for localized countries
* feat: add User-Agent header to axios requests in fetchPage function
---------
Co-authored-by: Flavio F Lima <flavioislima@users.noreply.github.com>
* [FEATURE] Add GitHub Sponsors link to sidebar
* chore: add ipc calls and types
---------
Co-authored-by: Flavio F Lima <flavioislima@users.noreply.github.com>
* tech: install steamgriddb package
* tech: add steamgriddb api key setting
* tech: add api calls and methods
* feat: add SteamGridDB Picker components
* fix: stylings errors
* ui: add loading effect after selecting tyhe image
* feat: Make SteamGridDB API key description clickable to open the SteamGridDB API preferences page.
* feat: Add `onLoad` and `onError` props to `CachedImage` and improve type safety for SteamGridDB error handling.
* i18n: updated keys
* ui: visual improvements
* chore: move ipc calls to a dedicated file
* refactor: Replace `steamgriddb` npm package with custom API utility functions for SteamGridDB integration.
* feat: add unit tests for SteamGridDB utilities and refactor graceful-fs imports in wine runtimes tests.
* fix: lint
* fix: pr comments
* feat: add help description for SteamGridDB API key in settings
* fix: prettier
* fix: user agent and test
* Update src/backend/steamgrid/__tests__/utils.test.ts
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update src/backend/steamgrid/utils.ts
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* [FIX] Match sibling wrapper pattern for SteamGridDB API key setting
The component wrapped itself in `className="AdvancedSetting"` (wrong casing),
so it didn't inherit the spacing from `.advancedSetting` in Settings/index.css.
Other Advanced Settings entries wrap from the parent; do the same here.
* [FIX] Avoid UI barrel cycle in SteamGridDBPicker
The picker imported CachedImage from the same UI barrel that re-exports it,
which can evaluate to undefined depending on bundling order. Import the
module directly.
* [FIX] Propagate SteamGridDB API failures to the picker UI
The IPC handlers were catching everything and returning [], which made the
frontend render every auth/network error as "No games found" and hid the
"Failed to search" / "Failed to fetch grids" branches. Rethrow after logging
so the renderer promise rejects and the real error state renders.
* [FIX] Check SteamGridDB key via dedicated IPC
SideloadDialog only needs to know whether a key is configured, not the key
itself. Replace the full requestAppSettings() call with a boolean-returning
steamgriddb.hasApiKey handler so the raw key stays in the main process.
* [FIX] Prevent stuck SideloadDialog cover spinner
If the CachedImage emitted onError instead of onLoad (bad URL/404), or if
the picked URL matched the current one (no new load event fires), the
loading overlay stayed up forever. Clear on error, and skip toggling
loading when the URL hasn't changed.
* fix: picker grid styling
Co-authored-by: Copilot <copilot@github.com>
* [FEAT] Encrypt the SteamGridDB API key at rest
Route the API key through Electron's safeStorage before it hits config.json
and decrypt it only inside the SGDB handlers that call the API. Adds a
dedicated steamgriddb.setApiKey IPC so the plaintext never flows through
the generic setSetting pipeline, plus a 'sgdb:v1:' prefix that lets the
handlers migrate any pre-existing plaintext value on first read.
* [UX] Mask the SteamGridDB API key input and write via dedicated IPC
Use type=password, autoComplete off, and store via steamgriddb.setApiKey so
the renderer never holds the plaintext key beyond the current input. Switch
the placeholder to a "key saved" hint when one is already configured.
* [i18n] Update SteamGridDB API key strings
Add the 'key saved' placeholder and mention the encrypted-at-rest behavior
in the help description.
* fix: lint
* fix: lint
* [UX] Point the SGDB search error at the API key
The original "Failed to search for games" was identical to "no results"
from the user's perspective. Spell out the likely cause so they know to
check the key in Settings.
---------
Co-authored-by: Flavio F Lima <flavioislima@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <copilot@github.com>
* [FIX] How Long To Beat 🎶One More Time...🎶
* chore: comments
* fix: prettier
* HLTB: Use GOG store page for gog HLTB data
---------
Co-authored-by: Flavio F Lima <flavioislima@users.noreply.github.com>
Co-authored-by: Ariel Juodziukynas <arieljuod@gmail.com>
* tech: update electron to v41.1.1
* fix: remove ozone platform hint for Linux
---------
Co-authored-by: Flavio F Lima <flavioislima@users.noreply.github.com>
[Feat]: Automatically pause and resume downloads based on system connectivity status.
Co-authored-by: Flavio F Lima <flavioislima@users.noreply.github.com>
* [UI] Show update badge on gamecard only if controller is connected
* chore: use a var for cleanup
---------
Co-authored-by: Flavio F Lima <flavioislima@users.noreply.github.com>
* tech: remove hltb-js and patches
* fix: fix HLTB by using native implementation
---------
Co-authored-by: Flavio F Lima <flavioislima@users.noreply.github.com>
* [CI] Add gtk3 as a dependency for AUR package
* [CI] Update maintainer email and format dependencies in AUR PKGBUILD
* [CI] Add CommandMC as a co-maintainer in PKGBUILD
---------
Co-authored-by: Flavio F Lima <flavioislima@users.noreply.github.com>
* feat: Add a 'has update' badge to game cards with conditional display and styling.
* fix: dont cover store icons
---------
Co-authored-by: Flavio F Lima <flavioislima@users.noreply.github.com>
* [FIX] Disable Save-Sync quick-menu when no path is set
* feat: add a new setting to enable/disable the quick-menu
* i18n: updated keys
* chore: setting name
* tech: deduplicate code
* fix: pr comments
---------
Co-authored-by: Flavio F Lima <flavioislima@users.noreply.github.com>
* [FIX] Launch options getInstallInfo loop on advanced game settings
* feat: Add a 'Default' launch option.
* fix: check for "" parameter instead of single option
* refactor: replace LaunchOptions component with LaunchOptionSelector and improve launch option handling
* fix: pr comments and other improvements
* i18n: updated keys
* fix: dialog not closing
* fix: update launch options handling to ensure default option is added when necessary
---------
Co-authored-by: Flavio F Lima <flavioislima@users.noreply.github.com>
* [FIX] Launch Epic Games while offline for games that supports it
* UI: disable play button for games that cannot be played offline
* [FIX] Add offline warning dialog for games that are not playable offline
---------
Co-authored-by: Flavio F Lima <flavioislima@users.noreply.github.com>
* feat: Add manual cloud save synchronization options and an auto-sync toggle to the GamePage.
* feat: Add functionality to open the game saves folder from the Cloud Saves Sync menu.
* feat: Introduce confirmation dialogs for force cloud save sync operations and refactor sync execution logic.
* i18n: updated keys
---------
Co-authored-by: Flavio F Lima <flavioislima@users.noreply.github.com>
* [FEAT] Add launch option to game settings and update launch event callback
* [FEAT] Add LaunchOptionSelector component to settings and integrate it into GamesSettings
* [FEAT] Enhance LaunchOptions component to handle last used launch option and improve option selection logic
* [FEAT] Initialize undefined settings in setSetting method of GameConfigV0
* [FEAT] Refactor launch process to handle multiple launch options and user selection dialog
* [FEAT] Add launch option selection messages to gamepage and translation files
* [FEAT] Update launch option selection messages for clarity and remove unused option
* [TECH] Update dependencies in useEffect for LaunchOptions component
* [TECH] Implement useLaunchOptions hook for managing launch options in GamePage and Settings components
* [TECH] Enhance launch option selection with auto-select feature and countdown timer
* fix: deadcode
---------
Co-authored-by: Flavio F Lima <flavioislima@users.noreply.github.com>
* [CI] Update AUR Workflow
* [Fix] Update AUR workflow URLs to use the official site
---------
Co-authored-by: Flavio F Lima <flavioislima@users.noreply.github.com>
* [FIX] Time container not updating after playing
* chore: missing i18n key
---------
Co-authored-by: Flavio F Lima <flavioislima@users.noreply.github.com>
[FIX] Update version to 2.18.1 and ensure analytics logging only occurs on valid platforms
Co-authored-by: Flavio F Lima <flavioislima@users.noreply.github.com>
* feat: add AnalyticsOptIn component for user data collection settings
* feat: add plausible dependency
* feat: add analyticsOptIn setting to AppSettings
* feat: add analytics info modal
* feat: add plausible to index.tsx
* feat: update analytics modal text and add disable option
* feat: update version to 2.18.0 and change stable version name to "Waterfall Beard" Jorul
* feat: enhance analytics modal text for clarity and compliance
* feat: add getLoggedInProviders handler and update analytics tracking
* tech: refactor to use on backend
* chore: comments
* tech: refactor analytics dialog in its own component
* chore: comments
* chore: deadcode
* feat: add OS
* fix: disable analytics opt-in by default
* refactor: replace Plausible initialization with startPlausible function
* fix: update analytics modal text and button labels for clarity
* feat: skip dialog on e2e test
* fix: update analytics opt-in text for clarity and add restart requirement
* feat: implement startPlausible function and integrate with analytics opt-in
* fix: update analytics modal text for transparency and adjust related translations
* feat: add sideloaded provider
* feat: add new launch option and shader pre-caching messages
* refactor: start plausible from backend events
---------
Co-authored-by: Flavio F Lima <flavioislima@users.noreply.github.com>
* Chore: update Gamescope and Mangohud runtime version messages
* feat: add flatpak runtime version support in environment and update related components
* fix: downgrade runtime and base versions to 23.08 in flatpak template
* fix: remove default flatpak runtime version fallback
---------
Co-authored-by: Flavio F Lima <flavioislima@users.noreply.github.com>
* [FIX] App icon Linux/macOS
* [FIX] Include mac-icon.icns in asarUnpack for packaging
---------
Co-authored-by: Flavio F Lima <flavioislima@users.noreply.github.com>
* [FIX] Add warning dialog for disabled Shader Pre-caching on SteamDeck
* [CHANGE] Bump version to 2.17.2 in package.json
* [ADD] Add 'Launch Game Anyway' option to shader pre-caching warning dialog
* [chore] Implement warning dialog for disabled Shader Pre-caching in launch process
* [CHANGE] Enhance shader pre-caching warning dialog with cancel option
* [CHANGE] Log user actions when launching with Shader Pre-Caching disabled
---------
Co-authored-by: Flavio F Lima <flavioislima@users.noreply.github.com>
* [FIx] Nord Light theme
* [UX] Enhance nord-light theme with new icon and download styles
---------
Co-authored-by: Flavio F Lima <flavioislima@users.noreply.github.com>
* [FEAT] Enhance responsive design for game page
* [FIX] Adjust grid layout and height for game configuration container
* [FIX] Adjust height of mainInfoWrapper and update padding for responsive design
* [FIX] Update max-width and max-height for game configuration container
---------
Co-authored-by: Flavio F Lima <flavioislima@users.noreply.github.com>
* [Fix] Update version to 2.17.1-beta.0 and show warning on disabled pre-cache
* fix: flatpak ci source
* chore: logs
* fix: simplify condition for UMU support check
* fix: update version to 2.17.1 cleanup
---------
Co-authored-by: Flavio F Lima <flavioislima@users.noreply.github.com>
* wip: advertise avx for rosetta
* [Refactor] Update wineVersion default value in AdvertiseAvxForRosetta component
* [Fix] Update advertiseAvxForRosetta setting based on platform and wine version
* [Feat] Add translation for advertiseAvxForRosetta in help and settings
* fix: lint
* fix: pr comments
---------
Co-authored-by: Flavio F Lima <flavioislima@users.noreply.github.com>
* fix: log screen
* fix: games with launch options
* feat: add eslint-plugin-react-hooks for improved React hooks linting
* fix: dialog padding
* fix: update LaunchOptions component initialization and remove duplicate instance
* fix: update stable version name in package.json
* fix: remove unused launch options section from gamepage.json
* fix: logs truncated position
* fix: lint
* fix: update electron to version 36.2.1
* fix: correct typo in welcome message for library tour
---------
Co-authored-by: Flavio F Lima <flavioislima@users.noreply.github.com>
* [Dependency] Add @tanstack/react-query version 5.71.10 to package.json and update pnpm-lock.yaml
* [Feature] Implement Steam download and installation for macOS Wine prefix
* [Feature] Add IPC handler and function for installing Steam on Windows
* [Feature] Integrate React Query for improved data fetching and state management
* [Fix] Make gameInfo parameter optional and set default runner value in hasStatus function
* [Feature] Add Steam installation button and dialog for enhanced user experience
* [Feature] Update translation.json with new Steam installation messages and compatibility notes
* [Feature] Enhance Steam installation button with tooltip and styling improvements
* [Refactor] Update hasStatus function to manage gameInfo state and fetch updated game information
* [Feature] Enhance SteamInstallDialog with icons and styling improvements
* [Refactor] Simplify SteamInstallButton by removing unused platform check and streamline installation logic
* [Feature] Add tooltip and tour step for Steam installation on macOS
* [Refactor] Improve Steam installation notifications
* fix: pr comments
* fix: update pnpm install command to prevent lockfile issues
* Revert "fix: update pnpm install command to prevent lockfile issues"
This reverts commit b9e3be8bd7.
* chore: pnpm-lock
* Revert "[Dependency] Add @tanstack/react-query version 5.71.10 to package.json and update pnpm-lock.yaml"
This reverts commit bded2b3e1a.
* tech: remove react-query code
* refactor: update translation keys for Steam installation components
* feat: add specific version download information for Steam installation
* feat: send refresh message to frontend after adding a new app
* refactor: simplify progress update logic in Steam installation
* feat: enhance Steam installation progress display with a progress bar
* refactor: update notification titles for Steam installation success and error messages
* feat: add WineSelector component and fetch wine versions for Steam installation
* refactor: remove redundant title field from Steam installation notification
* feat: add Steam installation localization and update tooltip texts
* feat: add abort installation functionality and update styles for Steam installation
* fix: lint
* fix: missing Path
* feat: ignore wine command if wine is crossover
* fix: downloaded percent wine
* chore: revert download percent changes
* fit: lint
* feat: Update Steam installation process to accept custom installation path and updated texts
* fix: codecheck
* chore: force gptk as default wine for steam
* feat: move isIntelMac functionality to backend
* fix: button color
* feat: auto download GPTK if none was found on apple silicon macs
* fix: Pr comments
* fix: lint
---------
Co-authored-by: Flavio F Lima <flavioislima@users.noreply.github.com>
* [FIX] HowLongToBeat data
* chore: types
* [Fix] Ensure clickable action for game links in HowLongToBeat component
---------
Co-authored-by: Flavio F Lima <flavioislima@users.noreply.github.com>
* [FEAT] Add Filter to show games with updates available
* i18n: updated keys
---------
Co-authored-by: Flavio F Lima <flavioislima@users.noreply.github.com>
* [TECH] Try to fix Snap build
* fix: update User-Agent header and enhance proxy settings in download helper
---------
Co-authored-by: Flavio F Lima <flavioislima@users.noreply.github.com>
* [deps] Add intro.js and intro.js-react dependencies
* [Tour] Implement guided tour on the library feature with TourButton and Tour components
* [Tour] Integrate TourButton into ActionIcons and update CategoryFilter for guided tour
* [Tour] Enhance library guided tour with new translations and improved step descriptions
* [Tour] Update guided tour with new sorting option and enhanced welcome message
* [Tour] Update library guided tour with additional welcome messages and custom styling
* [Sidebar] Add dataTour prop to SidebarItem and QuitButton; remove HeroicVersion CSS file
* [Tour] Update sidebar translations with new accessibility features and enhanced descriptions
* fix: deadcode
* fix: sidebar stylings
* fix: more sidebar stylings
* fix: library and sidebar tours
* fix: update i18next-parser and improve localization strings
---------
Co-authored-by: Flavio F Lima <flavioislima@users.noreply.github.com>