# cs2-modded-server turns a Counter-Strike 2 server into a mode switcher

> The kus/cs2-modded-server repository ships a Counter-Strike 2 dedicated server pre-wired with Metamod and CounterStrikeSharp, twenty-odd game modes selectable from chat or console, per-mode map presets, and install scripts for Google Cloud, Linux, Docker and Windows. Its main operational hazard is the one it documents first: a Valve update can break the server until the community refreshes its signatures.

**kus/cs2-modded-server** — Modded Counter Strike 2 (CS2) Dedicated Server with Metamod and CounterStrikeSharp for Windows and Linux that can automatically be setup on Google Cloud.

- Repository: https://github.com/kus/cs2-modded-server
- Website: https://buymeacoffee.com/kus
- Stars: 774 · Forks: 130
- Language: Shell
- License: LGPL-3.0
- Published: 2026-10-21 · Updated: 2026-10-21 · Language: en
- Canonical page: https://hysenlabs.com/projects/kus-cs2-modded-server

## The update treadmill is the first thing the README warns about

The most important callout in the documentation is at the very top, and it is about breakage rather than features.

It asks whether things are broken, and explains the situation. If there has been a recent big CS2 update and the server is broken, the answer is to wait for the community to update their signatures and mods. It says this is not a quick process, that Valve gives no notice, and that people do it in their free time.

The instruction is concrete about how to check. Go to the cs2-signatures repository, and if CounterStrikeSharp does not have two green ticks it is likely the server will not work and you need to wait for an update. And the plea that follows is worth quoting, because it is unusual in project documentation: please do not make an issue, there is literally nothing I can do.

This is the honest shape of the project. A modded Counter-Strike 2 server depends on memory inspection of the running game, and that technique breaks whenever Valve changes the binary. Nothing in the repository can prevent that, so the maintenance burden is distributed to a volunteer community, and the project is candid that it is a race you might lose.

For a person running a server for friends or a community, that is a cost worth knowing about before you set it up. The last push was on 2026-10-19, and the last release tag is v1.0.56 from 2026-01-26, with v1.0.55 from 2025-09-18 and v1.0.54 from 2025-08-16 before it.

## Twenty game modes, switchable from chat or console

The feature at the centre of the project is that you can change the active game mode on the server from chat or from the server console, and the maps change with it.

Each game mode has a handful of maps preset so you are ready to go, and the documentation has a section on setting maps for different modes. The mode list is long enough to be worth categorising.

Competitive and Practice both use MatchZy, and the difference is stated in parentheses: Practice is for recording grenade throws and similar. Wingman allows more than four players. Then there is GunGame, Custom Deathmatch, Prefire practice, Retakes and Executes, followed by the workshop-dependent modes: Capture The Flag, One In The Chamber, 1v1 with arenas, ScoutzKnivez, KZ, BHop, Surf, Mini Games, Deathrun, Course format, Hide n Seek, Battle Royale, Soccer and Battle Ball.

Most of the workshop-based modes need a Steam API key, and the documentation links that requirement to the section on playing workshop maps and collections. That is a real dependency for a large share of the modes, since workshop content has to be resolved through the Steam Web API.

The modes are also configurable beyond the preset. You can enable modifiers in game modes from the `!settings` menu in chat, and the documented example is Competitive with random rounds. Three modifiers are named: Random Rounds, where every round is a surprise; WarcraftMod, an open-source Warcraft mod for CS2 with a full RPG system; and Roll The Dice, which gives a positive or negative effect for the current round. Bunny hopping is listed as well.

## Metamod and CounterStrikeSharp do the real work

The plugin stack is where the modding happens, and the repository ships a table of what is installed and why.

Metamod:Source at version `2.0.0-1483` sits between the game and the engine and allows plugins to intercept calls that flow between them. That is the interception layer everything else depends on.

CounterStrikeSharp at `1.0.377` attempts to implement a .NET Core scripting layer on top of a Metamod Source Plugin, which lets developers write plugins that interact with the game server in a modern language, C#. This is the reason a game mode can be switched at runtime at all, since it is what makes the mode logic reconfigurable rather than baked into a compiled binary.

Three more plugins round out the visible list. MultiAddonManager at `1.6.2` allows you to use multiple workshop addons at once and have clients download them, which is what makes the workshop game modes practical. ServerListPlayersFix at `2.0` fixes players not showing up in the server browser, a real problem for a server whose whole purpose is being found. MovementUnlocker at `2.0.1` removes the top speed limit from players on the ground so it feels like CS:S, which is what the surf, kz and bhop modes need.

The verification procedure is short and worth memorising. In the server console, run `meta list` and you should see CounterStrikeSharp in the output, then run `css_plugins list` and you should see a few plugins. If you see content in both, everything is working.

The project is LGPL-3.0 licensed, its primary language is Shell, and it is written as a set of scripts rather than a program.

## Four install paths, and the scripts that run every time you boot

The install surface is broad: running on Google Cloud, running on Linux, running in Docker and running on Windows.

The scripts are named by platform, and the same three commands cover Linux, Windows and Google Cloud. Every time you want to boot the server you run `gcp.sh` on Google Cloud, `install.sh` on Linux or `update.bat` on Windows, and each of them ensures your OS is up to date, CS2 is up to date, and pulls down the latest patches from the mod.

That last point has a consequence the documentation states plainly. Any changes you have made to the files in the mod will be overwritten. The solution is a custom files folder, where you mirror the contents of the `game/csgo/` folder and put the files you want to tweak in the same spot, so they always overwrite the mod's default files. There is a custom_files/ directory at the root and a custom_files_example/ alongside it, and the quick setup lists creating your custom files for hostname, admins and similar as a distinct step.

