Skip to content

Garry's Mod Missing Textures and Server Mods: Workshop Collections, resource.AddWorkshop and FastDL

Fix GMod missing textures and ERROR models on your server: Workshop collections, resource.AddWorkshop, FastDL, and the player-side checks.

Updated October 28, 2026
Garry's Mod

Almost all GMod mods are Steam Workshop addons, and getting them onto a server takes two separate steps that most guides blur together. First, the server has to download and mount the addons. A Workshop collection does that. Second, players have to download the models, materials and maps those addons use, or they see purple-and-black checkerboards and giant red ERROR signs. The server does not do the second step for you, apart from the current map and a Workshop gamemode.

This guide covers both steps on your GSK server: building a collection, pointing the server at it, making players download the right addons, installing addons that aren't on the Workshop, and FastDL for custom content. Complete Getting started with your Garry's Mod server first.

Missing Textures on Your GMod Server: Server Problem or Player Problem?

GMod missing textures (purple-and-black checkerboards) and red ERROR models mean the player's game is missing content that the server is using. The fix depends on who is missing it, so check that first:

  • Every player sees the same errors on the same props or map. It's the server. The addon is mounted on the server but isn't being sent to players. Go to Step 2 below and add the addon with resource.AddWorkshop.
  • Some players see errors and others don't. It's those players' download settings or subscriptions (see below). The players who see everything correctly are usually subscribed to the addons already.
  • Only content from Counter-Strike: Source or Half-Life 2 maps is missing. This happens much less often since the July 2025 Update (below).

Since July 2025, CS:S content is no longer the usual cause

For years the standard answer to "gmod missing textures" was "buy and mount Counter-Strike: Source". The July 2025 Update changed that: it "brings most of Counter-Strike: Source and Half-Life 2 Episodic content to Garry's Mod by default". Facepunch also said what it doesn't fix: "This won't eliminate all instances of missing content (missing textures and ERROR models), but it will address a majority of instances of this issue. The remainder would just be addon authoring or installation errors."

Two exceptions are still worth knowing. Maps from those games are not included, so a server running a CS:S map still needs players to have that map. Voice-over files and music aren't included either. Everything else that is still missing is, in Facepunch's words, an authoring or installation problem. On a server, that almost always means content that isn't being delivered.

What to ask a player who sees errors when others don't

The client has a download filter, cl_downloadfilter, that decides what it accepts from servers. Its values are all, none, nosounds, mapsonly and noworkshop. A player on mapsonly or noworkshop skips the content you are sending them and sees errors. Ask them to open the console and run:

cl_downloadfilter all
text

Then they should reconnect. Facepunch's own hosting guide warns that "clients can change which types of files they download by going into the settings menu", so this is the first thing to rule out before you change anything on the server.

Server-side checklist

  1. The addon is in the Workshop collection in your Workshop ID Startup variable, and the boot log shows it being mounted.
  2. A resource.AddWorkshop( "<addon ID>" ) line exists for that addon, in a file under garrysmod/lua/autorun/server/. Use the addon's ID, not the collection's.
  3. The addon actually contains models or materials. Lua-only addons don't need this line.
  4. For content that isn't on the Workshop, the file is on your FastDL host at the same path it has under garrysmod/, and it is marked with resource.AddFile.
  5. You restarted the server after the change, and the player reconnected.

If all five are true and every player still sees the same errors, the addon itself is probably broken (missing files, or a path typo by its author). Test it on its own on a local game. Errors that show up there come from the addon, not your server.

Common questions about missing textures

Do players still need Counter-Strike: Source for GMod servers?
Not for most content, since the July 2025 Update. They still need it for CS:S maps, which aren't included.

Why do I see missing textures on my own server but my friends don't?
Usually your cl_downloadfilter is restricted, or your friends are already subscribed to the addons. Set the filter to all and reconnect.

