diff --git a/package.json b/package.json
index 80644ed7..174a859a 100644
--- a/package.json
+++ b/package.json
@@ -35,8 +35,10 @@
     "release": "node ./scripts/release.mjs"
   },
   "dependencies": {
+    "@guolao/vue-monaco-editor": "^1.4.1",
     "@it-tools/bip39": "^0.0.4",
     "@it-tools/oggen": "^1.3.0",
+    "@jspawn/qpdf-wasm": "^0.0.2",
     "@sindresorhus/slugify": "^2.2.1",
     "@tiptap/pm": "2.1.6",
     "@tiptap/starter-kit": "2.1.6",
@@ -49,38 +51,56 @@
     "@vueuse/router": "^10.0.0",
     "bcryptjs": "^2.4.3",
     "change-case": "^4.1.2",
+    "cidr-tools": "^7.0.4",
     "colord": "^2.9.3",
-    "composerize-ts": "^0.6.2",
+    "composerize": "^1.6.6",
+    "composeverter": "^1.6.2",
     "country-code-lookup": "^0.1.0",
     "cron-validator": "^1.3.1",
     "cronstrue": "^2.26.0",
     "crypto-js": "^4.1.1",
+    "custom-ed25519": "^1.0.0",
     "date-fns": "^2.29.3",
+    "decomposerize": "^1.2.4",
     "dompurify": "^3.0.6",
     "emojilib": "^3.0.10",
+    "exifreader": "^4.20.0",
+    "figlet": "^1.7.0",
     "figue": "^1.2.0",
     "fuse.js": "^6.6.2",
     "highlight.js": "^11.7.0",
     "iarna-toml-esm": "^3.0.5",
     "ibantools": "^4.3.3",
+    "ip-address": "^9.0.5",
+    "ip-bigint": "^8.0.2",
+    "ip-cidr": "^4.0.0",
+    "is-cidr": "^5.0.3",
+    "is-ip": "^5.0.1",
+    "isbn3": "^1.1.44",
+    "jpeg-quality-estimator": "^1.0.1",
     "json5": "^2.2.3",
     "jwt-decode": "^3.1.2",
     "libphonenumber-js": "^1.10.28",
     "lodash": "^4.17.21",
+    "mammoth": "^1.6.0",
     "marked": "^10.0.0",
     "mathjs": "^11.9.1",
     "mime-types": "^2.1.35",
     "monaco-editor": "^0.43.0",
     "naive-ui": "^2.35.0",
     "netmask": "^2.0.2",
-    "node-forge": "^1.3.1",
     "oui-data": "^1.0.10",
     "pdf-signature-reader": "^1.4.2",
     "pinia": "^2.0.34",
     "plausible-tracker": "^0.3.8",
+    "process": "^0.11.10",
+    "qpdf.js": "^1.0.0",
     "qrcode": "^1.5.1",
+    "qrcode-parser": "^2.1.3",
     "sql-formatter": "^13.0.0",
     "sshpk": "^1.18.0",
+    "tesseract.js": "^5.0.4",
+    "turndown": "^7.1.2",
     "ua-parser-js": "^1.0.35",
     "ulid": "^2.3.0",
     "unicode-emoji-json": "^0.4.0",
diff --git a/src/components/TextareaCopyable.vue b/src/components/TextareaCopyable.vue
index 8b0aae61..1bf3b5ff 100644
--- a/src/components/TextareaCopyable.vue
+++ b/src/components/TextareaCopyable.vue
@@ -16,6 +16,7 @@ const props = withDefaults(
     language?: string
     copyPlacement?: 'top-right' | 'bottom-right' | 'outside' | 'none'
     copyMessage?: string
+    wordWrap?: boolean
   }>(),
   {
     followHeightOf: null,
@@ -47,7 +48,7 @@ const tooltipText = computed(() => isJustCopied.value ? 'Copied!' : copyMessage.
         :style="height ? `min-height: ${height - 40 /* card padding */ + 10 /* negative margin compensation */}px` : ''"
       >