diff --git a/Makefile b/Makefile
index 7f4fe4741711b3746785d4b703c56e70955224fc..c5b0ce6274e6dfe60523a0ad69d313613204ea6e 100644
--- a/Makefile
+++ b/Makefile
@@ -15,4 +15,7 @@ debug:
 style:
 	$(YARN) prettier --write instance style client test main.js >/dev/null
 
+package:
+	$(YARN) linux-dist
+
 .PHONY: test debug run prepare style
diff --git a/icon.png b/icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..4e4109ba9253ce43b026c978f4b936f01f3b4ad6
Binary files /dev/null and b/icon.png differ
diff --git a/package.json b/package.json
index 9f78d99e3f8e68a800077bdc2327ee7fb385eea9..48e99f8eb694d99ddce3827be573d7dc73829045 100644
--- a/package.json
+++ b/package.json
@@ -12,11 +12,17 @@
     ],
     "license": "ISC",
     "scripts": {
-        "start": "electron -- --trace-uncaught . --trace-uncaught"
+        "start": "electron .",
+        "pack": "electron-builder",
+
+        "linux-dist": "yarn pack && yarn linux-extract-clean && yarn linux-extract-lektor && yarn linux-extract-amadeus && yarn linux-extract-links",
+        "linux-extract-links": "cd dist/squashfs-root/usr && ln -s bin sbin; cd ../../..",
+        "linux-extract-clean": "cd dist && rm -rf squashfs-root; cd ..",
+        "linux-extract-lektor": "cd dist && ./lektord-`arch`.AppImage --appimage-extract; cd ..",
+        "linux-extract-amadeus": "cd dist && ./amadeus*.AppImage --appimage-extract; cd .."
     },
     "dependencies": {
         "ejs": "^3.1.5",
-        "electron": "^10.1.1",
         "electron-ejs": "^1.2.1",
         "express": "^4.17.1",
         "ini": "^2.0.0",
@@ -30,6 +36,19 @@
         "kurisu": "https://kurisu.iiens.net/"
     },
     "devDependencies": {
+        "electron-builder": "^22.9.1",
+        "electron": "^10.1.1",
         "prettier": "2.1.2"
+    },
+    "mac": {
+        "target": "dmg",
+        "category": "public.app-category.utilities"
+    },
+    "win": {
+        "target": "nsis"
+    },
+    "linux": {
+        "target": "AppImage",
+        "category": "Utility"
     }
 }