Does sv_allowdownload 1 fix missing textures?
It can deliver files, but at about 64 kb/s, and Facepunch warns it opens the server to exploits. Use resource.AddWorkshop, or FastDL for content that isn't on the Workshop.

Step 1: Install GMod Mods on the Server with a Collection

A GMod server loads Workshop addons through a collection, a single Workshop item that bundles many addons. You give the server the collection ID and it downloads and mounts everything in it at startup.

Create the collection

  1. Go to steamcommunity.com/workshop/browse/?appid=4000 and open the Collections section.

  2. Create a collection, add the addons and maps you want, and save it.

  3. Set its visibility to Public or Unlisted. Facepunch are explicit that srcds can't read a private collection.

  4. Copy the collection ID, the number at the end of the collection's URL (?id=123456789).

Collections can be nested, and the server downloads sub-collections too. That makes it easy to keep, say, "maps" and "tools" as separate collections under one parent.

Point the server at it

In your panel's Startup tab, paste the collection ID into Workshop ID. The egg passes it to the server as +host_workshop_collection <ID>, which is exactly the parameter Facepunch documents. Restart the server.

On boot the server downloads every addon in the collection into garrysmod/cache/workshop/ and mounts it. A large collection makes the first boot slow. Later boots only fetch addons that have been updated. Since the September 2026 update, the server also cleans addons you have removed from the collection out of that cache folder.

You do not need a Steam Web API key

Older guides tell you to register a key at steamcommunity.com/dev/apikey and pass it as -authkey. That requirement was removed in the April 2017 update, which "Switched SRCDS Steam Workshop to ISteamUGC API", so the server now authenticates through its own Steam connection. Pass -authkey today and Garry's Mod prints "-authkey is no longer required by Garry's Mod" and ignores it. The collection ID is the only thing you need.

The Steam Account Token is a different credential

Your Startup tab also has a Steam Account Token field. That is a GSLT, generated at steamcommunity.com/dev/managegameservers, and it has nothing to do with Workshop. Without one your server takes a severe ranking penalty in the server list, so it is worth setting. Just don't confuse it with an API key.

Step 2: Make Players Download the Addons

This is the step that causes the missing-texture complaints. Mounting an addon on the server does not make joining players download it. Facepunch's wiki spells out that only two things are marked for client download automatically:

  • the current map, if it is in the server's collection
  • the gamemode, if it is a Workshop gamemode that declares its Workshop ID

Everything else needs a resource.AddWorkshop call. Create a server-side Lua file with the file manager (Files tab):

-- Addons with models, materials or sounds that players must download
resource.AddWorkshop( "160250458" ) -- Wiremod
garrysmod/lua/autorun/server/workshop.lua

Each line takes one addon ID, not the collection ID. The rules that save you from a slow join:

  • Only add addons that contain content. Lua files are not content. They go to players through a separate system automatically, so adding a Lua-only addon (ULX and ULib, for example) is a waste. It makes players download a Workshop item they gain nothing from.
  • Skip the "workshop.lua generator" sites. Facepunch warns that they add every addon in a collection, Lua-only ones included, which only lengthens join times.
  • There is a limit of 8,192 downloadable files, shared by all resource.Add* calls.

Players who are already subscribed to an addon skip the download. Everyone else gets it from Steam at full speed before they spawn.

Counter-Strike: Source textures

Since the July 2025 update most CS:S and Half-Life 2 Episodic content ships with Garry's Mod. The missing-textures section at the top of this page covers what is still not included.

Mods That Aren't on the Workshop

