Garry’s Mod · Server addons guide

How to Install Mods on a Garry’s Mod Server

Adding Workshop addons to a Garry’s Mod server is two jobs, not one: the server has to mount them, and players have to download their content. Here is how to do both properly, check that every addon loaded, and get rid of purple textures and red ERROR models for good.

Think in two jobs

Server install and player content delivery are separate. If you only do the first, addons can run while players still see purple and black textures or red ERROR models.

Best default route

Use a public or unlisted Workshop collection to mount addons on the server, then use resource.AddWorkshop only for addons that contain models, materials or sounds.

Keep joins sensible

Do not feed every addon into download generators. Lua-only addons gain nothing from it and only add unnecessary client download work.

Troubleshoot by logs

The restart console tells you what mounted, what was made available for client download and which file path broke if an addon throws a Lua error.

Core idea first: mounting an addon and sending its content are different jobs

For Sandbox, TTT, DarkRP and Prop Hunt, the rule is the same: the server loading an addon and a player seeing its assets are two separate outcomes. That is the part many admins miss. An addon can be mounted correctly, run its Lua and even change gameplay, while clients still join to missing textures or red ERROR models because the content was never sent to them.

  • Job 1: the server must have and mount the addon, or it cannot run it at all.
  • Job 2: players must download the addon’s content, or their client cannot render its models, materials or sounds.

Lua is not content. Server Lua is sent to clients automatically by a separate system, so a pure Lua admin tool, round controller or gameplay tweak does not need to be added to client download lists. The engine treats scripts and assets differently: Lua is included and sent as code, while models, materials and sounds are looked up as files on the client. If those files are absent, the client falls back to purple and black checkerboards or a large red ERROR.

Keep the two problems apart when you troubleshoot. “The addon does nothing” is a server-side mounting problem. “The addon works but looks wrong” is a client download problem. A heavy addon list that makes the server stutter in play is a third, separate issue (hooks, timers and entities running on the server), and it is not fixed by anything in this guide.

The matrix shows which job each type of addon needs.

Which job does each addon type need?
Job 1 = the server mounts it. Job 2 = players download its content.
Addon containsServer must mount itAdd with resource.AddWorkshop
Lua only (admin tools, gamemode logic)YesNo
Models, materials or soundsYesYes
The current Workshop mapYesAutomatic
A gamemode with a workshopidYesAutomatic
Lua plus content (weapons, NPCs)YesYes
Lua reaches players on its own; models, materials and sounds do not. That is why an addon can work while looking broken.

Use a Workshop collection to install addons on the server

For most community servers, a Workshop collection is the tidiest way to mount addons on the server. Put the addons you want into a Steam Workshop collection and make sure the collection is Public or Unlisted. A private or friends-only collection cannot be read by the server, so nothing will download from it at startup.

If you are self-hosting and the base dedicated server itself may be stale, update that first with steamcmd +login anonymous +force_install_dir <dir> +app_update 4020 validate +quit. That removes one variable before you start blaming addons.

Default Workshop route

  1. Create or tidy your collection so it contains the server addons you want mounted.
  2. Launch the server with the collection ID and your game server login token.
  3. Set the gamemode with its folder name if needed.
  4. Restart and read the console before adding more.
./srcds_run -game garrysmod +maxplayers 32 +host_workshop_collection 157384458 +sv_setsteamaccount <token> +gamemode sandbox +map gm_construct

The ID for +host_workshop_collection is the number at the end of the collection’s Workshop URL. On every start, the server downloads the collection, mounts all its addons and checks them for updates. If you included nested collections, those are downloaded too. A big collection makes restarts slower because of that update check, but you get one list to manage and the server stays on the same versions as the Workshop.

The collection route also helps with updates because the server checks the listed items every time it starts. Since the 23 July 2025 update, the console logs how many Workshop addons were mounted, and empty .gma files are rejected instead of quietly wasting your time. On the Windows dedicated server window, there is now a box for a Workshop collection as well, so this is no longer a launch-line-only feature.

Back up garrysmod/data before a big addon pass. That folder is where addons often keep settings and player data, so it is the part most worth saving before you swap, remove or update anything.

Follow an addon from the collection to the player and you can see where each step can break.

From Workshop collection to player
Where each step happens, and what proves it worked
Server side, on every start
Public or unlisted collection
on start
Server downloads, updates and mounts
console
Mount count logged
Player side: current map and gamemode
Map (.bsp) and gamemode with workshopid
automatic
Player downloads from Steam
Player side: every other content pack
Models, materials, sounds
workshop.lua
Player downloads from Steam
The collection only handles the server side, plus the current map and gamemode. Every other content pack needs its own resource.AddWorkshop line in workshop.lua.

