Skip to content

feat(frontend): add an Open in Steam action for Steam-matched games - #5368

Draft
gantoine wants to merge 1 commit into
masterfrom
feat/open-in-steam
Draft

gantoine wants to merge 1 commit into
masterfrom
feat/open-in-steam

Conversation

@gantoine

Copy link
Copy Markdown
Member

Description

Note

Re-lands #5358 (aaf6a4e17), which was reverted in #5366. It is the same change, cherry-picked onto master with Sam Dornan kept as the commit author.

Games matched to a Steam app (steam_id set by the Steam metadata provider, a (steam-N) filename tag, or a manual match) get a new Open in Steam action. It appears as a button in the game's action row (with the Steam logo, next to Flashpoint's) and as an item in the More menu. Clicking it opens steam://run/<appid>, which hands the game to the Steam client on the device the browser is running on.

  • useGameActions exposes canOpenInSteam / openInSteam. It only offers the action for a positive integer app ID, so a bad value never turns into a malformed URL.
  • The hidden-anchor click that the Flashpoint action already used is now a shared openAppLink(href) helper, used by both actions.
  • New rom.open-in-steam key, translated in all 18 locales.

Known limits, the same as the Flashpoint action:

  • Steam must be installed on the device running the browser, not on the RomM server. On a phone or TV the link does nothing.
  • RomM doesn't know whether the user owns the game on Steam, so the action shows on every Steam-matched game. What Steam does for an unowned game is up to the client; it can't install a paid game the account doesn't own.

This is the first step toward importing a user's Steam library. Imported games will have no file on disk, so this action will be how they're launched.

Checklist

  • I've tested the changes locally
  • I've updated relevant comments
  • I've assigned reviewers for this PR
  • I've added unit tests that cover the changes

Local verification: vue-tsc --build, trunk check, the full app Vitest project (338 files, 3237 tests), npm run build, and both i18n checks all pass. In a browser against a local backend: the Steam-matched game shows the button and menu item in both themes, the SNES game shows neither, a click sends exactly steam://run/220, and the button sits in the Tab order between "Copy download link" and "Favorite", with a visible focus ring.

Screenshots (if applicable)

Screenshots of the action row (dark and light), the More menu entry and the keyboard focus ring were captured during the browser pass. They'll be attached in a follow-up edit, since the session that opened this PR could not upload images.

AI assistance

This PR was written by Claude Code (code, tests, translations and this description), at the request of and reviewed by the contributor.


Generated by Claude Code

🤖 Generated with Claude Code

Re-lands #5358 (aaf6a4e), reverted in #5366.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@gantoine gantoine added the on-hold Pending further research or blocked by another issue label Oct 27, 2026

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

on-hold Pending further research or blocked by another issue

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants