diff --git a/.dockerignore b/.dockerignore
new file mode 100755
index 0000000..04204c7
--- /dev/null
+++ b/.dockerignore
@@ -0,0 +1 @@
+config
diff --git a/.gitignore b/.gitignore
new file mode 100755
index 0000000..04204c7
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1 @@
+config
diff --git a/Dockerfile b/Dockerfile
new file mode 100644
index 0000000..18646ce
--- /dev/null
+++ b/Dockerfile
@@ -0,0 +1,363 @@
+FROM debian:bullseye-slim
+
+# Update package repos
+ARG DEBIAN_FRONTEND=noninteractive
+RUN \
+ echo "**** Update apt database ****" \
+ && sed -i '/^.*main/ s/$/ contrib non-free/' /etc/apt/sources.list \
+ && \
+ echo
+
+# Update locale
+RUN \
+ echo "**** Update apt database ****" \
+ && apt-get update \
+ && \
+ echo "**** Install and configure locals ****" \
+ && apt-get -y install --no-install-recommends \
+ locales \
+ procps \
+ && echo 'en_US.UTF-8 UTF-8' > /etc/locale.gen \
+ && locale-gen \
+ && \
+ echo "**** Section cleanup ****" \
+ && apt-get clean autoclean -y \
+ && apt-get autoremove -y \
+ && rm -rf \
+ /var/lib/apt/lists/* \
+ /var/tmp/* \
+ /tmp/* \
+ && \
+ echo
+ENV \
+ LANG=en_US.UTF-8 \
+ LANGUAGE=en_US:en \
+ LC_ALL=en_US.UTF-8
+
+# Re-install certificates
+RUN \
+ echo "**** Update apt database ****" \
+ && apt-get update \
+ && \
+ echo "**** Install certificates ****" \
+ && apt-get -y install --reinstall \
+ ca-certificates \
+ && \
+ echo "**** Section cleanup ****" \
+ && apt-get clean autoclean -y \
+ && apt-get autoremove -y \
+ && rm -rf \
+ /var/lib/apt/lists/* \
+ /var/tmp/* \
+ /tmp/* \
+ && \
+ echo
+
+# Install core packages
+RUN \
+ echo "**** Update apt database ****" \
+ && apt-get update \
+ && \
+ echo "**** Install tools ****" \
+ && apt-get -y install \
+ bash \
+ bash-completion \
+ gcc \
+ git \
+ kmod \
+ less \
+ make \
+ nano \
+ sudo \
+ vim \
+ wget \
+ && \
+ echo "**** Section cleanup ****" \
+ && apt-get clean autoclean -y \
+ && apt-get autoremove -y \
+ && rm -rf \
+ /var/lib/apt/lists/* \
+ /var/tmp/* \
+ /tmp/* \
+ && \
+ echo
+
+# Install desktop requirements
+RUN \
+ echo "**** Update apt database ****" \
+ && apt-get update \
+ && \
+ echo "**** Install desktop requirements ****" \
+ && apt-get -y install --no-install-recommends \
+ dbus-x11 \
+ libxcomposite-dev \
+ libxcursor1 \
+ man-db \
+ mlocate \
+ net-tools \
+ pciutils \
+ pkg-config \
+ python3 \
+ python3-numpy \
+ python3-setuptools \
+ rsync \
+ x11vnc \
+ xauth \
+ xorg \
+ xserver-xorg-legacy \
+ xvfb \
+ && \
+ echo "**** Section cleanup ****" \
+ && apt-get clean autoclean -y \
+ && apt-get autoremove -y \
+ && rm -rf \
+ /var/lib/apt/lists/* \
+ /var/tmp/* \
+ /tmp/* \
+ && \
+ echo
+
+# Install supervisor
+RUN \
+ echo "**** Update apt database ****" \
+ && apt-get update \
+ && \
+ echo "**** Install supervisor ****" \
+ && apt-get -y install \
+ supervisor \
+ && \
+ echo "**** Section cleanup ****" \
+ && apt-get clean autoclean -y \
+ && apt-get autoremove -y \
+ && rm -rf \
+ /var/lib/apt/lists/* \
+ /var/tmp/* \
+ /tmp/* \
+ && \
+ echo
+
+# Install openssh server
+RUN \
+ echo "**** Update apt database ****" \
+ && apt-get update \
+ && \
+ echo "**** Install openssh server ****" \
+ && apt-get -y install \
+ openssh-server \
+ && echo 'PermitRootLogin yes' >> /etc/ssh/sshd_config \
+ && \
+ echo "**** Section cleanup ****" \
+ && apt-get clean autoclean -y \
+ && apt-get autoremove -y \
+ && rm -rf \
+ /var/lib/apt/lists/* \
+ /var/tmp/* \
+ /tmp/* \
+ && \
+ echo
+
+# Install noVNC
+ARG NOVNC_VERSION=1.2.0
+RUN \
+ echo "**** Fetch noVNC ****" \
+ && cd /tmp \
+ && wget -O /tmp/novnc.tar.gz https://github.com/novnc/noVNC/archive/v${NOVNC_VERSION}.tar.gz \
+ && \
+ echo "**** Extract noVNC ****" \
+ && cd /tmp \
+ && tar -xvf /tmp/novnc.tar.gz \
+ && \
+ echo "**** Configure noVNC ****" \
+ && cd /tmp/noVNC-${NOVNC_VERSION} \
+ && sed -i 's/credentials: { password: password } });/credentials: { password: password },\n wsProtocols: ["'"binary"'"] });/g' app/ui.js \
+ && mkdir -p /opt \
+ && rm -rf /opt/noVNC \
+ && cd /opt \
+ && mv -f /tmp/noVNC-${NOVNC_VERSION} /opt/noVNC \
+ && cd /opt/noVNC \
+ && ln -s vnc.html index.html \
+ && chmod -R 755 /opt/noVNC \
+ && \
+ echo "**** Modify noVNC title ****" \
+ && sed -i '/ document.title =/c\ document.title = "Steam Headless - noVNC";' \
+ /opt/noVNC/app/ui.js \
+ && \
+ echo "**** Section cleanup ****" \
+ && rm -rf \
+ /tmp/noVNC* \
+ /tmp/novnc.tar.gz
+
+# Install Websockify
+ARG WEBSOCKETIFY_VERSION=0.10.0
+RUN \
+ echo "**** Fetch Websockify ****" \
+ && cd /tmp \
+ && wget -O /tmp/websockify.tar.gz https://github.com/novnc/websockify/archive/v${WEBSOCKETIFY_VERSION}.tar.gz \
+ && \
+ echo "**** Extract Websockify ****" \
+ && cd /tmp \
+ && tar -xvf /tmp/websockify.tar.gz \
+ && \
+ echo "**** Install Websockify to main ****" \
+ && cd /tmp/websockify-${WEBSOCKETIFY_VERSION} \
+ && python3 ./setup.py install \
+ && \
+ echo "**** Install Websockify to noVNC path ****" \
+ && cd /tmp \
+ && mv -v /tmp/websockify-${WEBSOCKETIFY_VERSION} /opt/noVNC/utils/websockify \
+ && \
+ echo "**** Section cleanup ****" \
+ && rm -rf \
+ /tmp/websockify-* \
+ /tmp/websockify.tar.gz
+
+# Install desktop environment
+RUN \
+ echo "**** Update apt database ****" \
+ && apt-get update \
+ && \
+ echo "**** Install desktop environment ****" \
+ && apt-get -y install \
+ xfce4 \
+ xfce4-terminal \
+ msttcorefonts \
+ fonts-vlgothic \
+ gedit \
+ && \
+ echo "**** Section cleanup ****" \
+ && apt-get clean autoclean -y \
+ && apt-get autoremove -y \
+ && rm -rf \
+ /var/lib/apt/lists/* \
+ /var/tmp/* \
+ /tmp/* \
+ && \
+ echo
+
+# Install firefox
+RUN \
+ echo "**** Update apt database ****" \
+ && apt-get update \
+ && \
+ echo "**** Install firefox ****" \
+ && apt-get -y install \
+ firefox-esr \
+ && \
+ echo "**** Section cleanup ****" \
+ && apt-get clean autoclean -y \
+ && apt-get autoremove -y \
+ && rm -rf \
+ /var/lib/apt/lists/* \
+ /var/tmp/* \
+ /tmp/* \
+ && \
+ echo
+
+# Install Steam
+RUN \
+ echo "**** Install steam ****" \
+ && dpkg --add-architecture i386 \
+ && apt-get update \
+ && echo steam steam/question select "I AGREE" | debconf-set-selections \
+ && echo steam steam/license note '' | debconf-set-selections \
+ && apt-get -y install \
+ steam \
+ steam-devices \
+ vulkan-tools \
+ mesa-utils \
+ mesa-vulkan-drivers \
+ libglx-mesa0:i386 \
+ mesa-vulkan-drivers:i386 \
+ libgl1-mesa-dri:i386 \
+ && \
+ echo "**** Section cleanup ****" \
+ && apt-get clean autoclean -y \
+ && apt-get autoremove -y \
+ && rm -rf \
+ /var/lib/apt/lists/* \
+ /var/tmp/* \
+ /tmp/* \
+ && \
+ echo
+
+# Setup browser audio streaming deps
+RUN \
+ echo "**** Update apt database ****" \
+ && apt-get update \
+ && \
+ echo "**** Install audio streaming deps ****" \
+ && apt-get -y install --no-install-recommends \
+ bzip2 \
+ gstreamer1.0-alsa \
+ gstreamer1.0-gl \
+ gstreamer1.0-gtk3 \
+ gstreamer1.0-libav \
+ gstreamer1.0-plugins-base \
+ gstreamer1.0-plugins-good \
+ gstreamer1.0-pulseaudio \
+ gstreamer1.0-qt5 \
+ gstreamer1.0-tools \
+ gstreamer1.0-x \
+ libglu1-mesa \
+ libgstreamer1.0-0 \
+ libgtk2.0-0 \
+ libncursesw5 \
+ libopenal1 \
+ libsdl-image1.2 \
+ libsdl-ttf2.0-0 \
+ libsdl1.2debian \
+ libsndfile1 \
+ novnc \
+ pulseaudio \
+ ucspi-tcp \
+ && \
+ echo "**** Section cleanup ****" \
+ && apt-get clean autoclean -y \
+ && apt-get autoremove -y \
+ && rm -rf \
+ /var/lib/apt/lists/* \
+ /var/tmp/* \
+ /tmp/* \
+ && \
+ echo
+
+# Configure default user and set env
+ENV \
+ USER="default" \
+ USER_PASSWORD="password" \
+ USER_HOME="/home/default" \
+ TZ="Pacific/Auckland" \
+ USER_LOCALES="en_US.UTF-8 UTF-8"
+RUN \
+ echo "**** Configure default user '${USER}' ****" \
+ && mkdir -p \
+ ${USER_HOME} \
+ /games \
+ && useradd -d ${USER_HOME} -s /bin/bash ${USER} \
+ && chown -R ${USER} \
+ ${USER_HOME} \
+ /games \
+ && echo "${USER} ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers
+
+# Add FS overlay
+COPY overlay /
+
+# Set display environment variables
+ENV \
+ DISPLAY_CDEPTH="24" \
+ DISPLAY_DPI="96" \
+ DISPLAY_REFRESH="60" \
+ DISPLAY_SIZEH="900" \
+ DISPLAY_SIZEW="1600" \
+ DISPLAY_VIDEO_PORT="DFP" \
+ DISPLAY=":0" \
+ NVIDIA_DRIVER_CAPABILITIES="all" \
+ NVIDIA_VISIBLE_DEVICES="all"
+
+# Be sure that the noVNC port is exposed
+EXPOSE 8083
+EXPOSE 32123
+
+# Set entrypoint
+RUN chmod +x /entrypoint.sh
+ENTRYPOINT ["/entrypoint.sh"]
diff --git a/README.md b/README.md
index 71f5035..16b7856 100644
--- a/README.md
+++ b/README.md
@@ -1,2 +1,41 @@
-# docker-steam-headless
-Headless Steam supporting NVIDIA GPU and accessible via NoVNC
+# Headless Steam Service
+
+Play your games in the browser with audio. Connect another device and use it with Steam Remote Play.
+
+## Features:
+- Full video/audio noVNC web access to a Xfce4 Desktop
+- NVIDIA GPU support
+- Root access
+- SSH server for remote terminal access
+
+---
+## Notes:
+
+### ADDITIONAL SOFTWARE:
+If you wish to install additional applications, you can generate a
+script inside the `~/init.d` directory ending with ".sh". This will be executed on the container startup.
+
+### STORAGE PATHS:
+Everything that you wish to save in this container should be stored in the home directory or a docker container mount that you have specified. All files that are store outside your home directory are not persistent and will be wiped if there is an update of the container or you change something in the template.
+
+### GAMES LIBRARY:
+It is recommended that you mount your games library to `/games` and configure Steam to add that path.
+
+### AUTO START APPLICATIONS:
+In this container, Steam is configured to automatically start. If you wish to add additional services to automatically start, add them under **Applications > Settings > Session and Startup** in the WebUI.
+
+### NETWORK MODE:
+If you want to use the container as a Steam Remote Play (previously "In Home Streaming") host device you should create a custom network and assign this container it's own IP, if you don't do this the traffic will be routed through the internet since Steam thinks you are on a different network.
+
+---
+## Running:
+
+For a development environment, I have created a script in the devops directory.
+
+
+---
+## TODO:
+- Configure xorg.conf with no NVIDIA GPU
+- Lock SSH access to user only (remove root access)
+- Require user to enter password for sudo
+- Document how to run this container
diff --git a/devops/run_server.sh b/devops/run_server.sh
new file mode 100755
index 0000000..1d0fda2
--- /dev/null
+++ b/devops/run_server.sh
@@ -0,0 +1,66 @@
+#!/usr/bin/env bash
+###
+# File: run.sh
+# Project: docker-steamos
+# File Created: Saturday, 8th January 2022 2:34:23 pm
+# Author: Josh.5 (jsunnex@gmail.com)
+# -----
+# Last Modified: Monday, 10th January 2022 11:04:51 pm
+# Modified By: Josh.5 (jsunnex@gmail.com)
+###
+
+script_path=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd );
+project_base_path=$(realpath ${script_path}/..);
+
+
+if [[ ${1} == "stop" ]]; then
+ docker stop steam-headless
+ docker rm steam-headless
+ exit $?
+elif [[ ${1} == "tail" ]]; then
+ docker logs -f steam-headless
+ exit $?
+elif [[ ${1} == "user" ]]; then
+ docker exec -ti --user default steam-headless bash
+ exit $?
+elif [[ ${1} == "root" ]]; then
+ docker exec -ti --user 0 steam-headless bash
+ exit $?
+fi
+
+
+docker stop steam-headless
+docker rm steam-headless
+sleep 1
+
+
+docker run -d --name='steam-headless' \
+ --privileged=true \
+ --net='br0' --ip='192.168.1.208' \
+ --cpuset-cpus='3,9,4,10,5,11' \
+ -e PUID="99" \
+ -e PGID="100" \
+ -e UMASK='000' \
+ -e USER_PASSWORD="password" \
+ -e USER="default" \
+ -e HOME="/home/test" \
+ -e USER_HOME="/home/default" \
+ -e TZ="Pacific/Auckland" \
+ -e USER_LOCALES="en_US.UTF-8 UTF-8" \
+ -e DISPLAY_CDEPTH="24" \
+ -e DISPLAY_DPI="96" \
+ -e DISPLAY_REFRESH="60" \
+ -e DISPLAY_SIZEH="720" \
+ -e DISPLAY_SIZEW="1280" \
+ -e DISPLAY_VIDEO_PORT="DFP" \
+ -e DISPLAY=":0" \
+ -e NVIDIA_DRIVER_CAPABILITIES="all" \
+ -e NVIDIA_VISIBLE_DEVICES="all" \
+ -v "${project_base_path}/config/home/default":'/home/default':'rw' \
+ --hostname='steam-headless' \
+ --shm-size=2G \
+ --runtime=nvidia \
+ josh5/steam-headless:latest
+
+
+docker logs -f steam-headless
diff --git a/images/steam-icon.png b/images/steam-icon.png
new file mode 100644
index 0000000..b7d71a5
Binary files /dev/null and b/images/steam-icon.png differ
diff --git a/overlay/entrypoint.sh b/overlay/entrypoint.sh
new file mode 100644
index 0000000..bc7ac4a
--- /dev/null
+++ b/overlay/entrypoint.sh
@@ -0,0 +1,47 @@
+#!/usr/bin/env bash
+###
+# File: entrypoint.sh
+# Project: docker-steamos
+# File Created: Saturday, 8th January 2022 7:08:46 pm
+# Author: Josh.5 (jsunnex@gmail.com)
+# -----
+# Last Modified: Tuesday, 11th January 2022 1:02:16 am
+# Modified By: Josh.5 (jsunnex@gmail.com)
+###
+
+set -e
+
+# If a command was passed, run that instead of the usual init process
+if [ ! -z "$@" ]; then
+ exec $@
+ exit $?
+fi
+
+# Execute all init scripts
+for init_script in /scripts/*.sh ; do
+ echo
+ echo "[ ${init_script}: executing... ]"
+ sed -i 's/\r$//' "${init_script}"
+ source "${init_script}"
+done
+
+# Execute any user generated init scripts
+mkdir -p ${USER_HOME}/init.d
+chown -R ${USER} ${USER_HOME}/init.d
+for user_init_script in ${USER_HOME}/init.d/*.sh ; do
+
+ # Check that a file was found
+ # (If no files exist in this directory, then user_init_script will be empty)
+ if [[ -e "${user_init_script}" ]]; then
+
+ echo
+ echo "[ USER:${user_init_script}: executing... ]"
+ sed -i 's/\r$//' "${user_init_script}"
+ source "${user_init_script}"
+
+ fi
+
+done
+
+echo "**** Starting supervisord ****";
+exec /usr/bin/supervisord -c /etc/supervisor/supervisord.conf --nodaemon
diff --git a/overlay/etc/home_directory_template/.bashrc b/overlay/etc/home_directory_template/.bashrc
new file mode 100644
index 0000000..a355b0c
--- /dev/null
+++ b/overlay/etc/home_directory_template/.bashrc
@@ -0,0 +1,9 @@
+#
+# ~/.bashrc
+#
+
+# If not running interactively, don't do anything
+[[ $- != *i* ]] && return
+
+alias ls='ls --color=auto'
+PS1='[\u@\h \W]\$ '
diff --git a/overlay/etc/home_directory_template/.cache/log/.placeholder b/overlay/etc/home_directory_template/.cache/log/.placeholder
new file mode 100644
index 0000000..e69de29
diff --git a/overlay/etc/home_directory_template/.config/autostart/Steam.desktop b/overlay/etc/home_directory_template/.config/autostart/Steam.desktop
new file mode 100644
index 0000000..7319c5e
--- /dev/null
+++ b/overlay/etc/home_directory_template/.config/autostart/Steam.desktop
@@ -0,0 +1,14 @@
+[Desktop Entry]
+Encoding=UTF-8
+Version=0.9.4
+Type=Application
+Name=Steam
+Comment=launch steam on login
+Exec=/usr/games/steam %U
+Icon=steam
+OnlyShowIn=XFCE;
+RunHook=0
+StartupNotify=false
+Terminal=false
+Hidden=false
+
diff --git a/overlay/etc/home_directory_template/.config/xfce4/xfconf/xfce-perchannel-xml/xfce4-desktop.xml b/overlay/etc/home_directory_template/.config/xfce4/xfconf/xfce-perchannel-xml/xfce4-desktop.xml
new file mode 100644
index 0000000..9bcabd3
--- /dev/null
+++ b/overlay/etc/home_directory_template/.config/xfce4/xfconf/xfce-perchannel-xml/xfce4-desktop.xml
@@ -0,0 +1,50 @@
+
+
+