What the collection does not do

A collection is mainly a server install tool. It does not automatically make every addon in that collection available to clients. The current map is made available for client download automatically when its .bsp name matches, and the gamemode is made available automatically if its gamemode .txt has a workshopid. In the console, you will see Making workshop map available for client download and Making workshop gamemode available for client download. Everything else still needs its own client download handling.

Choose how the server reads Workshop IDs and how it updates

If you like the collection route, the default behaviour is sensible: the server checks it on every restart and mounts the current Workshop versions. Leave that on if you want your server to track author updates automatically. It costs startup bandwidth and some restart time, but it keeps versions aligned, which matters most for Workshop maps and gamemodes.

When to set host_workshop_autoupdate 0

Turn automatic Workshop update checks off only when you have a clear reason. The usual one is control: if you are running an event, preserving a stable build or you do not want an addon author’s broken or malicious update arriving on your next restart, host_workshop_autoupdate 0 stops that automatic check. The trade-off is version drift. If a map on the server goes out of date compared with the Workshop version clients have, players may be unable to join.

How do you tell if leaving autoupdate off helped or hurt? It helps when your server stops changing unexpectedly between restarts. It hurts when join problems start around a Workshop map or gamemode that previously worked and nothing else in your setup changed.

The newer cfg/srcds_workshop_ids.txt option

If your host panel does not expose launch parameters cleanly, or you just want the Workshop ID list inside the server files, you can now create cfg/srcds_workshop_ids.txt yourself and list item IDs there instead of using +host_workshop_collection. This is useful on rented servers where startup fields are hidden or overwritten.

"my_workshop_addons"
{
 "1" { "wsid" "123277559" }
 "2" { "wsid" "111412589" }
}

This file is direct item management, so the organisation is your responsibility. The benefit is clarity and easy editing inside the server files. The cost is that you lose the convenience of curating the list from a Workshop collection page. In both cases, the test is the same after restart: look for the Workshop mount count and then confirm the expected addon behaviour in game.

Use resource.AddWorkshop only for content players must download

Once the server can mount the addon, decide which items clients actually need. For Workshop-based content, that means placing resource.AddWorkshop("<ID>") calls in a server-side Lua file such as garrysmod/lua/autorun/server/workshop.lua.

-- garrysmod/lua/autorun/server/workshop.lua
-- one line per Workshop item that has models, materials or sounds
resource.AddWorkshop("123456789") -- example: a prop or playermodel pack
resource.AddWorkshop("123277559") -- example: a map's texture pack
-- no lines for Lua-only addons, and never the collection ID

Use the individual Workshop item ID, not the collection ID. That is a common mistake. A collection tells the server what to mount; resource.AddWorkshop tells clients which Workshop items to fetch as downloadable content. They are related, but not interchangeable.

Only add addons that contain models, materials or sounds. Skip pure Lua addons. Adding Lua-only items to client downloads does nothing useful because the server already sends Lua by another path. This is why generator sites that dump every addon from a collection into a ready-made workshop.lua are a bad fit for most servers: they turn a tidy install list into an inflated download list, which slows joins and creates more to audit when a player reports missing content.

There is also a hard limit of 8192 downloadable files shared by everything added with the resource.Add* functions. That is another reason to keep this file focused on actual client assets instead of shoving every addon into it “just in case”. The cost of an overstuffed list lands on your players as longer joins, not on the server, which is why it is easy to miss.

If you upload your own content pack to Workshop for this purpose, set the Workshop item type to ServerContent. That is the type meant for packs whose only job is to deliver shared models, materials and sounds to your players.

One more complication: players can choose in their own settings which downloads they accept. So if only some people report missing assets while your setup is otherwise correct, the problem can be on the client side rather than in your server files.

Pick the right download method: WorkshopDL, FastDL or ServerDL

All three get files onto a player’s PC. The difference is where the files come from, how fast they arrive and what goes wrong when they fail.

