If you already have a pack and just need help with hosting it, skip to Setting up a GitHub Repository.

Understanding the Folder Structure

A Minecraft Resource Pack is essentially a folder which holds a lot of files with your custom textures and resources in them. The below file tree shows how this folder might be organised.

(This is adapted from the Minecraft wiki page on resource packs. I have simplified it to omit some paths which are more complex or less relevant for server resource packs.)

.├── pack.mcmeta├── pack.png└── assets    └── minecraft        ├── sounds        │   └── custom        │       ├── metronome.ogg        │       ├── white_noise.ogg        │       └── tones        │           ├── dial.ogg        │           └── square.ogg        ├── sounds.json        └── textures            ├── block            │   ├── black_wool.png            │   └── white_wool.png            └── entity                └── zombie                    └── zombie.png

Visually, this looks like:

The folder structure of my example resource pack.
The folder structure of my example resource pack.

We’ll go over each of these in more detail individually later on.

Creating Your Resource Pack

To create your resource pack, start by creating a new folder. This folder will serve as the root directory for your resource pack. Alternatively, you can download my example resource pack as a template:




If you’re not using my example pack, create the following files and folders inside the root folder:

Inside the assets folder, create a minecraft subfolder, and inside it create the subfolders:

Structuring Pack Meta Files

The pack.mcmeta file is a JSON file that provides information about your resource pack. Inside it, paste the following text:

{  "pack": {    "pack_format": 42,    "description": "Your resource pack description goes here"  }}

Pack format 42 is valid for Minecraft version 1.21.3. To check the most recent version, you can see the Minecraft wiki page on pack formats.

In the description field, add the description you want to be visible in the Resource Pack Selection screen. Note that this is displayed over two lines, and cut off if it is too long.

The pack.png file is an optional PNG image that will be displayed as the icon for your resource pack in the selection screen. This should ideally be a small square image. If you don’t include this image, the icon for your resource pack will be greyed out.

Adding Textures

To add custom textures to your resource pack, navigate to assets/minecraft/textures. In here, you can create subfolders for the different texture categories, such as block, entity, item, and painting.

Place your custom texture files (which should be PNG images) inside the respective subfolders. For example, if you have a custom texture for spruce planks, place it inside the block folder and name it spruce_planks.png.

The example pack I provided has some examples:

Adding Fonts

To add custom fonts to your resource pack, create a font folder inside the assets/minecraft folder. Place your custom font file (in TTF or OTF format) inside the font subfolder. Suppose you want

Then, create a file named (for example) courier.json. Inside it, specify your font, in the format

{    "providers": [        {            "type": "ttf",            "file": "minecraft:courier.ttf"        }    ]}

Replace courier.ttf with your filename.

When you want to display text in this new font, you can use

@bypass /tellraw @s {"text": "This is a custom font!", "font": "courier"}

to control the display.

Adding Sounds

To add custom sounds to your resource pack, create a sounds folder inside the assets/minecraft folder to store all your .ogg files. You can organise sounds however you want in here, including in subfolders. In my example pack, the sounds directory is structured as:

assets/minecraft├── sounds.json└── sounds    └── custom        ├── metronome.ogg        ├── white_noise.ogg        └── tones            ├── dial.ogg            └── square.ogg

Then, in assets/minecraft/sounds.json, add the following text (for example):

{    "block.lever.click": {        "sounds": [            {                "name": "custom\/metronome",                "volume": 1.00            }        ],        "replace": true    },    "custom.tone": {        "sounds": [            {                "name": "custom\/tones\/dial",                "volume": 1.00            },            {                "name": "custom\/tones\/square",                "volume": 1.00            }        ],        "replace": true    }}

Edit this accordingly to match all of your files. This follows a simple pattern: For each sound, we have:

Note that the in-game sound events, like block.lever.click, will trigger as usual with your new sound files (here, when you toggle a lever). However, you can also use new paths like custom.tone, which will only trigger when you use /playsound.

Setting up a GitHub Repository

We’ll be using GitHub to host our pack: if you don’t have an account, sign up here. Click here to create a new GitHub repository.

Create a repository like this. Make sure it's set to Public.
Create a repository like this. Make sure it's set to Public.
Click here to upload your files to GitHub.
Click here to upload your files to GitHub.
Drag and drop your files then click "Commit changes".
Drag and drop your files then click "Commit changes".

Your files are now stored online!

Setting up a Server Resource Pack

Now, it’s time to set up your command. Enter the details of your map and repository here:

GitHub username:

Repository name:

Map code: