Steam Achievement Unlocker (SAU) is a C# console application. While it's more lightweight and less feature-rich than SAM, it lets you unlock Steam achievements gradually without inflating your recorded playtime (unlike SamRewritten). Achievements are unlocked in order of global popularity - for example, those earned by 90% of players will be unlocked before those earned by 80%.
The application does not need any special parameters. You just need to put a settings.json file in the same folder as the built application:
{
"apiKey": "A98XXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
"steamId64": "7684XXXXXXXXXXXXX",
"appId": ["1569040", "1238860"],
"minMinutes": "5",
"maxMinutes": "150",
"referenceSteamId64": "7684XXXXXXXXXXXXX"
}The apiKey you get it directly through the Steam portal. The appId is the unique Steam identifier for the game you want to unlock achievements for, and you can find it through SteamDB.
The referenceSteamId64 field is optional. When set, achievements will be unlocked in the same order that the reference user earned them, rather than by global popularity. This is useful if you want to mirror another player's achievement progression.
The minMinutes and maxMinutes fields are optional. When both are set, the program runs in continuous mode — it stays alive and unlocks achievements at random intervals within the specified range. When both are omitted, the program runs in single unlock mode — it unlocks one achievement per game and exits immediately. Note that you must either set both or omit both; setting only one will result in an error.
In case you want to build the project from source, keep in mind that you will need a copy of the steam_api64.dll for the final build to work, which can be found in pretty much all Steam games.
In order to query and alter a game's statistics on Steam, we need to use the Steam API to disguise our program as the actual game we want to fake. Steam will then increase our playtime for that title while the process remains alive. To keep our overall runtime to a minimum, the program is split into two cooperating components:
A long-running program that sits in the background, communicating with the Client over an IPC channel. Every X minutes the Server:
- Sends a launch request to a Client process
- Waits for it to unlock an achievement
A short-lived process whose only job is to:
- Connect to Steam
- Unlock the next achievement
- Exit immediately once that achievement has been granted
By moving to this Server/Client model with IPC, we ensure that each achievement-unlocking instance lives only as long as it needs to, and we keep our total playtime bump on Steam as low as possible.