Docker is supported with a Makefile that exposes three targets:

```
image-build:
	docker build --platform=linux/amd64 . -t cs2:latest

run:
	docker run --platform=linux/amd64  -v ${PWD}/cs2:/home/steam/cs2 -v ${PWD}/custom_files:/home/custom_files cs2:latest 
```

A third target, run-bash, opens an interactive shell in the container with the same mounts, which is what you want when a plugin is failing and you need to look at the files.

The compose file gives the resource shape of a server: two CPUs, a 3500m memory limit, and ports 27015 and 27020 published on both TCP and UDP, since a Source 2 server needs both for game traffic and for the Steam query port. The compose file also binds the custom_files and game directories from the host and keeps the steam home directory in a named volume, so the game files survive a container rebuild.

## The Docker image moved to Steam Runtime 4 for a concrete reason

The Dockerfile explains its base image choice in a comment, and the reason is a good illustration of how much of this depends on the surrounding platform.

The base is the Steam Runtime 4 container image, which is Debian 13 trixie. The comment records that Steam Runtime 3, sniper, is Debian 11 bullseye, whose security suite was retired in August 2026: the index is still published but the .deb files are gone, so every apt-get install on that base now fails with 404s.

The comment then says upstream CS2 projects moved for the same reason, naming joedwards32/CS2 in September 2026 and noting that Source2ZE build containers ship steamrt3 plus steamrt4. The last sentence is the compatibility check that made the move safe: all the plugin binaries shipped in game/csgo need at most GLIBC_2.29, well below the 2.41 the new image provides, so they load unchanged.

That is a two-line verification of the most important risk in the whole image, and it is exactly the kind of thing that gets broken silently.

The rest of the Dockerfile is ordinary container work. It installs dnsutils, lib32z1 and wget with no recommended packages, fixes the locale generation and reconfigures locales for a noninteractive Debian frontend, creates a steam group and user because Debian 13 dropped the adduser package from the base image, and gives that user passwordless sudo through a sudoers file. The environment variables exposed are TICKRATE, MAXPLAYERS, API_KEY and STEAM_ACCOUNT, with HOME set to /home/steam/cs2.

The comment about not pinning versions is also deliberate. No version pins, because they tie the build to one Debian point release and break on the next.

## RCON behaves differently here, and there is a known workaround

One operational quirk is documented prominently, and it has its own callout.

Using RCON while connected to the server does not work, and the documentation links a discussion about it. Three workarounds are listed.

First, the project includes CS2Rcon, which allows admins to use !rcon in chat. Second, you can disconnect from the server and use `rcon_address IP:PORT` in the console, after which rcon commands work. Third, you can use an external RCON program that has implemented the RCON protocol, and one is linked.

That is a genuinely useful piece of documentation, because the failure mode is silent. An admin who has never run rcon against a Source 2 server will not necessarily connect the symptom to being connected.

The documentation also collects the operational links into one list. There is a section on accessing the admin menu, on changing game mode, on changing maps and on player commands, plus the four platform guides. The admin menu is reached through the `!settings` chat menu, which is also where modifiers are enabled.

For the Steam API key requirement, the documentation treats it as a first-class setup item rather than a footnote, because so many of the game modes depend on workshop content being resolvable. A server that is set up without one will start fine and fail when a player tries to load a workshop map.

## Conclusion

Adopt cs2-modded-server if you want a Counter-Strike 2 server with matchmaking-style practice, retakes, execs and workshop game modes without assembling Metamod, CounterStrikeSharp and the plugin set yourself, since the install scripts do all of that and the game modes are switchable at runtime. Skip it if you need a vanilla competitive server, or if you cannot accept a service that can break on an unannounced game update, which the README describes as a matter of when, not if. Verify first that CounterStrikeSharp has two green ticks on the signature repository the README points to, that you hold the Steam API key several modes require, and that the platform you are on is one of the four the install scripts cover.

## FAQ

### How do I install the cs2-modded-server?

Create your firewall rules, provision a server on Google Cloud or locally, SSH in, run the install script, create your custom files, add admins, then stop and restart the server with the platform script. The scripts are `gcp.sh` on Google Cloud, `install.sh` on Linux and `update.bat` on Windows.

### What happens when Valve releases a CS2 update?

The server can break until the community updates its signatures and mods, and the README says this is not a quick process because Valve gives no notice and the work is done in people's free time. It tells you to check the cs2-signatures repository and wait until CounterStrikeSharp has two green ticks, and asks you not to open an issue because nothing can be done about it.

### Which game modes need a Steam API key?

Most of the workshop-based modes, including Wingman, GunGame, Custom Deathmatch, Capture The Flag, 1v1, ScoutzKnivez, KZ, BHop, Surf, Deathrun, Hide n Seek, Battle Royale, Soccer and Battle Ball. Competitive and Practice use MatchZy and do not list the key requirement.

### How do I keep my own configuration when the server updates?

Put the files you want to change in the custom files folder, mirroring the contents of the `game/csgo/` folder, and they will always overwrite the mod's default files. Any direct changes to the mod's own files are overwritten when the install or update script runs.

## Sources

- [kus/cs2-modded-server on GitHub](https://github.com/kus/cs2-modded-server)
- [License: LGPL-3.0](https://github.com/kus/cs2-modded-server/blob/master/LICENSE)
- [Project website](https://buymeacoffee.com/kus)
- [README](https://github.com/kus/cs2-modded-server/blob/master/README.md)
- [Releases](https://github.com/kus/cs2-modded-server/releases)

---

Hysen Labs editorial analysis, written from the project's own repository and release notes. Cite the canonical page: https://hysenlabs.com/projects/kus-cs2-modded-server
