diff --git a/.gitignore b/.gitignore
index fbadb208b..27da9903d 100644
--- a/.gitignore
+++ b/.gitignore
@@ -5,6 +5,12 @@
[Bb]uild*/
doc-build/
+# AppImageBuilder directory and torzu.AppImage
+AppImageBuilder/build/
+AppImageBuilder/appimagetool.AppImage
+AppImageBuilder/torzu.AppImage
+torzu.AppImage
+
# Generated source files
src/common/scm_rev.cpp
dist/english_plurals/generated_en.ts
diff --git a/AppImage-build.sh b/AppImage-build.sh
new file mode 100755
index 000000000..5abb17d8e
--- /dev/null
+++ b/AppImage-build.sh
@@ -0,0 +1,42 @@
+#!/bin/bash
+
+FILE=build/bin/yuzu
+if test -f "$FILE"; then
+ # remove any previously made AppImage in the base torzu git folder
+ rm ./torzu.AppImage
+
+ # enter AppImage utility folder
+ cd AppImageBuilder
+
+ # run the build script to create the AppImage
+ # (usage) ./build.sh [source torzu build folder] [destination .AppImage file]
+ ./build.sh ../build ./torzu.AppImage
+
+ FILE=./torzu.AppImage
+ if test -f "$FILE"; then
+ # move the AppImage to the main torzu folder
+ mv torzu.AppImage ..
+ # return to main torzu folder
+ cd ..
+ # show contents of current folder
+ echo
+ ls
+ # show AppImages specifically
+ echo
+ ls *.AppImage
+ echo
+ echo "'torzu.AppImage' is now located in the current folder."
+ echo
+ else
+ cd ..
+ echo "AppImage was not built."
+ fi
+else
+ echo
+ echo "$FILE does not exist."
+ echo
+ echo "No yuzu executable found in the /torzu/build/bin folder!"
+ echo
+ echo "You must first build a native linux version of torzu before running this script!"
+ echo
+fi
diff --git a/AppImageBuilder/assets/bwrap b/AppImageBuilder/assets/bwrap
new file mode 100755
index 000000000..a5dd85cc1
Binary files /dev/null and b/AppImageBuilder/assets/bwrap differ
diff --git a/AppImageBuilder/assets/bwrap-info.txt b/AppImageBuilder/assets/bwrap-info.txt
new file mode 100644
index 000000000..0178b387d
--- /dev/null
+++ b/AppImageBuilder/assets/bwrap-info.txt
@@ -0,0 +1 @@
+This is a statically compiled bubblewrap 0.9.0 executable.
diff --git a/AppImageBuilder/assets/torzu.desktop b/AppImageBuilder/assets/torzu.desktop
new file mode 100644
index 000000000..f84750393
--- /dev/null
+++ b/AppImageBuilder/assets/torzu.desktop
@@ -0,0 +1,6 @@
+[Desktop Entry]
+Type=Application
+Name=torzu
+Icon=torzu
+Exec=AppRun
+Categories=Game;
diff --git a/AppImageBuilder/assets/torzu.svg b/AppImageBuilder/assets/torzu.svg
new file mode 100644
index 000000000..de6443128
--- /dev/null
+++ b/AppImageBuilder/assets/torzu.svg
@@ -0,0 +1,2 @@
+
+
diff --git a/AppImageBuilder/assets_aarch64/AppRun b/AppImageBuilder/assets_aarch64/AppRun
new file mode 100755
index 000000000..829f33ba7
--- /dev/null
+++ b/AppImageBuilder/assets_aarch64/AppRun
@@ -0,0 +1,13 @@
+#! /bin/bash
+
+cd "$APPDIR"
+
+if [ -d /usr/lib/aarch64-linux-gnu/qt5 ]; then
+ exec ./yuzu-bwrap.sh
+else
+ if [ -d /usr/lib/aarch64-linux-gnu/qt6 ]; then
+ exec ./yuzu-bwrap.sh
+ else
+ exec ./yuzu.sh
+ fi
+fi
diff --git a/AppImageBuilder/assets_aarch64/yuzu-bwrap.sh b/AppImageBuilder/assets_aarch64/yuzu-bwrap.sh
new file mode 100755
index 000000000..d3c234cdb
--- /dev/null
+++ b/AppImageBuilder/assets_aarch64/yuzu-bwrap.sh
@@ -0,0 +1,8 @@
+#! /bin/sh
+if [ -d /usr/lib/aarch64-linux-gnu/qt5 ]; then
+ exec ./bwrap --dev-bind / / --tmpfs /usr/lib/aarch64-linux-gnu/qt5 ./yuzu.sh
+else
+ if [ -d /usr/lib/aarch64-linux-gnu/qt6 ]; then
+ exec ./bwrap --dev-bind / / --tmpfs /usr/lib/aarch64-linux-gnu/qt6 ./yuzu.sh
+ fi
+fi
diff --git a/AppImageBuilder/assets_aarch64/yuzu.sh b/AppImageBuilder/assets_aarch64/yuzu.sh
new file mode 100755
index 000000000..561ae269c
--- /dev/null
+++ b/AppImageBuilder/assets_aarch64/yuzu.sh
@@ -0,0 +1,6 @@
+#! /bin/sh
+
+# NOTE: the `ld-linux-aarch64.so.1` filename came from a pi debian 11 installation,
+# this may be incorrect for a different or more up-to-date system.
+# Can find out the correct filename using command "ldd yuzu" on the non-AppImage app
+QT_QPA_PLATFORM=xcb QT_PLUGIN_PATH=. exec ./ld-linux-aarch64.so.1 --library-path . ./yuzu
diff --git a/AppImageBuilder/assets_x86_64/AppRun b/AppImageBuilder/assets_x86_64/AppRun
new file mode 100755
index 000000000..524559c15
--- /dev/null
+++ b/AppImageBuilder/assets_x86_64/AppRun
@@ -0,0 +1,25 @@
+#! /bin/bash
+
+cd "$APPDIR"
+
+# default qt5 location
+if [ -d /usr/lib/x86_64-linux-gnu/qt5 ]; then
+ exec ./yuzu-bwrap.sh
+else
+ # qt5 on Steam Deck (as qt)
+ if [ -d /usr/lib/qt ]; then
+ exec ./yuzu-bwrap.sh
+ else
+ # default qt6 location
+ if [ -d /usr/lib/x86_64-linux-gnu/qt6 ]; then
+ exec ./yuzu-bwrap.sh
+ else
+ # qt6 on Steam Deck
+ if [ -d /usr/lib/qt6 ]; then
+ exec ./yuzu-bwrap.sh
+ else
+ exec ./yuzu.sh
+ fi
+ fi
+ fi
+fi
diff --git a/AppImageBuilder/assets_x86_64/yuzu-bwrap.sh b/AppImageBuilder/assets_x86_64/yuzu-bwrap.sh
new file mode 100755
index 000000000..9757f5bea
--- /dev/null
+++ b/AppImageBuilder/assets_x86_64/yuzu-bwrap.sh
@@ -0,0 +1,21 @@
+#! /bin/sh
+
+# default qt5 location
+if [ -d /usr/lib/x86_64-linux-gnu/qt5 ]; then
+ exec ./bwrap --dev-bind / / --tmpfs /usr/lib/x86_64-linux-gnu/qt5 ./yuzu.sh
+else
+ # qt5 on Steam Deck (as qt)
+ if [ -d /usr/lib/qt ]; then
+ exec ./bwrap --dev-bind / / --tmpfs /usr/lib/qt ./yuzu.sh
+ else
+ # default qt6 location
+ if [ -d /usr/lib/x86_64-linux-gnu/qt6 ]; then
+ exec ./bwrap --dev-bind / / --tmpfs /usr/lib/x86_64-linux-gnu/qt6 ./yuzu.sh
+ else
+ # qt6 on Steam Deck
+ if [ -d /usr/lib/qt6 ]; then
+ exec ./bwrap --dev-bind / / --tmpfs /usr/lib/qt6 ./yuzu.sh
+ fi
+ fi
+ fi
+fi
diff --git a/AppImageBuilder/assets_x86_64/yuzu.sh b/AppImageBuilder/assets_x86_64/yuzu.sh
new file mode 100755
index 000000000..a0e3672fd
--- /dev/null
+++ b/AppImageBuilder/assets_x86_64/yuzu.sh
@@ -0,0 +1,2 @@
+#! /bin/sh
+QT_QPA_PLATFORM=xcb QT_PLUGIN_PATH=. exec ./ld-linux-x86-64.so.2 --library-path . ./yuzu
diff --git a/AppImageBuilder/build.sh b/AppImageBuilder/build.sh
new file mode 100755
index 000000000..b74bc6268
--- /dev/null
+++ b/AppImageBuilder/build.sh
@@ -0,0 +1,136 @@
+#! /bin/bash
+set -e
+
+# Check arguments
+if [[ $# != 2 ]]; then
+ >&2 echo "Bad usage!"
+ echo "Usage: $0