Skip to content

Conversation

@08Robfin
Copy link

This is my first template submission, so apologies if anything is slightly off or could be improved.

After several hours of testing and troubleshooting, this setup is now fully working on my end and reliably installs and runs a Hytale dedicated server in PufferPanel, including proper authentication flow.

The template is designed to be as simple as possible, fill in the variables, install, authenticate, and the server is ready for players.

Feedback and improvements are very welcome!

Added a README file with setup instructions for Hytale server template.
@zephiowl
Copy link

zephiowl commented Jan 13, 2026

Just a heads up you're using python to extract the file and not every device has python3 installed by default, i suggest replacing it with "unzip" as its built into all major Linux distros by default. And avoids unnecessary installations of python while ensuring compatibility.

Copy link

@zephiowl zephiowl left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fix: Updated extraction method
Migrated from python to unzip to ensure ease of compatibility and minimal installs.

@08Robfin
Copy link
Author

Fix: Updated extraction method
Migrated from python to unzip to ensure ease of compatibility and minimal installs.

Did you get it to work? I tried using unzip, and I'm not sure why, but I did not get it to work.

@zephiowl
Copy link

Fix: Updated extraction method
Migrated from python to unzip to ensure ease of compatibility and minimal installs.

Did you get it to work? I tried using unzip, and I'm not sure why, but I did not get it to work.

Me and 2 other people tested it and it worked perfectly fine. Its why i made the comment.
Maybe its something to do with your environment?

Copy link

@zephiowl zephiowl left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Tested, working change. Nice work :>

Added requirements for binaries and OS.
@Toon2400
Copy link

instead of booting with ./start.sh you should replace it with ../local_java/bin/java -Xms1G -Xmx${ram}G -jar HytaleServer.jar --assets ../Assets.zip --disable-sentry --auth-mode authenticated --bind 0.0.0.0:${port} --backup --backup-dir ../Backups --backup-frequency 30 so the statistics tab is accurate, assuming it was installed with your installer, java would've installed

Copy link

@zephiowl zephiowl left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

-snip-

(posting as a code suggestion for easy acceptance)

@zephiowl
Copy link

instead of booting with ./start.sh you should replace it with ../local_java/bin/java -Xms1G -Xmx${ram}G -jar HytaleServer.jar --assets ../Assets.zip --disable-sentry --auth-mode authenticated --bind 0.0.0.0:${port} --backup --backup-dir ../Backups --backup-frequency 30 so the statistics tab is accurate, assuming it was installed with your installer, java would've installed

I didn't actually catch that one, nice call out :>

Copy link

@zephiowl zephiowl left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

-Snip-

