diff --git a/.github/workflows/ci_linux.yml b/.github/workflows/ci_linux.yml
new file mode 100644
index 0000000..1a96866
--- /dev/null
+++ b/.github/workflows/ci_linux.yml
@@ -0,0 +1,84 @@
+name: CI-Linux
+
+on:
+  push:
+    branches:
+      - master
+    paths-ignore:
+      - 'README.md'
+  pull_request:
+    branches:
+      - master
+    paths-ignore:
+      - 'README.md'
+
+jobs:
+  build:
+    runs-on: ubuntu-latest
+
+    steps:
+    - name: Checkout
+      uses: actions/checkout@v4
+      with:
+        fetch-depth: 0
+
+    - name: Install Qt
+      uses: jurplel/install-qt-action@v3
+      with:
+        version: '6.6'
+        modules: 'qtmultimedia'
+
+    - name: Install build dependencies
+      env:
+        FFMPEG_DEPS: >
+          libavutil-dev
+          libavcodec-dev
+          libavformat-dev
+          libavfilter-dev
+          libswscale-dev
+          libswresample-dev
+          libfuse2
+        APPIMAGE_DEPS: >
+          libfuse2
+          libxcb-cursor0
+      run: sudo apt install -y $FFMPEG_DEPS $APPIMAGE_DEPS
+
+    - name: Build
+      run: |
+        cmake -B ${{github.workspace}}/build -DCMAKE_BUILD_TYPE=Release
+        cmake --build ${{github.workspace}}/build
+
+    - name: Install linuxdeploy
+      run: |
+        wget https://github.com/linuxdeploy/linuxdeploy/releases/download/continuous/linuxdeploy-x86_64.AppImage
+        wget https://github.com/linuxdeploy/linuxdeploy-plugin-qt/releases/download/continuous/linuxdeploy-plugin-qt-x86_64.AppImage
+        chmod +x linuxdeploy-x86_64.AppImage
+        chmod +x linuxdeploy-plugin-qt-x86_64.AppImage
+
+    - name: Build AppImage
+      # Qt6_DIR is set by the install-qt-action
+      run: >
+        QMAKE=$Qt6_DIR/bin/qmake
+        PATH=$Qt6_DIR/libexec:$PATH
+        ./linuxdeploy-x86_64.AppImage
+        --appdir AppDir
+        -e ${{github.workspace}}/build/app/si-edit
+        -i ${{github.workspace}}/app/res/icon.svg
+        -d ${{github.workspace}}/app/res/AppImage.desktop
+        --plugin qt
+        --output appimage
+
+    - name: 'Upload Artifact: libweaver'
+      uses: actions/upload-artifact@v4
+      with:
+        name: libweaver-Linux
+        path: ${{github.workspace}}/build/lib/libweaver.so
+        if-no-files-found: error
+
+    - name: 'Upload Artifact: AppImage'
+      uses: actions/upload-artifact@v4
+      with:
+        name: SI-Edit-Linux.AppImage
+        path: ${{github.workspace}}/SI_Edit*.AppImage
+        if-no-files-found: error
+
diff --git a/app/res/AppImage.desktop b/app/res/AppImage.desktop
new file mode 100644
index 0000000..27f39a2
--- /dev/null
+++ b/app/res/AppImage.desktop
@@ -0,0 +1,9 @@
+[Desktop Entry]
+Name=SI Edit
+Comment=Tool for working with SI files
+Exec=si-edit
+Terminal=false
+Type=Application
+Icon=icon
+Categories=Development;Graphics;AudioVideo;
+
diff --git a/lib/CMakeLists.txt b/lib/CMakeLists.txt
index 6c5549f..29ce9f3 100644
--- a/lib/CMakeLists.txt
+++ b/lib/CMakeLists.txt
@@ -27,6 +27,7 @@ endif()
 set_target_properties(libweaver PROPERTIES
   CXX_STANDARD 98
   CXX_STANDARD_REQUIRED ON
+  PREFIX ""
 )
 
 if(LIBWEAVER_BUILD_DOXYGEN)