diff --git a/PVEDiscordDark.sh b/PVEDiscordDark.sh
new file mode 100644
index 0000000..6c643d4
--- /dev/null
+++ b/PVEDiscordDark.sh
@@ -0,0 +1,227 @@
+#!/bin/bash
+# https://github.com/Weilbyte/PVEDiscordDark
+
+#region Consts
+RED='\033[0;31m'
+BRED='\033[0;31m\033[1m'
+GRN='\033[92m'
+WARN='\033[93m'
+BOLD='\033[1m'
+REG='\033[0m'
+CHECKMARK='\033[0;32m\xE2\x9C\x94\033[0m'
+
+TEMPLATE_FILE="/usr/share/pve-manager/index.html.tpl"
+SCRIPTPATH="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/$(basename "${BASH_SOURCE[0]}")"
+
+REPO=${REPO:-"Weilbyte/PVEDiscordDark"}
+DEFAULT_TAG="master"
+TAG=${TAG:-$DEFAULT_TAG}
+BASE_URL="https://raw.githubusercontent.com/$REPO/$TAG"
+#endregion Consts
+
+#region Prerun checks
+hash sed 2>/dev/null || {
+ echo -e >&2 "${BRED}sed is required but missing from your system${REG}";
+ exit 1;
+}
+
+hash curl 2>/dev/null || {
+ echo -e >&2 "${BRED}cURL is required but missing from your system${REG}";
+ exit 1;
+}
+
+hash pveversion 2>/dev/null || {
+ echo -e >&2 "${BRED}PVE installation required but missing from your system${REG}";
+ exit 1;
+}
+
+curl -sSf -f https://github.com/robots.txt &> /dev/null || {
+ echo -e >&2 "${BRED}Could not establish a connection to GitHub (github.com)${REG}";
+ exit 1;
+}
+
+if [ $TAG != $DEFAULT_TAG ]; then
+ if !([[ $TAG =~ [0-9] ]] && [ ${#TAG} -ge 7 ] && (! [[ $TAG =~ ['!@#$%^&*()_+.'] ]]) ); then
+ echo -e "${WARN}It appears like you are using a non-default tag. For security purposes, please use the SHA-1 hash of said tag instead${REG}"
+ fi
+fi
+#endregion Prerun checks
+
+PVEVersion=$(pveversion --verbose | grep pve-manager | cut -c 14- | cut -c -6) # Below pveversion pre-run check
+PVEVersionMajor=$(echo $PVEVersion | cut -d'-' -f1)
+
+#region Helper functions
+function checkSupported {
+ local SUPPORTED=$(curl -f -s "$BASE_URL/meta/supported")
+ if [ -z "$SUPPORTED" ]; then
+ echo -e "${WARN}Could not reach supported version file ($BASE_URL/meta/supported). Skipping support check.${REG}"
+ else
+ local SUPPORTEDARR=($(echo "$SUPPORTED" | tr ',' '\n'))
+ if ! (printf '%s\n' "${SUPPORTEDARR[@]}" | grep -q -P "$PVEVersionMajor"); then
+ echo -e "${WARN}You might encounter issues because your version ($PVEVersionMajor) is not matching currently supported versions ($SUPPORTED)."
+ echo -e "If you do run into any issues on >newer< versions, please consider opening an issue at https://github.com/Weilbyte/PVEDiscordDark/issues.${REG}"
+ fi
+ fi
+}
+
+function isInstalled {
+ if (grep -Fq "" $TEMPLATE_FILE ||
+ grep -Fq "" $TEMPLATE_FILE ||
+ [ -f "/usr/share/pve-manager/css/dd_style.css" ] ); then
+ true
+ else
+ false
+ fi
+}
+
+#endregion Helper functions
+
+#region Main functions
+function usage {
+ if [ "$_silent" = false ]; then
+ echo -e "Usage: $0 [OPTIONS...] {COMMAND}\n"
+ echo -e "Manages the PVEDiscordDark theme."
+ echo -e " -h --help Show this help"
+ echo -e " -s --silent Silent mode\n"
+ echo -e "Commands:"
+ echo -e " status Check current theme status (in silent mode, returns 0 if installed, and 1 if not installed)"
+ echo -e " install Install the theme"
+ echo -e " uninstall Uninstall the theme"
+ echo -e " update Update the theme (runs uninstall, then install)"
+ echo -e " utility-update Update this utility\n"
+ echo -e "Exit status:"
+ echo -e " 0 OK"
+ echo -e " 1 Failure"
+ echo -e " 2 Already installed, OR not installed (when using install/uninstall commands)\n"
+ echo -e "Report issues at: "
+ fi
+}
+
+function status {
+ if [ "$_silent" = false ]; then
+ echo -e "Theme"
+ if isInstalled; then
+ echo -e " Status: ${GRN}present${REG}"
+ else
+ echo -e " Status: ${RED}not present${REG}"
+ fi
+ echo -e " CSS: $(sha256sum /usr/share/pve-manager/css/dd_style.css 2>/dev/null || echo N/A)"
+ echo -e " JS: $(sha256sum /usr/share/pve-manager/js/dd_patcher.js 2>/dev/null || echo N/A)\n"
+ echo -e "PVE"
+ echo -e " Version: $PVEVersion (major $PVEVersionMajor)\n"
+ echo -e "Utility hash: $(sha256sum $SCRIPTPATH 2>/dev/null || echo N/A)"
+ exit 0
+ else
+ if isInstalled; then exit 0; else exit 1; fi
+ fi
+}
+
+function install {
+ if isInstalled; then
+ if [ "$_silent" = false ]; then echo -e "${RED}Theme already installed${REG}"; fi
+ exit 2
+ else
+ if [ "$_silent" = false ]; then checkSupported; fi
+
+ if [ "$_silent" = false ]; then echo -e "${CHECKMARK} Backing up template file"; fi
+ cp $TEMPLATE_FILE $TEMPLATE_FILE.bak
+
+ if [ "$_silent" = false ]; then echo -e "${CHECKMARK} Downloading stylesheet"; fi
+ curl -s $BASE_URL/PVEDiscordDark/sass/PVEDiscordDark.css > /usr/share/pve-manager/css/dd_style.css
+
+ if [ "$_silent" = false ]; then echo -e "${CHECKMARK} Downloading patcher"; fi
+ curl -s $BASE_URL/PVEDiscordDark/js/PVEDiscordDark.js > /usr/share/pve-manager/js/dd_patcher.js
+
+ if [ "$_silent" = false ]; then echo -e "${CHECKMARK} Applying changes to template file"; fi
+ echo "" >> $TEMPLATE_FILE
+ echo "" >> $TEMPLATE_FILE
+
+ local IMAGELIST=$(curl -f -s "$BASE_URL/meta/imagelist")
+ local IMAGELISTARR=($(echo "$IMAGELIST" | tr ',' '\n'))
+ if [ "$_silent" = false ]; then echo -e "Downloading images (0/${#IMAGELISTARR[@]})"; fi
+ ITER=0
+ for image in "${IMAGELISTARR[@]}"
+ do
+ curl -s $BASE_URL/PVEDiscordDark/images/$image > /usr/share/pve-manager/images/$image
+ ((ITER++))
+ if [ "$_silent" = false ]; then echo -e "\e[1A\e[KDownloading images ($ITER/${#IMAGELISTARR[@]})"; fi
+ done
+ if [ "$_silent" = false ]; then echo -e "\e[1A\e[K${CHECKMARK} Downloading images (${#IMAGELISTARR[@]}/${#IMAGELISTARR[@]})"; fi
+
+ if [ "$_silent" = false ]; then echo -e "Theme installed."; fi
+ exit 0
+ fi
+}
+
+function uninstall {
+ if ! isInstalled; then
+ echo -e "${RED}Theme not installed${REG}"
+ exit 2
+ else
+ if [ "$_silent" = false ]; then echo -e "${CHECKMARK} Removing stylesheet"; fi
+ rm /usr/share/pve-manager/css/dd_style.css
+
+ if [ "$_silent" = false ]; then echo -e "${CHECKMARK} Removing patcher"; fi
+ rm /usr/share/pve-manager/js/dd_patcher.js
+
+ if [ "$_silent" = false ]; then echo -e "${CHECKMARK} Reverting changes to template file"; fi
+ sed -i "//d" /usr/share/pve-manager/index.html.tpl
+ sed -i "/