(i'm still learning sorry, see next comment)

Copy link

@zephiowl zephiowl left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Here you go, a request to change as per @Toon2400 and their suggestion.

I'm still a bit new when it comes to requesting changes as i normally make my own PRs, not help with others. Sorry for the extra bit of spam on the pr still trying to figure out the specifics. Just trying to help :> and make your day easier.

@08Robfin 08Robfin requested a review from zephiowl January 14, 2026 19:46
Copy link

@zephiowl zephiowl left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

-snip-

Copy link

@zephiowl zephiowl left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think i got the review feature working now. sorry about that.

"type": "command"
},
{
"target": "start.sh",

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
"target": "start.sh",

},
{
"target": "start.sh",
"text": "#!/bin/bash\n\nJAVA_BIN=\"./local_java/bin/java\"\n\necho \"--- LAUNCHING WITH LOCAL JAVA ---\"\n\nif [ ! -f \"$JAVA_BIN\" ]; then\n echo \"CRITICAL ERROR: local Java missing!\"\n exit 1\nfi\n\n$JAVA_BIN -version\n\ncd Server\n\n../$JAVA_BIN -Xms1G -Xmx${ram}G -jar HytaleServer.jar --assets ../Assets.zip --disable-sentry --auth-mode authenticated --bind 0.0.0.0:${port} --backup --backup-dir ../Backups --backup-frequency 30",

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
"text": "#!/bin/bash\n\nJAVA_BIN=\"./local_java/bin/java\"\n\necho \"--- LAUNCHING WITH LOCAL JAVA ---\"\n\nif [ ! -f \"$JAVA_BIN\" ]; then\n echo \"CRITICAL ERROR: local Java missing!\"\n exit 1\nfi\n\n$JAVA_BIN -version\n\ncd Server\n\n../$JAVA_BIN -Xms1G -Xmx${ram}G -jar HytaleServer.jar --assets ../Assets.zip --disable-sentry --auth-mode authenticated --bind 0.0.0.0:${port} --backup --backup-dir ../Backups --backup-frequency 30",

"target": "start.sh",
"text": "#!/bin/bash\n\nJAVA_BIN=\"./local_java/bin/java\"\n\necho \"--- LAUNCHING WITH LOCAL JAVA ---\"\n\nif [ ! -f \"$JAVA_BIN\" ]; then\n echo \"CRITICAL ERROR: local Java missing!\"\n exit 1\nfi\n\n$JAVA_BIN -version\n\ncd Server\n\n../$JAVA_BIN -Xms1G -Xmx${ram}G -jar HytaleServer.jar --assets ../Assets.zip --disable-sentry --auth-mode authenticated --bind 0.0.0.0:${port} --backup --backup-dir ../Backups --backup-frequency 30",
"type": "writefile"
},

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
},

},
{
"commands": [
"chmod +x start.sh"

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
"chmod +x start.sh"

{
"commands": [
"chmod +x start.sh"
],

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
],

"chmod +x start.sh"
],
"type": "command"
}

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
}

],
"run": {
"stop": "/stop",
"command": "./start.sh",

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
"command": "./start.sh",
"command": "../local_java/bin/java -Xms1G -Xmx${ram}G -jar HytaleServer.jar --assets ../Assets.zip --disable-sentry --auth-mode authenticated --bind 0.0.0.0:${port} --backup --backup-dir ../Backups --backup-frequency 30",

08Robfin and others added 2 commits January 14, 2026 21:13
Co-authored-by: Zephira <zephira58@protonmail.com>
Co-authored-by: Zephira <zephira58@protonmail.com>
@08Robfin
Copy link
Author

I think i got the review feature working now. sorry about that.

i have tried applying, i dont know why, but it wont. Im not very used to github.

@zephiowl
Copy link

zephiowl commented Jan 14, 2026

I think i got the review feature working now. sorry about that.

i have tried applying, i dont know why, but it wont. Im not very used to github.

Here i'll just send you the josn to copy and paste :>

I haven't tested it yet so make sure you do when you can before accepting.

{
  "name": "Hytale",
  "display": "Hytale Server",
  "type": "none",
  "install": [
    {
      "commands": [
        "echo '--- MANUAL INSTALL START ---'",
        "echo '1. Downloading Hytale Downloader...'",
        "curl -L -o hytale-downloader.zip https://downloader.hytale.com/hytale-downloader.zip",
        "unzip -o hytale-downloader.zip",
        "chmod +x hytale-downloader-linux-amd64",
        "mv hytale-downloader-linux-amd64 hytale-downloader",
        "rm hytale-downloader.zip",
        "echo '2. Downloading Game Files...'",
        "./hytale-downloader -skip-update-check -download-path game.zip",
        "unzip -o game.zip",
        "echo '3. Downloading Java 25...'",
        "curl -L -o java25.tar.gz https://api.adoptium.net/v3/binary/latest/25/ga/linux/x64/jdk/hotspot/normal/eclipse",
        "mkdir -p local_java",
        "tar -xzf java25.tar.gz -C local_java --strip-components=1",
        "chmod +x local_java/bin/java",
        "rm java25.tar.gz",
        "echo '--- INSTALL COMPLETE ---'"
      ],
      "type": "command"
    }
  ],
  "run": {
    "stop": "/stop",
    "command": "../local_java/bin/java -Xms1G -Xmx${ram}G -jar HytaleServer.jar --assets ../Assets.zip --disable-sentry --auth-mode authenticated --bind 0.0.0.0:${port} --backup --backup-dir ../Backups --backup-frequency 30",
    "workingDirectory": "",
    "pre": [],
    "post": [],
    "environmentVars": {
      "port": "${port}",
      "ram": "${ram}"
    }
  },
  "data": {
    "port": {
      "type": "integer",
      "display": "Port",
      "value": 5520
    },
    "ram": {
      "type": "integer",
      "display": "RAM (GB)",
      "value": 4
    }
  },
  "environment": {
    "type": "standard"
  },
  "supportedEnvironments": [
    {
      "type": "standard"
    }
  ],
  "requirements": {
    "binaries": [
      "curl",
      "tar",
      "unzip"
    ],
    "os": "linux",
    "arch": "amd64"
  }
}

@08Robfin
Copy link
Author

I think i got the review feature working now. sorry about that.

i have tried applying, i dont know why, but it wont. Im not very used to github.

Here i'll just send you the josn to copy and paste :>

{
  "name": "Hytale",

Dont know if its just me, but this json does not work for me

@Toon2400
Copy link

Toon2400 commented Jan 14, 2026

{
  "name": "Hytale",
  "display": "Hytale Server",
  "type": "none",
  "install": [
    {
      "commands": [
        "echo '--- MANUAL INSTALL START ---'",
        "echo '1. Downloading Hytale Downloader...'",
        "curl -L -o hytale-downloader.zip https://downloader.hytale.com/hytale-downloader.zip",
        "unzip -o hytale-downloader.zip",
        "chmod +x hytale-downloader-linux-amd64",
        "mv hytale-downloader-linux-amd64 hytale-downloader",
        "rm hytale-downloader.zip",
        "echo '2. Downloading Game Files...'",
        "./hytale-downloader -skip-update-check -download-path game.zip",
        "unzip -o game.zip",
        "echo '3. Downloading Java 25...'",
        "curl -L -o java25.tar.gz https://api.adoptium.net/v3/binary/latest/25/ga/linux/x64/jdk/hotspot/normal/eclipse",
        "mkdir -p local_java",
        "tar -xzf java25.tar.gz -C local_java --strip-components=1",
        "chmod +x local_java/bin/java",
        "rm java25.tar.gz",
        "echo '--- INSTALL COMPLETE ---'"
      ],
      "type": "command"
    }
  ],
  "run": {
    "stop": "/stop",
    "command": "../local_java/bin/java -Xms1G -Xmx${ram}G -jar HytaleServer.jar --assets ../Assets.zip --disable-sentry --auth-mode authenticated --bind 0.0.0.0:${port} --backup --backup-dir ../Backups --backup-frequency 30",
    "workingDirectory": "Server",
    "pre": [],
    "post": [],
    "environmentVars": {
      "port": "${port}",
      "ram": "${ram}"
    }
  },
  "data": {
    "port": {
      "type": "integer",
      "display": "Port",
      "value": 5520
    },
    "ram": {
      "type": "integer",
      "display": "RAM (GB)",
      "value": 4
    }
  },
  "environment": {
    "type": "standard"
  },
  "supportedEnvironments": [
    {
      "type": "standard"
    }
  ],
  "requirements": {
    "binaries": [
      "curl",
      "tar",
      "unzip"
    ],
    "os": "linux",
    "arch": "amd64"
  }
} 

this is what i used, not too familiar with github either 😅

@08Robfin
Copy link
Author

{
  "name": "Hytale",

this is what i used, not too familiar with github either 😅

Not really sure why, but i get this?

DAEMON
 Starting process: ../local_java/bin/java -Xms1G -Xmx4G -jar HytaleServer.jar --assets ../Assets.zip --disable-sentry --auth-mode authenticated --bind 0.0.0.0:5520 --backup --backup-dir ../Backups --backup-frequency 30
DAEMON
  Failed to start server

@Toon2400
Copy link

Toon2400 commented Jan 14, 2026

ahh thats my bad, forgot to update the template from my server after testing, updated my comment with the right working directory Server

Updated installation commands and modified working directory.
@08Robfin
Copy link
Author

ahh thats my bad, forgot to update the template from my server after testing, updated my comment with the right working directory Server

It works!

@thojo0
Copy link

thojo0 commented Jan 14, 2026

I also looked into this and created one inspired by the minecraft template.
I find it a lot cleaner.
I didn't test it, so if someone could test, this would be nice.

Template Json
{
  "type": "hytale",
  "name": "hytale",
  "display": "Hytale",
  "data": {
    "ip": {
      "type": "string",
      "value": "0.0.0.0",
      "display": "IP",
      "desc": "What IP to bind the server to",
      "required": true,
      "userEdit": false
    },
    "javaversion": {
      "type": "string",
      "value": "25",
      "display": "Java Version",
      "desc": "Version of Java to use",
      "required": true,
      "userEdit": true
    },
    "jvmArgs": {
      "type": "string",
      "value": "",
      "display": "JVM Arguments",
      "desc": "Extra JVM arguments to pass",
      "required": false,
      "userEdit": false
    },
    "serverArgs": {
      "type": "string",
      "value": "",
      "display": "Server Arguments",
      "desc": "Extra server arguments to pass",
      "required": false,
      "userEdit": false
    },
    "memory": {
      "type": "integer",
      "value": 4096,
      "display": "Memory (MB)",
      "desc": "How much memory in MB to allocate to the Java Heap",
      "required": true,
      "userEdit": false
    },
    "port": {
      "type": "integer",
      "value": 5520,
      "display": "Port",
      "desc": "What port to bind the server to",
      "required": true,
      "userEdit": false
    },
    "patchline": {
      "type": "string",
      "value": "release",
      "display": "Patchline",
      "desc": "Patchline you wish to install.",
      "required": true,
      "userEdit": true
    }
  },
  "groups": [
    {
      "display": "General",
      "description": "General settings for all servers",
      "variables": [
        "memory",
        "ip",
        "port",
        "patchline",
        "javaversion",
        "jvmArgs",
        "serverArgs"
      ],
      "order": 1
    }
  ],
    "install": [
    {
      "if": "javaversion != ''",
      "type": "javadl",
      "version": "${javaversion}"
    },
    {
      "type": "download",
      "files": [
        "https://downloader.hytale.com/hytale-downloader.zip"
      ]
    },
    {
      "type": "command",
      "commands": [
        "unzip -o hytale-downloader.zip hytale-downloader-linux-amd64",
        "rm hytale-downloader.zip",
        "chmod +x hytale-downloader-linux-amd64",
        "./hytale-downloader-linux-amd64 -skip-update-check -patchline ${patchline} -download-path game.zip",
        "unzip -o game.zip",
        "rm game.zip"
      ]
    }
  ],
  "run": {
    "command": "java${javaversion} -Xmx${memory}M ${jvmArgs} -jar HytaleServer.jar --assets Assets.zip --bind ${ip}:${port} ${serverArgs}",
    "stop": "/stop",
    "stdin": {
      "type": "stdin"
    },
    "autostart": false,
    "autorecover": false,
    "autorestart": false
  },
  "environment": {
    "type": "host"
  },
  "supportedEnvironments": [
    {
      "type": "host"
    }
  ],
  "requirements": {
    "binaries": [
      "unzip"
    ],
    "os": "linux",
    "arch": "amd64"
  }
}

@Krripe
Copy link

Krripe commented Jan 15, 2026

I don't know if this will help but i wanted to post my Hytale Template, i use it for my server and i have no problems with it, and it meets the requirements of the Hytale Manual.

{
  "name": "Hytale",
  "display": "Hytale Server",
  "type": "none",
  "install": [
    {
      "target": "install.sh",
      "text": "#!/bin/sh\nset -eu\n\nlog(){ printf '%s\\n' \"[Hytale] $*\"; }\nneed(){ command -v \"$1\" >/dev/null 2>&1 || { log \"ERROR: missing dependency '$1' on host. Install it and retry.\"; exit 1; }; }\n\nneed curl\nneed tar\nneed uname\n\nARCH=\"$(uname -m)\"\ncase \"$ARCH\" in\n  x86_64|amd64)\n    ADOPTIUM_ARCH=\"x64\"\n    DL_BIN=\"hytale-downloader-linux-amd64\"\n    ;;\n  aarch64|arm64)\n    ADOPTIUM_ARCH=\"aarch64\"\n    DL_BIN=\"hytale-downloader-linux-arm64\"\n    ;;\n  *)\n    log \"ERROR: unsupported CPU architecture: $ARCH\"\n    exit 1\n    ;;\nesac\n\nlog \"1) Downloading Java 25 (Temurin) for linux/$ADOPTIUM_ARCH ...\"\ncurl -fL --retry 5 --retry-delay 2 --retry-connrefused -o java25.tar.gz \"https://api.adoptium.net/v3/binary/latest/25/ga/linux/${ADOPTIUM_ARCH}/jdk/hotspot/normal/eclipse\"\nmkdir -p local_java\ntar -xzf java25.tar.gz -C local_java --strip-components=1\nrm -f java25.tar.gz\n\nJAVA_BIN=\"./local_java/bin/java\"\nJAR_BIN=\"./local_java/bin/jar\"\n\nchmod +x \"$JAVA_BIN\" \"$JAR_BIN\" 2>/dev/null || true\nlog \"Java installed:\" \n\"$JAVA_BIN\" -version || true\n\nlog \"2) Downloading Hytale Downloader...\"\ncurl -fL --retry 5 --retry-delay 2 --retry-connrefused -o hytale-downloader.zip \"https://downloader.hytale.com/hytale-downloader.zip\"\n\n# Validate zip using jar (no unzip needed)\n\"$JAR_BIN\" tf hytale-downloader.zip >/dev/null 2>&1 || {\n  log \"ERROR: hytale-downloader.zip is not a valid zip (download blocked/HTML/403/etc).\"\n  log \"Tip: check if the URL is reachable from the server host.\"\n  exit 1\n}\n\nlog \"Extracting downloader...\"\n\"$JAR_BIN\" xf hytale-downloader.zip\nrm -f hytale-downloader.zip\n\n# Pick correct binary name\nif [ -f \"$DL_BIN\" ]; then\n  mv -f \"$DL_BIN\" hytale-downloader\nfi\n\n# Fallback: if archive already contains 'hytale-downloader'\nif [ ! -f \"hytale-downloader\" ]; then\n  CANDIDATE=\"$(ls -1 hytale-downloader* 2>/dev/null | head -n 1 || true)\"\n  if [ -n \"$CANDIDATE\" ] && [ -f \"$CANDIDATE\" ]; then\n    mv -f \"$CANDIDATE\" hytale-downloader\n  fi\nfi\n\nif [ ! -f \"hytale-downloader\" ]; then\n  log \"ERROR: Could not find downloader binary after extraction. Directory listing:\"\n  ls -la || true\n  exit 1\nfi\n\nchmod +x hytale-downloader\n\nlog \"3) Downloading server/game files... (may take a while)\"\n# According to manual: --download-path game.zip\n./hytale-downloader --skip-update-check --download-path game.zip\n\n\"$JAR_BIN\" tf game.zip >/dev/null 2>&1 || {\n  log \"ERROR: game.zip is not a valid zip.\"\n  ls -lh game.zip || true\n  exit 1\n}\n\nlog \"Extracting game.zip...\"\n\"$JAR_BIN\" xf game.zip\nrm -f game.zip\n\n# Validate expected structure\n[ -f \"Assets.zip\" ] || { log \"ERROR: Assets.zip not found after extraction\"; ls -la || true; exit 1; }\n[ -f \"Server/HytaleServer.jar\" ] || { log \"ERROR: Server/HytaleServer.jar not found after extraction\"; ls -la Server || true; exit 1; }\n\nlog \"--- INSTALL COMPLETE ---\"",
      "type": "writefile"
    },
    {
      "commands": [
        "chmod +x install.sh",
        "./install.sh"
      ],
      "type": "command"
    },
    {
      "target": "start.sh",
      "text": "#!/bin/sh\nset -eu\n\nROOT_DIR=$(cd \"$(dirname \"$0\")\" && pwd)\nJAVA_BIN=\"$ROOT_DIR/local_java/bin/java\"\n\nPORT=\"${port:-5520}\"\nRAM=\"${ram:-4}\"\nAUTH_MODE=\"${auth_mode:-authenticated}\"\n\necho \"--- LAUNCHING HYTALE ---\"\n\nif [ ! -x \"$JAVA_BIN\" ]; then\n  echo \"CRITICAL: Java not found at $JAVA_BIN\"\n  echo \"Install failed or local_java is missing.\"\n  exit 1\nfi\n\n\"$JAVA_BIN\" -version || true\n\nASSETS=\"$ROOT_DIR/Assets.zip\"\nSERVER_DIR=\"$ROOT_DIR/Server\"\n\nif [ ! -f \"$ASSETS\" ]; then\n  echo \"CRITICAL: Missing $ASSETS\"\n  exit 1\nfi\n\nif [ ! -f \"$SERVER_DIR/HytaleServer.jar\" ]; then\n  echo \"CRITICAL: Missing $SERVER_DIR/HytaleServer.jar\"\n  exit 1\nfi\n\ncd \"$SERVER_DIR\"\n\n# Hytale uses QUIC over UDP. Make sure UDP port is forwarded/open.\nexec \"$JAVA_BIN\" -Xms1G -Xmx\"${RAM}G\" -jar \"HytaleServer.jar\" \\\n  --assets \"$ASSETS\" \\\n  --disable-sentry \\\n  --auth-mode \"$AUTH_MODE\" \\\n  --bind \"0.0.0.0:${PORT}\"\n",
      "type": "writefile"
    },
    {
      "commands": [
        "chmod +x start.sh"
      ],
      "type": "command"
    }
  ],
  "run": {
    "stop": "/stop",
    "command": "./start.sh",
    "workingDirectory": "",
    "pre": [],
    "post": [],
    "environmentVars": {
      "port": "${port}",
      "ram": "${ram}",
      "auth_mode": "${auth_mode}"
    }
  },
  "data": {
    "port": {
      "type": "integer",
      "display": "Port (UDP / QUIC)",
      "value": 5520
    },
    "ram": {
      "type": "integer",
      "display": "RAM (GB)",
      "value": 4
    },
    "auth_mode": {
      "type": "string",
      "display": "Auth Mode (authenticated/offline)",
      "value": "authenticated"
    }
  },
  "environment": {
    "type": "standard"
  },
  "supportedEnvironments": [
    {
      "type": "standard"
    }
  ],
  "requirements": {}
}

"commands": [
"echo '--- INSTALL START ---'",
"echo '1. Downloading Hytale Downloader...'",
"curl -L -o hytale-downloader.zip https://downloader.hytale.com/hytale-downloader.zip",
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"Scripting" like this is generally frown upon, because it's very intensive.
A lot of these operations are also covered in some other tool, which is agnostic.

curl for example has a "download" operation
unzip is "extract"
mv is "move"

"echo '2. Downloading Game Files...'",
"./hytale-downloader -skip-update-check -download-path game.zip",
"unzip -o game.zip",
"echo '3. Downloading Java 25...'",
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

javadl should be used, and "optional" if the environment is host

(when using environment as host, the "java" command is "java25"

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

],
"run": {
"stop": "/stop",
"command": "../local_java/bin/java -Xms1G -Xmx${ram}G -jar HytaleServer.jar --assets ../Assets.zip --disable-sentry --auth-mode authenticated --bind 0.0.0.0:${port} --backup --backup-dir ../Backups --backup-frequency 30",
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Simply is "java25" when environment is host

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"run": {
"stop": "/stop",
"command": "../local_java/bin/java -Xms1G -Xmx${ram}G -jar HytaleServer.jar --assets ../Assets.zip --disable-sentry --auth-mode authenticated --bind 0.0.0.0:${port} --backup --backup-dir ../Backups --backup-frequency 30",
"workingDirectory": "Server",
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is there a reason we can't use the "root" folder?

"workingDirectory": "Server",
"pre": [],
"post": [],
"environmentVars": {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

These should not be needed it seems, variable replacement does the command-line

],
"run": {
"stop": "/stop",
"command": "../local_java/bin/java -Xms1G -Xmx${ram}G -jar HytaleServer.jar --assets ../Assets.zip --disable-sentry --auth-mode authenticated --bind 0.0.0.0:${port} --backup --backup-dir ../Backups --backup-frequency 30",
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Also, the IP should be a variable for "consistency"

"type": "standard"
},
"supportedEnvironments": [
{
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Docker would be supported in this case, as it'd just need the eclipse image.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

See

{
"type": "host"
},
{
"type": "docker",
"image": "eclipse-temurin:17",
"portBindings": [
"0.0.0.0:${port}:${port}/tcp"
]
}

}
},
"environment": {
"type": "standard"
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Also, "host" instead of standard.

@08Robfin
Copy link
Author

im not a pro at all 😭 and when i try to fix all these Pufferpanel just spits out "unknown error", i dont know where to go now tbh.

@thojo0
Copy link

thojo0 commented Jan 17, 2026

My template already had almost everything @LordRalex requested, except for the extract, because in 3.0.0-rc.16 (16c77dd5df0d6edec9ef29f576e89e32978c3671) there is no ui selector for this.

EDIT:
I tested it now and it works for me (at least host).

New Template Json with `extract`
{
  "type": "hytale",
  "name": "hytale",
  "display": "Hytale",
  "data": {
    "ip": {
      "type": "string",
      "value": "0.0.0.0",
      "display": "IP",
      "desc": "What IP to bind the server to",
      "required": true,
      "userEdit": false
    },
    "javaversion": {
      "type": "string",
      "value": "25",
      "display": "Java Version",
      "desc": "Version of Java to use",
      "required": true,
      "userEdit": true
    },
    "jvmArgs": {
      "type": "string",
      "value": "",
      "display": "JVM Arguments",
      "desc": "Extra JVM arguments to pass",
      "required": false,
      "userEdit": false
    },
    "serverArgs": {
      "type": "string",
      "value": "",
      "display": "Server Arguments",
      "desc": "Extra server arguments to pass",
      "required": false,
      "userEdit": false
    },
    "memory": {
      "type": "integer",
      "value": 4096,
      "display": "Memory (MB)",
      "desc": "How much memory in MB to allocate to the Java Heap",
      "required": true,
      "userEdit": false
    },
    "port": {
      "type": "integer",
      "value": 5520,
      "display": "Port",
      "desc": "What port to bind the server to",
      "required": true,
      "userEdit": false
    },
    "patchline": {
      "type": "string",
      "value": "release",
      "display": "Patchline",
      "desc": "Patchline you wish to install.",
      "required": true,
      "userEdit": true
    }
  },
  "groups": [
    {
      "display": "General",
      "description": "General settings for all servers",
      "variables": [
        "memory",
        "ip",
        "port",
        "patchline",
        "javaversion",
        "jvmArgs",
        "serverArgs"
      ],
      "order": 1
    }
  ],
  "install": [
    {
      "if": "javaversion != '' && env == 'host'",
      "type": "javadl",
      "version": "${javaversion}"
    },
    {
      "type": "download",
      "files": [
        "https://downloader.hytale.com/hytale-downloader.zip"
      ]
    },
    {
      "type": "extract",
      "source": "hytale-downloader.zip",
      "destination": "."
    },
    {
      "type": "command",
      "commands": [
        "unzip -o hytale-downloader.zip hytale-downloader-linux-amd64",
        "rm -f hytale-downloader.zip hytale-downloader-windows-amd64.exe QUICKSTART.md",
        "chmod +x hytale-downloader-linux-amd64",
        "./hytale-downloader-linux-amd64 -skip-update-check -patchline ${patchline} -download-path game.zip"
      ]
    },
    {
      "type": "extract",
      "source": "game.zip",
      "destination": "."
    },
    {
      "type": "command",
      "commands": [
        "rm -f game.zip"
      ]
    }
  ],
  "run": {
    "command": [
      {
        "command": "java${javaversion} -Xmx${memory}M ${jvmArgs} -jar Server/HytaleServer.jar --assets Assets.zip --bind ${ip}:${port} ${serverArgs}",
        "if": "env == 'host'"
      },
      {
        "command": "java -Xmx${memory}M ${jvmArgs} -jar Server/HytaleServer.jar --assets Assets.zip --bind ${ip}:${port} ${serverArgs}"
      }
    ],
    "stop": "/stop",
    "stdin": {
      "type": "stdin"
    },
    "autostart": false,
    "autorecover": false,
    "autorestart": false
  },
  "environment": {
    "type": "host"
  },
  "supportedEnvironments": [
    {
      "type": "host"
    },
    {
      "type": "docker",
      "image": "eclipse-temurin:${javaversion}",
      "portBindings": [
        "0.0.0.0:${port}:${port}/udp"
      ]
    }
  ],
  "requirements": {
    "os": "linux",
    "arch": "amd64"
  }
}

@Marco-Melchio
Copy link

Can you use this template also for arm64? Bc i got my Pufferpannel on my rasp5 and in your json is amd64.

@TheBeaconCrafter
Copy link

TheBeaconCrafter commented Jan 20, 2026

Can you use this template also for arm64? Bc i got my Pufferpannel on my rasp5 and in your json is amd64.

I believe this template won't work on arm64 as the hytale downloader is currently only bundled for amd64. The hytale server software in itself works on arm64 tho.

@Marco-Melchio
Copy link

Can you use this template also for arm64? Bc i got my Pufferpannel on my rasp5 and in your json is amd64.

I believe this template won't work on arm64 as the hytale downloader is currently only bundled for amd64. The hytale server software in itself works on arm64 tho.

So would it be possible to edit this template to a working arm64 based template?

@nepcore
Copy link
Member

nepcore commented Jan 20, 2026

Can you use this template also for arm64? Bc i got my Pufferpannel on my rasp5 and in your json is amd64.

I believe this template won't work on arm64 as the hytale downloader is currently only bundled for amd64. The hytale server software in itself works on arm64 tho.

So would it be possible to edit this template to a working arm64 based template?

Not really, Hytale does not offer a way of downloading besides their downloader, which they don't offer for arm cpus

@thojo0
Copy link

thojo0 commented Jan 20, 2026

You could remove the downloader parts and upload the server files + Assets.zip yourself, but I don't think this should be expected in the normal template.

Hytale Server Docs - Server Files

@Marco-Melchio
Copy link

I might be missing something, but this feels a bit confusing.

https://support.hytale.com/hc/en-us/articles/45326769420827-Hytale-Server-Manual
The documentation says the Hytale server supports arm64, however the official downloader ZIP only includes:

  • hytale-downloader-linux-amd64
  • hytale-downloader-windows-amd64.exe
Screenshot 2026-01-20 162424

There doesn’t seem to be a linux-arm64 (aarch64) downloader, which makes it hard to set up a server directly on ARM machines like Raspberry Pi or ARM-based VPS without workarounds.

@nepcore
Copy link
Member

nepcore commented Jan 20, 2026

I might be missing something, but this feels a bit confusing.

You're not missing anything, the Hytale server is written in Java (or another JVM based language) and should run on anything you can run a JVM on. That includes ARM CPUs. But for some reason someone decided that automated downloads should only ever happen through their downloader tool, yet that is built in a CPU dependent way and not provided for ARM CPUs, due to which on ARM you can only set up a server manually. If you want to know why they made that decision you'll probably have to ask the Hytale team as I fail to find any logic in that.

@Marco-Melchio
Copy link

I might be missing something, but this feels a bit confusing.

You're not missing anything, the Hytale server is written in Java (or another JVM based language) and should run on anything you can run a JVM on. That includes ARM CPUs. But for some reason someone decided that automated downloads should only ever happen through their downloader tool, yet that is built in a CPU dependent way and not provided for ARM CPUs, due to which on ARM you can only set up a server manually. If you want to know why they made that decision you'll probably have to ask the Hytale team as I fail to find any logic in that.

Glad to hear I’m not the only one seeing it this way

I’ll try to reach out to the Hytale team for clarification.
In the meantime, I’ll likely use a workaround and run an amd64 Docker container on the rasp5 to handle the installation.

@BraveCake
Copy link

I might be missing something, but this feels a bit confusing.

You're not missing anything, the Hytale server is written in Java (or another JVM based language) and should run on anything you can run a JVM on. That includes ARM CPUs. But for some reason someone decided that automated downloads should only ever happen through their downloader tool, yet that is built in a CPU dependent way and not provided for ARM CPUs, due to which on ARM you can only set up a server manually. If you want to know why they made that decision you'll probably have to ask the Hytale team as I fail to find any logic in that.

you could modify the script to have no dependencies on the downloader.
just upload the server files anywhere and make the script download it from there.
this approach is definitely better than tightly coupling your script to their unreliable tool that could stop working later.

@thojo0
Copy link

thojo0 commented Jan 23, 2026

We could also implement the whole downloader as an hytaledl task in pufferpannel.

I found a reverse engineered project of the downloader: https://github.com/decomp-project/hytale-downloader/
So we could use this as a reference.
I don't think we could use the code directly, because of licensing.

@nepcore
Copy link
Member

nepcore commented Jan 23, 2026

just upload the server files anywhere and make the script download it from there.

I'm no legal expert, but I'm pretty sure that would be a massive copyright infringement and I'm good without massive and unwinnable legal issues.

this approach is definitely better than tightly coupling your script to their unreliable tool that could stop working later.

The tool they provide is most likely the only way they'll try to make sure keeps working since that's the only officially documented path. So far the only issue with it that I am aware of is missing support for ARM CPUs. That has nothing to do with reliability.

We could also implement the whole downloader as an hytaledl task in pufferpannel.

Then we have to keep track of any API changes and since they want you yo use their downloader and don't document the API I doubt they'll announce breaking changes ahead of time, should they happen.

@thojo0
Copy link

thojo0 commented Jan 23, 2026

I also think the best thing would be, if they release the downloader tool also in arm or even better, directly as jar, so we could use it anywhere, where the server itself would run.

@Marco-Melchio
Copy link

I’ve opened a ticket with Hytale Support regarding this.
Let’s see what they come back with.

grafik

{
"commands": [
"echo '--- MANUAL INSTALL START ---'",
"echo '1. Downloading Hytale Downloader...'",

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Configuration file looks good, simple and easy to use

@08Robfin
Copy link
Author

I still have not been able to get everything to work witrh the changes requested by LordRalex, so if anyone gets it working, please help me. As i mentioned in the top, i have never done this before.

@Hell32bits
Copy link

My template already had almost everything @LordRalex requested, except for the extract, because in 3.0.0-rc.16 (16c77dd5df0d6edec9ef29f576e89e32978c3671) there is no ui selector for this.

EDIT: I tested it now and it works for me (at least host).
New Template Json with extract

"requirements": {
"os": "linux",
"arch": "arm64"
}

I used this method on my Raspberry Pi and it worked perfectly, both installation and execution.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.