Steamworks Documentation
Action Manifest Files

Overview

In addition to using the Steam Workshop for hosting configurations, game can also choose to bundle their configurations directly with the game depots. There's a number of benefits to bundling configuration in your game depots:
  • Official configurations can be checked into Perforce or other revision control tools
  • Managing configurations between different branches of your game or between a public and private AppID is easier
  • Updates are atomic rather than being done via two publishing steps in Steamworks

Format

The action manifest file is an extension of the In-Game Actions File which includes an extra section containing a list of official configurations broken out by type:
"Action Manifest" { "configurations" { } "actions" { } "localization" { } }
For information about the action and localization sections please see the In-Game Actions File documentation.

Configuration List

In the controller configuration section the configurations are listed by controller type, then by priority for loading. The "path" value is listed relative to the Action Manifest file's location on-disk.
"Action Manifest" { "configurations" { "controller_xboxone" { "0" { "path" "xbox_controller.vdf" } } "controller_steamcontroller_gordon" { "0" { "path" "steam_controller.vdf" } "1" { "path" "steam_controller_motion_controls.vdf" } } } "actions" { } "localization" { } }

Supported controller type strings:

Steam Deck Controllercontroller_neptune
Steam Controllercontroller_steamcontroller_gordon
Xbox 360controller_xbox360
Xbox Onecontroller_xboxone
Xbox One Elite Controllercontroller_xboxelite
PlayStation 4 Controllercontroller_ps4
PlayStation 5 Controllercontroller_ps5
Nintendo Switch Pro Controllercontroller_switch_pro
Generic Gamepadscontroller_generic

Setting up an Action Manifest File

There are two main ways to setup your action manifest file, either starting from scratch or using an existing IGA file.

Starting with an In-Game Actions file

Step 1 - Save a configuration

If you have an existing IGA file you can save your current configuration out by going to the controller configuration screen->Export->"Save Personal Binding". If you've setup multiple localization tokens for titles/descriptions you'll be given a dropdown of options to pick from.

Step 2 - Find your configuration

Next you will run the following Steam URL to dump the configuration into your OS-specific documents folder, ex: My Documents on Windows. URL:

Windows Commandline
start steam://dumpcontrollerconfig?appid=X
Linux Commandline
xdg-open steam://dumpcontrollerconfig?appid=X

Copy both the configuration and your existing IGA file into the desired location inside the game folder.

Step 3 - Convert the IGA file to Action Manifest file

To convert your IGA file to an Action Manifest edit the file and add a "configuration" section including a listing for the controller configuration you just exported. This is an example from the Steamworks SDK:
"configurations" { "controller_xboxone" { "0" { "path" "xbox_controller.vdf" } } "controller_steamcontroller_gordon" { "0" { "path" "steam_controller.vdf" } } }

Step 4 - Set the Steamworks settings

To set your Steamworks settings in the partner site, navigate to the Steam Input settings. Next set the dropdown to "Custom Configuration (Bundled with game)" and enter the path where the action manifest is located:

gamebundledconfigdropdown.PNG

Debugging a game that uses an Action Manifest File

When running the game through Steam the Action Manifest file will automatically be pulled from your game depots. If you're running via the IDE and have the game installed Steam will also use the Action Manifest file from your Steam depots. However if you're running without the game installed in Steam or have local changes you need to make then you can override the Action Manifest path with the SetInputActionManfiestPath API call. This override will be remembered for the rest of the Steam session. There's an example of it's use in the Steamworks SDK:
char rgchCWD[1024]; if ( !_getcwd( rgchCWD, sizeof( rgchCWD ) ) ) { strcpy( rgchCWD, "." ); } char rgchFullPath[1024]; #if defined(_WIN32) _snprintf( rgchFullPath, sizeof( rgchFullPath ), "%s\\%s", rgchCWD, "steam_input_manifest.vdf" ); #elif defined(OSX) _snprintf( rgchFullPath, sizeof( rgchFullPath ), "%s/steamworksexample.app/Contents/Resources/%s", rgchCWD, "steam_input_manifest.vdf" ); #else _snprintf( rgchFullPath, sizeof( rgchFullPath ), "%s/%s", rgchCWD, "steam_input_manifest.vdf" ); #endif SteamInput()->SetInputActionManifestFilePath( rgchFullPath );