On this page

Steam and Steam Deck: sources and measurements

The research behind the steam and console-cert (Steam Deck) skills, the textsize runner, the steam-removed-api and steam-env-dotnet architecture rules, doctor's GDExtension, Steam package and Steamworks file checks, the SteamAppId=480 default, and the C# example's Platform/ (IPlatformServices, LocalPlatform, BreakoutProgress) and SaveStore.SaveResolved, gathered on 2026-10-21. Tests ran on Godot 4.7.2 mono and standard, .NET 8 (SDK 8.0.131), Linux x86_64, with no Steam client and no Steamworks partner account. Marks: tested means run here, doc means stated by Valve or Godot, source means read in the code, and unconfirmed means memory, community knowledge or inference not checked here.

Sources

Source What it gave
GodotSteam, codeberg.org/godotsteam/godotsteam (releases, readme, changelog, license.md) 4.23.2-gde of 2026-10-20 for "Godot 4.4+ - Steamworks 1.65"; MIT; removed functions; the 4.23.2 macOS file names; a "No LLM Policy" for issues and pull requests
GodotSteam documentation, godotsteam.com (tutorial, Common Issues, C-Sharp Tools) GDScript examples; app ID 480 for testing; the C# options; still lists isSteamRunningOnSteamDeck()
GodotSteam C# Bindings, github.com/LauraWebdev/GodotSteam_CSharpBindings (MIT) A generated typed wrapper over Call; supports "the GodotSteam 4.22 plugin"
Steamworks.NET (rlabrecque, MIT) and the fork Steamworks.NET.AnyCPU, github.com/Akarinnnnn/Steamworks.NET.AnyCPU (MIT) SDK 1.65 headers and enums; the AnyCPU package's natives per runtime; the native resolver fix of 2026-10-21
NuGet packages Steamworks.NET 2024.8.0, Steamworks.NET.AnyCPU 2026.164.4 to 2026.165.2, Facepunch.Steamworks 2.3.3 What each package contains (listings); which load in Godot 4.7.2 mono
Facepunch.Steamworks repository (commit of 2026-10-13) Per-OS assemblies; SteamClient.Init sets SteamAppId through .NET
Steamworks SDK access agreement, partner.steamgames.com/documentation/sdk_access_agreement What may be redistributed; no software that replaces the SDK
Steamworks documentation: api/steam_api, features/auth, ISteamUser, ISteamUserStats, ISteamFriends, ISteamApps, ISteamInput, ISteamUtils, features/cloud, features/enhancedrichpresence, store/application/dlc, store/application/depots, branches, demos, sdk/uploading/distributing_gs Init and relaunch rules, authentication, stats, leaderboards, rich presence, Cloud, DLC, depots, branches, demos and servers
Steam Web API, AuthenticateUserTicket, SetLeaderboardScore Server-side ticket checks; trusted leaderboard writes
Steam hardware compatibility, doc/steamhardware/compat (doc/steamdeck/compat serves the same text), the recommendations page and steamdeck/faq One review for Deck, Machine and other SteamOS devices; the 9 px text rule; mixed input; suspend advice
Steam Support FAQ 68D2-35AB-09A9-7678 The Cloud conflict and "Unable to sync" dialogs
steamcommunity.com/dev/testrichpresence The rich presence test page
Steamworks.NET-Example Spacewar's (480) achievement and stat names
game-ci/steam-deploy action.yml (commit of 2026-09-09) Depot IDs, built-in exclusions, the CLI it runs
Godot 4.7.2 class reference and source (DisplayServer, data paths, os_linuxbsd.cpp, SDL's SDL_hidapi_steamdeck.c) No virtual keyboard on Linux; user:// locations; no built-in Deck detection

Bindings in Godot 4.7.2 mono (tested)

Binding Loads in 4.7.2 mono Natives in the export Notes
GodotSteam 4.23.2 GDExtension, raw Call or the C# wrapper Yes Next to the executable, from [dependencies] in godotsteam.gdextension MIT, active; string calls; macOS file names wrong; the wrapper lags one release
Steamworks.NET.AnyCPU 2026.164.4 Yes, project run and exported Linux build data_<name>_<platform>/ MIT fork, one maintainer; typed one-to-one Steamworks API
Steamworks.NET.AnyCPU 2026.165.0 and 2026.165.2 No on Linux: every call throws DllNotFoundException Same Fixed in commit 374c3aa on 2026-10-21, not released
Facepunch.Steamworks built from source Exported builds yes; a project run needs a native resolver Per-OS ProjectReference NuGet 2.3.3 is "For Windows x64" only
GodotSteam module (pre-compiled editor) No: no mono builds; 4.23.2's templates and macOS assets are listed with size 0 Custom templates GDScript only in practice

Start-up and stats (doc, with measurements)

Environment RestartAppIfNecessary(480)
No steam_appid.txt, no SteamAppId True, and GodotSteam runs sh: 1: /root/.steam/root/steam.sh: not found; the game quits with exit code 0
steam_appid.txt in the working directory False
SteamAppId=480 in the native environment (shell or OS.SetEnvironment) False
SteamAppId=480 set with .NET's Environment.SetEnvironmentVariable True

Cloud, DLC, depots and branches (doc)

Steam Deck (doc and tested)

Frame-rate data on the store page (Valve's announcement, November 2026)

From Valve's Steam news post "Steam Deck Framerate" (the text was pasted by the owner on 2026-11-10; the post's URL and date were not read here):

What the kit does with it: deck reports deck.framePacing and warns when the project's frame cap (application/run/max_fps) is below a Deck display's rate and does not divide it (60 on the OLED's 90 Hz; 45 on the LCD's 60 Hz). The rule (a cap at or above the rate, or a divisor of it, paces evenly) is arithmetic from Valve's two examples, not a measurement on a Deck. Not done: a cap set in code (Engine.max_fps) is not read, and nothing here measures a Deck's speed.

Text size at 1280x800 (tested)

With stretch mode canvas_items, text in window pixels is the theme font size times the stretch scale. A 1920x1080 base at 1280x800 gives min(1280/1920, 800/1080) = 0.6667. Screenshots (Xvfb, Compatibility renderer, Godot's default font) matched the font's glyph outlines within 1 px:

Font size (1080p base) Size at 1280x800 Capitals ("H") x-height
12 8.00 px 5 px 4 px
14 9.33 px 6 px 5 px
16 (Godot's default) 10.67 px 8 px 6 px
18 12.00 px 9 px 7 px
20 13.33 px 9 px 7 px
24 16.00 px 12 px 9 px
28 18.67 px 14 px 11 px

Suspend (tested)

A Godot 4.7.2 process stopped for 3 s (SIGSTOP, then SIGCONT, on X11) received no notification at all: no focus change, no APPLICATION_PAUSED. Its next frame had a delta of 0.134 s against 3.013 s of wall clock, with 8 physics steps (max_physics_steps_per_frame). Time.GetTicksMsec() advanced through the stop.

SDK release notes 1.59 to 1.65 (the SDK's own Readme.txt)

From the Readme.txt that ships in the Steamworks SDK (newest entry v1.65, 23 July 2026), paraphrased; the owner supplied the file on 2026-10-29. It lists changes only, with no licence or redistribution terms. "Pinned package" means Steamworks.NET.AnyCPU 2026.164.4, which doctor pins and which carries SDK 1.64, so a call added in 1.65 is not in it.

SDK What changed What it means for a Godot game (suggestions are marked)
1.65 (23 Jul 2026) ISteamUtils::IsRunningUnderProton() added: tells the game it runs under Proton on Linux. For support and diagnostics, like IsRunningOnSteamHardware(); decide behaviour by feature. Not in the pinned package.
1.65 ISteamApps::SetGamePerformanceSetting() and SetGameRenderResolution() added: the game reports the relative performance setting and render resolution the player chose; Steam adds them to anonymous frame-rate data when the player opted into sharing it. Suggestion: call them when the player changes the quality preset or the render scale; skip them if the game has neither. Not in the pinned package.
1.65 ISteamMatchmakingServers::ServerFriends() (friends who recently played on a server) and the popularamongfriends server filter. Only for a game with a server browser, such as the multiplayer arena.
1.65 Steam Input action origin values for Switch 2, Steam Controller and Steam Frame Controller. Do not hard-code origin tables: pass the origin to the glyph and string functions, as the 1.39 notes advise, so a device added later still gets a prompt.
1.65 Two new UGC query sort orders: by the number of items that depend on an item, and by the number of collections that contain it. Workshop browsers only.
1.64 (11 Mar 2026) androidarm64 libraries link libc++ statically and use a 16 KB maximum page size (was 4 KB); linuxarm64 libraries use 4 KB (was 64 KB). The 16 KB size matches what Android exports need (mobile-web).
1.64 ISteamApps::GetBetaInfo() returns the last update time of a branch. UGC: MarkDownloadedItemAsUnused(), GetDownloadedItems(), GetNumDownloadedItems(). Remote Play: BSessionRemotePlayTogether(), GetSessionGuestID(), small, medium and large guest avatars and a callback when one has loaded. Workshop and Remote Play Together games.
1.63 (18 Nov 2025) First linuxarm64 and androidarm64 libraries. ISteamMusicRemote removed. Action origins for the Lenovo Legion Go and a generic controller. GetMarketEligibility can report a trade-cooldown reason. Remove any use of ISteamMusicRemote.
1.62 (14 Mar 2025) ISteamFriends::SetPersonaName() and GetUserRestrictions() removed. EMouseCursor renamed EHTMLMouseCursor. Remote Play Together: BStartRemotePlayTogether() removed (it is always available when a supported game launches), ShowRemotePlayTogetherUI() added, and functions to read a guest's keyboard and mouse directly instead of simulating local input. UGC: SetSubscriptionsLoadOrder(), SetItemsDisabledLocally(), and an optional flag on the subscribed-items calls to include locally disabled items. A game cannot rename the player. Mod load order and locally disabled mods are now Steam's to store (modding).
1.61 (8 Nov 2024) ISteamTimeline calls renamed and extended: instantaneous and range events, removing an event, opening the overlay at an event, game phases. RequestCurrentStats() removed (above). Glyphs for the Wireless HORIPAD for Steam. Suggestion: Steam Timeline is optional; mark moments a player might clip (a boss kill, a death) and the phases of a run.
1.60 (19 Jun 2024) ISteamTimeline added (the Game Recording feature). CSteamAPIContext removed: use the per-interface accessors. UGC: a 64-bit total file size, supported game versions per item, SetAdminQuery(). ISteamApps can manage the active beta branches. C++ bindings only for the accessors; C# bindings already use the static classes.
1.59 (9 Feb 2024) SteamAPI_InitFlat added as an initialization method for the flat API. ISteamUtils::DismissGamepadTextInput(). ISteamAppList removed. InitEx stays the call for Steamworks.NET and GodotSteam (section above).

Kit checks

Case Scale Result
Hint, size 12, at 1280x800 0.6667 8.00 px (capitals 5.92): fails
Play, Godot's default 16, at 1280x800 0.6667 10.67 px (capitals 7.89): warning
Title, size 40, at 1280x800 0.6667 26.67 px: ok
Hint, size 12, at 1920x1080 1.0 12.00 px (capitals 8.88): warning
A hidden label, size 6 Not measured
The same menu with scale_mode="integer" (integer/), at 1280x800 1.0 Fails as cut off

Not confirmed