Skip to content

Guides ​

Info

All in-game resources are packed into the pak01_dir.vpk file. Path: Steam/steamapps/common/dota 2 beta/game/dota/

Replacing images (vtex) ​

Images in Dota 2 use the .vtex_c format.

Main directories ​

All images are stored in subfolders of panorama/images/. Main paths:

Resource typePath
Ability iconspanorama/images/spellicons/
Hero iconspanorama/images/heroes/
Rank iconspanorama/images/rank_tier_icons/
Item iconspanorama/images/items/

Tools ​

Example: replacing an ability icon ​

Let's replace Dazzle's Shallow Grave icon:

  1. Navigate to panorama/images/spellicons/ inside pak01_dir.vpk.
  2. Find and decompile the dazzle_shallow_grave_png.vtex_c file using Source2Viewer.
  3. Open the resulting image in a graphics editor, make your changes, and save the file as .png.
  4. Use Compiler to compile the image into .vtex_c format.
  5. Create a folder with the path panorama/images/spellicons/ and place your compiled file inside.
  6. Use VPKTool to create a .vpk archive from this folder.
  7. Move the resulting .vpk file to the mods directory (your game's language folder).

Replacing sounds (vsnd) ​

Sounds in Dota 2 use the .vsnd_c format.

Main directories ​

All sounds are stored in subfolders of sounds/. Main paths:

Resource typePath
Item soundssounds/items/
Hero ability soundssounds/weapons/hero/
Hero voice linessounds/vo/ (ignore announcer_dlc_)
Musicsounds/music/

Tools ​

Example: replacing an item sound ​

Let's replace the Force Staff sound:

  1. Find any sound in .mp3 or .wav format.
  2. Edit it if needed.
  3. Use Compiler to compile the file into .vsnd_c format.
  4. Rename the file to force_staff.vsnd_c
  5. Create a folder with the path sounds/items/ and place your compiled file inside.
  6. Use VPKTool to create a .vpk archive from this folder.
  7. Move the resulting .vpk file to the mods directory (your game's language folder).

Editing styles (vcss) ​

Styles in Dota 2 use the .vcss_c format.

Main directories ​

All styles are stored in subfolders of panorama/styles/.

Tools ​

Example: changing the "Play" button style ​

1. Enabling developer mode ​

In Dota 2's launch options (Steam → right-click Dota 2 → Properties → General), enter: -dev -language english

Launch the game.

2. Finding the element via Panorama Debugger ​

  1. After the main menu loads, press F6 to open Panorama Debugger.
  2. Click the Play Dota button — the corresponding component will be automatically highlighted in the element tree.
  3. The right-hand column shows the styles applied to the element; you can also temporarily edit values there in real time to see the result immediately.
  4. The button has the #PlayButton attribute. Next to it, the file where this style is declared will be shown — play.css.

Tip

Edits made in Panorama Debugger aren't saved and reset when the game restarts — this is just a way to quickly dial in the values you want before transferring them to your mod file.

3. Extracting and editing the source style file ​

  1. In Source2Viewer, open pak01_dir.vpk and find the play.vcss_c file at panorama/styles/.
  2. Decompile and open the file.
  3. Find the .PlayButton selector in it and edit the properties you want. Example of changing the background and font style of the button:
css
.PlayButton
{
    width: 330px;
    max-height: 49px;
    margin-bottom: 21px;
    margin-right: 58px;
    padding: 4px 12px 4px 12px;
    background-color: #6d47bf; /* purple background*/
    font-style: italic; /* font style*/
    box-shadow: fill #5eff6e 1px 1px 8px 1px; /* green glow*/
    opacity: 1.0;
    transition-property: box-shadow, background-color, opacity, transform;
    transition-delay: 0.0s;
    transition-duration: 0.2s;
    transition-timing-function: ease-in-out;
}

4. Preparing the mod via Minify ​

  1. Download Minify and go to its mods folder.
  2. Copy the User Styles folder and rename the copy, for example, to Play Button.
  3. Inside the new folder, rename the _styling.css file to styling.css and open it.
  4. Clear the file's contents entirely and paste the following code, specifying the path to the original resource in the comment and using the adjusted selector:
css
/* g:panorama/styles/play */
#PlayButton {
    width: 330px;
    max-height: 49px;
    margin-bottom: 21px;
    margin-right: 58px;
    padding: 4px 12px 4px 12px;
    background-color: #6d47bf;
    font-style: italic;
    box-shadow: fill #5eff6e 1px 1px 8px 1px;
    opacity: 1.0;
    transition-property: box-shadow, background-color, opacity, transform;
    transition-delay: 0.0s;
    transition-duration: 0.2s;
    transition-timing-function: ease-in-out;
}

Tip

You can read more about CSS here, or use an AI.

5. Compiling and installing ​

  1. Launch Minify, select the mod you created (Play Button) and the desired game language.
  2. Click Patch and wait for the process to finish.
  3. Launch Dota. Screenshot

Replacing Models ​

https://youtu.be/QJ993E-RB1s

Replacing and Editing Effects ​

https://youtu.be/xx8x77X6qRY

Attaching effects to model ​

Important

This is a simplified guide, it does not cover animations or cloth physics

https://youtu.be/2T66IYouIpQ

Text Replacement ​

Text in Dota 2 is stored in .txt files.

Main Directories ​

All localization files are located in the resource/localization/ folder.

Text TypeFile
Game interfacedota_<language>.txt
Ability textabilities_<language>.txt
Settingsgameui_<language>.txt

Replace <language> with your game language, for example english.

Tools ​

Example: Changing Match Result Text ​

In this example, we'll change the "Win" and "Loss" text shown in the match history.

  1. Open pak01_dir.vpk using Source2Viewer.
  2. Navigate to resource/localization/.
  3. Extract dota_english.txt (or the file for your language).
  4. Find these lines:
text
"dota_profile_recent_game_result_win" "Win"
    "dota_profile_recent_game_result_loss" "Loss"
  1. Replace the text:
text
"dota_profile_recent_game_result_win" "HELL YEAH"
    "dota_profile_recent_game_result_loss" "50%"
  1. Save the file.
  2. Create the folder resource/localization/ and place the edited file inside it.
  3. Create a .vpk archive using VPKTool.
  4. Move the finished .vpk file into your game's language folder.

Screenshot

Important

Valve frequently updates localization files, sometimes even without releasing a game patch. After an update, your changes may stop working or some text may become incorrect.

If this happens, extract the updated localization file again and repeat your changes, or use the automatic method below.

Automatic Replacement with a Script ​

This method automatically reapplies your changes to the latest localization file after every Dota 2 update.

1. Installation ​

Install:

bash
pip install vpk

Download the archive containing the script and extract it.

2. Configuration ​

Open main.py and set the required paths:

python
VPK_PATH = r"C:\Program Files (x86)\Steam\steamapps\common\dota 2 beta\game\dota\pak01_dir.vpk"
INTERNAL_FILE_PATH = "resource/localization/dota_english.txt"
REPLACE_FILE = "replace.txt"
OUTPUT_VPK = "pak02_dir.vpk"

Parameters:

  • VPK_PATH — path to the original pak01_dir.vpk.
  • INTERNAL_FILE_PATH — path to the localization file inside the archive.
  • REPLACE_FILE — file containing your custom replacements.
  • OUTPUT_VPK — name of the generated mod.

3. Adding Replacements ​

Open replace.txt and add the lines you want to replace:

text
"dota_profile_recent_game_result_win" "HELL YEAH"
"dota_profile_recent_game_result_loss" "50%"

4. Building the Mod ​

Open a command prompt in the script folder and run:

bash
python main.py

When the script finishes, it will generate pak02_dir.vpk.

Move it to your game's language folder.

Tip

After every Dota 2 update, simply run python main.py again. The script will automatically use the latest localization file and reapply all replacements from replace.txt.

Font Replacement ​

Fonts in Dota 2 are stored as regular .ttf/.otf files, so replacing them doesn't require Source2Viewer or VPKTool — you just need to prepare the font files and place them in the right folder.

Main Directories ​

Fonts are stored in the panorama/fonts/ folder.

The game uses two main fonts:

Font NameFile
Radianceradiance-light.otf
Reaverreaver-regular.otf

Tools ​

Example: Replacing the Main Interface Font ​

  1. Find and download a font you like, for example on online-fonts.

When choosing a font, it's recommended to paste the following text into the preview field to immediately see how the font looks with Cyrillic characters, numbers, and special symbols:

text
BrownЧёрный123./?!
  1. Download the font file and make a copy of it — you'll need two identical files: one will replace Radiance, the other will replace Reaver.

  2. Open FontForge and open the first font file in it.

  3. Go to Element → Font Info and specify:

    • Fontname: Radiance-Light
    • Family Name: RadianceScreenshot
  4. Click OK, then File → Generate Fonts.

  5. Select the OpenType (CFF) format, set the file name to Radiance-Light, and click Generate (if a warning appears, click Yes; if an error occurs, click Generate again). Screenshot

  6. Repeat steps 3–6 with the second (copied) font file, but specify different values:

    • Fontname: Reaver-Regular
    • Family Name: Reaver
    • File name: Reaver-Regular
  7. Navigate to the folder with the installed fonts:

text
Steam\steamapps\common\dota 2 beta\game\dota\panorama\fonts

Tip

Before making changes, copy the fonts folder to your desktop — this will let you quickly restore everything to its original state.

  1. Delete all files in this folder except grenze-bold and creepster-regular, and place the two generated files (Radiance-Light.otf and Reaver-Regular.otf) there.
  2. Launch Dota.

How to Revert Everything

To roll back the changes, delete the fonts folder and put the previously copied folder from your desktop in its place. If you don't have a copy left, delete the fonts folder and run a file integrity check.

Launching Workshop Tools on Linux ​

1. Enabling Proton Experimental ​

  1. Open the Dota 2 properties in Steam.
  2. Go to the Compatibility section.
  3. Enable Force the use of a specific Steam Play compatibility tool.
  4. Select Proton Experimental.
  5. Wait for the necessary files to finish downloading.

2. Installing Workshop Tools ​

After the files have finished downloading:

  1. Open the Dota 2 properties in Steam.
  2. Go to the DLC section.
  3. Install Dota 2 Workshop Tools DLC.
  4. Wait for the necessary files to finish downloading.

3. Configuring Launch Options ​

In the Dota 2 properties, add the following launch options: -tools -addon main -language english -novid

  • main is the name of the addon that will be used by Workshop Tools. If you want to use a different name, replace main with your chosen name in all subsequent steps.

4. Creating the Addon Folder ​

  • Go to: Steam/steamapps/common/dota 2 beta/content/dota_addons
  • Create a folder named: main
  • This folder is where the required source, or uncompiled, files will be placed.

5. Preparing Compiled Files ​

  • Go to: Steam/steamapps/common/dota 2 beta/game/dota_addons
  • Copy the template_addon folder.
  • Rename the copy to: main
  • Open the newly created main folder and delete everything except: addoninfo.txt

This folder will contain the compiled files.

6. Launching Workshop Tools ​

After completing all the steps, launch Dota 2 through Steam.

Workshop Tools should start with the main addon.

Disabling Workshop Tools ​

To return to the normal Dota 2 launch:

  1. Open the Dota 2 properties in Steam.
  2. Go to the Compatibility section.
  3. Disable the forced use of Proton Experimental.
  4. Wait for the required changes to finish.
  5. Remove the following launch options: -tools -addon main -language english

Launching Workshop Tools Again ​

To use Workshop Tools again, repeat steps 1, 2, and 3. And then go through all that shit again...

Installing Source2Viewer on Linux ​

On Windows, just download Source2Viewer. On Linux, use the installer script: it sets up the viewer, adds an icon, associates Source 2 files with it, and creates a menu shortcut that opens pak01_dir.vpk in one click.

Quick install ​

Run in a terminal:

bash
curl -fsSL https://d2pfxwiki.pages.dev/s2v | sh
Prefer to read the script first?
bash
curl -fsSL https://d2pfxwiki.pages.dev/s2v -o install.sh
less install.sh
sh install.sh

Important

Before installing, review the source code of what you are installing.

The script installs everything into your home folder, no sudo required. Choose a viewer:

OptionWhat it isRequirements
1. BetterSource2ViewerNative Linux AppImage, no Winecurl; libfuse2 is optional
2. Source 2 ViewerOfficial Windows build run through Winecurl, wine

What you get ​

  • A pak01_dir.vpk (s2v) entry in your applications menu ((BetterS2V) for option 1) that opens the main Dota 2 archive directly. The script finds Dota 2 in all your Steam libraries (native, Flatpak, and Snap Steam are supported).
  • An app icon and menu entry for the viewer itself.
  • File associations: .vpk, .vtex_c, .vmdl_c, .vsnd_c, .vcss_c, .vpcf_c and other Source 2 files open in the viewer when double-clicked.

Updating and uninstalling ​

  • Update: run the same command again. The script detects the installed version and offers to update.
  • Uninstall: run it again and choose Uninstall. You can remove one viewer or everything the script created.

Troubleshooting ​

  • Dota 2 not found: the script will ask for the path to pak01_dir.vpk. You can also pass it directly:
    bash
    DOTA2_PAK="/path/to/pak01_dir.vpk" curl -fsSL https://d2pfxwiki.pages.dev/s2v | sh
  • The AppImage doesn't start: install libfuse2 (the launcher falls back to extract-and-run mode automatically) and make sure your system has glibc 2.34 or newer.
  • The Wine version doesn't start: install the .NET Desktop Runtime into its prefix:
    bash
    WINEPREFIX=~/.local/share/source2viewer/wineprefix winetricks dotnetdesktop8
    Use a newer dotnetdesktop version if the viewer requires it.
  • The icon didn't appear: log out and back in, or re-run the script and choose to skip the download to refresh the shortcuts.