{"id":48700304,"url":"https://github.com/ValveResourceFormat/SteamAppInfo","last_synced_at":"2026-04-27T05:01:03.243Z","repository":{"id":144601353,"uuid":"256241717","full_name":"ValveResourceFormat/SteamAppInfo","owner":"ValveResourceFormat","description":"Parser for appinfo.vdf and packageinfo.vdf files used by the Steam client","archived":false,"fork":false,"pushed_at":"2026-04-11T17:53:05.000Z","size":37,"stargazers_count":129,"open_issues_count":0,"forks_count":11,"subscribers_count":4,"default_branch":"master","last_synced_at":"2026-04-11T19:26:38.873Z","etag":null,"topics":["reverse-engineering","steam"],"latest_commit_sha":null,"homepage":"","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ValveResourceFormat.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null},"funding":{"github":"xPaw"}},"created_at":"2020-04-16T14:38:41.000Z","updated_at":"2026-04-11T17:53:13.000Z","dependencies_parsed_at":"2024-07-08T09:12:20.451Z","dependency_job_id":"33b19d69-f1a4-4f57-8435-c89d17374cb8","html_url":"https://github.com/ValveResourceFormat/SteamAppInfo","commit_stats":null,"previous_names":["valveresourceformat/steamappinfo"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/ValveResourceFormat/SteamAppInfo","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ValveResourceFormat%2FSteamAppInfo","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ValveResourceFormat%2FSteamAppInfo/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ValveResourceFormat%2FSteamAppInfo/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ValveResourceFormat%2FSteamAppInfo/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ValveResourceFormat","download_url":"https://codeload.github.com/ValveResourceFormat/SteamAppInfo/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ValveResourceFormat%2FSteamAppInfo/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32323215,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-26T23:26:28.701Z","status":"online","status_checked_at":"2026-04-27T02:00:06.769Z","response_time":128,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["reverse-engineering","steam"],"created_at":"2026-04-11T10:00:40.455Z","updated_at":"2026-04-27T05:01:03.231Z","avatar_url":"https://github.com/ValveResourceFormat.png","language":"C#","funding_links":["https://github.com/sponsors/xPaw"],"categories":["C# #"],"sub_categories":[],"readme":"This is a simple program that finds the Steam installation on disk, reads `appinfo.vdf` and `packageinfo.vdf` files and dumps appid/subid and their tokens.\n\nThis is mostly intended as an example on how to read these files.\n\n## appinfo.vdf\n\n### File Header\n\n| Type   | Size | Version | Field Name          | Description |\n|--------|------|---------|---------------------|-------------|\n| uint32 | 4    |         | Magic               | Version identifier (see Version History) |\n| uint32 | 4    |         | Universe            | Steam universe (always 1) |\n| int64  | 8    | 41+     | String Table Offset | Offset to string table from file start |\n\n### App Entry (Repeated)\n\n| Type     | Size     | Version | Field Name    | Description |\n|----------|----------|---------|---------------|-------------|\n| uint32   | 4        |         | App ID        | Steam application ID |\n| uint32   | 4        | 36+     | Size          | Size of data until end of binary VDF |\n| uint32   | 4        |         | Info State    | State flags (2 = normal, 1 = prerelease/no info) |\n| uint32   | 4        |         | Last Updated  | Unix timestamp of last update |\n| uint64   | 8        | 38+     | PICS Token    | Product Info Change Set token |\n| bytes    | 20       | 38+     | SHA-1 Hash    | Hash of text appinfo VDF |\n| uint32   | 4        | 36+     | Change Number | Steam change number |\n| ~~uint8~~| 1        | \u003c38     | Section Type  | Section identifier (repeated until 0x08) |\n| bytes    | 20       | 40+     | Binary SHA-1  | Hash of binary VDF data |\n| bytes    | variable |         | Binary VDF    | VDF data in binary format |\n\nRepeated read until the first uint32 (App ID) is zero (which is the file footer).\n\n### String Table (Version 41+)\n\nLocated at the offset specified in the file header:\n\n| Type             | Size     | Version | Field Name   | Description |\n|------------------|----------|---------|--------------|-------------|\n| uint32           | 4        | 41+     | String Count | Number of strings in table |\n| null-terminated  | variable | 41+     | Strings      | Array of null-terminated strings |\n\nThis string table is used to deduplicate strings in all the binary vdf blobs, so it is required to parse this string table first,\nand then parse the binary keyvalues with this string table.\n\n### Version History\n\n| Version | Magic Number | Start Date      | Description |\n|---------|--------------|-----------------|-------------|\n| 36      | `0x06564424` | circa 2011      | Added size field |\n| 37      | `0x07564425` | circa 2012      | Same structure as v36 |\n| 38      | `0x07564426` | circa 2013      | Added PICS token and SHA hash |\n| 39      | `0x07564427` | circa 2017      | Same as v38 but unified VDF structure |\n| 40      | `0x07564428` | Dec 2022        | Added binary VDF SHA1 hash validation |\n| 41      | `0x07564429` | June 2024       | Added string table with offset pointer |\n\n*For parsing older formats not implemented here, [see this repo](https://github.com/eepycats/appinfo-parser/).*\n\n### SHA-1 Hash Fields\n\nThe appinfo format includes two different hash fields that serve different purposes:\n\n#### SHA-1 Hash\nThis field contains the SHA-1 hash of the raw `CMsgClientPICSProductInfoResponse.AppInfo.buffer` from Steam's internal protobuf protocol, excluding the last byte (which is always `\\x00`). This hash is used by Steam for downloading appinfo from CDN via HTTP and corresponds to the hash provided when the Steam client requests appinfo from the server.\n\nThis hash cannot be easily recalculated from the VDF data alone, as it represents the hash of the original protobuf buffer that Steam received from the server, not a hash of the local VDF representation.\n\n#### Binary SHA-1 Hash (20 bytes, version 40+)\nThis field contains the SHA-1 hash of the binary VDF data that follows immediately after this field. This hash can be calculated directly from the VDF data and is used to verify the integrity of the local binary VDF content.\n\n## packageinfo.vdf\n\n### File Header\n\n| Type   | Size | Version | Field Name | Description |\n|--------|------|---------|------------|-------------|\n| uint4  | 4    |         | Magic      | Version identifier (see Version History) |\n| uint32 | 4    |         | Universe   | Steam universe (always 1) |\n\n### Package Entry (Repeated)\n\n| Type     | Size     | Version | Field Name    | Description |\n|----------|----------|---------|---------------|-------------|\n| uint32   | 4        |         | Package ID    | Steam package/subscription ID |\n| bytes    | 20       |         | SHA-1 Hash    | Hash of package data |\n| uint32   | 4        |         | Change Number | Steam change number |\n| uint64   | 8        | 40+     | PICS Token    | Product Info Change Set token |\n| bytes    | variable |         | Binary VDF    | VDF data in binary format |\n\nRepeated read until the first uint32 (Package ID) is `0xFFFFFFFF` (which is the file footer).\n\n### Version History\n\n| Version | Magic Number | Start Date      | Description |\n|---------|--------------|-----------------|-------------|\n| 39      | `0x06555627` | Before Apr 2020 | Basic format |\n| 40      | `0x06555628` | Apr 2020        | Added PICS Token field |\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FValveResourceFormat%2FSteamAppInfo","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FValveResourceFormat%2FSteamAppInfo","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FValveResourceFormat%2FSteamAppInfo/lists"}