WorkshopDL vs FastDL vs ServerDL
WorkshopDLFastDLServerDL
Files come fromSteamYour web serverThe game server
SpeedFast, up to about 2 GB per .gmaFile by file, .bz2 firstAbout 64 kb/s
Changed files re-sentYesNo, if the name is unchanged–
Load on the game serverNoneNoneCan lag it
Use it?YesWhen neededNo
WorkshopDL is the default for Workshop content. FastDL is for files that are not on the Workshop. ServerDL stays off.
Method How it works Cost on your setup Trade-off for players Practical verdict
WorkshopDL Steam Workshop plus resource.AddWorkshop. The current map and gamemode can also be made available automatically from the Workshop collection. Startup downloads and disk writes when the server updates Workshop items. Client content comes from Steam rather than your game server. Join time rises if you add unnecessary Workshop items, but it is efficient for real content packs. It can handle a .gma of up to about 2 GB in one go. Best default for Workshop-based Garry’s Mod server addons.
FastDL An HTTP web server set with sv_downloadurl "http://your-web-server/garrysmod/" plus resource.AddFile or resource.AddSingleFile. Bandwidth and storage move to the web server. The client looks for a .bz2 compressed copy first. File-by-file delivery is flexible, but if a file changes and keeps the same name, players who already have it do not re-download it. Useful when you need non-Workshop file control, but it needs disciplined file management.
ServerDL The game server itself sends files with sv_allowdownload 1. Uses the game server for content transfer and can lag the server if download requests are spammed. It is capped at about 64 kb/s. Slow joins and poorer server responsiveness while players download. Keep it off with sv_allowdownload 0 when using Workshop or FastDL.

For most servers, the sensible default is WorkshopDL for Workshop content and FastDL only when you need file-by-file HTTP delivery for files that are not being handled well by Workshop. ServerDL is effectively obsolete because it pushes content traffic through the game server itself, which is the one place you do not want busy serving files during joins.

Legacy addon folders still work, but the layout must be exact

Not every addon comes through the Workshop. Manual, non-Workshop addons still work if the folder layout is correct. The important word is exact. Garry’s Mod scans known top-level folders inside an addon. If the files sit one folder too deep, the server does not find them at all.

Correct
garrysmod/addons/my_addon/
  lua/
    autorun/
      server/
        sv_my_addon.lua
  models/
  materials/

Wrong
garrysmod/addons/my_addon/
  my_addon/
    lua/

The common mistake is that extra nested folder under garrysmod/addons/<addon_name>/. It looks harmless in a file manager, but the game only sees the top level it expects, so nothing inside the extra layer is mounted.

Allowed top-level folders inside an addon include:

  • backgrounds, data_static, gamemodes, lua, maps, materials, models, particles
  • resource/fonts, resource/localization, scenes, scripts/vehicles, sound

Gamemodes belong in garrysmod/gamemodes/<name>/ or inside an addon’s gamemodes folder. If you set a gamemode with +gamemode, use the folder name of the gamemode, not the display name.

On Linux, file and folder names are case-sensitive. That matters for both legacy addons and anything you copy into FastDL storage. Using lower-case folder names avoids a whole class of “works on Windows, missing on Linux” problems. The trade-off with legacy addons: you get full control and nothing changes on restart, but you update them by hand, and players still need the content delivered by FastDL or a Workshop copy.

Troubleshoot missing textures, ERROR models and content from other Source games

Since the 23 July 2025 update, Garry’s Mod includes most Counter-Strike: Source and Half-Life 2 episode content by default. That does not include maps, voice lines or music, but it does change the usual diagnosis. Pink textures and red ERROR models are now far more likely to be an addon packaging or download problem than a missing CSS install.

Addon not working? Find the broken job
An addon is missing, broken or shows ERROR models
Does the addon do anything on the server at all?
No
Job 1: not mountedCollection public or unlisted? Legacy folder one level too deep or wrong case on Linux?
Yes
Is there a red [ERROR] line with a file path?
Yes
Broken LuaThe path names the addon. Fix or remove it, then restart.
No
Do players see purple and black textures or ERROR models?
Yes
Job 2: no downloadAdd the content pack with resource.AddWorkshop, or serve it by FastDL.
Only some players
Those players have downloads switched off in their own settings
Start with the addon that is misbehaving and work down. Most answers are in the console or in workshop.lua.
Symptom Likely cause First fix
Addon features run, but players see purple and black textures or red ERROR models The server mounted the addon, but clients did not download its models, materials or sounds Add the content addon’s item ID with resource.AddWorkshop or serve the files by FastDL
Current Workshop map downloads, but a prop pack from the same collection does not Expected collection behaviour: the current map and gamemode are auto-shared, other content is not List the content pack itself in workshop.lua
Only some players report missing content Those players may have downloads switched off in their own settings Check your server config first, then ask affected players to confirm downloads are allowed
An addon does nothing at all on the server It was never mounted, or a legacy addon is one folder too deep or wrongly cased on Linux Check the collection or folder layout, then restart and read the console
Pink textures persist after the July 2025 game update Usually bad addon packaging or a broken download path, not “install CSS” Check the addon’s content delivery before chasing other game mounts

