diff --git a/.automation/log.sh b/.automation/log.sh
new file mode 100755
index 0000000..a7ab55d
--- /dev/null
+++ b/.automation/log.sh
@@ -0,0 +1,53 @@
+#!/usr/bin/env bash
+
+declare -Agr B=(
+  [B]=$(echo -e "\e[44m")
+  [C]=$(echo -e "\e[46m")
+  [G]=$(echo -e "\e[42m")
+  [K]=$(echo -e "\e[40m")
+  [M]=$(echo -e "\e[45m")
+  [R]=$(echo -e "\e[41m")
+  [W]=$(echo -e "\e[47m")
+  [Y]=$(echo -e "\e[43m")
+)
+declare -Agr F=(
+  [B]=$(echo -e "\e[0;34m")
+  [C]=$(echo -e "\e[0;36m")
+  [G]=$(echo -e "\e[0;32m")
+  [K]=$(echo -e "\e[0;30m")
+  [M]=$(echo -e "\e[0;35m")
+  [R]=$(echo -e "\e[0;31m")
+  [W]=$(echo -e "\e[0;37m")
+  [Y]=$(echo -e "\e[0;33m")
+)
+readonly NC=$(echo -e "\e[0m")
+
+export B
+export F
+export NC
+
+# Log Functions
+LOG_TEMP=$(mktemp) || echo "Failed to create temporary log file."
+export LOG_TEMP
+echo "super-linter Log" > "${LOG_TEMP}"
+log() {
+  local TOTERM=${1:-}
+  local MESSAGE=${2:-}
+  echo -e "${MESSAGE:-}" | (
+    if [[ -n ${TOTERM} ]]; then
+      tee -a "${LOG_TEMP}" >&2
+    else
+      cat >> "${LOG_TEMP}" 2>&1
+    fi
+  )
+}
+trace() { log "${LOG_TRACE:-}" "${NC}$(date +"%F %T") ${F[B]}[TRACE ]${NC}   $*${NC}"; }
+debug() { log "${LOG_DEBUG:-}" "${NC}$(date +"%F %T") ${F[B]}[DEBUG ]${NC}   $*${NC}"; }
+info() { log "${LOG_VERBOSE:-}" "${NC}$(date +"%F %T") ${F[B]}[INFO  ]${NC}   $*${NC}"; }
+notice() { log "true" "${NC}$(date +"%F %T") ${F[G]}[NOTICE]${NC}   $*${NC}"; }
+warn() { log "true" "${NC}$(date +"%F %T") ${F[Y]}[WARN  ]${NC}   $*${NC}"; }
+error() { log "true" "${NC}$(date +"%F %T") ${F[R]}[ERROR ]${NC}   $*${NC}"; }
+fatal() {
+  log "true" "${NC}$(date +"%F %T") ${B[R]}${F[W]}[FATAL ]${NC}   $*${NC}"
+  exit 1
+}
diff --git a/.automation/upload-docker.sh b/.automation/upload-docker.sh
new file mode 100755
index 0000000..fd704da
--- /dev/null
+++ b/.automation/upload-docker.sh
@@ -0,0 +1,480 @@
+#!/usr/bin/env bash
+
+################################################################################
+############# Deploy Container to DockerHub @admiralawkbar #####################
+################################################################################
+
+# NOTES: This script is used to upload a Dockerfile to DockerHub
+# under the GitHub organization
+# Its based on being built from a GitHub Action, but could be easily updated
+# To be ran in a different medium.
+#
+# PRE-Requirements:
+# - Dockerfile
+# - System with Docker installed
+# - Global variables met
+
+###########
+# Globals #
+###########
+GITHUB_WORKSPACE="${GITHUB_WORKSPACE}" # GitHub Workspace
+DOCKER_USERNAME="${DOCKER_USERNAME}"   # Username to login to DockerHub
+DOCKER_PASSWORD="${DOCKER_PASSWORD}"   # Password to login to DockerHub
+GPR_USERNAME="${GPR_USERNAME}"         # Username to login to GitHub package registry
+GPR_TOKEN="${GPR_TOKEN}"               # Password to login to GitHub package registry
+REGISTRY="${REGISTRY}"                 # What registry to upload | <GPR> or <Docker>
+IMAGE_REPO="${IMAGE_REPO}"             # Image repo to upload the image
+IMAGE_VERSION="${IMAGE_VERSION}"       # Version to tag the image
+DOCKERFILE_PATH="${DOCKERFILE_PATH}"   # Path to the Dockerfile to be uploaded
+MAJOR_TAG=''                           # Major tag version if we need to update it
+UPDATE_MAJOR_TAG=0                     # Flag to deploy the major tag version as well
+
+#########################
+# Source Function Files #
+#########################
+# shellcheck source=/dev/null
+source "${GITHUB_WORKSPACE}/.automation/log.sh" # Source the function script(s)
+
+################################################################################
+############################ FUNCTIONS BELOW ###################################
+################################################################################
+################################################################################
+#### Function Header ###########################################################
+Header() {
+  info "-------------------------------------------------------"
+  info "---- GitHub Actions Upload image to [${REGISTRY}] ----"
+  info "-------------------------------------------------------"
+}
+################################################################################
+#### Function ValidateInput ####################################################
+ValidateInput() {
+  # Need to validate we have the basic variables
+  ################
+  # Print header #
+  ################
+  info "----------------------------------------------"
+  info "Gathering variables..."
+  info "----------------------------------------------"
+
+  #############################
+  # Validate GITHUB_WORKSPACE #
+  #############################
+  if [ -z "${GITHUB_WORKSPACE}" ]; then
+    error "Failed to get [GITHUB_WORKSPACE]!"
+    fatal "[${GITHUB_WORKSPACE}]"
+  else
+    info "Successfully found:${F[W]}[GITHUB_WORKSPACE]${F[B]}, value:${F[W]}[${GITHUB_WORKSPACE}]"
+  fi
+
+  #####################
+  # Validate REGISTRY #
+  #####################
+  if [ -z "${REGISTRY}" ]; then
+    error "Failed to get [REGISTRY]!"
+    fatal "[${REGISTRY}]"
+  else
+    info "Successfully found:${F[W]}[REGISTRY]${F[B]}, value:${F[W]}[${REGISTRY}]"
+  fi
+
+  #####################################################
+  # See if we need values for GitHub package Registry #
+  #####################################################
+  if [[ ${REGISTRY} == "GPR" ]]; then
+    #########################
+    # Validate GPR_USERNAME #
+    #########################
+    if [ -z "${GPR_USERNAME}" ]; then
+      error "Failed to get [GPR_USERNAME]!"
+      fatal "[${GPR_USERNAME}]"
+    else
+      info "Successfully found:${F[W]}[GPR_USERNAME]${F[B]}, value:${F[W]}[${GPR_USERNAME}]"
+    fi
+
+    ######################
+    # Validate GPR_TOKEN #
+    ######################
+    if [ -z "${GPR_TOKEN}" ]; then
+      error "Failed to get [GPR_TOKEN]!"
+      fatal "[${GPR_TOKEN}]"
+    else
+      info "Successfully found:${F[W]}[GPR_TOKEN]${F[B]}, value:${F[W]}[********]"
+    fi
+  ########################################
+  # See if we need values for Ducker hub #
+  ########################################
+  elif [[ ${REGISTRY} == "Docker" ]]; then
+    ############################
+    # Validate DOCKER_USERNAME #
+    ############################
+    if [ -z "${DOCKER_USERNAME}" ]; then
+      error "Failed to get [DOCKER_USERNAME]!"
+      fatal "[${DOCKER_USERNAME}]"
+    else
+      info "Successfully found:${F[W]}[DOCKER_USERNAME]${F[B]}, value:${F[W]}[${DOCKER_USERNAME}]"
+    fi
+
+    ############################
+    # Validate DOCKER_PASSWORD #
+    ############################
+    if [ -z "${DOCKER_PASSWORD}" ]; then
+      error "Failed to get [DOCKER_PASSWORD]!"
+      fatal "[${DOCKER_PASSWORD}]"
+    else
+      info "Successfully found:${F[W]}[DOCKER_PASSWORD]${F[B]}, value:${F[B]}[********]"
+    fi
+  ###########################################
+  # We were not passed a registry to update #
+  ###########################################
+  else
+    error "Failed to find a valid registry!"
+    fatal "Registry:[${REGISTRY}]"
+  fi
+
+  #######################
+  # Validate IMAGE_REPO #
+  #######################
+  if [ -z "${IMAGE_REPO}" ]; then
+    error "Failed to get [IMAGE_REPO]!"
+    fatal "[${IMAGE_REPO}]"
+  else
+    info "Successfully found:${F[W]}[IMAGE_REPO]${F[B]}, value:${F[W]}[${IMAGE_REPO}]"
+    ###############################################
+    # Need to see if GPR registry and update name #
+    ###############################################
+    if [[ ${REGISTRY} == "GPR" ]]; then
+      NAME="docker.pkg.github.com/${IMAGE_REPO}/rally"
+      IMAGE_REPO="${NAME}"
+      info "Updated [IMAGE_REPO] to:[${IMAGE_REPO}] for GPR"
+    fi
+  fi
+
+  ##########################
+  # Validate IMAGE_VERSION #
+  ##########################
+  if [ -z "${IMAGE_VERSION}" ]; then
+    warn "Failed to get [IMAGE_VERSION]!"
+    info "Pulling from Branch Name..."
+    ##############################
+    # Get the name of the branch #
+    ##############################
+    BRANCH_NAME=$(git -C "${GITHUB_WORKSPACE}" branch --contains "${GITHUB_SHA}" | awk '{print ${2}}' 2>&1)
+
+    #######################
+    # Load the error code #
+    #######################
+    ERROR_CODE=$?
+
+    ##############################
+    # Check the shell for errors #
+    ##############################
+    if [ ${ERROR_CODE} -ne 0 ]; then
+      error "Failed to get branch name!"
+      fatal "[${BRANCH_NAME}]"
+    fi
+
+    ##################################
+    # Remove non alpha-numeric chars #
+    ##################################
+    BRANCH_NAME=$(echo "${BRANCH_NAME}" | tr -cd '[:alnum:]')
+
+    ############################################
+    # Set the IMAGE_VERSION to the BRANCH_NAME #
+    ############################################
+    IMAGE_VERSION="${BRANCH_NAME}"
+    info "Tag:[${IMAGE_VERSION}]"
+  else
+    info "Successfully found:${F[W]}[IMAGE_VERSION]${F[B]}, value:${F[W]}[${IMAGE_VERSION}]"
+  fi
+
+  ##################################
+  # Set regex for getting tag info #
+  ##################################
+  REGEX='(v[0-9]+\.[0-9]+\.[0-9]+)' # Matches 'v1.2.3'
+
+  ######################################################################
+  # Check if this is a latest to a versioned release at create new tag #
+  ######################################################################
+  if [[ ${IMAGE_VERSION} =~ ${REGEX} ]]; then
+    # Need to get the major version, and set flag to update
+
+    #####################
+    # Set the major tag #
+    #####################
+    MAJOR_TAG=$(echo "${IMAGE_VERSION}" | cut -d '.' -f1)
+
+    ###################################
+    # Set flag for updating major tag #
+    ###################################
+    UPDATE_MAJOR_TAG=1
+
+    info "- Also deploying a major tag of:[${MAJOR_TAG}]"
+  fi
+
+  ############################
+  # Validate DOCKERFILE_PATH #
+  ############################
+  if [ -z "${DOCKERFILE_PATH}" ]; then
+    error "Failed to get [DOCKERFILE_PATH]!"
+    fatal "[${DOCKERFILE_PATH}]"
+  else
+    info "Successfully found:${F[W]}[DOCKERFILE_PATH]${F[B]}, value:${F[W]}[${DOCKERFILE_PATH}]"
+  fi
+}
+################################################################################
+#### Function Authenticate #####################################################
+Authenticate() {
+  ################
+  # Pull in Vars #
+  ################
+  USERNAME="${1}" # Name to auth with
+  PASSWORD="${2}" # Password to auth with
+  URL="${3}"      # Url to auth towards
+  NAME="${4}"     # name of the service
+
+  ################
+  # Print header #
+  ################
+  info "----------------------------------------------"
+  info "Login to ${NAME}..."
+  info "----------------------------------------------"
+
+  ###################
+  # Auth to service #
+  ###################
+  LOGIN_CMD=$(docker login "${URL}" --username "${USERNAME}" --password "${PASSWORD}" 2>&1)
+
+  #######################
+  # Load the error code #
+  #######################
+  ERROR_CODE=$?
+
+  ##############################
+  # Check the shell for errors #
+  ##############################
+  if [ ${ERROR_CODE} -ne 0 ]; then
+    # ERROR
+    error "Failed to authenticate to ${NAME}!"
+    fatal "[${LOGIN_CMD}]"
+  else
+    # SUCCESS
+    info "Successfully authenticated to ${F[C]}${NAME}${F[B]}!"
+  fi
+}
+################################################################################
+#### Function BuildImage #######################################################
+BuildImage() {
+  ################
+  # Print header #
+  ################
+  info "----------------------------------------------"
+  info "Building the DockerFile image..."
+  info "----------------------------------------------"
+
+  ################################
+  # Validate the DOCKERFILE_PATH #
+  ################################
+  if [ ! -f "${DOCKERFILE_PATH}" ]; then
+    # No file found
+    error "failed to find Dockerfile at:[${DOCKERFILE_PATH}]"
+    error "Please make sure you give full path!"
+    fatal "Example:[/configs/Dockerfile] or [Dockerfile] if at root directory"
+  fi
+
+  ###################
+  # Build the image #
+  ###################
+  docker build --no-cache -t "${IMAGE_REPO}:${IMAGE_VERSION}" -f "${DOCKERFILE_PATH}" . 2>&1
+
+  #######################
+  # Load the error code #
+  #######################
+  ERROR_CODE=$?
+
+  ##############################
+  # Check the shell for errors #
+  ##############################
+  if [ ${ERROR_CODE} -ne 0 ]; then
+    # ERROR
+    fatal "failed to [build] Dockerfile!"
+  else
+    # SUCCESS
+    info "Successfully Built image!"
+  fi
+
+  ########################################################
+  # Need to see if we need to tag a major update as well #
+  ########################################################
+  if [ ${UPDATE_MAJOR_TAG} -eq 1 ]; then
+    # Tag the image with the major tag as well
+    docker build -t "${IMAGE_REPO}:${MAJOR_TAG}" -f "${DOCKERFILE_PATH}" . 2>&1
+
+    #######################
+    # Load the error code #
+    #######################
+    ERROR_CODE=$?
+
+    ##############################
+    # Check the shell for errors #
+    ##############################
+    if [ ${ERROR_CODE} -ne 0 ]; then
+      # ERROR
+      fatal "failed to [tag] Dockerfile!"
+    else
+      # SUCCESS
+      info "Successfully tagged image!"
+    fi
+  fi
+}
+################################################################################
+#### Function UploadImage ######################################################
+UploadImage() {
+  ################
+  # Print header #
+  ################
+  info "----------------------------------------------"
+  info "Uploading the DockerFile image to ${REGISTRY}..."
+  info "----------------------------------------------"
+
+  ############################################
+  # Upload the docker image that was created #
+  ############################################
+  docker push "${IMAGE_REPO}:${IMAGE_VERSION}" 2>&1
+
+  #######################
+  # Load the error code #
+  #######################
+  ERROR_CODE=$?
+
+  ##############################
+  # Check the shell for errors #
+  ##############################
+  if [ ${ERROR_CODE} -ne 0 ]; then
+    # ERROR
+    fatal "failed to [upload] Dockerfile!"
+  else
+    # SUCCESS
+    info "Successfully Uploaded Docker image:${F[W]}[${IMAGE_VERSION}]${F[B]} to ${F[C]}${REGISTRY}${F[B]}!"
+  fi
+
+  #########################
+  # Get Image information #
+  #########################
+  IFS=$'\n' # Set the delimit to newline
+  GET_INFO_CMD=$(docker images | grep "${IMAGE_REPO}" | grep "${IMAGE_VERSION}" 2>&1)
+
+  #######################
+  # Load the error code #
+  #######################
+  ERROR_CODE=$?
+
+  ##############################
+  # Check the shell for errors #
+  ##############################
+  if [ ${ERROR_CODE} -ne 0 ]; then
+    # ERROR
+    error "Failed to get information about built Image!"
+    fatal "[${GET_INFO_CMD}]"
+  else
+    ################
+    # Get the data #
+    ################
+    REPO=$(echo "${GET_INFO_CMD}" | awk '{print ${1}}')
+    TAG=$(echo "${GET_INFO_CMD}" | awk '{print ${2}}')
+    IMAGE_ID=$(echo "${GET_INFO_CMD}" | awk '{print ${3}}')
+    SIZE="${GET_INFO_CMD##* }"
+
+    ###################
+    # Print the goods #
+    ###################
+    info "----------------------------------------------"
+    info "Docker Image Details:"
+    info "Repository:[${REPO}]"
+    info "Tag:[${TAG}]"
+    info "Image_ID:[${IMAGE_ID}]"
+    info "Size:[${SIZE}]"
+    info "----------------------------------------------"
+  fi
+
+  ###############################################################
+  # Check if we need to upload the major tagged version as well #
+  ###############################################################
+  if [ ${UPDATE_MAJOR_TAG} -eq 1 ]; then
+    ############################################
+    # Upload the docker image that was created #
+    ############################################
+    docker push "${IMAGE_REPO}:${MAJOR_TAG}" 2>&1
+
+    #######################
+    # Load the error code #
+    #######################
+    ERROR_CODE=$?
+
+    ##############################
+    # Check the shell for errors #
+    ##############################
+    if [ ${ERROR_CODE} -ne 0 ]; then
+      # ERROR
+      fatal "failed to [upload] MAJOR_TAG:[${MAJOR_TAG}] Dockerfile!"
+    else
+      # SUCCESS
+      info "Successfully Uploaded TAG:${F[W]}[${MAJOR_TAG}]${F[B]} of Docker image to ${F[C]}${REGISTRY}${F[B]}!"
+    fi
+  fi
+}
+################################################################################
+#### Function Footer ###########################################################
+Footer() {
+  info "-------------------------------------------------------"
+  info "The step has completed"
+  info "-------------------------------------------------------"
+}
+################################################################################
+################################## MAIN ########################################
+################################################################################
+
+##########
+# Header #
+##########
+Header
+
+##################
+# Validate Input #
+##################
+ValidateInput
+
+###################
+# Build the image #
+###################
+BuildImage
+
+######################
+# Login to DockerHub #
+######################
+if [[ ${REGISTRY} == "Docker" ]]; then
+  # Authenticate "Username" "Password" "Url" "Name"
+  Authenticate "${DOCKER_USERNAME}" "${DOCKER_PASSWORD}" "" "Dockerhub"
+
+####################################
+# Login to GitHub Package Registry #
+####################################
+elif [[ ${REGISTRY} == "GPR" ]]; then
+  # Authenticate "Username" "Password" "Url" "Name"
+  Authenticate "${GPR_USERNAME}" "${GPR_TOKEN}" "https://docker.pkg.github.com" "GitHub Package Registry"
+
+else
+  #########
+  # ERROR #
+  #########
+  error "Registry not set correctly!"
+  fatal "Registry:[${REGISTRY}]"
+fi
+
+####################
+# Upload the image #
+####################
+UploadImage
+
+##########
+# Footer #
+##########
+Footer
diff --git a/.github/workflows/deploy-PROD.yml b/.github/workflows/deploy-PROD.yml
new file mode 100644
index 0000000..640460e
--- /dev/null
+++ b/.github/workflows/deploy-PROD.yml
@@ -0,0 +1,55 @@
+---
+#########################
+#########################
+## Deploy Docker Image ##
+#########################
+#########################
+
+#
+# Documentation:
+# https://help.github.com/en/articles/workflow-syntax-for-github-actions
+#
+
+#######################################
+# Start the job on all push to master #
+#######################################
+on:
+  push:
+    branches:
+      - 'main'
+
+###############
+# Set the Job #
+###############
+jobs:
+  build:
+    # Name the Job
+    name: Deploy Docker Image - PROD
+    # Set the agent to run on
+    runs-on: ubuntu-latest
+    # Only run this on the main repo
+    if: github.repository == 'github/rally'
+    ##################
+    # Load all steps #
+    ##################
+    steps:
+      ##########################
+      # Checkout the code base #
+      ##########################
+      - name: Checkout Code
+        uses: actions/checkout@v2.3.2
+
+      #####################
+      # Run Deploy script #
+      #####################
+      - name: Deploy latest image to DockerHub
+        env:
+          # Set the Env Vars
+          DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }}
+          DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }}
+          IMAGE_REPO: github/rally
+          IMAGE_VERSION: latest
+          DOCKERFILE_PATH: Dockerfile
+          REGISTRY: Docker
+        shell: bash
+        run: .automation/upload-docker.sh
diff --git a/.github/workflows/deploy-RELEASE.yml b/.github/workflows/deploy-RELEASE.yml
new file mode 100644
index 0000000..0413da6
--- /dev/null
+++ b/.github/workflows/deploy-RELEASE.yml
@@ -0,0 +1,70 @@
+---
+#########################
+#########################
+## Deploy Docker Image ##
+#########################
+#########################
+
+#
+# Documentation:
+# https://help.github.com/en/articles/workflow-syntax-for-github-actions
+#
+
+#######################################
+# Start the job on all push to master #
+#######################################
+on:
+  release:
+    # Want to run the automation when a release is created
+    types: ['published']
+
+###############
+# Set the Job #
+###############
+jobs:
+  build:
+    # Name the Job
+    name: Deploy Docker Image - Release
+    # Set the agent to run on
+    runs-on: ubuntu-latest
+    # Only run on main repo
+    if: github.repository == 'github/rally'
+    ##################
+    # Load all steps #
+    ##################
+    steps:
+      ##########################
+      # Checkout the code base #
+      ##########################
+      - name: Checkout Code
+        uses: actions/checkout@v2.3.2
+
+      ###################################
+      # Run Deploy script for Dockerhub #
+      ###################################
+      - name: Deploy Release image to Dockerhub
+        env:
+          # Set the Env Vars
+          DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }}
+          DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }}
+          IMAGE_REPO: github/rally
+          IMAGE_VERSION: ${{ github.event.release.tag_name }}
+          DOCKERFILE_PATH: Dockerfile
+          REGISTRY: Docker
+        shell: bash
+        run: .automation/upload-docker.sh
+
+      #############################
+      # Run Deploy script for GPR #
+      #############################
+      - name: Deploy Release image to GitHub Package Registry
+        env:
+          # Set the Env Vars
+          GPR_USERNAME: ${{ secrets.GPR_USERNAME }}
+          GPR_TOKEN: ${{ secrets.GPR_TOKEN }}
+          IMAGE_REPO: github/rally
+          IMAGE_VERSION: ${{ github.event.release.tag_name }}
+          DOCKERFILE_PATH: Dockerfile
+          REGISTRY: GPR
+        shell: bash
+        run: .automation/upload-docker.sh
diff --git a/.github/workflows/log.sh b/.github/workflows/log.sh
new file mode 100644
index 0000000..a7ab55d
--- /dev/null
+++ b/.github/workflows/log.sh
@@ -0,0 +1,53 @@
+#!/usr/bin/env bash
+
+declare -Agr B=(
+  [B]=$(echo -e "\e[44m")
+  [C]=$(echo -e "\e[46m")
+  [G]=$(echo -e "\e[42m")
+  [K]=$(echo -e "\e[40m")
+  [M]=$(echo -e "\e[45m")
+  [R]=$(echo -e "\e[41m")
+  [W]=$(echo -e "\e[47m")
+  [Y]=$(echo -e "\e[43m")
+)
+declare -Agr F=(
+  [B]=$(echo -e "\e[0;34m")
+  [C]=$(echo -e "\e[0;36m")
+  [G]=$(echo -e "\e[0;32m")
+  [K]=$(echo -e "\e[0;30m")
+  [M]=$(echo -e "\e[0;35m")
+  [R]=$(echo -e "\e[0;31m")
+  [W]=$(echo -e "\e[0;37m")
+  [Y]=$(echo -e "\e[0;33m")
+)
+readonly NC=$(echo -e "\e[0m")
+
+export B
+export F
+export NC
+
+# Log Functions
+LOG_TEMP=$(mktemp) || echo "Failed to create temporary log file."
+export LOG_TEMP
+echo "super-linter Log" > "${LOG_TEMP}"
+log() {
+  local TOTERM=${1:-}
+  local MESSAGE=${2:-}
+  echo -e "${MESSAGE:-}" | (
+    if [[ -n ${TOTERM} ]]; then
+      tee -a "${LOG_TEMP}" >&2
+    else
+      cat >> "${LOG_TEMP}" 2>&1
+    fi
+  )
+}
+trace() { log "${LOG_TRACE:-}" "${NC}$(date +"%F %T") ${F[B]}[TRACE ]${NC}   $*${NC}"; }
+debug() { log "${LOG_DEBUG:-}" "${NC}$(date +"%F %T") ${F[B]}[DEBUG ]${NC}   $*${NC}"; }
+info() { log "${LOG_VERBOSE:-}" "${NC}$(date +"%F %T") ${F[B]}[INFO  ]${NC}   $*${NC}"; }
+notice() { log "true" "${NC}$(date +"%F %T") ${F[G]}[NOTICE]${NC}   $*${NC}"; }
+warn() { log "true" "${NC}$(date +"%F %T") ${F[Y]}[WARN  ]${NC}   $*${NC}"; }
+error() { log "true" "${NC}$(date +"%F %T") ${F[R]}[ERROR ]${NC}   $*${NC}"; }
+fatal() {
+  log "true" "${NC}$(date +"%F %T") ${B[R]}${F[W]}[FATAL ]${NC}   $*${NC}"
+  exit 1
+}
diff --git a/.github/workflows/stack-linter.yml b/.github/workflows/stack-linter.yml
index 35fc28c..830b955 100644
--- a/.github/workflows/stack-linter.yml
+++ b/.github/workflows/stack-linter.yml
@@ -42,7 +42,7 @@ jobs:
       # Run Linter against code base #
       ################################
       - name: Lint Code Base
