diff --git a/CHANGELOG.md b/CHANGELOG.md
index a01cc222..abbbc29d 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -7,6 +7,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
 - [fix] [GithubContributors] ordered contributors by contribution count
 - [refactor] used vue-typecasting for number inputs
 - [feat] lazy loading tools routes
+- [feat] added [markdown editor](/#/markdown-editor)
 
 ## 1.2.1
 - [fix] [UuidGenerator] added quantity validation rules
diff --git a/package-lock.json b/package-lock.json
index e99f5c86..25952fac 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -3139,6 +3139,12 @@
           "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
           "dev": true
         },
+        "highlight.js": {
+          "version": "9.18.1",
+          "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-9.18.1.tgz",
+          "integrity": "sha512-OrVKYz70LHsnCgmbXctv/bfuvntIKDz177h0Co37DQ5jamGZLVmoCVMtjMtNZY3X9DrCcKfklHPNeA0uPZhSJg==",
+          "dev": true
+        },
         "supports-color": {
           "version": "7.1.0",
           "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
@@ -4373,6 +4379,11 @@
         "domelementtype": "1"
       }
     },
+    "dompurify": {
+      "version": "2.0.11",
+      "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.0.11.tgz",
+      "integrity": "sha512-qVoGPjIW9IqxRij7klDQQ2j6nSe4UNWANBhZNLnsS7ScTtLb+3YdxkRY8brNTpkUiTtcXsCJO+jS0UCDfenLuA=="
+    },
     "domutils": {
       "version": "1.7.0",
       "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz",
@@ -6253,12 +6264,6 @@
       "integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==",
       "dev": true
     },
-    "highlight.js": {
-      "version": "9.18.1",
-      "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-9.18.1.tgz",
-      "integrity": "sha512-OrVKYz70LHsnCgmbXctv/bfuvntIKDz177h0Co37DQ5jamGZLVmoCVMtjMtNZY3X9DrCcKfklHPNeA0uPZhSJg==",
-      "dev": true
-    },
     "hmac-drbg": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz",
@@ -8103,6 +8108,11 @@
         "object-visit": "^1.0.0"
       }
     },
+    "marked": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/marked/-/marked-1.1.0.tgz",
+      "integrity": "sha512-EkE7RW6KcXfMHy2PA7Jg0YJE1l8UPEZE8k45tylzmZM30/r1M1MUXWQfJlrSbsTeh7m/XTwHbWUENvAJZpp1YA=="
+    },
     "md5.js": {
       "version": "1.3.5",
       "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz",
diff --git a/package.json b/package.json
index b552be8a..97cd7d81 100644
--- a/package.json
+++ b/package.json
@@ -13,6 +13,8 @@
     "color-convert": "^2.0.1",
     "color-name": "^1.1.4",
     "core-js": "^3.6.4",
+    "dompurify": "^2.0.11",
+    "marked": "^1.1.0",
     "register-service-worker": "^1.7.1",
     "roboto-fontface": "*",
     "vue": "^2.6.11",
diff --git a/src/router.js b/src/router.js
index 35471805..17cd3e9a 100644
--- a/src/router.js
+++ b/src/router.js
@@ -85,15 +85,22 @@ const toolsComponents = [
         ],
     },
     {
-        title: 'Miscellaneous',
+        title: 'Text',
         child: [
             {
-                icon: 'fa-align-left\n',
+                icon: 'fa-align-left',
                 text: 'Text stats',
                 path: '/text-stats',
                 component: () => import('./routes/tools/TextStats'),
                 keywords: ['word', 'count', 'size', 'bytes', 'length']
             },
+            {
+                icon: 'fab fa-markdown',
+                text: 'Markdown editor',
+                path: '/markdown-editor',
+                component: () => import('./routes/tools/MarkdownEditor'),
+                keywords: ['text', 'html', 'markdown']
+            },
         ],
     }
 ];
diff --git a/src/routes/tools/MarkdownEditor.vue b/src/routes/tools/MarkdownEditor.vue
new file mode 100644
index 00000000..7a19b09c
--- /dev/null
+++ b/src/routes/tools/MarkdownEditor.vue
@@ -0,0 +1,77 @@
+
+    
+        
+            
+                
+                    
+                    
+                        copy markdown
+                    
+                
+            
+        
+        
+            
+                
+                    
+                    
+                        
+                        
+                        copy html
+                    
+                
+            
+        
+    
+
+
+
+
+
diff --git a/src/utils/helpers.js b/src/utils/helpers.js
index e847c420..f81190bc 100644
--- a/src/utils/helpers.js
+++ b/src/utils/helpers.js
@@ -28,9 +28,19 @@ const isInt = (value) => {
     return Number.isInteger(value);
 }
 
+const debounce = (callback, delay = 300) => {
+    let timer;
+
+    return function(...args) {
+        clearTimeout(timer);
+        timer = setTimeout(() => callback(...args), delay);
+    }
+}
+
 export {
     copyToClipboard,
     fileIsImage,
     formatBytes,
-    isInt
+    isInt,
+    debounce
 }
\ No newline at end of file