diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
new file mode 100644
index 0000000000000000000000000000000000000000..77c7659cea842aabd71f7f6521766e479ca7d2e5
--- /dev/null
+++ b/.github/workflows/release.yml
@@ -0,0 +1,44 @@
+
+on:
+  push:
+    tags:
+        - 'v*'
+name: Release
+
+jobs:
+  build:
+    name: Release
+    runs-on: ubuntu-latest
+    permissions:
+      packages: write
+      contents: write
+    steps:
+      - name: Checkout code
+        uses: actions/checkout@v4
+
+      - name: Build project
+        id: build_project
+        run: |
+          VERSION=${GITHUB_REF_NAME#v}
+          echo "path=Luna3-${VERSION}.plasmoid" >> "$GITHUB_OUTPUT"
+          sed -Eie 's#"Version": "[0-9.]+",#"Version": "${{ github.ref }}",#' package/metadata.json
+          sed -Eie 's#refs/tags/v##' package/metadata.json
+          make plasmoid
+
+      - name: Create Release
+        id: create_release
+        env:
+          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+          title: Release ${{ github.ref_name }}
+          tag: ${{ github.ref_name }}
+        run: gh release create ${tag} -t "${title}"
+
+      - name: Upload Release Asset
+        id: upload-release-asset 
+        env:
+          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+          tag: ${{ github.ref_name }}
+          asset_path: ${{ steps.build_project.outputs.path }}
+        run: gh release upload ${tag} "${asset_path}"
+
+
diff --git a/release.sh b/release.sh
new file mode 100755
index 0000000000000000000000000000000000000000..fb2d8fdb791ad1d74a5f128e572cbb4ba362eca3
--- /dev/null
+++ b/release.sh
@@ -0,0 +1,13 @@
+#!/bin/bash
+
+if [[ "$#" -eq 0 ]]; then
+	echo "Usage: release.sh VERSION [OPTION]..."
+	exit 0
+fi
+
+VERSION=${1#v}
+VERSION=${VERSION:?Must provide version number.}
+shift
+
+git tag v${VERSION} $@
+sed -Eie 's#"Version": "[0-9.]+",#"Version": "'"${VERSION}"'",#' package/metadata.json