---
title: "How to use Custom Maps and setup FastDL for Team Fortress 2"
description: "Build your mapcycle.txt file, add custom map files, and configure sv_downloadurl fast downloads to prevent slow loading screens."
url: "https://www.gameserverkings.com/knowledge-base/team-fortress-2/maps-and-fastdl/"
category: "Team Fortress 2"
category_url: "https://www.gameserverkings.com/knowledge-base/team-fortress-2/"
published: "2026-03-29T19:09:34.204Z"
updated: "2026-08-10T07:53:27.990Z"
source_format: "markdown"
site: "GameServerKings"
---

# How to use Custom Maps and setup FastDL for 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](/knowledge-base/team-fortress-2/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:

```text title="tf/cfg/mapcycle.txt"
ctf_2fort
cp_dustbowl
pl_badwater
koth_viaduct
cp_gravelpit
pl_upward
cp_steel
```

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](/knowledge-base/team-fortress-2/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](/games/team-fortress-2/).

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:

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

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/`.

> [!NOTE] 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)

> [!IMPORTANT] 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:

   ```cfg
   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.

### Compressing Files (Optional but Recommended)

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 |

> [!TIP] 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/`.

## What to Read Next

- [SourceMod Plugins](/knowledge-base/team-fortress-2/sourcemod-plugins/) for MapChooser Extended (map voting and RTV)
- [Game Mode Servers](/knowledge-base/team-fortress-2/gamemodes/) for maps tied to specific game modes
- [Getting started with your Team Fortress 2 server](/knowledge-base/team-fortress-2/getting-started-with-your-team-fortress-2-server/) for the `server.cfg` settings referenced here
- [Team Fortress 2 Admin Commands](/knowledge-base/team-fortress-2/admin-commands/) to change maps and run map votes from the console

---

Made with 💜 by GameServerKings
