VPKTools 1.0.1
dotnet add package VPKTools --version 1.0.1
NuGet\Install-Package VPKTools -Version 1.0.1
<PackageReference Include="VPKTools" Version="1.0.1" />
<PackageVersion Include="VPKTools" Version="1.0.1" />
<PackageReference Include="VPKTools" />
paket add VPKTools --version 1.0.1
#r "nuget: VPKTools, 1.0.1"
#:package VPKTools@1.0.1
#addin nuget:?package=VPKTools&version=1.0.1
#tool nuget:?package=VPKTools&version=1.0.1
VPKTools
Parse and inspect Valve's VPK archive format. Works as both a CLI tool and a .NET library.
Uses ValvePak to read .vpk files. List, find, extract, and verify entries without needing any Valve tooling installed.
Install
Grab an archive from the latest release:
| Archive | Needs .NET installed? | Use when |
|---|---|---|
VPKTools-win-x64.zip |
No | Windows, just run it |
VPKTools-linux-x64.zip |
No | Linux, just run it |
VPKTools-win-x64-portable.zip |
.NET 10 runtime | Windows, smaller download |
VPKTools-linux-x64-portable.zip |
.NET 10 runtime | Linux, smaller download |
Those links always resolve to the newest stable release. On Linux, chmod +x VPKTools.App after unzipping.
As a library:
dotnet add package VPKTools
Layout
| Project | Purpose |
|---|---|
VPKTools.Tier0 |
Core framework: interface registry, ConVars, ConCommands, logging, terminal REPL. |
VPKTools.Pak |
VPK reading, backed by ValvePak. Public API in src/Shared/, implementation in src/Core/. |
VPKTools.App |
CLI entry point. One-shot VPK action when you pass -vpk + a flag, or interactive terminal. |
Interactive terminal
Run with no arguments to get a REPL:
./VPKTools.App
help lists commands, help <name> describes one. cmds dumps every command, convars dumps every ConVar. quit exits.
Inspect VPK files
Read-only VPK inspection is built in — open a .vpk, list/find entries, extract, or verify hashes and signature, either as a one-shot CLI command or from the terminal.
One-shot:
./VPKTools.App -vpk pak01_dir.vpk -list
./VPKTools.App -vpk pak01_dir.vpk -list -filter .vmt -output listing.txt
./VPKTools.App -vpk pak01_dir.vpk -info
./VPKTools.App -vpk pak01_dir.vpk -verify
./VPKTools.App -vpk pak01_dir.vpk -find materials/foo/bar.vmt
./VPKTools.App -vpk pak01_dir.vpk -extract materials/foo/bar.vmt -dest bar.vmt
./VPKTools.App -vpk pak01_dir.vpk -extractall ./out -filter .vmt
-list/-output/-extractall accept -filter <substring> to narrow which entries are matched. -vpk with no action flag just opens the pak and drops you into the terminal instead of exiting, so pak_* commands below pick up where the CLI left off.
Entry listings (-list, -output, pak_list, pak_output, pak_find) print one line per entry:
path=materials/foo/bar.vmt crc=B5ECB9D0 size=51B size_in_bytes=51
crc is the 8-digit uppercase-hex CRC32; size is human-readable (KB/MB/... binary units); size_in_bytes is the exact byte count.
From the terminal, the same functionality is available as commands:
pak_open pak01_dir.vpk
pak_info
pak_list [filter]
pak_find <path>
pak_extract <entryPath> <destPath>
pak_extractall <destDir> [filter]
pak_verify
pak_output <filePath> [filter]
pak_close
Building from source
Requires the .NET 10 SDK.
git clone https://github.com/Swiftly-Tracker/VPKTools.git
cd VPKTools
dotnet build VPKTools.slnx -c Release
Output lands in build/Release/<project>/; the CLI is build/Release/VPKTools.App/VPKTools.App.
To produce a standalone binary like the release archives:
dotnet publish VPKTools.App/VPKTools.App.csproj -c Release \
-r linux-x64 --self-contained true \
-p:PublishSingleFile=true -p:PublishReadyToRun=true -p:PublishTrimmed=false \
-o out/linux-x64
PublishTrimmedmust stayfalse. The app resolves its modules by name throughAssembly.Load, which the trimmer cannot see.
Releases & branches
| Branch | Publishes | Tag |
|---|---|---|
main |
Stable release | vX.Y.Z |
beta |
Prerelease | vX.Y.Z-beta.N |
The flow:
- Features and fixes land on
beta. Every push builds and publishes a prerelease with all four archives attached. - When a batch is ready, open a PR from
beta→main. Merging it publishes the stable release and pushes the NuGet package. betais then automatically force-reset ontomain, so the next cycle starts clean. If you keep a localbeta, rungit fetch && git reset --hard origin/betaafter each stable release.
Architecture
VPKTools/
├── VPKTools.Tier0/ # Framework layer
│ └── src/
│ ├── Core/ # ConVar system, logging, terminal, serialization
│ └── Shared/ # Public interfaces (IInterfaceSystem, IConVar, ITerminal, ...)
├── VPKTools.Pak/ # VPK reading (ValvePak-backed)
│ └── src/
│ ├── Core/ # CPakSystem, CPakCommands (pak_* terminal commands), CPakModule
│ └── Shared/ # Public API (IPakSystem, PakInfo, PakEntryInfo, ...) + Formatting/
├── VPKTools.App/ # CLI entry point
│ └── src/Application.cs
├── VPKTools.csproj # NuGet packaging front
├── Directory.Build.props # Shared metadata + version
└── GitVersion.yml # Versioning rules
Community
- Issues: Report bugs and request features
- Security: Report privately — never in a public issue
License
GPL-3.0. See LICENSE. Third-party attributions in THIRDPARTY.md.
<div align="center"> <strong>Made with ❤️ by the Swiftly Development team</strong> </div>
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net10.0 is compatible. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
-
net10.0
- QRCoder (>= 1.8.0)
- Spectre.Console (>= 0.57.2)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 1.0.1 | 46 | 8/3/2026 |
| 1.0.0 | 36 | 8/3/2026 |
| 1.0.0-beta.1 | 43 | 8/3/2026 |
| 0.1.2-beta.2 | 38 | 8/3/2026 |
| 0.1.2-beta.1 | 32 | 8/3/2026 |