Quick answer: The overlay hooks your renderer when the game starts, so the game must be launched by Steam (or have Steam running with an app ID in development), and SteamAPI_Init must run before the graphics device is created. The overlay only redraws when you present frames, so games that render on demand look frozen. Also check the player's overlay setting and other overlays.

The Steam overlay matters more than it looks: it is where players accept invites, see achievements and open the store page from your game. When Shift+Tab does nothing, invites and in-game purchases quietly break with it.

Cause 1: the game was not launched through Steam

Steam injects the overlay into processes it starts. A game started from its folder, from your IDE or from a launcher you wrote is not hooked unless the Steam API is initialized with Steam running, and even then the overlay is most reliable when Steam launched the game. For development, use the Steam client's Play button on a build installed through a test branch, or add your local build as a non-Steam game only for overlay tests.

Cause 2: Steam initialized after the graphics device

The overlay hooks the rendering API when the device is created. If your code creates the window and graphics device first and calls SteamAPI_Init later, the hook may miss the device. Initialize Steam as early as possible in startup, before any rendering setup. Engine integrations usually handle this when you use their built-in Steam support; custom initializations added later in startup are where it breaks.

Cause 3: the game does not present frames

The overlay draws on top of your frames. If the game stops presenting (a menu that renders only when something changes, a paused game that stops drawing, or Godot's low processor usage mode), the overlay opens but appears frozen or never visibly appears. Keep presenting at a steady rate while the overlay is active. Steam tells you when it opens:

// C++ Steamworks
STEAM_CALLBACK(Game, OnOverlay, GameOverlayActivated_t);
void Game::OnOverlay(GameOverlayActivated_t* p)
{
    overlayOpen = p->m_bActive != 0;   // pause gameplay, keep rendering
}

Cause 4: the overlay is disabled

Cause 5: other overlays and injectors

Recording and monitoring tools (RivaTuner/MSI Afterburner, some capture software), other launchers' overlays and mod injectors hook the same rendering calls. Ask affected players to close them one at a time. Antivirus and anti-cheat software can also block the overlay's DLL injection.

Engine-specific notes

When overlay features silently fail

A broken overlay usually surfaces as “invites don't work” or “purchase did nothing”. Bugnet's SDKs for Unity, Godot and Unreal file errors automatically with the player's OS, hardware and recent log lines, and pull your Steam reviews into the same dashboard, and an in-game report form gives players a way to tell you before they leave a review.

Frequently asked questions

Why does the Steam overlay not open in my game?

The game was not launched through Steam, SteamAPI_Init ran after the graphics device was created, the overlay is disabled in Steam settings, or another overlay or injector conflicts.

Why does the Steam overlay appear frozen?

The overlay only updates when the game presents frames. Games that stop rendering while paused or render on demand make it look frozen.

How do I know when the Steam overlay opens?

Listen for the GameOverlayActivated_t callback, or your engine wrapper’s equivalent, and pause gameplay while keeping rendering running.

Init Steam before the renderer, keep presenting frames, and test from the Steam client.