{
  "meta": {
    "version": "PTDL_v2",
    "update_url": null
  },
  "exported_at": "2026-08-19T16:57:41+00:00",
  "name": "Modrinth",
  "author": "contact@chromozone.dev",
  "description": "Egg generico para modpacks de Modrinth.",
  "features": [
    "eula",
    "java_version",
    "pid_limit"
  ],
  "container_version_map": [
    {
      "version": "latest",
      "docker_image": "ghcr.io/pelican-eggs/yolks:java_21"
    },
    {
      "version": "1.21.11",
      "docker_image": "ghcr.io/pelican-eggs/yolks:java_21"
    },
    {
      "version": "1.21.10",
      "docker_image": "ghcr.io/pelican-eggs/yolks:java_21"
    },
    {
      "version": "1.21.9",
      "docker_image": "ghcr.io/pelican-eggs/yolks:java_21"
    },
    {
      "version": "1.21.8",
      "docker_image": "ghcr.io/pelican-eggs/yolks:java_21"
    },
    {
      "version": "1.21.7",
      "docker_image": "ghcr.io/pelican-eggs/yolks:java_21"
    },
    {
      "version": "1.21.6",
      "docker_image": "ghcr.io/pelican-eggs/yolks:java_21"
    },
    {
      "version": "1.21.5",
      "docker_image": "ghcr.io/pelican-eggs/yolks:java_21"
    },
    {
      "version": "1.21.4",
      "docker_image": "ghcr.io/pelican-eggs/yolks:java_21"
    },
    {
      "version": "1.21.3",
      "docker_image": "ghcr.io/pelican-eggs/yolks:java_21"
    },
    {
      "version": "1.21.1",
      "docker_image": "ghcr.io/pelican-eggs/yolks:java_21"
    },
    {
      "version": "1.21",
      "docker_image": "ghcr.io/pelican-eggs/yolks:java_21"
    },
    {
      "version": "1.20.6",
      "docker_image": "ghcr.io/pelican-eggs/yolks:java_21"
    },
    {
      "version": "1.20.5",
      "docker_image": "ghcr.io/pelican-eggs/yolks:java_21"
    },
    {
      "version": "1.20.4",
      "docker_image": "ghcr.io/pelican-eggs/yolks:java_17"
    },
    {
      "version": "1.20.3",
      "docker_image": "ghcr.io/pelican-eggs/yolks:java_17"
    },
    {
      "version": "1.20.2",
      "docker_image": "ghcr.io/pelican-eggs/yolks:java_17"
    },
    {
      "version": "1.20.1",
      "docker_image": "ghcr.io/pelican-eggs/yolks:java_17"
    },
    {
      "version": "1.20",
      "docker_image": "ghcr.io/pelican-eggs/yolks:java_17"
    },
    {
      "version": "1.19.4",
      "docker_image": "ghcr.io/pelican-eggs/yolks:java_17"
    },
    {
      "version": "1.19.3",
      "docker_image": "ghcr.io/pelican-eggs/yolks:java_17"
    },
    {
      "version": "1.19.2",
      "docker_image": "ghcr.io/pelican-eggs/yolks:java_17"
    },
    {
      "version": "1.19.1",
      "docker_image": "ghcr.io/pelican-eggs/yolks:java_17"
    },
    {
      "version": "1.19",
      "docker_image": "ghcr.io/pelican-eggs/yolks:java_17"
    },
    {
      "version": "1.18.2",
      "docker_image": "ghcr.io/pelican-eggs/yolks:java_17"
    },
    {
      "version": "1.18.1",
      "docker_image": "ghcr.io/pelican-eggs/yolks:java_17"
    },
    {
      "version": "1.18",
      "docker_image": "ghcr.io/pelican-eggs/yolks:java_17"
    },
    {
      "version": "1.17.1",
      "docker_image": "ghcr.io/pelican-eggs/yolks:java_16"
    },
    {
      "version": "1.17",
      "docker_image": "ghcr.io/pelican-eggs/yolks:java_16"
    },
    {
      "version": "1.16.5",
      "docker_image": "ghcr.io/pelican-eggs/yolks:java_8"
    },
    {
      "version": "1.16.4",
      "docker_image": "ghcr.io/pelican-eggs/yolks:java_8"
    },
    {
      "version": "1.16.3",
      "docker_image": "ghcr.io/pelican-eggs/yolks:java_8"
    },
    {
      "version": "1.16.2",
      "docker_image": "ghcr.io/pelican-eggs/yolks:java_8"
    },
    {
      "version": "1.16.1",
      "docker_image": "ghcr.io/pelican-eggs/yolks:java_8"
    },
    {
      "version": "1.16",
      "docker_image": "ghcr.io/pelican-eggs/yolks:java_8"
    },
    {
      "version": "1.15.2",
      "docker_image": "ghcr.io/pelican-eggs/yolks:java_8"
    },
    {
      "version": "1.15.1",
      "docker_image": "ghcr.io/pelican-eggs/yolks:java_8"
    },
    {
      "version": "1.15",
      "docker_image": "ghcr.io/pelican-eggs/yolks:java_8"
    },
    {
      "version": "1.14.4",
      "docker_image": "ghcr.io/pelican-eggs/yolks:java_8"
    },
    {
      "version": "1.14.3",
      "docker_image": "ghcr.io/pelican-eggs/yolks:java_8"
    },
    {
      "version": "1.14.2",
      "docker_image": "ghcr.io/pelican-eggs/yolks:java_8"
    },
    {
      "version": "1.14.1",
      "docker_image": "ghcr.io/pelican-eggs/yolks:java_8"
    },
    {
      "version": "1.14",
      "docker_image": "ghcr.io/pelican-eggs/yolks:java_8"
    },
    {
      "version": "1.13.2",
      "docker_image": "ghcr.io/pelican-eggs/yolks:java_8"
    },
    {
      "version": "1.13.1",
      "docker_image": "ghcr.io/pelican-eggs/yolks:java_8"
    },
    {
      "version": "1.13",
      "docker_image": "ghcr.io/pelican-eggs/yolks:java_8"
    },
    {
      "version": "1.12.2",
      "docker_image": "ghcr.io/pelican-eggs/yolks:java_8"
    },
    {
      "version": "1.12.1",
      "docker_image": "ghcr.io/pelican-eggs/yolks:java_8"
    },
    {
      "version": "1.12",
      "docker_image": "ghcr.io/pelican-eggs/yolks:java_8"
    },
    {
      "version": "1.11.2",
      "docker_image": "ghcr.io/pelican-eggs/yolks:java_8"
    },
    {
      "version": "1.10.2",
      "docker_image": "ghcr.io/pelican-eggs/yolks:java_8"
    },
    {
      "version": "1.9.4",
      "docker_image": "ghcr.io/pelican-eggs/yolks:java_8"
    },
    {
      "version": "1.8.9",
      "docker_image": "ghcr.io/pelican-eggs/yolks:java_8"
    },
    {
      "version": "1.8.8",
      "docker_image": "ghcr.io/pelican-eggs/yolks:java_8"
    },
    {
      "version": "1.7.10",
      "docker_image": "ghcr.io/pelican-eggs/yolks:java_8"
    }
  ],
  "file_denylist": [],
  "startup": "java $([ -f user_jvm_args.txt ] && printf %s \"@user_jvm_args.txt\") -Xms128M -Xmx{{SERVER_MEMORY}}M -Dterminal.jline=false -Dterminal.ansi=true $([ ! -f unix_args.txt ] && printf %s \"-jar `cat .serverjar`\" || printf %s \"@unix_args.txt\")",
  "config": {
    "files": "{\n    \"server.properties\": {\n        \"parser\": \"properties\",\n        \"find\": {\n            \"server-ip\": \"0.0.0.0\",\n            \"server-port\": \"{{server.build.default.port}}\",\n            \"query.port\": \"{{server.build.default.port}}\"\n        }\n    }\n}",
    "startup": "{\"done\":\")! For help, type\"}",
    "logs": "{}",
    "stop": "stop"
  },
  "scripts": {
    "installation": {
      "script": "#!/bin/bash\n\nset -euo pipefail\n\nsource /usr/local/lib/egg-utils.sh\negg_init\n\n: \"${PROJECT_ID:=}\"\n: \"${VERSION_ID:=}\"\n: \"${PAT:=}\"\n\nAUTH_HEADER=()\nif [[ -n \"${PAT}\" ]]; then\n  AUTH_HEADER=(--header=\"Authorization: ${PAT}\")\nfi\n\nMODRINTH_API_URL=\"https://api.modrinth.com/v2\"\n\nget_download() {\n  egg_info \"Fetching Modrinth project ${PROJECT_ID}...\"\n  local PROJECT_DATA\n  PROJECT_DATA=$(wget -q \"${AUTH_HEADER[@]}\" \"${MODRINTH_API_URL}/project/${PROJECT_ID}\" -O -)\n  local PROJECT_TITLE\n  PROJECT_TITLE=$(echo \"${PROJECT_DATA}\" | jq -r '.title // empty')\n\n  if [[ -z \"${PROJECT_DATA}\" ]]; then\n    egg_error \"Could not fetch project '${PROJECT_ID}'\"\n  fi\n\n  local PROJECT_SUPPORTED\n  PROJECT_SUPPORTED=$(echo \"${PROJECT_DATA}\" | jq -r '.\"server_side\" // empty')\n  if [[ \"${PROJECT_SUPPORTED}\" == \"unsupported\" ]]; then\n    egg_warn \"Project '${PROJECT_TITLE}' is marked as unsupported for server\"\n  fi\n\n  if [[ -n \"${VERSION_ID}\" && \"${VERSION_ID}\" != \"latest\" ]]; then\n    if [[ $(echo \"${PROJECT_DATA}\" | jq -r --arg VERSION_ID \"${VERSION_ID}\" '.versions[]? | select(. == $VERSION_ID)') != \"${VERSION_ID}\" ]]; then\n      egg_error \"Version id '${VERSION_ID}' not found\"\n    fi\n  else\n    VERSION_ID=$(echo \"${PROJECT_DATA}\" | jq -r '.versions[-1] // empty')\n    if [[ -z \"${VERSION_ID}\" ]]; then\n      egg_error \"No version found for '${PROJECT_TITLE}'\"\n    fi\n    egg_info \"Using latest version: ${VERSION_ID}\"\n  fi\n\n  local JSON_DATA\n  JSON_DATA=$(wget -q \"${AUTH_HEADER[@]}\" \"${MODRINTH_API_URL}/version/${VERSION_ID}\" -O -)\n  local DOWNLOAD_URL\n  DOWNLOAD_URL=$(echo \"${JSON_DATA}\" | jq -r '.files[]? | select(.primary == true) | .url')\n\n  if [[ -z \"${DOWNLOAD_URL}\" ]]; then\n    egg_error \"No download URL for version ${VERSION_ID}\"\n  fi\n\n  egg_download \"${DOWNLOAD_URL}\" \"server.zip\"\n}\n\nunpack_zip() {\n  unzip -o server.zip\n  rm -f server.zip\n}\n\njson_download_mods() {\n  egg_info \"Downloading mods...\"\n  local MANIFEST=\"${SERVER_DIR}/modrinth.index.json\"\n  jq -c '.files[]? | select(.env.server == \"required\") | {name: .path, url: .downloads[0]}' \"${MANIFEST}\" | while read -r mod; do\n    local FILE_URL\n    FILE_URL=$(echo \"${mod}\" | jq -r '.url // empty')\n    local FILE_NAME\n    FILE_NAME=$(echo \"${mod}\" | jq -r '.name // empty')\n\n    [[ -z \"${FILE_URL}\" ]] && egg_error \"No URL for mod ${FILE_NAME}\"\n    mkdir -p \"${SERVER_DIR}/$(dirname \"${FILE_NAME}\")\"\n    egg_download \"${FILE_URL}\" \"${SERVER_DIR}/${FILE_NAME}\"\n  done\n}\n\njson_download_forge() {\n  local MANIFEST=\"${SERVER_DIR}/modrinth.index.json\"\n  local MC_VERSION\n  MC_VERSION=$(jq -r '.dependencies.minecraft // empty' \"${MANIFEST}\")\n  local RAW_FORGE_VERSION\n  RAW_FORGE_VERSION=$(jq -r '.dependencies.forge // empty' \"${MANIFEST}\")\n\n  [[ -z \"${MC_VERSION}\" || -z \"${RAW_FORGE_VERSION}\" ]] && egg_error \"Incomplete Forge dependencies\"\n\n  local MC_MAJOR_MINOR\n  MC_MAJOR_MINOR=$(echo \"${MC_VERSION}\" | cut -d. -f1,2)\n\n  local -a CANDIDATES=(\n    \"${MC_VERSION}-${RAW_FORGE_VERSION}\"\n    \"${MC_VERSION}-${RAW_FORGE_VERSION}-${MC_VERSION}\"\n    \"${MC_VERSION}-${RAW_FORGE_VERSION}-${MC_VERSION}.0\"\n    \"${MC_VERSION}-${RAW_FORGE_VERSION}-mc${MC_VERSION//./}\"\n    \"${MC_MAJOR_MINOR}.1-${RAW_FORGE_VERSION}\"\n    \"${MC_MAJOR_MINOR}.2-${RAW_FORGE_VERSION}\"\n    \"${MC_MAJOR_MINOR}.3-${RAW_FORGE_VERSION}\"\n    \"${MC_MAJOR_MINOR}.4-${RAW_FORGE_VERSION}\"\n    \"${MC_MAJOR_MINOR}.5-${RAW_FORGE_VERSION}\"\n    \"${MC_MAJOR_MINOR}.6-${RAW_FORGE_VERSION}\"\n    \"${MC_MAJOR_MINOR}.7-${RAW_FORGE_VERSION}\"\n    \"${MC_MAJOR_MINOR}.8-${RAW_FORGE_VERSION}\"\n    \"${MC_MAJOR_MINOR}.9-${RAW_FORGE_VERSION}\"\n    \"${MC_MAJOR_MINOR}.10-${RAW_FORGE_VERSION}\"\n    \"${MC_MAJOR_MINOR}-${RAW_FORGE_VERSION}\"\n  )\n\n  local DOWNLOADED=false\n  FORGE_VERSION=\"\"\n  for cand in \"${CANDIDATES[@]}\"; do\n    local CAND_URL=\"https://maven.minecraftforge.net/net/minecraftforge/forge/${cand}/forge-${cand}-installer.jar\"\n    if wget -q -O forge-installer.jar \"${CAND_URL}\"; then\n      FORGE_VERSION=\"${cand}\"\n      DOWNLOADED=true\n      break\n    fi\n  done\n\n  if [[ \"${DOWNLOADED}\" != \"true\" ]]; then\n    egg_error \"Could not download Forge installer\"\n  fi\n\n  rm -rf libraries/net/minecraftforge/forge/\n  rm -f unix_args.txt\n\n  java -jar forge-installer.jar --installServer || egg_error \"Forge installation failed\"\n\n  if forge_1_17_or_later \"${MC_VERSION}\" || forge_1_17_or_later \"${FORGE_VERSION}\"; then\n    ln -sf libraries/net/minecraftforge/forge/*/unix_args.txt unix_args.txt\n  else\n    local GENERATED_JAR=\"\"\n    if [[ -f \"forge-${FORGE_VERSION}.jar\" ]]; then\n      GENERATED_JAR=\"forge-${FORGE_VERSION}.jar\"\n    elif [[ -f \"forge-${FORGE_VERSION}-universal.jar\" ]]; then\n      GENERATED_JAR=\"forge-${FORGE_VERSION}-universal.jar\"\n    else\n      GENERATED_JAR=$(find . -maxdepth 1 -name \"forge-*.jar\" ! -name \"forge-installer.jar\" | head -n 1 || true)\n    fi\n\n    if [[ -n \"${GENERATED_JAR}\" && -f \"${GENERATED_JAR}\" ]]; then\n      mv \"${GENERATED_JAR}\" forge-server-launch.jar\n    else\n      egg_error \"Could not locate installed Forge server jar\"\n    fi\n    echo \"forge-server-launch.jar\" > .serverjar\n  fi\n\n  rm -f forge-installer.jar\n}\n\njson_download_fabric() {\n  local MANIFEST=\"${SERVER_DIR}/modrinth.index.json\"\n  local MC_VERSION\n  MC_VERSION=$(jq -r '.dependencies.minecraft // empty' \"${MANIFEST}\")\n  local FABRIC_VERSION\n  FABRIC_VERSION=$(jq -r '.dependencies.\"fabric-loader\" // empty' \"${MANIFEST}\")\n\n  [[ -z \"${MC_VERSION}\" || -z \"${FABRIC_VERSION}\" ]] && egg_error \"Incomplete Fabric dependencies\"\n\n  fabric_install \"${MC_VERSION}\" \"${FABRIC_VERSION}\" \"fabric-server-launch.jar\"\n}\n\njson_download_quilt() {\n  local MANIFEST=\"${SERVER_DIR}/modrinth.index.json\"\n  local MC_VERSION\n  MC_VERSION=$(jq -r '.dependencies.minecraft // empty' \"${MANIFEST}\")\n  local QUILT_VERSION\n  QUILT_VERSION=$(jq -r '.dependencies.\"quilt-loader\" // empty' \"${MANIFEST}\")\n\n  [[ -z \"${MC_VERSION}\" || -z \"${QUILT_VERSION}\" ]] && egg_error \"Incomplete Quilt dependencies\"\n\n  quilt_install \"${MC_VERSION}\" \"${QUILT_VERSION}\" \"quilt-server-launch.jar\"\n}\n\nvalidate_not_empty PROJECT_ID\n\nif [[ \"${PROJECT_ID}\" != \"zip\" ]]; then\n  get_download\n  unpack_zip\nelse\n  unpack_zip\nfi\n\nif [[ -f \"${SERVER_DIR}/modrinth.index.json\" ]]; then\n  copy_overrides\n  json_download_mods\n\n  MANIFEST=\"${SERVER_DIR}/modrinth.index.json\"\n  if [[ $(jq -r '.dependencies.forge' \"${MANIFEST}\") != \"null\" ]]; then\n    json_download_forge\n  fi\n  if [[ $(jq -r '.dependencies.\"fabric-loader\"' \"${MANIFEST}\") != \"null\" ]]; then\n    json_download_fabric\n  fi\n  if [[ $(jq -r '.dependencies.\"quilt-loader\"' \"${MANIFEST}\") != \"null\" ]]; then\n    json_download_quilt\n  fi\nfi\n\nexport_mc_version\n\negg_info \"Modrinth installation complete\"\n",
      "container": "ghcr.io/enderhost/installers:java21",
      "entrypoint": "bash"
    }
  },
  "variables": [
    {
      "name": "Minecraft Version",
      "description": "Versión de Minecraft determinada en la instalación.",
      "env_variable": "MINECRAFT_VERSION",
      "default_value": "latest",
      "user_viewable": false,
      "user_editable": false,
      "rules": "nullable|string",
      "field_type": "text",
      "source": "installation",
      "defines_version": true
    },
    {
      "name": "Modpack Project ID",
      "description": "ID del proyecto en Modrinth. Por ejemplo, para https://modrinth.com/modpack/fabulously-optimized/ el ID es 1KVo5zza.",
      "env_variable": "PROJECT_ID",
      "default_value": "",
      "user_viewable": true,
      "user_editable": true,
      "rules": "required|string|max:8",
      "field_type": "text",
      "source": "user"
    },
    {
      "name": "Modpack Version ID",
      "description": "ID de la version del modpack en Modrinth. Por ejemplo, para /version/4.7.4 el ID puede ser P9wA6exe. Usa latest para la mas reciente.",
      "env_variable": "VERSION_ID",
      "default_value": "latest",
      "user_viewable": true,
      "user_editable": true,
      "rules": "string|max:8",
      "field_type": "text",
      "source": "user"
    },
    {
      "name": "Modrinth PAT",
      "description": "Personal Access Token de Modrinth para acceder a modpacks privados.",
      "env_variable": "PAT",
      "default_value": "",
      "user_viewable": true,
      "user_editable": true,
      "rules": "nullable|string",
      "field_type": "text",
      "source": "user"
    }
  ]
}