-        uses: docker://github/super-linter:latest
+        uses: github/super-linter@v3
         env:
           VALIDATE_ALL_CODEBASE: false
           DEFAULT_BRANCH: main
diff --git a/Dockerfile b/Dockerfile
index 71bc716..1910bf8 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -20,12 +20,12 @@ COPY --chown=node:node lib /opt/rally/lib
 ## Future updates to this Dockerfile _may_ move this over to
 ## pure environment variables in Docker, so it can be passed at the CLI.
 ## This will be purely based on demand
-COPY --chown=node:node .env /opt/rally/
+# COPY --chown=node:node .env /opt/rally/
 
 ## This can probably be removed, but users will have to make sure they
 ## run the container, then copy the key. This helps avoid that for folks
 ## using this in their enterprise environments
-COPY --chown=node:node .ssh/rally.pem /opt/rally/.ssh/
+# COPY --chown=node:node .ssh/rally.pem /opt/rally/.ssh/
 
 ## We need Python for Probot
 RUN apk add --no-cache make python
@@ -37,7 +37,7 @@ USER node
 WORKDIR /opt/rally
 
 ## Not strictly necessary, but set permissions to 400
-RUN chmod 400 /opt/rally/.ssh/rally.pem /opt/rally/.env
+# RUN chmod 400 /opt/rally/.ssh/rally.pem /opt/rally/.env
 
 ## Install the app and dependencies
 RUN npm install
