protonscr

No way to launch non-Steam games with Steam browser protocol

steamopen Steam clientDistro Family: SteamOSnon-Steam application
ValveSoftware/steam-for-linux#8580 · opened 2022-05-10 by hellcp · updated 2026-03-16 · 4 comments · github
Hhellcp 2022-05-10 github

Your system information

  • Steam client version (build number or date): 1651529636
  • Distribution (e.g. Ubuntu): SteamOS 3.1
  • Opted into Steam client beta?: No
  • Have you checked for system updates?: Yes

Please describe your issue in as much detail as possible:

There is no way to create a desktop shortcut to a non-Steam game, because Steam browser protocol doesn't handle non-Steam games properly. This is documented as a supported scenario in rungameid portion of https://developer.valvesoftware.com/wiki/Steam_browser_protocol. Trying to use the appid used for the non-Steam game in rungameid, the error states app configuration unavailable, and trying to use its name (like in case of forceinputappid) does nothing at all. Additionally, Steam shows the option to create a desktop shortcut in the UI of non-Steam game in the library, with nothing happening when used.

Steps for reproducing this issue:

  1. Add a non-Steam game
  2. Try to add a desktop shortcut for it through Manage > Add desktop shortcut
  3. Observe no shortcut be created

Please don't remove this functionality from the client, it would be really useful if it worked

Kkmturley 2026-03-03 github

Experiencing the same on MacOS v13.7.8

Image

Shortcut file run.sh contains:

#!/bin/bash
# autogenerated file - do not edit

open steam://run/-1423321438

When run shows the error
Image

An error occurred while launching this game: Game configuration unavailable

If I run using the Play button inside Steam it runs fine:

Image
Kkmturley 2026-03-03 github

Here is the documentation for the Steam browser protocol:
https://developer.valvesoftware.com/wiki/Steam_browser_protocol

It's possible to run Steam application in dev mode to see the console output (for example Mac):
/Applications/Steam.app/Contents/MacOS/steam_osx -dev

This allowed me to test the Steam browser protocols listed above, and see the Steam app logs:

If I run steam://validate/3429715210 it opens the app details page

ExecuteSteamURL: "steam://open/steam://validate/3429715210"
GameAction [AppID 7163146, ActionID 9] : VerifyApp changed task to UpdatingAppInfo with "1"
[0302/201350.211338:ERROR:check.cc(376)] Check failed: false. NOTREACHED log messages are omitted in official builds. Sorry!
GameAction [AppID 7163146, ActionID 9] : VerifyApp changed task to Completed with "0"

but running steam://run/3429715210 throws the error:

ExecuteSteamURL: "steam://open/steam://run/3429715210"
ExecuteSteamURL: "steam://run/3429715210"
GameAction [AppID 7163146, ActionID 10] : LaunchApp changed task to RequestingLicense with ""
GameAction [AppID 7163146, ActionID 10] : LaunchApp changed task to UpdatingAppInfo with ""
GameAction [AppID 7163146, ActionID 10] : LaunchApp failed with AppError_9 with ""
GameAction [AppID 7163146, ActionID 10] : LaunchApp changed task to Failed with ""

Notice how the appId 3429715210 comes out as 7163146, something is converting it.

Kkmturley 2026-03-03 github

Figured out a workaround using steam://rungameid/<gameID64>

Formulas to convert between:

export function appIdToGameId64(appId: number | string): string {
  const u32 = Number(appId) >>> 0;
  const gameId =
    ((BigInt(u32) | 0x80000000n) << 32n) |
    0x02000000n;
  return gameId.toString();
}

export function gameId64ToAppId(gameId64: string | bigint): string {
  const g = typeof gameId64 === "bigint" ? gameId64 : BigInt(gameId64);
  const appId = (g >> 32n) & 0xFFFFFFFFn;
  return appId.toString();
}

Running this worked:
steam://rungameid/14730514661577326592

Output was:

ExecuteSteamURL: "steam://open/steam://rungameid/14730514661577326592"
ExecuteSteamURL: "steam://rungameid/14730514661577326592"
GameAction [AppID 3429715210, ActionID 13] : LaunchApp changed task to RunningInstallScript with ""
GameAction [AppID 3429715210, ActionID 13] : LaunchApp changed task to SynchronizingStats with ""
GameAction [AppID 3429715210, ActionID 13] : LaunchApp changed task to ShowInterstitials with ""
GameAction [AppID 3429715210, ActionID 13] : LaunchApp waiting for user response to ShowInterstitials ""
GameAction [AppID 3429715210, ActionID 13] : LaunchApp continues with user response "ShowInterstitials"
GameAction [AppID 3429715210, ActionID 13] : LaunchApp changed task to SynchronizingControllerConfig with ""
GameAction [AppID 3429715210, ActionID 13] : LaunchApp changed task to SiteLicenseSeatCheckout with ""
GameAction [AppID 3429715210, ActionID 13] : LaunchApp changed task to DelayLaunch with ""
GameAction [AppID 3429715210, ActionID 13] : LaunchApp changed task to CreatingProcess with ""
GameAction [AppID 3429715210, ActionID 13] : LaunchApp waiting for user response to CreatingProcess ""
GameAction [AppID 3429715210, ActionID 13] : LaunchApp continues with user response "CreatingProcess"
Game process added : AppID 0 ""/System/Applications/Calculator.app"", ProcID 11643, IP 0.0.0.0:0
Game Recording - would start recording game 14730514661577326592, but recording for this game is disabled
Adding process 11643 for gameID 14730514661577326592
GameAction [AppID 3429715210, ActionID 13] : LaunchApp changed task to WaitingGameWindow with ""
GameAction [AppID 3429715210, ActionID 13] : LaunchApp changed task to Completed with ""
Game process removed: AppID 0 ""/System/Applications/Calculator.app"", ProcID 11643 
ThreadGetProcessExitCode: no such process 11643
Game Recording - game stopped [gameid=14730514661577326592]
Removing process 11643 for gameID 14730514661577326592

It resolves to 3429715210

JJThundley 2026-03-16 github

This seams to work fine for me, I'm on EndeavourOS. The shortcut works and has the proper gameid.

Nothing extracted yet.