diff --git a/add-appimage-to-apps b/add-appimage-to-apps
new file mode 100755
index 0000000..8472740
--- /dev/null
+++ b/add-appimage-to-apps
@@ -0,0 +1,62 @@
+#!/bin/bash
+
+set -e
+
+# Check if an AppImage path is provided
+if [ -z "$1" ]; then
+    echo "Usage: $0 /path/to/AppImage"
+    exit 1
+fi
+
+# Absolute path to the AppImage
+APPIMAGE_PATH="$(realpath "$1")"
+# Application destination dir
+APPDIR="$HOME/.local/share/applications"
+# A place to store application icons
+ICONDIR="$HOME/.local/share/icons"
+
+# Make a tempdir and cd into it
+EXTRACT_DIR=$(mktemp -d)
+cleanup() {
+	[ -z "$EXTRACT_DIR" ] && exit 2
+	rm -rf "$EXTRACT_DIR"
+}
+trap cleanup EXIT
+pushd "$EXTRACT_DIR"
+
+# Extract AppImage
+"$APPIMAGE_PATH" --appimage-extract > /dev/null 2>&1
+# Find the extracted desktop file and icon
+DESKTOP_FILE=$(find "$EXTRACT_DIR/squashfs-root" -name "*.desktop" | head -n 1)
+# GPT spat this out and I'm really not sure if it's correct. I don't think
+# fd spec limits us to these two file formats
+ICON_FILE=$(find "$EXTRACT_DIR/squashfs-root" -name "*.png" -o -name "*.svg" | head -n 1)
+
+if [ -z "$DESKTOP_FILE" ]; then
+    echo "Error: No .desktop file found in AppImage."
+    exit 1
+fi
+
+# Jump out of the tempdir. We now have absolute paths to the things we want
+popd
+
+APP_NAME=$(grep -m1 '^Name=' "$DESKTOP_FILE" | cut -d= -f2)
+DESKTOP_TARGET="$APPDIR/$APP_NAME.desktop"
+ICON_TARGET="$ICONDIR/$APP_NAME.${ICON_FILE##*.}"
+# Copy the icon over
+mkdir -p "$ICONDIR"
+cp "$ICON_FILE" "$ICON_TARGET"
+# Update paths in the .desktop file and copy it over
+sed -e "s|^Exec=.*|Exec=$APPIMAGE_PATH|" \
+    -e "s|^Icon=.*|Icon=$ICON_TARGET|" \
+    "$DESKTOP_FILE" > "$DESKTOP_TARGET"
+# Ensure the desktop file is executable
+chmod +x "$DESKTOP_TARGET"
+
+# Refresh application menu
+update-desktop-database "$APPDIR"
+
+echo "Desktop entry created: $DESKTOP_TARGET"
+echo "Icon saved at: $ICON_TARGET"
+echo "You can now launch '$APP_NAME' from your application menu."
+