Skip to content

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

Install GMod mods on your server with a Workshop collection, make players download them with resource.AddWorkshop, and serve custom content over FastDL.

Updated September 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.

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

Many older maps and addons expect Counter-Strike: Source content. Since the July 2025 update, Garry's Mod ships most CS:S and Half-Life 2 Episodic content by default. Missing textures on those maps are now much rarer, and players no longer need to own and mount CS:S for most of it.

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