Some addons are distributed as ZIPs (GitHub releases, a developer's site, or your own code). These are legacy addons. Extract each one into its own folder under garrysmod/addons/:

garrysmod/addons/
├── ulib/
│   └── lua/ ...
└── ulx/
    └── lua/ ...

Each folder should directly contain the addon's lua/, materials/, models/ and so on. A common mistake is one folder too deep: addons/ulx-master/ulx/lua/. Restart the server after adding a legacy addon. Some, ULX included, need a full restart rather than a map change.

Legacy addons aren't on the Workshop, so resource.AddWorkshop can't deliver their content. For those files, use FastDL (below), or better, upload the content-only part to the Workshop as your own addon.

Common Server Mods and Their Workshop IDs

Addon Workshop ID Needs resource.AddWorkshop?
ULib 557962238 No, Lua only
ULX 557962280 No, Lua only
Wiremod 160250458 Yes, it has models and materials

ULX and ULib are the usual admin layer. Garry's Mod admin commands covers setting them up. Gamemodes such as DarkRP and TTT are covered in Garry's Mod Gamemodes.

Keeping Addons Updated

By default the server checks the collection for updates each time it starts, so a restart is how you pick up new versions. Facepunch documents host_workshop_autoupdate 0 to stop this. That can protect you from an addon update that breaks something or ships unwanted code, but it has a cost. A player whose copy of a map is newer than the server's can fail to join. We haven't confirmed whether the setting takes effect from server.cfg on our servers, so if you want updates switched off, contact support and we'll help you set it.

Fast Downloads (sv_downloadurl) for Custom Content

FastDL is for content that isn't on the Workshop: legacy addons, custom sounds or a map you haven't uploaded. Without it, those files come over the game connection, which Facepunch's own table caps at a "Slow 64kb/s limit, file by file". Their wiki calls this path "extremely slow" and "obsolete", and says you should avoid it.

To set up FastDL:

  1. Host the files on a normal HTTP server, your own or a CDN, mirroring the garrysmod/ folder layout (materials/..., models/..., sound/..., maps/...).

  2. Point the server at it in garrysmod/cfg/server.cfg:

    sv_downloadurl "https://fastdl.example.com/garrysmod"
    
  3. Mark each file for download in a server-side Lua file with resource.AddFile( "materials/myserver/logo.vmt" ). resource.AddFile adds related files automatically: a .vmt brings its .vtf, and a .mdl brings its .vvd, .phy and .vtx files. Paths are virtual and relative to garrysmod/, so content inside a legacy addon is written as materials/..., not addons/myaddon/materials/....

Clients request the .bz2-compressed version of each file first and fall back to the plain file. So compress everything with bzip2 and host both versions. With sv_downloadurl "https://fastdl.example.com/garrysmod", a marked materials/hud/killicon.vmt is fetched from https://fastdl.example.com/garrysmod/materials/hud/killicon.vmt.bz2 first.

Two FastDL limitations worth knowing:

  • Files are downloaded one at a time, so thousands of small files are slow even on a fast host. That is a good reason to put content on the Workshop instead.
  • Clients don't check file contents. If you update a file on the FastDL host, players who already have the old version keep it.

Leave sv_allowdownload off

sv_allowdownload 1 enables the slow in-game download path. Facepunch warn it also "opens you up to exploits", because modified clients can spam file requests to lag the server. With Workshop plus FastDL, you don't need it.

Common Issues

  • Players see ERROR models or purple checkerboards: the addon is mounted on the server but not sent to players. Add its ID with resource.AddWorkshop. Check that you used the addon ID, not the collection ID.
  • Server ignores the collection: the collection is private, or the Workshop ID field holds a single addon's ID. The boot log shows what the server mounts.
  • Server stuck loading a map: the map is not in the collection, or hasn't finished downloading. Check the console during boot.
  • Joining takes minutes: you are sending Lua-only addons with resource.AddWorkshop, or relying on the in-game download instead of FastDL.
  • FastDL returns 404: the folder layout on the HTTP host doesn't mirror garrysmod/, or the file wasn't uploaded (both .bz2 and plain).
  • Legacy addon does nothing: it is nested one folder too deep in addons/, or needs a full restart rather than a map change.

Made with 💜 by GameServerKings

Need a Garry's Mod server?

Deploy an instantly-provisioned Garry's Mod server on high-clock hardware. DDoS protected, no contracts, cancel anytime.

From $4.90 /month