How to make a custom FiveM minimap
Making a minimap is not a drawing problem. The art is the easy half: the hard half is producing twelve texture dictionaries that match, byte for byte in structure, what the game already expects to find, and doing it without breaking the container format they live in. This guide covers all three ways people actually do it, and is specific about where each one goes wrong.
Short answer: A FiveM minimap is a 6144 × 9216 image cut into six 3072 × 3072 land tiles in a 2 × 3 grid, plus a matching set of sea tiles, a LOD texture and the geometry they are drawn onto. Each tile is compressed as DXT5 with a full mipmap chain and packed into a .ytd texture dictionary, which is an RSC7 container whose header describes the memory the game will allocate. You can build that by hand with CodeWalker, OpenIV and an image editor; you can generate it with a browser or in-game editor; or you can take a finished pack and change only the branding. The manual route is the only one that gives you complete control and the only one that can silently produce a file the streamer refuses.

#What you are actually building
Before you open anything, get the target clear. The game does not load "a minimap". It loads a fixed set of named texture dictionaries, draws them onto a fixed set of geometry, and samples them at zoom levels defined in game data. Every one of those pieces has to be right or the result is wrong in a specific, recognisable way.
| Property | Value |
|---|---|
| Full map resolution | 6144 × 9216 |
| Grid | 2 columns × 3 rows |
| Tile resolution | 3072 × 3072 |
| Land dictionaries | 6 — minimap_0_0 … minimap_2_1 |
| Sea dictionaries | 6 — minimap_sea_0_0 … minimap_sea_2_1 |
| Zoomed-out pause map | 1 LOD texture, minimap_lod_128 |
| Geometry | 65 .ydd drawable dictionaries |
| Compression | DXT5 (BC3), full mip chain |
| Runtime cost | ≈ 113 MB of VRAM, the same as the stock map |
The specification a correct replacement has to hit. Full detail in [the technical specification](/guides/minimap-technical-specification).
The aspect ratio is not a choice. San Andreas is much taller than it is wide, and the 2 × 3 grid is what the base game’s geometry asks for. Change the grid and nothing lines up no matter how good the artwork is.
#The three routes
| Route | What it gives you | What it costs | Realistic time |
|---|---|---|---|
| By hand | Total control over every pixel | Tooling knowledge, and the ability to break the container | Days for a first attempt |
| Editor or generator | Zones, labels and branding on a base map somebody else made | A subscription or a one-off licence | An afternoon |
| Ready-made pack | A finished, tested map immediately | You did not choose the base art | Five minutes |
Most people who ask how to make a minimap want the second or third. It is worth being honest with yourself about which problem you have: if you want the stock map in your colours with your logo on it, that is a rendering and branding problem, not a drawing one, and the manual route is a slow way to get there.
#Route one: by hand
The traditional pipeline is CodeWalker or OpenIV to get the stock textures out, an image editor to make the new art, a DDS converter, and CodeWalker to build the dictionaries back up. Here is the order that works.
- Extract the stock map. Open the game files in CodeWalker or OpenIV and export the existing
minimap_*.ytdland and sea dictionaries. You want them for two reasons: as a reference for exact naming, and as a size and format template. - Assemble a single flat image. Stitch the six land tiles into one 6144 × 9216 canvas. Working on separate tiles is how you get seams, because any effect with a radius — a glow, a blur, a drop shadow — behaves differently at a tile edge than in the middle.
- Work at 2× if you can afford it. Build the master at 12288 × 18432 and resample down at the end. It is the difference between a smooth coastline and a stair-stepped one, and it is what keeps street labels legible once the game compresses them.
- Do the sea as its own layer set. Keep the ocean on separate layers from the start. You will export it separately, and rebuilding it later from a flattened image is painful.
- Split into tiles last. Once the flat image is final, cut it into six 3072 × 3072 pieces, in column-row order, and name them to match the dictionaries they are going into.
- Convert to DDS. DXT5 (BC3), mipmaps generated, no sRGB conversion surprises. Check one tile in a DDS viewer before doing all six.
- Rebuild the dictionaries. Import each DDS into its
.ytdin CodeWalker and let it write the file. Do not patch bytes into an existing file with a hex editor, for reasons the RSC7 section below explains. - Package the resource. A
fxmanifest.lua, aclient.luawith the zoom calls, and astream/folder containing the dictionaries, the LOD texture and the.yddgeometry.
CodeWalker is the tool most people settle on because it can open, edit and write these formats directly. OpenIV is still the better extractor for some archives. Working with them both is covered in CodeWalker map editing.
#Getting the tile grid right
Six land tiles, two columns by three rows. The naming is minimap_<row>_<column>, so the six land dictionaries run minimap_0_0, minimap_0_1, minimap_1_0, minimap_1_1, minimap_2_0 and minimap_2_1, and the sea set mirrors them exactly with the minimap_sea_ prefix.
column 0 column 1
┌──────────────────┬──────────────────┐
row 0 │ minimap_0_0 │ minimap_0_1 │ 3072 px
├──────────────────┼──────────────────┤
row 1 │ minimap_1_0 │ minimap_1_1 │ 3072 px
├──────────────────┼──────────────────┤
row 2 │ minimap_2_0 │ minimap_2_1 │ 3072 px
└──────────────────┴──────────────────┘
3072 px 3072 px
total: 6144 × 9216The file names are not decorative. They are what the .ydd geometry asks the streamer for, which is also why every minimap on every server collides with every other one. If you invent your own names, the geometry will not find them and you get an empty map.
- Cut on exact 3072 boundaries. A one-pixel offset shows as a visible seam along a straight road.
- Do not add a bleed or a border. The tiles butt together edge to edge.
- Keep the same tile at the same grid position in the sea set as in the land set.
- Do not rotate or flip anything to "make it fit". If it needs flipping, your export order is wrong.
#DXT5, mipmaps and the alpha channel
DXT5, also called BC3, is block compression: the image is divided into 4 × 4 pixel blocks and each block is stored as two endpoint colours plus interpolation indices, with the alpha channel stored separately at higher precision than DXT1 can manage. That alpha channel is the reason the minimap uses DXT5 rather than DXT1 — the map is drawn over the world with transparency, and DXT1’s one-bit alpha is not enough.
| Choice | Effect on a minimap |
|---|---|
| DXT5 with mips | Correct. What the stock map uses. |
| DXT1 | Alpha collapses to one bit. Hard edges where the map should fade. |
| Uncompressed (A8R8G8B8) | Roughly four times the memory for no visible gain, and stutter when it streams. |
| No mipmap chain | Shimmering and aliasing on the radar while driving. |
| BC7 | Better quality per byte, but not what the stock pipeline expects here. |
The mip chain matters more on a minimap than on almost any other texture, because the radar is a small window showing a heavily minified version of a very large image. Without mipmaps the hardware samples the full-resolution texture at radar scale and thin features — road centrelines, label strokes, the coastline — crawl and flicker as the player moves. A full chain from 3072 down to 1 is not optional.
#The RSC7 page trap
This is the part that is never in the tutorials and the part that ruins the most weekends. A .ytd is not a zip of DDS files. It is an RSC7 resource container: a 16-byte header followed by a compressed stream. The header carries two flag words that describe the memory layout the game must allocate before it inflates the payload into it.
The consequence is blunt: the game never looks at the file size. It allocates exactly what the header’s flag words say and decompresses the file into that allocation. Pixel data inside is packed into memory pages, and a texture never straddles a page boundary. Change what is inside without recomputing the page layout, the record size words and the header flags, and you have a file whose header promises one shape and whose payload is another.
| What you did | What you get |
|---|---|
| Rebuilt the dictionary with a tool that recomputes the flags | A working map |
Patched new pixel data into an existing .ytd | Checkerboard tiles, or missing map entirely |
| Increased the texture size without rebuilding | A resource the streamer refuses to load |
| Left the file uncompressed on disk | Oversized-asset warnings and slow first joins |
The second effect of the same design is that on-disk size tells you nothing about memory cost. A .ytd of a few megabytes on disk can need tens of megabytes of physical memory in game, because the payload is deflated and because pages are allocated whole. This is why the FiveM server console warns about assets above roughly 16 MiB of physical memory rather than about file sizes, and why a correctly built minimap of six 3072 px tiles sits at around 22 MB on disk while costing the same VRAM as the map it replaces.
The practical rule is short. Let CodeWalker write the file. If a workflow ever asks you to open a .ytd in a hex editor, or to rename a .dds to .ytd, stop. That is not how the format works, and the file it produces will fail somewhere between the server console and a player’s screen. The oversized-asset side of the same problem is covered in the oversized assets warning.
#Zoom data and the manifest
The radar samples the map at zoom levels defined in game data. In single-player modding that data lives in mapzoomdata.meta; on a FiveM server you do not ship a meta file, you set the same values at runtime from a client script. That is the whole reason a minimap resource has any Lua in it at all.
CreateThread(function()
SetMapZoomDataLevel(0, 0.96, 0.9, 0.08, 0.0, 0.0)
SetMapZoomDataLevel(1, 1.6, 0.9, 0.08, 0.0, 0.0)
SetMapZoomDataLevel(2, 8.6, 0.9, 0.08, 0.0, 0.0)
SetMapZoomDataLevel(3, 12.3, 0.9, 0.08, 0.0, 0.0)
SetMapZoomDataLevel(4, 22.3, 0.9, 0.08, 0.0, 0.0)
end)The arguments are the zoom level index, then the zoom scale, zoom speed, scroll speed and the two tile values — the same fields the meta file holds. If your map appears at the wrong scale next to the player blip, this is where it is coming from. Radar zoom settings goes through the numbers in detail.
fx_version 'cerulean'
game 'gta5'
this_is_a_map 'yes'
client_script 'client.lua'That is the whole manifest, and it is worth noticing what is not in it. Anything inside a stream/ folder is picked up automatically, so there is no files block and no data_file line. If a minimap you downloaded declares data files, find out what it is overriding before you start it.
#Route two: editors and generators
If what you want is your own zones, labels and branding rather than your own terrain, an editor does the container work for you and you never see an RSC7 header.
Browser editors such as the one at fivem-tools.com let you place gang zones, labels, images and map-wide tints over the GTA V map and export a stream-ready resource in one click, with a free tier limited to one generation per tool per day and a paid supporter tier at $15 a month for unlimited exports and larger export resolutions. In-game editors such as LMX Minimap Creator move the same job inside the game: you draw on the live map and the resource writes BC3-compressed minimap_*.ytd and minimap_sea_*.ytd files into its own stream folder. It is a one-off Tebex purchase listed at $29.99 and the code is escrowed apart from its config.
What neither can do is change the base map underneath. You are compositing onto somebody else’s terrain, coastline and road palette. That is usually fine, and it is exactly the wrong tool if the thing you dislike is the base map itself.
#Route three: start from a finished map
The third route is to take a map that is already built correctly and change only what you care about. For a lot of servers the honest requirement is "the stock map, in our colours, with our name on it", and that is a render-and-composite job rather than an art job.
That is what this site does: twelve colour themes over three base map styles, giving 36 maps — with postal codes, without postal codes, and a Google-style street map. The themes are black OBSIDIAN, white ALABASTER, gray GRAPHITE, red CRIMSON, blue COBALT, yellow SOLAR, green EMERALD, orange EMBER, purple VIOLET, pink MAGENTA, TOPO NIGHT and TOPO DAY. A map is $8.00 and each element you place in the browser studio — a logo, a server name, a Discord tag — is $1.00, with later edits at $1.00 per element. Every tenth account that registers gets a base map free. The export is the specification at the top of this page: 6144 × 9216 across 78 stream files, about 22 MB, no framework dependency, so it drops onto ESX, QBCore, Qbox, vMenu or a standalone server unchanged.
The catalogue is at all 36 minimaps and the branding workflow is described in custom FiveM minimaps. A comparison of every route, including the free packs, is in the best FiveM minimaps compared.
#Testing what you built
Whatever route you took, the test is the same and it takes two minutes. The radar and the pause map fail independently, which makes checking both a diagnosis rather than a formality.
| What you see | What it means |
|---|---|
| Both radar and pause map changed | Built and installed correctly |
| Pause map changed, radar did not | Client cache not cleared on that machine |
| Neither changed | Resource not started, or another resource is winning the name collision |
| Checkerboard tiles | A dictionary is missing or its container is malformed |
| Map at the wrong scale | Zoom data not set, or two resources setting it |
| New land over an old sea | You built the land tiles and not the sea set |
Check the server console at start too. Oversized-asset lines naming your minimap mean the compression or the resolution is wrong, and they are worth fixing before players find the same problem as missing textures elsewhere in the world.
#Which route is actually yours
- You want a different world. A fictional city, a custom map, a non-San-Andreas island: manual, and budget days rather than hours.
- You want gang territory or hood zones you can redraw. An editor. Nothing else makes the second revision cheap.
- You want the stock map in your colours with your logo on it. A themed map you brand, or a preset. Building that by hand is a slow route to a result you can buy.
- You want to learn the formats. Manual, once, on a copy of a single tile. It is genuinely educational and you will never fear a
.ytdagain. - You need it working tonight. A finished pack, free or paid, installed properly.
Installation is the same for all of them and is covered step by step in installing a custom FiveM minimap.
Questions
What resolution should a FiveM minimap be?
Which compression does a FiveM minimap use?
Can I make a minimap without CodeWalker?
.ytd without a tool that writes the RSC7 container correctly, and in practice that means CodeWalker, OpenIV or a generator that does the packing for you.Why is my custom minimap a checkerboard?
Do I need to ship mapzoomdata.meta?
SetMapZoomDataLevel in a client script, which is why minimap resources are server-side and need nothing installed by the player.How long does making a minimap by hand take?
Ready to pick a map?
Twelve themes on three base map styles, $8 each, instant download.