Directory layout
The folder the engine mounts is not the Steam folder name, so substitute yours in every path below:
| Game | Steam folder | Mod directory |
|---|---|---|
| Counter-Strike 2 | Counter-Strike Global Offensive | csgo |
| Dota 2 | dota 2 beta | dota |
| Deadlock | Deadlock | citadel |
| Half-Life: Alyx | Half-Life Alyx | hlvr |
| Aperture Desk Job | Aperture Desk Job | steampal |
| Dota Underlords | Underlords | dac |
| Artifact Classic | Artifact | dcg |
| Artifact Foundry | Artifact 2.0 | dcg |
Two of the older titles do not follow the game/ layout at all. The Lab keeps its Source 2 content in RobotRepair/vr/, and SteamVR Home nests it under tools/steamvr_environments/game/.
Why the paths matter
The engine and the tools find assets by path. A folder name is part of an asset's identity: materials/wall.vmat compiles to materials/wall.vmat_c, and that exact string is what every material, model and map referring to it stores. Nothing searches the disk for a file that is not where its path says it is.
The practical consequence is that folders are not free to rearrange. Renaming or moving one after assets reference it breaks every reference at once, because those paths are stored as plain strings inside the compiled files.
The content folders
The same folder names appear on both sides of the install: authored under content/, compiled under game/, at the same relative path. What each one is for:
- Counter-Strike 2
- Half-Life: Alyx
- Dota 2
- Steam VR
| Folder | Holds | Source | Compiled | Packed |
|---|---|---|---|---|
agents/ | player models, laid out the same way as weapons/ | .vmdl, .dmx, .vmat | .vmdl_c, .vmat_c | no |
animation/ | Animgraph 2 skeletons, clips and graphs | .vnmskel, .vnmclip, .vnmgraph | _c of each | no |
cfg/maps/ | per map console configs, executed when that map loads | .cfg | not compiled | yes |
items/ | economy items such as keychains and stickers, with their artwork | .econitem, .tga | .econitem_c, .vtex_c | no |
lighting/postprocessing/ | the post processing a map's lighting uses | .vpost | .vpost_c | yes |
maps/ | maps | .vmap | one .vpk per map | yes |
materials/ | materials and the textures they reference | .vmat, .vtex, and the .tga, .psd or .png a .vtex reads | .vmat_c, .vtex_c | yes |
models/ | models, with the materials and textures that belong only to them | .vmdl, and the .dmx or .fbx meshes it builds from | .vmdl_c | yes |
panorama/ | the UI: layouts, styles, scripts and images | .xml, .css, .js, .ts, images | .vxml_c, .vcss_c, .vjs_c, .vts_c, .vtex_c | no |
panorama/images/map_icons/panorama/images/overheadmaps/panorama/layout/custom_game/panorama/styles/custom_game/ | the map's icon and overhead image, and the UI an addon adds for a custom game | images, .xml, .css | .vtex_c, .vxml_c, .vcss_c | yes |
particles/ | particle systems and the snapshots they sample | .vpcf, .vsnap | .vpcf_c, .vsnap_c | yes |
postprocess/ | post processing settings | .vpost | .vpost_c | yes |
pulse/ | Pulse graphs | .vpulse | .vpulse_c | no |
resource/ | localisation, subtitles, fonts and UI data | .txt, .res | mostly not compiled | no |
resource/overviews/ | a map's radar overview definition | .txt | not compiled | yes |
scripts/ | data the game reads rather than renders: item and weapon definitions, response rules | .kv3, .vdata, .vrr, .txt | .vdata_c, .vrr_c, or nothing | yes |
smartprops/ | SmartProps, the rule driven props Hammer places | .vsmart | .vsmart_c | no |
soundevents/ | the soundevent scripts that name and configure playback | .vsndevts | .vsndevts_c | yes |
sounds/ | the audio files themselves | .wav, .mp3 | .vsnd_c | yes |
soundstacks/ | mixing rules and operators applied to soundevents | .vsndstck, .vmix | .vsndstck_c, .vmix_c | no |
weapons/ | weapon models with the materials and sounds that belong to them, one folder per weapon | .vmdl, and the .dmx or .fbx it builds from | .vmdl_c | no |
Packed is whether the folder survives publishing to the workshop as the game ships. A folder marked no compiles and works locally, then is dropped from the uploaded item without a warning, unless the list that decides this is edited first. See Workshop packing.
Every extension in the table is listed with its compiler in Asset Types.
The folder list for this game is not documented yet. The Counter-Strike 2 tab covers the folders the engine itself defines, most of which apply everywhere.
The folder list for this game is not documented yet. The Counter-Strike 2 tab covers the folders the engine itself defines, most of which apply everywhere.
The folder list for this game is not documented yet. The Counter-Strike 2 tab covers the folders the engine itself defines, most of which apply everywhere.
Addons
An addon is a mod directory of its own, using the same folder names, mounted on top of the main mod. Paths inside it are relative to the addon root, so content/csgo_addons/my_addon/materials/wall.vmat is referenced everywhere as materials/wall.vmat, exactly as if it shipped with the game. content/csgo_addons/addon_template/ is the layout Valve ships as a starting point, and the other tools games carry the same template under their own addon directories.
Which of an addon's folders the game mounts, and in what order against the base game, is on Content mounting. Not every folder survives publishing either: by default the workshop packer keeps only the directories the main mod's gameinfo.gi lists and drops the rest without a warning, though that list can be edited, see Workshop packing.