What mount.cfg does and does not do

A dedicated server can still mount content from other Source games through garrysmod/cfg/mount.cfg. That helps the server access that content. It does not send those files to players.

"mountcfg"
{
 "cstrike" "C:\steamcmd\css\cstrike"
}

This matters because admins sometimes mount another game and assume client missing textures should disappear. They will not, unless the clients already have that content locally or receive it by another delivery method. So treat mount.cfg as a server-side compatibility tool, not a client download solution.

Check that it loaded: read the console after every restart

Most addon problems are obvious in the restart console if you look early enough. Since the July 2025 update, the server logs how many Workshop addons were mounted. Use that as your first sanity check after every restart: if the count is lower than expected, stop there and fix the mount problem before chasing missing content reports.

Then watch for the automatic client-download lines: Making workshop map available for client download and Making workshop gamemode available for client download. If those do not appear when you expect them, the map or gamemode side is not set up the way you think it is.

Lua errors tell you which addon actually broke. On the server console, server-side errors appear in blue text and client-side errors in yellow. The useful part is the file path and line number:

[ERROR] addons/my_addon/lua/autorun/server/sv_my_addon_autorun.lua:2: attempt to call global 'Print' (a nil value)

That example points straight at a specific file and line, so you do not need to guess which addon is at fault. Fix the first clear error you see, restart, then read again. Chasing later knock-on errors first wastes time.

If the console says Couldn't include file '...' (File not found), the usual cause is simple: files were added while the server was running. Garry’s Mod does not always re-scan or include newly added files the way people expect during a live session. Restarting forces a clean mount and include pass, which costs a brief downtime but gives you a consistent result.

Add addons in small batches and restart between batches. That keeps the fault domain narrow. It is much easier to isolate one bad Workshop item, one bad folder layout or one bad Lua file when you changed only a little since the last clean boot.

When the control panel or plan is the bottleneck

If you can set the startup line, place files in garrysmod/lua/autorun/server/ and garrysmod/addons/, restart cleanly and read the full console, you already have enough control for sensible addon management. If you cannot do those things, the problem is not really Garry’s Mod; it is admin access.

The signs are straightforward: no place to set +host_workshop_collection or +sv_setsteamaccount, no file access for workshop.lua, no way to create cfg/srcds_workshop_ids.txt, or no proper console output when a Lua error hits. At that point, changing addon strategy will not fix the friction. If your current rented setup is awkward in those areas, our Garry’s Mod server hosting comparison is the sensible place to check what level of control you actually get.

Need a setup that makes Workshop and file access straightforward?

If your current server makes launch options, file placement or console logs harder than they should be, compare providers before you pile on more addons. Good admin access matters more than flashy panel extras when you are maintaining a Garry’s Mod server.

Compare the best Garry’s Mod server hosts

Garry’s Mod server FAQ

Do players need to subscribe to my Workshop collection to join?

No. The server can make the current Workshop map and gamemode available automatically, and other content can be delivered with resource.AddWorkshop or FastDL. Subscribing in advance only saves them download time; what matters is that players allow downloads in their own settings.

Why do players see purple and black textures or ERROR models?

That almost always means the client is missing models, materials or sounds. The server may have mounted the addon correctly, but the content was not delivered to players, was packaged badly, or the player refused downloads. Since July 2025, this is usually an addon delivery problem rather than a missing CSS install.

Should I add every addon with resource.AddWorkshop?

No. Add only Workshop items that contain content clients must render or hear. Pure Lua addons are already sent by the game’s Lua system, so adding them to workshop.lua only increases join time and adds clutter to a download list that should stay focused.

Can I add addons without restarting the server?

Not reliably. If you copy files in while the server is running, Garry’s Mod can throw Couldn't include file '...' (File not found) because the file was not present during the clean startup include pass. A restart is the safe way to force mounting, include checks and Workshop update checks into a known state.

Do I still need Counter-Strike: Source content for my server?

Usually less than before. Most Counter-Strike: Source and Half-Life 2 episode content now ships with Garry’s Mod by default, aside from maps, voice lines and music. If you still mount another Source game with mount.cfg, remember that it only helps the server; it does not give players that content automatically.

More for Garry’s Mod server admins

Choosing a host, sizing a server and running one yourself.

Garry’s Mod updates and host panels change. Many panels have a Workshop collection box that fills in the same launch option for you; where your panel differs, follow it and use the paths, commands and console lines here as the reference. Last checked October 2026.