diff --git a/docs/pullFromDockerHub.md b/docs/pullFromDockerHub.md
new file mode 100644
index 0000000..c1ff4be
--- /dev/null
+++ b/docs/pullFromDockerHub.md
@@ -0,0 +1,43 @@
+# Pull Rally Probot and run image from DockerHub
+The **Rally + GitHub** app can be pulled from **Docker Hub** and deployed using your container environment.
+The only work needed would be loading the correct environment variables.
+
+## Pull Image down from DockerHub
+- Currently the image is hosted at `docker://github/rally`
+- You can pull the image down with: `docker pull github/rally:latest` or a specific version
+
+## Run Container with environment variables
+- You can then run the downloaded container by passing all information as environment variables
+  - `docker run -e APP_ID=<123> -e WEBHOOK_SECRET=<SECRET> github/rally`
+- You could run using docker compose
+```yml
+---
+#####################################
+# Docker compose for Rally + GitHub #
+#####################################
+
+###########
+# Version #
+###########
+version: '3.3'
+
+####################
+# Set the services #
+####################
+services:
+    rally:
+        # Set the open ports
+        ports:
+            - '3000:3000'
+        # Set to restart on error
+        restart: always
+        # Set logging informatgion
+        logging:
+            options:
+                max-size: 1g
+        environment:
+          - APP_ID=<123>
+          - WEBHOOK_SECRET=<SECRET>
+        # Start the image
+        image: github/rally
+```
