diff --git a/.github/workflows/major.yml b/.github/workflows/major.yml
new file mode 100644
index 0000000000000000000000000000000000000000..ca901f21e19e56dcfe4146f38fc6a92af3e67b51
--- /dev/null
+++ b/.github/workflows/major.yml
@@ -0,0 +1,124 @@
+name: Major Release
+
+on:
+  workflow_dispatch:
+
+jobs:
+  release:
+    runs-on: ubuntu-latest
+    steps:
+      # GET LATEST CODE
+      - name: Checkout latest code
+        uses: actions/checkout@master
+        with:
+          fetch-depth: 0
+
+      # GENERATE CHANGELOG, TAG, RELEASE
+      - id: conventional_changelog
+        uses: ardalanamini/auto-changelog@master
+        with:
+          token: ${{ secrets.GITHUB_TOKEN }}
+      - id: compute_tag
+        uses: craig-day/compute-tag@v13
+        with:
+          github_token: ${{ secrets.GITHUB_TOKEN }}
+          version_scheme: semantic
+          version_type: major
+          # MAJOR.MINOR.PATCH
+      - name: Create Release
+        id: create_release
+        uses: actions/create-release@latest
+        env:
+          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+        with:
+          tag_name: ${{ github.ref }}
+          release_name: Release ${{ steps.compute_tag.outputs.next_tag }}
+          body: |
+            Automatic release of version: **${{ steps.compute_tag.outputs.next_tag }}**
+            **Changes in this release:**
+            ${{ steps.conventional_changelog.outputs.changelog }}
+          draft: false
+          prerelease: false
+
+      - name: Setup Node.js environment
+        uses: actions/setup-node@v2.4.0
+        with:
+          # Version Spec of the version to use.  Examples: 12.x, 10.15.1, >=10.15.0
+          node-version: '>= 16.9.1'
+          # Set this option if you want the action to check for the latest available version that satisfies the version spec
+          check-latest: false
+
+      - name: Install Quasar
+        run: npm install -g @quasar/cli
+
+      - name: Install packages
+        run: npm install
+
+      - name: Build project
+        run: quasar build
+
+      - name: List files
+        run: pwd && ls -al *
+
+      - name: Create Build Archive tar.gz
+        run: |
+          echo "**** Creating archive of quasar build ****"
+          tar -czf lttmm-${{ steps.compute_tag.outputs.next_tag }}.tar.gz dist/spa
+
+      - name: Create Build Archive zip
+        uses: papeloto/action-zip@v1
+        with:
+          files: dist/spa
+          recursive: true
+          dest: lttmm-${{ steps.compute_tag.outputs.next_tag }}.zip
+
+      - name: Upload Release Archive tar.gz
+        id: upload-release-asset-archive-targz
+        uses: actions/upload-release-asset@v1
+        env:
+          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+        with:
+          upload_url: ${{ steps.create_release.outputs.upload_url }}
+          asset_path: ./lttmm-${{ steps.compute_tag.outputs.next_tag }}.tar.gz
+          asset_name: lttmm-${{ steps.compute_tag.outputs.next_tag }}.tar.gz
+          asset_content_type: application/gzip
+
+      - name: Upload Release Archive zip
+        id: upload-release-asset-archive-zip
+        uses: actions/upload-release-asset@v1
+        env:
+          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+        with:
+          upload_url: ${{ steps.create_release.outputs.upload_url }}
+          asset_path: ./lttmm-${{ steps.compute_tag.outputs.next_tag }}.zip
+          asset_name: lttmm-${{ steps.compute_tag.outputs.next_tag }}.zip
+          asset_content_type: application/zip
+
+      # DOCKER RELATED
+      - name: Set up QEMU
+        uses: docker/setup-qemu-action@v1
+      - name: Set up Docker Buildx
+        uses: docker/setup-buildx-action@v1
+      - name: Login to DockerHub
+        uses: docker/login-action@v1
+        with:
+          username: griefed
+          password: ${{ secrets.DOCKERHUB_TOKEN }}
+      - name: Login to GitHub Container Registry
+        uses: docker/login-action@v1
+        with:
+          registry: ghcr.io
+          username: ${{ github.actor }}
+          password: ${{ secrets.GITHUB_TOKEN }}
+      - name: Build and push
+        uses: docker/build-push-action@v2
+        with:
+          context: .
+          file: ./Dockerfile
+          platforms: linux/amd64,linux/arm/v7,linux/arm64
+          push: true
+          tags: |
+            ghcr.io/griefed/ltt-mapmaker:latest
+            ghcr.io/griefed/ltt-mapmaker:${{ steps.compute_tag.outputs.next_tag }}
+            griefed/ltt-mapmaker:latest
+            griefed/ltt-mapmaker:${{ steps.compute_tag.outputs.next_tag }}
diff --git a/.github/workflows/minor.yml b/.github/workflows/minor.yml
new file mode 100644
index 0000000000000000000000000000000000000000..4b29e923166db4c902251bc81621b9b9a4a88f2c
--- /dev/null
+++ b/.github/workflows/minor.yml
@@ -0,0 +1,124 @@
+name: Minor Release
+
+on:
+  workflow_dispatch:
+
+jobs:
+  release:
+    runs-on: ubuntu-latest
+    steps:
+      # GET LATEST CODE
+      - name: Checkout latest code
+        uses: actions/checkout@master
+        with:
+          fetch-depth: 0
+
+      # GENERATE CHANGELOG, TAG, RELEASE
+      - id: conventional_changelog
+        uses: ardalanamini/auto-changelog@master
+        with:
+          token: ${{ secrets.GITHUB_TOKEN }}
+      - id: compute_tag
+        uses: craig-day/compute-tag@v13
+        with:
+          github_token: ${{ secrets.GITHUB_TOKEN }}
+          version_scheme: semantic
+          version_type: minor
+          # MAJOR.MINOR.PATCH
+      - name: Create Release
+        id: create_release
+        uses: actions/create-release@latest
+        env:
+          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+        with:
+          tag_name: ${{ github.ref }}
+          release_name: Release ${{ steps.compute_tag.outputs.next_tag }}
+          body: |
+            Automatic release of version: **${{ steps.compute_tag.outputs.next_tag }}**
+            **Changes in this release:**
+            ${{ steps.conventional_changelog.outputs.changelog }}
+          draft: false
+          prerelease: false
+
+      - name: Setup Node.js environment
+        uses: actions/setup-node@v2.4.0
+        with:
+          # Version Spec of the version to use.  Examples: 12.x, 10.15.1, >=10.15.0
+          node-version: '>= 16.9.1'
+          # Set this option if you want the action to check for the latest available version that satisfies the version spec
+          check-latest: false
+
+      - name: Install Quasar
+        run: npm install -g @quasar/cli
+
+      - name: Install packages
+        run: npm install
+
+      - name: Build project
+        run: quasar build
+
+      - name: List files
+        run: pwd && ls -al *
+
+      - name: Create Build Archive tar.gz
+        run: |
+          echo "**** Creating archive of quasar build ****"
+          tar -czf lttmm-${{ steps.compute_tag.outputs.next_tag }}.tar.gz dist/spa
+
+      - name: Create Build Archive zip
+        uses: papeloto/action-zip@v1
+        with:
+          files: dist/spa
+          recursive: true
+          dest: lttmm-${{ steps.compute_tag.outputs.next_tag }}.zip
+
+      - name: Upload Release Archive tar.gz
+        id: upload-release-asset-archive-targz
+        uses: actions/upload-release-asset@v1
+        env:
+          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+        with:
+          upload_url: ${{ steps.create_release.outputs.upload_url }}
+          asset_path: ./lttmm-${{ steps.compute_tag.outputs.next_tag }}.tar.gz
+          asset_name: lttmm-${{ steps.compute_tag.outputs.next_tag }}.tar.gz
+          asset_content_type: application/gzip
+
+      - name: Upload Release Archive zip
+        id: upload-release-asset-archive-zip
+        uses: actions/upload-release-asset@v1
+        env:
+          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+        with:
+          upload_url: ${{ steps.create_release.outputs.upload_url }}
+          asset_path: ./lttmm-${{ steps.compute_tag.outputs.next_tag }}.zip
+          asset_name: lttmm-${{ steps.compute_tag.outputs.next_tag }}.zip
+          asset_content_type: application/zip
+
+      # DOCKER RELATED
+      - name: Set up QEMU
+        uses: docker/setup-qemu-action@v1
+      - name: Set up Docker Buildx
+        uses: docker/setup-buildx-action@v1
+      - name: Login to DockerHub
+        uses: docker/login-action@v1
+        with:
+          username: griefed
+          password: ${{ secrets.DOCKERHUB_TOKEN }}
+      - name: Login to GitHub Container Registry
+        uses: docker/login-action@v1
+        with:
+          registry: ghcr.io
+          username: ${{ github.actor }}
+          password: ${{ secrets.GITHUB_TOKEN }}
+      - name: Build and push
+        uses: docker/build-push-action@v2
+        with:
+          context: .
+          file: ./Dockerfile
+          platforms: linux/amd64,linux/arm/v7,linux/arm64
+          push: true
+          tags: |
+            ghcr.io/griefed/ltt-mapmaker:latest
+            ghcr.io/griefed/ltt-mapmaker:${{ steps.compute_tag.outputs.next_tag }}
+            griefed/ltt-mapmaker:latest
+            griefed/ltt-mapmaker:${{ steps.compute_tag.outputs.next_tag }}
diff --git a/.github/workflows/patch.yml b/.github/workflows/patch.yml
new file mode 100644
index 0000000000000000000000000000000000000000..a4f32554e9e676355e1853cb69623cbd0627bea4
--- /dev/null
+++ b/.github/workflows/patch.yml
@@ -0,0 +1,124 @@
+name: Patch Release
+
+on:
+  workflow_dispatch:
+
+jobs:
+  release:
+    runs-on: ubuntu-latest
+    steps:
+      # GET LATEST CODE
+      - name: Checkout latest code
+        uses: actions/checkout@master
+        with:
+          fetch-depth: 0
+
+      # GENERATE CHANGELOG, TAG, RELEASE
+      - id: conventional_changelog
+        uses: ardalanamini/auto-changelog@master
+        with:
+          token: ${{ secrets.GITHUB_TOKEN }}
+      - id: compute_tag
+        uses: craig-day/compute-tag@v13
+        with:
+          github_token: ${{ secrets.GITHUB_TOKEN }}
+          version_scheme: semantic
+          version_type: patch
+          # MAJOR.MINOR.PATCH
+      - name: Create Release
+        id: create_release
+        uses: actions/create-release@latest
+        env:
+          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+        with:
+          tag_name: ${{ github.ref }}
+          release_name: Release ${{ steps.compute_tag.outputs.next_tag }}
+          body: |
+            Automatic release of version: **${{ steps.compute_tag.outputs.next_tag }}**
+            **Changes in this release:**
+            ${{ steps.conventional_changelog.outputs.changelog }}
+          draft: false
+          prerelease: false
+
+      - name: Setup Node.js environment
+        uses: actions/setup-node@v2.4.0
+        with:
+          # Version Spec of the version to use.  Examples: 12.x, 10.15.1, >=10.15.0
+          node-version: '>= 16.9.1'
+          # Set this option if you want the action to check for the latest available version that satisfies the version spec
+          check-latest: false
+
+      - name: Install Quasar
+        run: npm install -g @quasar/cli
+
+      - name: Install packages
+        run: npm install
+
+      - name: Build project
+        run: quasar build
+
+      - name: List files
+        run: pwd && ls -al *
+
+      - name: Create Build Archive tar.gz
+        run: |
+          echo "**** Creating archive of quasar build ****"
+          tar -czf lttmm-${{ steps.compute_tag.outputs.next_tag }}.tar.gz dist/spa
+
+      - name: Create Build Archive zip
+        uses: papeloto/action-zip@v1
+        with:
+          files: dist/spa
+          recursive: true
+          dest: lttmm-${{ steps.compute_tag.outputs.next_tag }}.zip
+
+      - name: Upload Release Archive tar.gz
+        id: upload-release-asset-archive-targz
+        uses: actions/upload-release-asset@v1
+        env:
+          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+        with:
+          upload_url: ${{ steps.create_release.outputs.upload_url }}
+          asset_path: ./lttmm-${{ steps.compute_tag.outputs.next_tag }}.tar.gz
+          asset_name: lttmm-${{ steps.compute_tag.outputs.next_tag }}.tar.gz
+          asset_content_type: application/gzip
+
+      - name: Upload Release Archive zip
+        id: upload-release-asset-archive-zip
+        uses: actions/upload-release-asset@v1
+        env:
+          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+        with:
+          upload_url: ${{ steps.create_release.outputs.upload_url }}
+          asset_path: ./lttmm-${{ steps.compute_tag.outputs.next_tag }}.zip
+          asset_name: lttmm-${{ steps.compute_tag.outputs.next_tag }}.zip
+          asset_content_type: application/zip
+
+      # DOCKER RELATED
+      - name: Set up QEMU
+        uses: docker/setup-qemu-action@v1
+      - name: Set up Docker Buildx
+        uses: docker/setup-buildx-action@v1
+      - name: Login to DockerHub
+        uses: docker/login-action@v1
+        with:
+          username: griefed
+          password: ${{ secrets.DOCKERHUB_TOKEN }}
+      - name: Login to GitHub Container Registry
+        uses: docker/login-action@v1
+        with:
+          registry: ghcr.io
+          username: ${{ github.actor }}
+          password: ${{ secrets.GITHUB_TOKEN }}
+      - name: Build and push
+        uses: docker/build-push-action@v2
+        with:
+          context: .
+          file: ./Dockerfile
+          platforms: linux/amd64,linux/arm/v7,linux/arm64
+          push: true
+          tags: |
+            ghcr.io/griefed/ltt-mapmaker:latest
+            ghcr.io/griefed/ltt-mapmaker:${{ steps.compute_tag.outputs.next_tag }}
+            griefed/ltt-mapmaker:latest
+            griefed/ltt-mapmaker:${{ steps.compute_tag.outputs.next_tag }}