diff --git a/js/customElements/pwgen.js b/js/customElements/pwgen.js
new file mode 100644
index 0000000000000000000000000000000000000000..c8d198049a0d453472d5a7add6de9894b52022ee
--- /dev/null
+++ b/js/customElements/pwgen.js
@@ -0,0 +1,55 @@
+class PasswordGenerator extends HTMLElement {
+    constructor() {
+        super();
+        this.innerHTML = `
+        <input type="text" disabled id="pwgen-out"><br>
+        <input type="range" min="8" max="128" value="32" id="pwgen-len"><span id="pwgen-len-num">32</span><br>
+        <input type="checkbox" id="pwgen-inc-num" checked> Zahlen<br>
+        <input type="checkbox" id="pwgen-inc-big-char" checked> Großbuchstaben<br>
+        <input type="checkbox" id="pwgen-inc-small-char" checked> Kleinbuchstaben<br>
+        <input type="checkbox" id="pwgen-inc-special-char" checked> Sonderzeichen<br>
+        <button>Generieren</button>
+        `;
+
+        const outValue = this.querySelector("#pwgen-out");
+        const pwlen = this.querySelector("#pwgen-len");
+        const pwlenSpan = this.querySelector("#pwgen-len-num");
+        const includeNum = this.querySelector("#pwgen-inc-num");
+        const includeBigChar = this.querySelector("#pwgen-inc-big-char");
+        const includeSmallChar = this.querySelector("#pwgen-inc-small-char");
+        const includeSpecialChat = this.querySelector("#pwgen-inc-special-char");
+        const button = this.querySelector("button");
+
+        pwlen.oninput = () => {
+            pwlenSpan.innerText = pwlen.value;
+        }
+
+        button.onclick = () => {
+            let possibleChar = "";
+            let password = "";
+
+            if(includeNum.checked) {
+                possibleChar += "1234567890";
+            }
+            if(includeBigChar.checked) {
+                possibleChar += "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
+            }
+            if(includeSmallChar.checked) {
+                possibleChar += "abcdefghijklmnopqrstuvwxyz";
+            }
+            if(includeSpecialChat.checked) {
+                possibleChar += ",;.:-_#'+*?=)(/&%$§\"!°{[]}<>|~"
+            }
+
+            for(let i = 0; i < pwlen.value; i++) {
+                password += possibleChar[Math.floor(Math.random() * possibleChar.length)];
+            }
+
+            outValue.value = password;
+        }
+
+        button.click();
+    }
+}
+
+customElements.define("jl-pwgen", PasswordGenerator)
\ No newline at end of file
diff --git a/js/script.js b/js/script.js
index f9ec471c212f1174807209bacc89980c01277b74..cd0b46684e64d4bb7ceb0325a87c36c295c42ac4 100644
--- a/js/script.js
+++ b/js/script.js
@@ -18,4 +18,5 @@ require("./customElements/mainMenu");
 require("./customElements/footer");
 require("./customElements/ebkBanner");
 require("./customElements/sellingTable");
-require("./customElements/skills");
\ No newline at end of file
+require("./customElements/skills");
+require("./customElements/pwgen");
\ No newline at end of file
diff --git a/public/API/mainMenu.json b/public/API/mainMenu.json
index 51538cacdae9035390b0285638741f8d0df36d81..a04035b048e27af1fd0a97516bab76d63aae2e92 100644
--- a/public/API/mainMenu.json
+++ b/public/API/mainMenu.json
@@ -174,6 +174,11 @@
                 "name": "Matrix",
                 "url": "//chat.jonasled.de",
                 "type": "link"
+            },
+            {
+                "name": "Passwort Generator",
+                "url": "/passwordgen.html",
+                "type": "link"
             }
         ]
     },
diff --git a/public/passwordgen.html b/public/passwordgen.html
new file mode 100644
index 0000000000000000000000000000000000000000..222011367e13be0e64a5a4de433a19d5c3baa439
--- /dev/null
+++ b/public/passwordgen.html
@@ -0,0 +1,23 @@
+<!DOCTYPE html>
+<html lang="de">
+
+<head>
+    <meta charset="UTF-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <link href="/css/style.css" rel="stylesheet">
+    <title></title>
+</head>
+
+<body>
+    <jl-header data-title="Passwort Generator"></jl-header>
+    <div id="content">
+        <h3>Alle Passwörter werden nur auf dem Lokalen Computer generiert und werden in keiner Weise an den Server
+            übertragen, daher habe ich keinerlei Möglichkeit diese mitzulesen und der Passwortmanager kann ohne bedenken
+            verwendet werden.</h3>
+        <jl-pwgen></jl-pwgen>
+    </div>
+    <jl-footer></jl-footer>
+    <script src="/js/script.js"></script>
+</body>
+
+</html>
\ No newline at end of file
diff --git a/styl/lib/_pwgen.styl b/styl/lib/_pwgen.styl
new file mode 100644
index 0000000000000000000000000000000000000000..57d6357263f91f9eab22566deebe0900c0e8ab6c
--- /dev/null
+++ b/styl/lib/_pwgen.styl
@@ -0,0 +1,15 @@
+jl-pwgen {
+    input[type="text"] {
+        background-color: #1a2332;
+        color: #b3b3b3;
+        border: solid #111721;
+        border-radius: 5px;
+        padding: 5px;
+        width: 100%
+    }
+
+    input, button {
+        margin-top: 5px;
+    }
+
+}
\ No newline at end of file
diff --git a/styl/style.styl b/styl/style.styl
index d31d4da3f2da352e1879afb46d224f2817919354..30042e5a6b1fb707896a5ad4d88f5d36c66a2f96 100644
--- a/styl/style.styl
+++ b/styl/style.styl
@@ -16,4 +16,5 @@
 @import "lib/_prism";
 @import "lib/_sellingTable";
 @import "lib/_skills";
-@import "lib/_basicLightbox"
\ No newline at end of file
+@import "lib/_basicLightbox"
+@import "lib/_pwgen";
\ No newline at end of file