Skip to content

How to use Custom Maps and setup FastDL for Team Fortress 2

Build your mapcycle.txt file, add custom map files, and configure sv_downloadurl fast downloads to prevent slow loading screens.

Updated August 10, 2026
Team Fortress 2

This guide covers the map cycle, adding custom maps, and setting up a fast download (sv_downloadurl) so players are not stuck on the Source engine's painfully slow built-in download. Complete Getting started with your Team Fortress 2 server first.

The Map Cycle

tf/cfg/mapcycle.txt lists the maps the server rotates through, one per line:

ctf_2fort
cp_dustbowl
pl_badwater
koth_viaduct
cp_gravelpit
pl_upward
cp_steel
tf/cfg/mapcycle.txt

The server advances to the next map when the time limit (mp_timelimit) or round limit is reached.

To force a specific map on boot, set +map cp_dustbowl in the Startup tab arguments (or use the Startup map field).

For player-controlled rotation (voting, nominations, RTV), install MapChooser Extended, covered in SourceMod Plugins. With it, players vote on the next map near the end of each round.

Adding Custom Maps

  1. Find a map on gamebanana.com/maps, the TF2 Workshop, or another source.

  2. Download the .bsp file.

  3. Upload it to tf/maps/ via SFTP or the File Manager on your hosted Team Fortress 2 server.

  4. Add the map name (without the .bsp extension) to mapcycle.txt.

  5. Restart, or switch to it live with changelevel mapname.

Some maps come with extra files (custom textures, sounds, particles). Upload those to the matching tf/ subfolders (tf/materials/, tf/sound/, etc.) so the map renders correctly.

Playing a Custom Map on Your Own Client

A map you download from GameBanana is a .bsp, and on your own machine it goes in the same place it goes on the server:

steamapps/common/Team Fortress 2/tf/maps/
text

That is the folder the game loads maps from. A .bsp sitting there is playable immediately — no mapcycle.txt entry, no restart.

Maps you picked up by joining a server are a different case. They arrive on their own — as Valve's wiki puts it, "upon joining a server currently playing a custom map, the map files start downloading automatically if the player does not already have it" — but they land in tf/download/maps/, the engine's separate path for server-supplied content, not in tf/maps/. That is fine while you are connected and no help offline. If map cp_custom tells you the map is not found, copy the .bsp from tf/download/maps/ into tf/maps/.

Players can turn custom downloads off

The same wiki notes it "is possible to disable custom content downloads in the options menu; however, doing so prevents downloading custom maps from servers". If one player reports timing out on every custom-map server while everyone else connects, check that setting before you touch FastDL.

Enabling the developer console

You need the console to type map at all. Turn it on in Options → Keyboard → Advanced → Enable Developer Console, then open it with the backtick/tilde key (the one to the left of 1). Adding -console to the game's launch options does the same job, and -developer opens the console automatically on startup.

map offline versus changelevel on the server

They are not interchangeable.

  • map cp_custom changes the map and restarts the server. Run from the main menu it starts a new local server, which is how you load a custom map on your own machine without going through the Create Server dialog.
  • changelevel cp_custom changes the map on a server that is already running, without the restart. This is the one to use in your panel Console on a live server — map restarts and drops everyone.

Neither adds the map to rotation. That still needs the name in mapcycle.txt, as above.

Fast Downloads (sv_downloadurl)

The one thing to get right on a custom-map server

This is the single most important thing for any server running custom maps.

The Problem

Without sv_downloadurl, players downloading custom content from the game server are throttled to roughly 20 KB/s, a hard Source engine limit. A 60 MB custom map takes minutes, and players often give up and disconnect before it finishes.

The Fix

Host your custom files on a normal HTTP web server and point the game at it:

  1. Host the contents of tf/maps/ (and any custom tf/materials/, tf/sound/) on a web server, your own or a CDN.

  2. In server.cfg, set:

    sv_downloadurl "https://fastdl.yourdomain.com/tf/"
    sv_allowdownload 1
    sv_allowupload 1
    
  3. Mirror the server's folder structure on the HTTP host. A map at tf/maps/cp_custom.bsp on the game server must be reachable at https://fastdl.yourdomain.com/tf/maps/cp_custom.bsp.

Now custom downloads come from your fast HTTP server at full speed instead of the throttled game server.

Source supports bzip2-compressed fast-download files. Compress each .bsp to .bsp.bz2 and host both. Clients download the smaller compressed version and decompress locally, cutting download time further. Tools like bzip2 on the command line produce these.

Hosting Options

  • Your own web server: Full control, mirror the tf/ structure
  • A dedicated FastDL host: Some providers offer FastDL space specifically for this
  • A CDN or object storage (S3-compatible, etc.): Works as long as the path structure matches and files are publicly readable

sv_pure and Custom Content

sv_pure controls how strictly the server enforces client file consistency:

Value Effect
0 Anything goes; clients can use custom skins and content
1 Enforces consistency.txt; common for competitive
2 Strict; only stock content

Pick the value that matches your server's purpose

For trade and casual servers running lots of custom content, sv_pure 0 is typical. For competitive integrity, sv_pure 1 or higher.

Common Issues

  • Custom maps not downloading for clients: sv_downloadurl not set, or sv_allowdownload 0. Confirm both. Also confirm the file is actually reachable at the mirrored URL path (paste it in a browser).
  • Map downloads but textures are missing: The map's custom materials/sounds were not uploaded, or not mirrored to the FastDL host. Upload the full content set.
  • FastDL URL returns 404: Folder structure mismatch. The path after the base URL must exactly mirror the tf/ structure (e.g., /tf/maps/yourmap.bsp).
  • Map not in rotation: Confirm it is listed in mapcycle.txt with the correct name (no .bsp extension) and that the .bsp is in tf/maps/.

Made with 💜 by GameServerKings

Need a Team Fortress 2 server?

Deploy an instantly-provisioned Team Fortress 2 server on high-clock hardware — DDoS protected, no contracts, cancel anytime.

From $5.40 /month