.vtf is the texture format used by Valve's Source engine — CS:GO / CS2 skins, TF2, Garry's Mod, L4D and friends. Every decent VTF tool is Windows-only, so Mac users get stuck booting a VM or fighting Wine just to look at a texture.
VTFEdit for Mac fixes that. Drag your textures in and see them instantly. Export to PNG, TGA, TIFF or JPEG — one file or a whole folder at a time — or go the other way and turn any image into a game-ready .vtf with DXT compression and mipmaps. No Wine, no VM, no command line required.
- 🖼️ Instant preview — open a
.vtfand see the texture immediately, with a transparency checkerboard so alpha is obvious. - 🔁 Both directions — decode
.vtf→ image, and encode any image →.vtfwith DXT1/DXT5 compression, uncompressed output and automatic mipmaps. - 🎞️ Frames & cubemaps — step through animated frames and cubemap faces, and export them all at once.
- 🧱 VMT materials — open a
.vmt, read its fields, and preview the$basetextureit points to. - 🔍 Zoom & pan — pinch on the trackpad or use the on-screen controls (
−/+/ Fit / 1:1) to inspect every pixel. - 📦 Batch export — drop in a whole folder and convert everything in one click.
- 🎨 Multiple output formats — PNG, TGA, TIFF and JPEG.
- 🧩 Broad format coverage — DXT1/3/5 plus all the common uncompressed layouts, across VTF versions 7.1 → 7.6.
- 🪶 Zero dependencies — a pure-Swift VTF codec. No VTFLib, no DevIL, no native libraries to install.
- 🍎 Truly native — SwiftUI app, universal on Apple Silicon and Intel, tiny footprint.
curl -fsSL https://raw.githubusercontent.com/Scratchhhh/vtfedit-mac/main/install.sh | bashDownloads the latest release, installs VTFEdit.app into your Applications folder, clears the Gatekeeper quarantine, and launches it. Requires macOS 13 Ventura or newer (Apple Silicon & Intel).
Grab VTFEdit-macOS.zip from the latest release, unzip it, and drag VTFEdit.app to Applications. On first launch, right-click the app → Open (the build is ad-hoc signed, not notarized).
Build from source
Requires Xcode 15+ (or the Command Line Tools) on macOS 13+.
git clone https://github.com/Scratchhhh/vtfedit-mac.git
cd vtfedit-mac
./scripts/build_app.sh
open dist/VTFEdit.app| Action | How |
|---|---|
| Open file(s) | Toolbar Open Files, ⌘O, or drag files onto the window |
| Open a folder | Toolbar Open Folder, ⇧⌘O (scans recursively) |
| Pick output format | Format menu in the toolbar — PNG / TGA / TIFF / JPEG |
| Export a texture | Select it → Export…, or right-click → Export |
| Export everything | Toolbar Export All → pick a destination folder |
| Convert image → VTF | Open a .png/.jpg/… → choose DXT5 / DXT1 / uncompressed + mipmaps → Export VTF… |
| Browse frames/faces | Use the Frame / Face controls over the preview; Export All writes every one |
| Zoom | Pinch on the trackpad, or the − / + / Fit / 1:1 controls |
.vtf, .vmt and image files (.png .jpg .tiff .bmp .gif) are all accepted, and exports keep the original base name.
Read — .vtf (versions 7.1 – 7.6, including the 7.3+ resource directory) and .vmt materials:
| Compressed | Uncompressed |
|---|---|
| DXT1 | RGBA8888 · ABGR8888 · ARGB8888 |
| DXT1 (1-bit alpha) | BGRA8888 · BGRX8888 |
| DXT3 | RGB888 · BGR888 |
| DXT5 | RGB565 · BGR565 |
| I8 · IA88 · A8 · P8 | |
| UV88 · BGRA4444 · BGRA5551 · BGRX5551 | |
| RGBA16161616 / RGBA16161616F (HDR) |
Write to image — PNG · TGA · TIFF · JPEG. Write to VTF — DXT1 · DXT5 · BGRA8888 · RGBA8888, with a generated mipmap chain and low-res thumbnail.
VTFEdit for Mac is split into two pieces:
VTFKit— a dependency-free Swift codec. It parses the VTF header, walks the mipmap/frame/face layout and decodes the pixel data (hand-rolled BC1/BC2/BC3 block decompression) into RGBA8; encodes RGBA8 back into VTF (BC1/BC3 compression, mipmaps, thumbnail); writes PNG/TGA/TIFF/JPEG; and parses.vmtmaterials.VTFEditMac— the SwiftUI front-end: file management, preview, zoom, frame/face navigation and export.
Because VTFKit has no platform UI dependencies, it's also reusable on its own.
import VTFKit
// Decode a texture to an image
let vtf = try VTFFile(data: Data(contentsOf: url))
let image = try vtf.decode()
try image.write(to: pngURL, as: .png)
// Encode an image back into a VTF
let data = try VTFEncoder.encode(image, options: .init(format: .dxt5, generateMipmaps: true))
try data.write(to: vtfURL)swift build # build the library + app
swift run # run the app from the terminal
swift test # run the VTFKit decoder testsThe test suite validates the parser and each decoder against synthetic fixtures; drop a real .vtf into Samples/ and the integration test will exercise the full pipeline on it.
Issues and pull requests are welcome. If you hit a .vtf that fails to open, attach the file (or its header) to an issue — odd formats are exactly what makes a decoder better.
Released under the MIT License.
Valve Texture Format and the Source engine are trademarks of Valve Corporation. This project is an independent, unaffiliated tool for working with the format.
