Easily upload resource packs to CurseForge, Planet Minecraft, and Modrinth, all at the same time!
PackUploader is an automation tool that streamlines the process of publishing Minecraft resource packs across multiple platforms simultaneously. Instead of manually uploading to each site individually, configure your project once and deploy everywhere with a single command.
- Multi-platform deployment - Upload to CurseForge, Planet Minecraft, and Modrinth at once
- Template system - Create dynamic descriptions that adapt to each platform's formatting
- Version management - Support version ranges and automatically target multiple Minecraft versions at once
- Project synchronization - Keep project details, images, and descriptions in sync across platforms
- Import existing projects - Bring your current projects into the system for unified management
Unofficial Tool: This is a community-created automation tool and is not officially supported by CurseForge or Planet Minecraft. CurseForge and Planet Minecraft functionality relies on reverse-engineered website interactions, while Modrinth uses the official API. Use at your own discretion.
Personal Tool: This tool was built for my personal workflow and remains primarily designed for my use. I've made it available for others to use, but some features and defaults may reflect my specific needs and preferences.
All Platforms Required: You must have accounts and configure authentication for all three platforms (CurseForge, Planet Minecraft, and Modrinth) during setup, even if you don't plan to use all of them initially.
- First Time Setup
- Description Templates
- Creating Projects
- Importing Projects
- Updating Projects
- Editing Project Details
- Download and install Node.js
- Download this repository as a ZIP
- Extract the ZIP to a folder of your choice
- Open a terminal in that folder
- Run
npm ito install all required dependencies
The auth.json file stores your authentication tokens and cookies, allowing the program to interact with the websites on your behalf.
Cookies must be provided in the format:
CookieName=CookieValue
Example:
CobaltSession=hguoewhguoewhudofewhfuioewhfuopewufjeiwohgoewpgwe
CurseForge Setup
You will need:
tokenCobaltSessioncookie
- Go to CurseForge API Tokens
- Create a new API token
- Add this to your
auth.json
- Go to CurseForge Authors and log in
- Open your browser's developer tools
- Firefox: Storage tab
- Chrome: Application tab
- Under Cookies, select the site
- Copy the
CobaltSessionname and value into yourauth.json
Planet Minecraft Setup
You will need:
pmc_autologincookie
- Go to Planet Minecraft and log in
- Open your browser's developer tools.
- Firefox: Storage tab
- Chrome: Application tab
- Under Cookies, select the site
- Copy the
pmc_autologinname and value into yourauth.json
Modrinth Setup
You will need:
token
- Go to Modrinth Personal Access Tokens
- Create a new token.
- Enable the following scopes for the token:
- Create Projects
- Read Projects
- Write Projects
- Create Versions
- Read Versions
- Write Versions
- Set the expiry date some time far in the future
- Paste it into your
auth.json
After setting up authentication, you need to configure your settings in settings.json:
Not all settings are described here, only ones that need clarification.
First, change "ewan": true to "ewan": false to disable ewanhowell.com support.
There are two image width options:
logoWidth: The width that project logos will be when included in project descriptionsimageWidths: The width that project images will be when included in project descriptions
These can also both be set per project by including them in a projects config JSON.
CurseForge Settings
Donation Settings:
- Set the donation
typeto one of:none,paypal,paypalHosted,patreon,github,kofi,buyMeACoffee - Set the
valueto your username/ID for the chosen platform
Social Links:
Configure your social media links. Important: Links must match CurseForge's expected formats or this will fail. For example, use direct Discord invite links (like https://discord.gg/xxxxx) rather than custom redirect URLs.
Planet Minecraft Settings
Website Link: This is displayed underneath the primary download button as a secondary button
link: URL to your website/social mediatitle: Display text for the link
Platform Preference:
prefer: Set to either"curseforge"or"modrinth"to determine which platform Planet Minecraft should link to as the primary download
Note: Planet Minecraft does not host the actual pack file - it redirects users to your preferred platform for downloads. This allows you to benefit from CurseForge/Modrinth creator reward systems.
Template Defaults
These are default values used in project description templates. When you use template tags like {{ youtube }} in your descriptions, they'll be replaced with these values.
Configure things that will be staying the same across all your project descriptions, for example social media links and icon URLs. I strongly recommend NOT using my icon URLs in case I change them in the future.
Before creating your first project, you may want to remove the existing project folders in /projects/ - these are my personal projects. You can delete them or keep them as references for configuration examples.
PackUploader uses a templating system to generate project descriptions for each platform. Templates allow you to create dynamic content that automatically pulls from your project configuration and settings.
There are three template files in the templates/ folder:
curseforge.html- HTML template for CurseForge descriptionsmodrinth.md- Markdown template for Modrinth descriptionsplanetminecraft.bbcode- BBCode template for Planet Minecraft descriptions
The templates included in the repository can be used as references for creating your own.
Recommendation: Write your descriptions directly on each platform first to ensure they look good, then extract the source code for your templates. Replace static content with template variables so it can be dynamically inserted.
- Use the WYSIWYG editor to create your description
- Click the triple dot button, then "Source Code" to get the raw HTML
- Copy this stripped-down HTML into
curseforge.html - Replace static content with template variables (e.g., replace your project name with
{{ name }}) - Note: HTML is used for CurseForge, but not all HTML features will work
- Create your description using the editor
- Click the "BBCode Source" button to get the raw BBCode
- Copy this into
planetminecraft.bbcode - Replace static content with template variables
- Write your description in the Markdown editor
- Copy the markdown directly into
modrinth.md - Replace static content with template variables
Templates use {{ var }} syntax to insert dynamic content. You can use any property from your project configuration or from the templateDefaults section of your settings.json, including JSON paths.
{{ name }}- Project name{{ summary }}- Project summary{{ curseforge.license }}- CurseForge license setting{{ id }}- Project ID
These variables have special handling and are not standard text insertion:
{{ logo }}- Logo image (or project name as text if no logo){{ description }}- Project description paragraphs (formatted for each platform){{ images }}- Embedded project images{{ video }}- YouTube video embed (Modrinth only - CurseForge and Planet Minecraft use native video support)
Snippets are reusable components shared across projects. They're formatted as {{ snippet:snippetname }} and loaded from the templates/snippets/ folder:
templates/snippets/curseforge/snippetname.htmltemplates/snippets/modrinth/snippetname.mdtemplates/snippets/planetminecraft/snippetname.bbcode
Snippets are merged into the template before variables are replaced, and can use template variables themselves.
Here's an example CurseForge template using snippets and variables:
<div style="text-align: center; font-family: Arial">
{{ snippet:header }}
<br>
{{ description }}
{{ images }}
<br>
{{ snippet:footer }}
</div>With a corresponding header snippet:
{{ logo }}
<h2 style="font-weight: 700; font-size: 32px">{{ summary }}</h2>
<a href="https://ewanhowell.com/resourcepacks/{{ id }}" target="_blank" style="font-size: 20px; line-height: 40px; color: #1EA1F1; display: block;">View the pack on my website!</a>Once projects are created, templates are copied into individual project folders. This allows you to customize templates for specific projects without affecting others.
For Unique Project Descriptions: If you need custom descriptions for a specific project, it's recommended to:
- Create the project first using the create script with your standard templates
- Modify the templates in the project folder (
/projects/yourprojectid/templates/) - Use the details script to update the descriptions
This approach saves you from having to edit your main templates for one project, then change them back afterward.
Used for creating new projects on all platforms.
- Navigate to the
data/create/folder - Configure your project settings (see configuration details below)
- Add your required files (pack.zip, pack.png, create.json)
- Double-click
create.batto create and upload the project
Your project will have been created and uploaded. You will now have a project folder within the /projects/ directory with all your project information.
Note: Planet Minecraft projects are created in draft state by default. You must manually set them to live on the Planet Minecraft website once your CurseForge/Modrinth projects get moderator approved.
If you already have a project imported but it's missing from some platforms (e.g., exists on CurseForge and Planet Minecraft but not Modrinth), you can use this script to create it on the missing platforms. In this case:
- Only
pack.zipandcreate.jsonare required in the create folder - Only the
idfield increate.jsonis used - everything else is ignored - All other configuration comes from the existing project folder and its
project.jsonfile
create.json- Main configuration file for your projectpack.zip- Your resource pack file (must be named exactly this)pack.png- Project icon (recommended 512x512px)- At least one image in the
images/folder (CurseForge and Modrinth will reject projects without images)
logo.png- Logo image for your project description (replaces{{ logo }}template tag). If not provided,{{ logo }}becomes the project name as text. Logo images are uploaded as the last image in your project gallery. On CurseForge the image will not be marked as featured so will not appear in CurseForge's main image carousel.thumbnail.png- Thumbnail image (used as first image on CurseForge and Planet Minecraft)images/- Folder containing additional project images (must be PNG format)
Note: thumbnail.png is not used on Modrinth. On Planet Minecraft it appears as the project thumbnail, on CurseForge as the first large image on the project page.
The create.json file contains all settings for your project. You can see an example in the repository.
Important: All properties are required even if set to false - this helps you remember available options for future use.
Any property in create.json can be used in description templates:
{{ summary }}- Inserts the project summary{{ curseforge.license }}- Inserts the CurseForge license- You can add custom properties for your own template tags
id- Unique project identifier (used for URLs)name- Display name of your projectsummary- Short descriptiondescription- Array of description paragraphs (each array entry is a paragraph, use\nfor newlines within paragraphs)optifine- Set tofalse(used only for ewanhowell.com)video- YouTube video ID only (not full URL), orfalseif nonegithub- Repository URL, orfalseif noneversion- Version number for this release
Configure which Minecraft versions your pack supports on each platform:
Version Types:
"latest"- Uses the latest available version on that platform"exact"- Specific version (provide"version"field)"after"- All versions from specified version onwards (provide"version"field, CurseForge/Modrinth only)"range"- Version range from one version to another (provide"version"and"to"fields, CurseForge/Modrinth only)
Additional Options:
snapshots: true/false- Include/exclude snapshot versions (CurseForge/Modrinth only)
Examples:
"versions": {
"curseforge": {
"type": "after",
"version": "1.20",
"snapshots": false
},
"planetminecraft": {
"type": "exact",
"version": "1.21"
},
"modrinth": {
"type": "range",
"version": "1.20",
"to": "1.21",
"snapshots": true
}
}Note: Use version IDs exactly as they appear on each platform, not the game's version names. For example, CurseForge uses 1.21.9-snapshot for snapshots rather than the game's 25w34a. Don't include "Minecraft" in version IDs (use "1.21" not "Minecraft 1.21").
Configure your project images in the images array. Each image object supports:
name- Display name for the image (required)description- Description text for the image (encouraged, use empty string""if none)file- Filename without the .png extension (required)embed- Whether to include this image in the project description via the{{ images }}template sectionfeatured- Whether to use as the featured image on Modrinth (the image shown in gallery view on the resource packs page)
Example:
"images": [
{
"name": "House",
"description": "A wooden house next to a larger house",
"file": "house",
"featured": true,
"embed": true
},
{
"name": "Farm",
"description": "A farm with scarecrows in it",
"file": "farm",
"embed": true
}
]Main Category: Choose one of
16x32x64x128x256x512x and HigherData PacksFont Packs
Additional Categories: Enable relevant secondary categories (use 0 for false, true for true - false is still supported, but using 0 makes the enabled categories stand out more)
License: Choose one of
Academic Free License v3.0Ace3 Style BSDAll Rights ReservedApache License version 2.0Apple Public Source License version 2.0 (APSL)Attribution-NonCommercial-ShareAlike 4.0 InternationalBSD LicenseCommon Development and Distribution License (CDDL)Creative Commons 4.0Creative Commons Attribution-NonCommercial 3.0 UnportedEclipse Public License - v 2.0GNU Affero General Public License version 3 (AGPLv3)GNU General Public License version 2 (GPLv2)GNU General Public License version 3 (GPLv3)GNU Lesser General Public License version 2.1 (LGPLv2.1)GNU Lesser General Public License version 3 (LGPLv3)ISC License (ISCL)Microsoft Public License (Ms-PL)Microsoft Reciprocal License (Ms-RL)MIT LicenseMozilla Public License 1.0 (MPL)Mozilla Public License 1.1 (MPL 1.1)Mozilla Public License 2.0PolyForm Shield License 1.0.0Public DomainWTFPLzlib/libpng License
Category: Choose one of
ExperimentalPvPRealisticSimplisticThemedUnreleasedOther
Resolution: Choose one of
8163264128256512102420484096
Progress: Completion percentage of your pack (0-100)
Credit: Credits text for your pack
Modifies: Features your pack changes in-game (use 0 for false, true for true)
Tags: Array of tag strings for your pack
Tags: Enable relevant tags (use 0 for false, true for true, "featured" for featured tags - you can have up to 3 featured tags)
License: Choose one of
All Rights Reserved/No LicenseApache License 2.0BSD 2-Clause "Simplified" LicenseBSD 3-Clause "New" or "Revised" LicenseCC Zero (Public Domain equivalent)CC-BY 4.0CC-BY-NC 4.0CC-BY-NC-ND 4.0CC-BY-NC-SA 4.0CC-BY-ND 4.0CC-BY-SA 4.0GNU Affero General Public License v3GNU General Public License v2GNU General Public License v3GNU Lesser General Public License v2.1GNU Lesser General Public License v3ISC LicenseMIT LicenseMozilla Public License 2.0zlib License
Used for importing existing projects from platforms into your local system.
- Navigate to the
data/folder - Configure your
import.jsonfile (see configuration below) - Double-click
import.batto import the project
After importing, your project will appear in /projects/yourprojectid/. Check this folder to ensure everything looks correct and make any required changes.
Configure which platforms to import from using project IDs and slugs:
{
"id": "f8thful",
"curseforge": {
"id": 364688,
"slug": "f8thful"
},
"planetminecraft": {
"id": 4595209,
"slug": "f8thful-the-complete-vanilla-8x8-resource-pack"
},
"modrinth": {
"id": "ZrW0og1b",
"slug": "f8thful"
}
}id- Your local project identifier. This determines the folder name in/projects/and is how you'll reference this project in other scripts- For each platform: provide both the
idandslugfor the project - If the project doesn't exist on a platform yet, set that platform's
idtonull
CurseForge: Found in the sidebar of your project page, or in the URL on the project management page
Planet Minecraft: Found in the URL when editing your project
Modrinth: On your project page, click the triple dot menu and select "Copy ID"
- Check your project folder in
/projects/yourprojectid/ - Verify all information imported correctly
- Add your description. Due to the complexity of descriptions, they cannot be nicely imported. You must add it yourself after importing
- Add missing files like
thumbnail.pngorlogo.pngif desired - Use the create script to add the project to any missing platforms
Used for uploading updates to existing projects on all platforms.
- Navigate to the
data/update/folder - Add your required files (pack.zip, update.json)
- Configure your
update.jsonfile (see configuration below) - Double-click
update.batto upload the update
pack.zip- Your updated resource pack file (must be named exactly this)update.json- Update configuration file
Configure your update settings:
{
"id": "better-bows",
"changelog": "Updated for 1.21.8\nThe crossbow now supports spectral arrows, tipped arrows, and multishot showing three arrows",
"version": "1.2.0",
"versions": {
"curseforge": {
"type": "after",
"version": "1.20.2",
"snapshots": false
},
"planetminecraft": {
"type": "latest"
},
"modrinth": {
"type": "after",
"version": "1.20.2",
"snapshots": false
}
}
}id- Your project identifier (must match existing project)changelog- Description of changes in this update (supports\nfor newlines)version- New version number for this releaseversions- Minecraft version targeting (same format as create script)
Used for updating project information like description, name, summary, social links, categories, and images.
- Navigate to your project folder in
/projects/yourprojectid/ - Make any desired changes to your project files
- Configure
data/details.json(see configuration below) - Double-click
details.batto update the project details
This script updates project information such as description, name, categories, social links, and more. If images is set to true, it will also reupload project icons and images across all platforms.
Make all desired changes to your project files in the /projects/yourprojectid/ folder, then run the details script to sync these changes across all platforms.
{
"id": "f8thful",
"images": false,
"live": true
}id- Your project identifier (must match existing project)images- Set totrueto also reupload project icon and images across all platformslive- If the Modrinth project is not yet approved, this must be set tofalseto prevent crashes, otherwise set totrue. Also controls Planet Minecraft's live/draft status so it stays hidden until the Modrinth project is approved. Does nothing for CurseForge.