How to Install Addons on Your Garry's Mod Server
Workshop collections, resource.AddWorkshop and manual installation - and why your players see ERROR signs even though the addons work fine on the server.
Two things people confuse: server and client
This is the key to Garry's Mod addons, and the misunderstanding is behind almost every support ticket:
| The server | The player | |
|---|---|---|
| What it needs | The files, so the code can run and the map can load | Models, materials and sounds, so there is something to see |
| How | +host_workshop_collection or files in garrysmod/addons/ |
resource.AddWorkshop() |
| If missing | The addon does not work | ERROR signs and purple-black checkerboards |
A workshop collection alone does not deliver addons to your players. The server mounts them, but the client is only told about two things automatically: the map the server is running, if it is in your collection, and the gamemode you run, if it has a workshop ID. Everything else - playermodels, weapons, props - has to be registered with
resource.AddWorkshop.
Lua-only addons such as ULX, DarkRP and admin mods belong only on the server. They have no content for players to download.
Step 1 - Create a workshop collection
- Subscribe to at least one addon in the Garry's Mod workshop.
- Use Collections → Create Collection and add your addons.
- Set it to Public or Unlisted. The server cannot read a private collection.
- Copy the ID from the address - the number after
?id=.
Collections must not contain other collections. Nested collections are not resolved and the inner addons never load. Put addons directly in the collection.
Step 2 - Point the server at the collection
Stop the server in the Potionhost control panel, go to Startup, and add:
+host_workshop_collection 157384458
Start the server again. The first startup takes longer while everything downloads.
You do not need a Steam Web API key. Older guides say to add
-authkey- that is a requirement in CS:GO and CS2, not in Garry's Mod. You can safely leave it out.
A typical complete startup line:
-game garrysmod -port 27015 +maxplayers 32
+host_workshop_collection 157384458
+gamemode sandbox +map gm_construct
+sv_setsteamaccount YOUR_GSLT
+gamemode takes the folder name under garrysmod/gamemodes/ - so darkrp, not "DarkRP". +map takes the map name without .bsp.
Step 3 - Make sure players get the content
Create the file garrysmod/lua/autorun/server/workshop.lua and list one addon ID per line:
resource.AddWorkshop( "150455514" )
resource.AddWorkshop( "104606562" )
resource.AddWorkshop( "2818480138" )
- The IDs are individual addons - never a collection ID
- Only addons with content: models, materials, sounds, maps. Lua-only addons gain nothing
- There is an overall limit of 8192 files
- Restart the server for the file to take effect
Manual installation without the workshop
If you have an addon that is not on the workshop, it has to be unpacked first. Workshop addons are distributed as .gma files, and the server cannot use those directly.
Use the gmad tool that ships with Garry's Mod:
gmad.exe extract -file "my_addon.gma" -out "where_it_goes"
Then upload the extracted folder to garrysmod/addons/. The structure has to look like this:
garrysmod/addons/my_addon/
├── lua/
├── materials/
├── models/
├── maps/
└── sound/
The most common mistake is one extra folder level. If your files sit in
addons/my_addon/my_addon/lua/, they will not load. The top level inside the addon folder has to belua,materials,modelsand so on.The server runs Linux. Every file and folder must be lowercase with no spaces, or it simply will not be found.
Content from other Source games
If you run a map that uses Counter-Strike: Source textures, the server has to mount that game. That happens in garrysmod/cfg/mount.cfg:
"mountcfg"
{
"cstrike" "/path/to/cstrike"
}
Remember that players also have to own and mount the game themselves, otherwise they see purple-black checkerboards no matter what the server does.
Verify that it works
In the console during startup there is a line per addon:
Mounting Addon 'M9K Heavy Weapons' (128091208)
If you see Download Failed!, that is the line to act on.
To check that players receive the content, look for:
Making workshop map available for client download
Live check from the console:
lua_run PrintTable( engine.GetAddons() )
You get a list with mounted and downloaded per addon. Note that it only shows workshop addons - manually installed folders do not appear.
Troubleshooting
| Symptom | Likely cause | Fix |
|---|---|---|
| Players see ERROR signs and purple checkerboards | The addon is mounted on the server but not registered for download | Add resource.AddWorkshop |
| Purple checkerboards on the map | Missing game content, such as CS:S | Set up mount.cfg - and the player must own the game |
host_workshop_collection is unset |
Spaces in the parameter | Write it as one token followed by one number |
| No addons download | The collection is private | Set it to public or unlisted |
| Only some addons load | The collection contains other collections | Put addons directly in it |
Download Failed! on one large addon |
A known issue with large files | Install that one addon manually |
| A manual addon does not load | An extra folder level, or uppercase filenames | Fix the structure, use lowercase |
.gma uploaded directly |
The server does not use packed files | Extract it with gmad first |
| The gamemode does not start | +gamemode does not match the folder name |
Use the folder name, e.g. darkrp |
| Lua changes have no effect | Autorun files are not reloaded at runtime | Restart the server |
Good advice
- Add addons in small batches and restart in between - then you know what broke the server.
- Join as a completely fresh player with no subscriptions to test whether
resource.AddWorkshopis set up correctly. - Keep the collection tidy. Every addon costs startup time and disk space.
- Set
sv_setsteamaccountwith a GSLT - without it your server is deprioritised in the server list. - Back up
garrysmod/data/before major changes. That is where your players' data lives.
Stuck on a collection that will not download? Send us the collection link in a ticket and we will look at it.