How it works

Inside content.kspkg

How Assetto Corsa EVO packs its content, and how step 1 extracts it exactly.

Assetto Corsa EVO keeps almost all of its content in a single file, content.kspkg: about 69 GB holding some 117,000 files, the circuits, cars, interface and game tables.

A package is a file system in one file

A Kunos package is a long run of file data, with a table at its end listing every entry: its path, where its data starts, its size and a few flags. Reading a file means finding its entry in the table, then reading its bytes.

Some entries are scrambled with a simple XOR, the way the game stores them; the key is read from the package's own table. Step 1 unscrambles them as the game does, so the extracted files are exactly what the game reads.

Extracted exactly, and checked

  • Exact copies. Each file is written with the bytes the game reads, under its package path: game/content/tracks/laguna_seca/….
  • Checked. kspkg verify reads every file back and compares it with the package, byte for byte.
  • Incremental. A file already extracted from the same package entry is skipped. After a game update, only the changed files are written, and --prune removes the ones the game dropped.
  • Careful with your disk. Before writing, the extraction checks that the disk has room for what it will add.

Anything unusual is reported

kspkg info checks every entry of the table and reports what the game would not expect, such as an unsafe path or data running past the end of the file. Extraction never writes outside its output folder. On the game's own package, it reports nothing unusual.

Step 1 was written from the game's own loader. The community documented the format first: ace-kspkg, ACEvo.Package and kspkg-viewer.

beamng.assetto is free software under the GNU AGPL v3.

Not affiliated with Kunos Simulazioni or BeamNG GmbH. Assetto Corsa EVO and BeamNG.drive are trademarks of their owners.