diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml
index 11c5d729081..a7bb0020056 100644
--- a/.github/workflows/tests.yml
+++ b/.github/workflows/tests.yml
@@ -7,6 +7,15 @@ on:
         branches: [main]
 
 jobs:
+    vale:
+      name: runner / vale
+      runs-on: ubuntu-latest
+      steps:
+        - uses: actions/checkout@v3
+        - uses: errata-ai/vale-action@reviewdog
+          with:
+            files: "**/*.md"
+            reporter: github-pr-check
     build:
         runs-on: ubuntu-latest
         steps:
diff --git a/.vale.ini b/.vale.ini
new file mode 100644
index 00000000000..f48ad765002
--- /dev/null
+++ b/.vale.ini
@@ -0,0 +1,18 @@
+StylesPath=".vale/styles"
+
+Vocab = Base, Appwrite
+
+MinAlertLevel = suggestion
+
+# Ignore text in code blocks and tables
+IgnoredScopes = code, tt, a
+SkippedScopes = script, style, pre, figure
+
+[formats]
+markdoc = md
+
+[*.md]
+BasedOnStyles = Vale, appwrite
+
+# Ignore text inside markdoc components
+BlockIgnores = {%.*%}
\ No newline at end of file
diff --git a/.vale/styles/Vocab/Appwrite/accept.txt b/.vale/styles/Vocab/Appwrite/accept.txt
new file mode 100644
index 00000000000..01c356bf88d
--- /dev/null
+++ b/.vale/styles/Vocab/Appwrite/accept.txt
@@ -0,0 +1,10 @@
+Appwrite
+Appwrite Realtime
+Appwrite Cloud
+Appwrite Console
+Backend as a Service
+Console
+Realtime
+Eldad
+Fux
+Christy
\ No newline at end of file
diff --git a/.vale/styles/Vocab/Base/accept.txt b/.vale/styles/Vocab/Base/accept.txt
new file mode 100644
index 00000000000..9b98d8ab723
--- /dev/null
+++ b/.vale/styles/Vocab/Base/accept.txt
@@ -0,0 +1,80 @@
+Hacktoberfest
+Bitwarden
+Twilio
+Instacart
+Trustpilot
+Gradle
+Authy
+Supabase
+Bcrypt
+Scrypt
+Zendesk
+Deno
+Excali
+Vue
+React
+Svelte
+SvelteKit
+Vite
+Datadog
+Markdoc
+runtime
+SDK
+REST
+Rest
+rest
+SMS
+GraphQL
+GET
+Get
+get
+POST
+Post
+post
+PUT
+Put
+put
+PATCH
+Patch
+patch
+DELETE
+Delete
+delete
+API
+CLI
+HTML
+CSS
+PDF
+URL
+Nuxt
+Xcode
+UIKit
+VSCode
+PowerShell
+BaaS
+JWT
+JSON
+GPU
+ASIC
+OAuth
+OAuth2
+CAPTCHA
+Bundler
+reputational
+cyberattack
+inclusivity
+admin
+console
+viewport
+repository
+keyframe
+todo
+favicons
+wireframe
+hostname
+Hostname
+destructuring
+Destructuring
+async
+rebrand
+serverless
\ No newline at end of file
diff --git a/.vale/styles/appwrite/SentenceCase.yml b/.vale/styles/appwrite/SentenceCase.yml
new file mode 100644
index 00000000000..6e3b2bc279c
--- /dev/null
+++ b/.vale/styles/appwrite/SentenceCase.yml
@@ -0,0 +1,5 @@
+extends: capitalization
+message: "'%s' should be in sentence case"
+level: warning
+scope: heading
+match: $sentence
\ No newline at end of file
diff --git a/.vscode/settings.json b/.vscode/settings.json
new file mode 100644
index 00000000000..6ea857582f3
--- /dev/null
+++ b/.vscode/settings.json
@@ -0,0 +1,3 @@
+{
+    "vale.valeCLI.path": "${workspaceFolder}/node_modules/.bin/vale"
+}
diff --git a/package.json b/package.json
index 701f6413976..dcbbf9b4210 100644
--- a/package.json
+++ b/package.json
@@ -10,6 +10,7 @@
         "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json",
         "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch",
         "lint": "prettier --plugin-search-dir . --check . && eslint .",
+        "lint:docs": "vale --config=.vale.ini --glob='**/*.md' .",
         "format": "prettier --plugin-search-dir . --write .",
         "test:integration": "playwright test",
         "test:unit": "vitest",
@@ -20,6 +21,7 @@
     "devDependencies": {
         "@melt-ui/pp": "^0.1.2",
         "@melt-ui/svelte": "^0.55.0",
+        "@ocular-d/vale-bin": "^2.29.6",
         "@playwright/test": "^1.37.1",
         "@sveltejs/adapter-node": "^1.3.1",
         "@sveltejs/adapter-static": "^2.0.3",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index fbb06379c22..9aa6422c21d 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -13,7 +13,7 @@ dependencies:
     version: 0.1.0-next.9
   '@appwrite.io/repo':
     specifier: github:appwrite/appwrite#main
-    version: github.com/appwrite/appwrite/fce18647d2352e4cfce7ce75fd103a21bafbf7d0
+    version: github.com/appwrite/appwrite/3a53dce467c7bf731009963402da00be4ccab7e5
   '@splinetool/viewer':
     specifier: 0.9.455
     version: 0.9.455
@@ -42,10 +42,13 @@ dependencies:
 devDependencies:
   '@melt-ui/pp':
     specifier: ^0.1.2
-    version: 0.1.2(@melt-ui/svelte@0.55.0)(svelte@4.2.0)
+    version: 0.1.2(@melt-ui/svelte@0.55.4)(svelte@4.2.0)
   '@melt-ui/svelte':
     specifier: ^0.55.0
-    version: 0.55.0(svelte@4.2.0)
+    version: 0.55.4(svelte@4.2.0)
+  '@ocular-d/vale-bin':
+    specifier: ^2.29.6
+    version: 2.29.6
   '@playwright/test':
     specifier: ^1.37.1
     version: 1.38.0
@@ -111,7 +114,7 @@ devDependencies:
     version: 3.5.1(postcss@8.4.27)(sass@1.66.1)(svelte@4.2.0)
   svelte-markdoc-preprocess:
     specifier: ^1.1.0
-    version: 1.1.0
+    version: 1.1.2
   svelte-sequential-preprocessor:
     specifier: ^2.0.1
     version: 2.0.1
@@ -884,8 +887,8 @@ packages:
       '@lit-labs/ssr-dom-shim': 1.1.1
     dev: false
 
-  /@markdoc/markdoc@0.3.2:
-    resolution: {integrity: sha512-D0SaanaSkTIARvQu+zQqPEpKcvYUBR/mfac9e8JzS89P7eXhiNWPonUN7avRS1saZHpIQWIRote97qT+jGk5Gw==}
+  /@markdoc/markdoc@0.3.4:
+    resolution: {integrity: sha512-cTyucw4YcQL3JfKMjjjszuTuR97nELN0mvPQhYLvVR/flvYaZUZUNBs8O3lv0vf7g0bfM2ZTUezBq0u8+1hTdg==}
     engines: {node: '>=14.7.0'}
     peerDependencies:
       '@types/react': '*'
@@ -899,19 +902,19 @@ packages:
       '@types/markdown-it': 12.2.3
     dev: true
 
-  /@melt-ui/pp@0.1.2(@melt-ui/svelte@0.55.0)(svelte@4.2.0):
+  /@melt-ui/pp@0.1.2(@melt-ui/svelte@0.55.4)(svelte@4.2.0):
     resolution: {integrity: sha512-GZeqp7UWLNZUC2dJpREnZrWMR88vy27WO7C3cIBz4KW3/CFD19FjNkd3VbSRfcRryrMkdnEs9nu2VUa8/0u58w==}
     engines: {pnpm: '>=8.6.3'}
     peerDependencies:
       '@melt-ui/svelte': '>= 0.29.0'
       svelte: ^3.55.0 || ^4.0.0
     dependencies:
-      '@melt-ui/svelte': 0.55.0(svelte@4.2.0)
+      '@melt-ui/svelte': 0.55.4(svelte@4.2.0)
       svelte: 4.2.0
     dev: true
 
-  /@melt-ui/svelte@0.55.0(svelte@4.2.0):
-    resolution: {integrity: sha512-fNv47y2Uxx3dtBoihTbBAaQxKy4j8xVGdat8n5I01JMkwTv1GS1qnzOVNDLncDeJCo8aY6/Qoy6wRelCnbxyGg==}
+  /@melt-ui/svelte@0.55.4(svelte@4.2.0):
+    resolution: {integrity: sha512-kAE7bdRItTE6Ng7ageM1/w7vJmVAKMDJwekpaSQHjNmTRWuY+4iHGX567iilFsrkhD9iIRwQfznoxQ671wbTtg==}
     peerDependencies:
       svelte: '>=3 <5'
     dependencies:
@@ -1012,6 +1015,16 @@ packages:
       semver: 7.5.4
     dev: true
 
+  /@ocular-d/vale-bin@2.29.6:
+    resolution: {integrity: sha512-Sxp4+H1FV7hg254zYXYLdcFjtW/Bawb8gtp+3Cn3Bi57gDv2Cu7+r20iBtoOOTswA+Zr4fjEbl5T7O/qUjQbow==}
+    engines: {node: '>=8'}
+    hasBin: true
+    requiresBuild: true
+    dependencies:
+      chalk: 4.1.2
+      download: 7.1.0
+    dev: true
+
   /@pkgjs/parseargs@0.11.0:
     resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==}
     engines: {node: '>=14'}
@@ -1031,8 +1044,8 @@ packages:
     resolution: {integrity: sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==}
     dev: true
 
-  /@resvg/resvg-js-android-arm-eabi@2.4.1:
-    resolution: {integrity: sha512-AA6f7hS0FAPpvQMhBCf6f1oD1LdlqNXKCxAAPpKh6tR11kqV0YIB9zOlIYgITM14mq2YooLFl6XIbbvmY+jwUw==}
+  /@resvg/resvg-js-android-arm-eabi@2.6.0:
+    resolution: {integrity: sha512-lJnZ/2P5aMocrFMW7HWhVne5gH82I8xH6zsfH75MYr4+/JOaVcGCTEQ06XFohGMdYRP3v05SSPLPvTM/RHjxfA==}
     engines: {node: '>= 10'}
     cpu: [arm]
     os: [android]
@@ -1040,8 +1053,8 @@ packages:
     dev: true
     optional: true
 
-  /@resvg/resvg-js-android-arm64@2.4.1:
-    resolution: {integrity: sha512-/QleoRdPfsEuH9jUjilYcDtKK/BkmWcK+1LXM8L2nsnf/CI8EnFyv7ZzCj4xAIvZGAy9dTYr/5NZBcTwxG2HQg==}
+  /@resvg/resvg-js-android-arm64@2.6.0:
+    resolution: {integrity: sha512-N527f529bjMwYWShZYfBD60dXA4Fux+D695QsHQ93BDYZSHUoOh1CUGUyICevnTxs7VgEl98XpArmUWBZQVMfQ==}
     engines: {node: '>= 10'}
     cpu: [arm64]
     os: [android]
@@ -1049,8 +1062,8 @@ packages:
     dev: true
     optional: true
 
-  /@resvg/resvg-js-darwin-arm64@2.4.1:
-    resolution: {integrity: sha512-U1oMNhea+kAXgiEXgzo7EbFGCD1Edq5aSlQoe6LMly6UjHzgx2W3N5kEXCwU/CgN5FiQhZr7PlSJSlcr7mdhfg==}
+  /@resvg/resvg-js-darwin-arm64@2.6.0:
+    resolution: {integrity: sha512-MabUKLVayEwlPo0mIqAmMt+qESN8LltCvv5+GLgVga1avpUrkxj/fkU1TKm8kQegutUjbP/B0QuMuUr0uhF8ew==}
     engines: {node: '>= 10'}
     cpu: [arm64]
     os: [darwin]
@@ -1058,8 +1071,8 @@ packages:
     dev: true
     optional: true
 
-  /@resvg/resvg-js-darwin-x64@2.4.1:
-    resolution: {integrity: sha512-avyVh6DpebBfHHtTQTZYSr6NG1Ur6TEilk1+H0n7V+g4F7x7WPOo8zL00ZhQCeRQ5H4f8WXNWIEKL8fwqcOkYw==}
+  /@resvg/resvg-js-darwin-x64@2.6.0:
+    resolution: {integrity: sha512-zrFetdnSw/suXjmyxSjfDV7i61hahv6DDG6kM7BYN2yJ3Es5+BZtqYZTcIWogPJedYKmzN1YTMWGd/3f0ubFiA==}
     engines: {node: '>= 10'}
     cpu: [x64]
     os: [darwin]
@@ -1067,8 +1080,8 @@ packages:
     dev: true
     optional: true
 
-  /@resvg/resvg-js-linux-arm-gnueabihf@2.4.1:
-    resolution: {integrity: sha512-isY/mdKoBWH4VB5v621co+8l101jxxYjuTkwOLsbW+5RK9EbLciPlCB02M99ThAHzI2MYxIUjXNmNgOW8btXvw==}
+  /@resvg/resvg-js-linux-arm-gnueabihf@2.6.0:
+    resolution: {integrity: sha512-sH4gxXt7v7dGwjGyzLwn7SFGvwZG6DQqLaZ11MmzbCwd9Zosy1TnmrMJfn6TJ7RHezmQMgBPi18bl55FZ1AT4A==}
     engines: {node: '>= 10'}
     cpu: [arm]
     os: [linux]
@@ -1076,8 +1089,8 @@ packages:
     dev: true
     optional: true
 
-  /@resvg/resvg-js-linux-arm64-gnu@2.4.1:
-    resolution: {integrity: sha512-uY5voSCrFI8TH95vIYBm5blpkOtltLxLRODyhKJhGfskOI7XkRw5/t1u0sWAGYD8rRSNX+CA+np86otKjubrNg==}
+  /@resvg/resvg-js-linux-arm64-gnu@2.6.0:
+    resolution: {integrity: sha512-fCyMncqCJtrlANADIduYF4IfnWQ295UKib7DAxFXQhBsM9PLDTpizr0qemZcCNadcwSVHnAIzL4tliZhCM8P6A==}
     engines: {node: '>= 10'}
     cpu: [arm64]
     os: [linux]
@@ -1085,8 +1098,8 @@ packages:
     dev: true
     optional: true
 
-  /@resvg/resvg-js-linux-arm64-musl@2.4.1:
-    resolution: {integrity: sha512-6mT0+JBCsermKMdi/O2mMk3m7SqOjwi9TKAwSngRZ/nQoL3Z0Z5zV+572ztgbWr0GODB422uD8e9R9zzz38dRQ==}
+  /@resvg/resvg-js-linux-arm64-musl@2.6.0:
+    resolution: {integrity: sha512-ouLjTgBQHQyxLht4FdMPTvuY8xzJigM9EM2Tlu0llWkN1mKyTQrvYWi6TA6XnKdzDJHy7ZLpWpjZi7F5+Pg+Vg==}
     engines: {node: '>= 10'}
     cpu: [arm64]
     os: [linux]
@@ -1094,8 +1107,8 @@ packages:
     dev: true
     optional: true
 
-  /@resvg/resvg-js-linux-x64-gnu@2.4.1:
-    resolution: {integrity: sha512-60KnrscLj6VGhkYOJEmmzPlqqfcw1keDh6U+vMcNDjPhV3B5vRSkpP/D/a8sfokyeh4VEacPSYkWGezvzS2/mg==}
+  /@resvg/resvg-js-linux-x64-gnu@2.6.0:
+    resolution: {integrity: sha512-n3zC8DWsvxC1AwxpKFclIPapDFibs5XdIRoV/mcIlxlh0vseW1F49b97F33BtJQRmlntsqqN6GMMqx8byB7B+Q==}
     engines: {node: '>= 10'}
     cpu: [x64]
     os: [linux]
@@ -1103,8 +1116,8 @@ packages:
     dev: true
     optional: true
 
-  /@resvg/resvg-js-linux-x64-musl@2.4.1:
-    resolution: {integrity: sha512-0AMyZSICC1D7ge115cOZQW8Pcad6PjWuZkBFF3FJuSxC6Dgok0MQnLTs2MfMdKBlAcwO9dXsf3bv9tJZj8pATA==}
+  /@resvg/resvg-js-linux-x64-musl@2.6.0:
+    resolution: {integrity: sha512-n4tasK1HOlAxdTEROgYA1aCfsEKk0UOFDNd/AQTTZlTmCbHKXPq+O8npaaKlwXquxlVK8vrkcWbksbiGqbCAcw==}
     engines: {node: '>= 10'}
     cpu: [x64]
     os: [linux]
@@ -1112,8 +1125,8 @@ packages:
     dev: true
     optional: true
 
-  /@resvg/resvg-js-win32-arm64-msvc@2.4.1:
-    resolution: {integrity: sha512-76XDFOFSa3d0QotmcNyChh2xHwk+JTFiEQBVxMlHpHMeq7hNrQJ1IpE1zcHSQvrckvkdfLboKRrlGB86B10Qjw==}
+  /@resvg/resvg-js-win32-arm64-msvc@2.6.0:
+    resolution: {integrity: sha512-X2+EoBJFwDI5LDVb51Sk7ldnVLitMGr9WwU/i21i3fAeAXZb3hM16k67DeTy16OYkT2dk/RfU1tP1wG+rWbz2Q==}
     engines: {node: '>= 10'}
     cpu: [arm64]
     os: [win32]
@@ -1121,8 +1134,8 @@ packages:
     dev: true
     optional: true
 
-  /@resvg/resvg-js-win32-ia32-msvc@2.4.1:
-    resolution: {integrity: sha512-odyVFGrEWZIzzJ89KdaFtiYWaIJh9hJRW/frcEcG3agJ464VXkN/2oEVF5ulD+5mpGlug9qJg7htzHcKxDN8sg==}
+  /@resvg/resvg-js-win32-ia32-msvc@2.6.0:
+    resolution: {integrity: sha512-L7oevWjQoUgK5W1fCKn0euSVemhDXVhrjtwqpc7MwBKKimYeiOshO1Li1pa8bBt5PESahenhWgdB6lav9O0fEg==}
     engines: {node: '>= 10'}
     cpu: [ia32]
     os: [win32]
@@ -1130,8 +1143,8 @@ packages:
     dev: true
     optional: true
 
-  /@resvg/resvg-js-win32-x64-msvc@2.4.1:
-    resolution: {integrity: sha512-vY4kTLH2S3bP+puU5x7hlAxHv+ulFgcK6Zn3efKSr0M0KnZ9A3qeAjZteIpkowEFfUeMPNg2dvvoFRJA9zqxSw==}
+  /@resvg/resvg-js-win32-x64-msvc@2.6.0:
+    resolution: {integrity: sha512-8lJlghb+Unki5AyKgsnFbRJwkEj9r1NpwyuBG8yEJiG1W9eEGl03R3I7bsVa3haof/3J1NlWf0rzSa1G++A2iw==}
     engines: {node: '>= 10'}
     cpu: [x64]
     os: [win32]
@@ -1139,22 +1152,22 @@ packages:
     dev: true
     optional: true
 
-  /@resvg/resvg-js@2.4.1:
-    resolution: {integrity: sha512-wTOf1zerZX8qYcMmLZw3czR4paI4hXqPjShNwJRh5DeHxvgffUS5KM7XwxtbIheUW6LVYT5fhT2AJiP6mU7U4A==}
+  /@resvg/resvg-js@2.6.0:
+    resolution: {integrity: sha512-Tf3YpbBKcQn991KKcw/vg7vZf98v01seSv6CVxZBbRkL/xyjnoYB6KgrFL6zskT1A4dWC/vg77KyNOW+ePaNlA==}
     engines: {node: '>= 10'}
     optionalDependencies:
-      '@resvg/resvg-js-android-arm-eabi': 2.4.1
-      '@resvg/resvg-js-android-arm64': 2.4.1
-      '@resvg/resvg-js-darwin-arm64': 2.4.1
-      '@resvg/resvg-js-darwin-x64': 2.4.1
-      '@resvg/resvg-js-linux-arm-gnueabihf': 2.4.1
-      '@resvg/resvg-js-linux-arm64-gnu': 2.4.1
-      '@resvg/resvg-js-linux-arm64-musl': 2.4.1
-      '@resvg/resvg-js-linux-x64-gnu': 2.4.1
-      '@resvg/resvg-js-linux-x64-musl': 2.4.1
-      '@resvg/resvg-js-win32-arm64-msvc': 2.4.1
-      '@resvg/resvg-js-win32-ia32-msvc': 2.4.1
-      '@resvg/resvg-js-win32-x64-msvc': 2.4.1
+      '@resvg/resvg-js-android-arm-eabi': 2.6.0
+      '@resvg/resvg-js-android-arm64': 2.6.0
+      '@resvg/resvg-js-darwin-arm64': 2.6.0
+      '@resvg/resvg-js-darwin-x64': 2.6.0
+      '@resvg/resvg-js-linux-arm-gnueabihf': 2.6.0
+      '@resvg/resvg-js-linux-arm64-gnu': 2.6.0
+      '@resvg/resvg-js-linux-arm64-musl': 2.6.0
+      '@resvg/resvg-js-linux-x64-gnu': 2.6.0
+      '@resvg/resvg-js-linux-x64-musl': 2.6.0
+      '@resvg/resvg-js-win32-arm64-msvc': 2.6.0
+      '@resvg/resvg-js-win32-ia32-msvc': 2.6.0
+      '@resvg/resvg-js-win32-x64-msvc': 2.6.0
     dev: true
 
   /@rollup/plugin-commonjs@25.0.4(rollup@3.28.0):
@@ -1225,6 +1238,11 @@ packages:
     resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==}
     dev: true
 
+  /@sindresorhus/is@0.7.0:
+    resolution: {integrity: sha512-ONhaKPIufzzrlNbqtWFFd+jlnemX6lJAgq9ZeiZtS7I1PIf/la7CW4m83rTXRnVnsMbW2k56pGYu7AUFJD9Pow==}
+    engines: {node: '>=4'}
+    dev: true
+
   /@splinetool/viewer@0.9.455:
     resolution: {integrity: sha512-SqgjM5RJn/hq8mbqteTOS+uFPZrtJDScMzjIr3mXRIV6nL55AMH52fQ5xgETy7IAjZPgKajL0sHyavGIHHZkPA==}
     dependencies:
@@ -1422,6 +1440,12 @@ packages:
       '@types/node': 20.5.0
     dev: true
 
+  /@types/keyv@3.1.4:
+    resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==}
+    dependencies:
+      '@types/node': 20.5.0
+    dev: true
+
   /@types/linkify-it@3.0.3:
     resolution: {integrity: sha512-pTjcqY9E4nOI55Wgpz7eiI8+LzdYnw3qxXCfHyBDdPbYvbyLgWLJGh8EdPvqawwMK1Uo1794AUkkR38Fr0g+2g==}
     dev: true
@@ -1488,6 +1512,12 @@ packages:
     resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==}
     dev: true
 
+  /@types/responselike@1.0.1:
+    resolution: {integrity: sha512-TiGnitEDxj2X0j+98Eqk5lv/Cij8oHd32bU4D/Yw6AOq7vvTk0gSD2GPj0G/HkvhMoVsdlhYF4yqqlyPBTM6Sg==}
+    dependencies:
+      '@types/node': 20.5.0
+    dev: true
+
   /@types/semver@7.5.0:
     resolution: {integrity: sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==}
     dev: true
@@ -1828,6 +1858,13 @@ packages:
     resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==}
     dev: true
 
+  /archive-type@4.0.0:
+    resolution: {integrity: sha512-zV4Ky0v1F8dBrdYElwTvQhweQ0P7Kwc1aluqJsYtOBP01jXcWCyW2IEfI1YiqsG+Iy7ZR+o5LF1N+PGECBxHWA==}
+    engines: {node: '>=4'}
+    dependencies:
+      file-type: 4.4.0
+    dev: true
+
   /are-we-there-yet@3.0.1:
     resolution: {integrity: sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==}
     engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0}
@@ -1947,6 +1984,13 @@ packages:
       file-uri-to-path: 1.0.0
     dev: true
 
+  /bl@1.2.3:
+    resolution: {integrity: sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==}
+    dependencies:
+      readable-stream: 2.3.8
+      safe-buffer: 5.2.1
+    dev: true
+
   /bl@4.1.0:
     resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==}
     dependencies:
@@ -2021,6 +2065,17 @@ packages:
       fill-range: 7.0.1
     dev: true
 
+  /buffer-alloc-unsafe@1.1.0:
+    resolution: {integrity: sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==}
+    dev: true
+
+  /buffer-alloc@1.2.0:
+    resolution: {integrity: sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==}
+    dependencies:
+      buffer-alloc-unsafe: 1.1.0
+      buffer-fill: 1.0.0
+    dev: true
+
   /buffer-crc32@0.2.13:
     resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==}
     dev: true
@@ -2030,6 +2085,10 @@ packages:
     engines: {node: '>=0.4.0'}
     dev: true
 
+  /buffer-fill@1.0.0:
+    resolution: {integrity: sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ==}
+    dev: true
+
   /buffer@5.7.1:
     resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==}
     dependencies:
@@ -2103,6 +2162,18 @@ packages:
       unset-value: 1.0.0
     dev: true
 
+  /cacheable-request@2.1.4:
+    resolution: {integrity: sha512-vag0O2LKZ/najSoUwDbVlnlCFvhBE/7mGTY2B5FgCBDcRD+oVV1HYTOwM6JZfMg/hIcM6IwnTZ1uQQL5/X3xIQ==}
+    dependencies:
+      clone-response: 1.0.2
+      get-stream: 3.0.0
+      http-cache-semantics: 3.8.1
+      keyv: 3.0.0
+      lowercase-keys: 1.0.0
+      normalize-url: 2.0.1
+      responselike: 1.0.2
+    dev: true
+
   /call-bind@1.0.2:
     resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==}
     dependencies:
@@ -2115,6 +2186,16 @@ packages:
     engines: {node: '>=6'}
     dev: true
 
+  /caw@2.0.1:
+    resolution: {integrity: sha512-Cg8/ZSBEa8ZVY9HspcGUYaK63d/bN7rqS3CYCzEGUxuYv6UlmcjzDUz2fCFFHyTvUW5Pk0I+3hkA3iXlIj6guA==}
+    engines: {node: '>=4'}
+    dependencies:
+      get-proxy: 2.1.0
+      isurl: 1.0.0
+      tunnel-agent: 0.6.0
+      url-to-options: 1.0.1
+    dev: true
+
   /chai@4.3.7:
     resolution: {integrity: sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==}
     engines: {node: '>=4'}
@@ -2227,6 +2308,12 @@ packages:
       wrap-ansi: 7.0.0
     dev: true
 
+  /clone-response@1.0.2:
+    resolution: {integrity: sha512-yjLXh88P599UOyPTFX0POsd7WxnbsVsGohcwzHOLspIhhpalPw1BcqED8NblyZLKcGrL8dTgMlcaZxV2jAD41Q==}
+    dependencies:
+      mimic-response: 1.0.1
+    dev: true
+
   /code-red@1.0.4:
     resolution: {integrity: sha512-7qJWqItLA8/VPVlKJlFXU+NBlo/qyfs39aJcuMT/2ere32ZqvF5OSxgdM5xOfJJ7O429gg2HM47y8v9P+9wrNw==}
     dependencies:
@@ -2279,6 +2366,10 @@ packages:
     hasBin: true
     dev: true
 
+  /commander@2.20.3:
+    resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==}
+    dev: true
+
   /commander@4.1.1:
     resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==}
     engines: {node: '>= 6'}
@@ -2328,6 +2419,13 @@ packages:
     resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
     dev: true
 
+  /config-chain@1.1.13:
+    resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==}
+    dependencies:
+      ini: 1.3.8
+      proto-list: 1.2.4
+    dev: true
+
   /console-control-strings@1.1.0:
     resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==}
     dev: true
@@ -2337,7 +2435,6 @@ packages:
     engines: {node: '>= 0.6'}
     dependencies:
       safe-buffer: 5.2.1
-    dev: false
 
   /content-type@1.0.5:
     resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==}
@@ -2469,6 +2566,13 @@ packages:
     engines: {node: '>=0.10'}
     dev: true
 
+  /decompress-response@3.3.0:
+    resolution: {integrity: sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==}
+    engines: {node: '>=4'}
+    dependencies:
+      mimic-response: 1.0.1
+    dev: true
+
   /decompress-response@6.0.0:
     resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==}
     engines: {node: '>=10'}
@@ -2476,6 +2580,59 @@ packages:
       mimic-response: 3.1.0
     dev: false
 
+  /decompress-tar@4.1.1:
+    resolution: {integrity: sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ==}
+    engines: {node: '>=4'}
+    dependencies:
+      file-type: 5.2.0
+      is-stream: 1.1.0
+      tar-stream: 1.6.2
+    dev: true
+
+  /decompress-tarbz2@4.1.1:
+    resolution: {integrity: sha512-s88xLzf1r81ICXLAVQVzaN6ZmX4A6U4z2nMbOwobxkLoIIfjVMBg7TeguTUXkKeXni795B6y5rnvDw7rxhAq9A==}
+    engines: {node: '>=4'}
+    dependencies:
+      decompress-tar: 4.1.1
+      file-type: 6.2.0
+      is-stream: 1.1.0
+      seek-bzip: 1.0.6
+      unbzip2-stream: 1.4.3
+    dev: true
+
+  /decompress-targz@4.1.1:
+    resolution: {integrity: sha512-4z81Znfr6chWnRDNfFNqLwPvm4db3WuZkqV+UgXQzSngG3CEKdBkw5jrv3axjjL96glyiiKjsxJG3X6WBZwX3w==}
+    engines: {node: '>=4'}
+    dependencies:
+      decompress-tar: 4.1.1
+      file-type: 5.2.0
+      is-stream: 1.1.0
+    dev: true
+
+  /decompress-unzip@4.0.1:
+    resolution: {integrity: sha512-1fqeluvxgnn86MOh66u8FjbtJpAFv5wgCT9Iw8rcBqQcCo5tO8eiJw7NNTrvt9n4CRBVq7CstiS922oPgyGLrw==}
+    engines: {node: '>=4'}
+    dependencies:
+      file-type: 3.9.0
+      get-stream: 2.3.1
+      pify: 2.3.0
+      yauzl: 2.10.0
+    dev: true
+
+  /decompress@4.2.1:
+    resolution: {integrity: sha512-e48kc2IjU+2Zw8cTb6VZcJQ3lgVbS4uuB1TfCHbiZIP/haNXm+SVyhu+87jts5/3ROpd82GSVCoNs/z8l4ZOaQ==}
+    engines: {node: '>=4'}
+    dependencies:
+      decompress-tar: 4.1.1
+      decompress-tarbz2: 4.1.1
+      decompress-targz: 4.1.1
+      decompress-unzip: 4.0.1
+      graceful-fs: 4.2.11
+      make-dir: 1.3.0
+      pify: 2.3.0
+      strip-dirs: 2.1.0
+    dev: true
+
   /deep-eql@4.1.3:
     resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==}
     engines: {node: '>=6'}
@@ -2620,6 +2777,28 @@ packages:
       domhandler: 5.0.3
     dev: true
 
+  /download@7.1.0:
+    resolution: {integrity: sha512-xqnBTVd/E+GxJVrX5/eUJiLYjCGPwMpdL+jGhGU57BvtcA7wwhtHVbXBeUk51kOpW3S7Jn3BQbN9Q1R1Km2qDQ==}
+    engines: {node: '>=6'}
+    dependencies:
+      archive-type: 4.0.0
+      caw: 2.0.1
+      content-disposition: 0.5.4
+      decompress: 4.2.1
+      ext-name: 5.0.0
+      file-type: 8.1.0
+      filenamify: 2.1.0
+      get-stream: 3.0.0
+      got: 8.3.2
+      make-dir: 1.3.0
+      p-event: 2.3.1
+      pify: 3.0.0
+    dev: true
+
+  /duplexer3@0.1.5:
+    resolution: {integrity: sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==}
+    dev: true
+
   /eastasianwidth@0.2.0:
     resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==}
     dev: true
@@ -2728,6 +2907,11 @@ packages:
     resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==}
     dev: false
 
+  /escape-string-regexp@1.0.5:
+    resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==}
+    engines: {node: '>=0.8.0'}
+    dev: true
+
   /escape-string-regexp@4.0.0:
     resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==}
     engines: {node: '>=10'}
@@ -2965,6 +3149,21 @@ packages:
       - supports-color
     dev: false
 
+  /ext-list@2.2.2:
+    resolution: {integrity: sha512-u+SQgsubraE6zItfVA0tBuCBhfU9ogSRnsvygI7wht9TS510oLkBRXBsqopeUG/GBOIQyKZO9wjTqIu/sf5zFA==}
+    engines: {node: '>=0.10.0'}
+    dependencies:
+      mime-db: 1.52.0
+    dev: true
+
+  /ext-name@5.0.0:
+    resolution: {integrity: sha512-yblEwXAbGv1VQDmow7s38W77hzAgJAO50ztBLMcUyUBfxv1HC+LGwtiEN+Co6LtlqT/5uwVOxsD4TNIilWhwdQ==}
+    engines: {node: '>=4'}
+    dependencies:
+      ext-list: 2.2.2
+      sort-keys-length: 1.0.1
+    dev: true
+
   /extend-shallow@2.0.1:
     resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==}
     engines: {node: '>=0.10.0'}
@@ -3029,6 +3228,12 @@ packages:
       reusify: 1.0.4
     dev: true
 
+  /fd-slicer@1.1.0:
+    resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==}
+    dependencies:
+      pend: 1.2.0
+    dev: true
+
   /file-entry-cache@6.0.1:
     resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==}
     engines: {node: ^10.12.0 || >=12.0.0}
@@ -3045,6 +3250,31 @@ packages:
       token-types: 4.2.1
     dev: true
 
+  /file-type@3.9.0:
+    resolution: {integrity: sha512-RLoqTXE8/vPmMuTI88DAzhMYC99I8BWv7zYP4A1puo5HIjEJ5EX48ighy4ZyKMG9EDXxBgW6e++cn7d1xuFghA==}
+    engines: {node: '>=0.10.0'}
+    dev: true
+
+  /file-type@4.4.0:
+    resolution: {integrity: sha512-f2UbFQEk7LXgWpi5ntcO86OeA/cC80fuDDDaX/fZ2ZGel+AF7leRQqBBW1eJNiiQkrZlAoM6P+VYP5P6bOlDEQ==}
+    engines: {node: '>=4'}
+    dev: true
+
+  /file-type@5.2.0:
+    resolution: {integrity: sha512-Iq1nJ6D2+yIO4c8HHg4fyVb8mAJieo1Oloy1mLLaB2PvezNedhBVm+QU7g0qM42aiMbRXTxKKwGD17rjKNJYVQ==}
+    engines: {node: '>=4'}
+    dev: true
+
+  /file-type@6.2.0:
+    resolution: {integrity: sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg==}
+    engines: {node: '>=4'}
+    dev: true
+
+  /file-type@8.1.0:
+    resolution: {integrity: sha512-qyQ0pzAy78gVoJsmYeNgl8uH8yKhr1lVhW7JbzJmnlRi0I4R2eEDEJZVKG8agpDnLpacwNbDhLNG/LMdxHD2YQ==}
+    engines: {node: '>=6'}
+    dev: true
+
   /file-uri-to-path@1.0.0:
     resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==}
     dev: true
@@ -3055,6 +3285,20 @@ packages:
       minimatch: 5.1.6
     dev: true
 
+  /filename-reserved-regex@2.0.0:
+    resolution: {integrity: sha512-lc1bnsSr4L4Bdif8Xb/qrtokGbq5zlsms/CYH8PP+WtCkGNF65DPiQY8vG3SakEdRn8Dlnm+gW/qWKKjS5sZzQ==}
+    engines: {node: '>=4'}
+    dev: true
+
+  /filenamify@2.1.0:
+    resolution: {integrity: sha512-ICw7NTT6RsDp2rnYKVd8Fu4cr6ITzGy3+u4vUujPkabyaz+03F24NWEX7fs5fp+kBonlaqPH8fAO2NM+SXt/JA==}
+    engines: {node: '>=4'}
+    dependencies:
+      filename-reserved-regex: 2.0.0
+      strip-outer: 1.0.1
+      trim-repeated: 1.0.0
+    dev: true
+
   /fill-range@4.0.0:
     resolution: {integrity: sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==}
     engines: {node: '>=0.10.0'}
@@ -3143,9 +3387,15 @@ packages:
     engines: {node: '>= 0.6'}
     dev: false
 
+  /from2@2.3.0:
+    resolution: {integrity: sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==}
+    dependencies:
+      inherits: 2.0.4
+      readable-stream: 2.3.8
+    dev: true
+
   /fs-constants@1.0.0:
     resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==}
-    dev: false
 
   /fs-extra@11.1.1:
     resolution: {integrity: sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==}
@@ -3217,6 +3467,26 @@ packages:
       has-symbols: 1.0.3
     dev: false
 
+  /get-proxy@2.1.0:
+    resolution: {integrity: sha512-zmZIaQTWnNQb4R4fJUEp/FC51eZsc6EkErspy3xtIYStaq8EB/hDIWipxsal+E8rz0qD7f2sL/NA9Xee4RInJw==}
+    engines: {node: '>=4'}
+    dependencies:
+      npm-conf: 1.1.3
+    dev: true
+
+  /get-stream@2.3.1:
+    resolution: {integrity: sha512-AUGhbbemXxrZJRD5cDvKtQxLuYaIbNtDTK8YqupCI393Q2KSTreEsLUN3ZxAWFGiKTzL6nKuzfcIvieflUX9qA==}
+    engines: {node: '>=0.10.0'}
+    dependencies:
+      object-assign: 4.1.1
+      pinkie-promise: 2.0.1
+    dev: true
+
+  /get-stream@3.0.0:
+    resolution: {integrity: sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==}
+    engines: {node: '>=4'}
+    dev: true
+
   /get-value@2.0.6:
     resolution: {integrity: sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==}
     engines: {node: '>=0.10.0'}
@@ -3326,6 +3596,31 @@ packages:
     resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==}
     dev: true
 
+  /got@8.3.2:
+    resolution: {integrity: sha512-qjUJ5U/hawxosMryILofZCkm3C84PLJS/0grRIpjAwu+Lkxxj5cxeCU25BG0/3mDSpXKTyZr8oh8wIgLaH0QCw==}
+    engines: {node: '>=4'}
+    dependencies:
+      '@sindresorhus/is': 0.7.0
+      '@types/keyv': 3.1.4
+      '@types/responselike': 1.0.1
+      cacheable-request: 2.1.4
+      decompress-response: 3.3.0
+      duplexer3: 0.1.5
+      get-stream: 3.0.0
+      into-stream: 3.1.0
+      is-retry-allowed: 1.2.0
+      isurl: 1.0.0
+      lowercase-keys: 1.0.1
+      mimic-response: 1.0.1
+      p-cancelable: 0.4.1
+      p-timeout: 2.0.1
+      pify: 3.0.0
+      safe-buffer: 5.2.1
+      timed-out: 4.0.1
+      url-parse-lax: 3.0.0
+      url-to-options: 1.0.1
+    dev: true
+
   /graceful-fs@4.2.11:
     resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==}
     dev: true
@@ -3344,11 +3639,21 @@ packages:
     engines: {node: '>= 0.4'}
     dev: false
 
+  /has-symbol-support-x@1.4.2:
+    resolution: {integrity: sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw==}
+    dev: true
+
   /has-symbols@1.0.3:
     resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==}
     engines: {node: '>= 0.4'}
     dev: false
 
+  /has-to-string-tag-x@1.4.1:
+    resolution: {integrity: sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw==}
+    dependencies:
+      has-symbol-support-x: 1.4.2
+    dev: true
+
   /has-unicode@2.0.1:
     resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==}
     dev: true
@@ -3424,6 +3729,10 @@ packages:
       entities: 4.5.0
     dev: true
 
+  /http-cache-semantics@3.8.1:
+    resolution: {integrity: sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w==}
+    dev: true
+
   /http-cache-semantics@4.1.1:
     resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==}
     dev: true
@@ -3534,13 +3843,20 @@ packages:
 
   /ini@1.3.8:
     resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==}
-    dev: false
 
   /ini@4.1.1:
     resolution: {integrity: sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==}
     engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
     dev: true
 
+  /into-stream@3.1.0:
+    resolution: {integrity: sha512-TcdjPibTksa1NQximqep2r17ISRiNE9fwlfbg3F8ANdvP5/yrFTew86VcO//jk4QTaMlbjypPBq76HN2zaKfZQ==}
+    engines: {node: '>=4'}
+    dependencies:
+      from2: 2.3.0
+      p-is-promise: 1.1.0
+    dev: true
+
   /ip@2.0.0:
     resolution: {integrity: sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==}
     dev: true
@@ -3665,6 +3981,10 @@ packages:
     resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==}
     dev: true
 
+  /is-natural-number@4.0.1:
+    resolution: {integrity: sha512-Y4LTamMe0DDQIIAlaer9eKebAlDSV6huy+TWhJVPlzZh2o4tRP5SQWFlLn5N0To4mDD22/qdOq+veo1cSISLgQ==}
+    dev: true
+
   /is-number@3.0.0:
     resolution: {integrity: sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==}
     engines: {node: '>=0.10.0'}
@@ -3677,6 +3997,10 @@ packages:
     engines: {node: '>=0.12.0'}
     dev: true
 
+  /is-object@1.0.2:
+    resolution: {integrity: sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA==}
+    dev: true
+
   /is-path-cwd@2.2.0:
     resolution: {integrity: sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==}
     engines: {node: '>=6'}
@@ -3687,6 +4011,11 @@ packages:
     engines: {node: '>=8'}
     dev: true
 
+  /is-plain-obj@1.1.0:
+    resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==}
+    engines: {node: '>=0.10.0'}
+    dev: true
+
   /is-plain-object@2.0.4:
     resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==}
     engines: {node: '>=0.10.0'}
@@ -3706,6 +4035,16 @@ packages:
       '@types/estree': 1.0.1
     dev: true
 
+  /is-retry-allowed@1.2.0:
+    resolution: {integrity: sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==}
+    engines: {node: '>=0.10.0'}
+    dev: true
+
+  /is-stream@1.1.0:
+    resolution: {integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==}
+    engines: {node: '>=0.10.0'}
+    dev: true
+
   /is-windows@1.0.2:
     resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==}
     engines: {node: '>=0.10.0'}
@@ -3731,6 +4070,14 @@ packages:
     engines: {node: '>=0.10.0'}
     dev: true
 
+  /isurl@1.0.0:
+    resolution: {integrity: sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==}
+    engines: {node: '>= 4'}
+    dependencies:
+      has-to-string-tag-x: 1.4.1
+      is-object: 1.0.2
+    dev: true
+
   /jackspeak@2.3.6:
     resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==}
     engines: {node: '>=14'}
@@ -3777,6 +4124,10 @@ packages:
       argparse: 2.0.1
     dev: true
 
+  /json-buffer@3.0.0:
+    resolution: {integrity: sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ==}
+    dev: true
+
   /json-schema-traverse@0.4.1:
     resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==}
     dev: true
@@ -3807,6 +4158,12 @@ packages:
       graceful-fs: 4.2.11
     dev: true
 
+  /keyv@3.0.0:
+    resolution: {integrity: sha512-eguHnq22OE3uVoSYG0LVWNP+4ppamWr9+zWBe1bsNcovIMy6huUJFPgy4mGwCd/rnl3vOLGW1MTlu4c57CT1xA==}
+    dependencies:
+      json-buffer: 3.0.0
+    dev: true
+
   /kind-of@3.2.2:
     resolution: {integrity: sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==}
     engines: {node: '>=0.10.0'}
@@ -3932,6 +4289,16 @@ packages:
     resolution: {integrity: sha512-dPvYcBok38QvXC+X8/v2BZJDA/iZfCfkRXAwp+s9rvBxY+ZWkMuhNNxukQVIUVMNutIonKpN140Vfv6LCli/wQ==}
     dev: true
 
+  /lowercase-keys@1.0.0:
+    resolution: {integrity: sha512-RPlX0+PHuvxVDZ7xX+EBVAp4RsVxP/TdDSN2mJYdiq1Lc4Hz7EUSjUI7RZrKKlmrIzVhf6Jo2stj7++gVarS0A==}
+    engines: {node: '>=0.10.0'}
+    dev: true
+
+  /lowercase-keys@1.0.1:
+    resolution: {integrity: sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==}
+    engines: {node: '>=0.10.0'}
+    dev: true
+
   /lru-cache@10.0.1:
     resolution: {integrity: sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g==}
     engines: {node: 14 || >=16.14}
@@ -3962,6 +4329,13 @@ packages:
       '@jridgewell/sourcemap-codec': 1.4.15
     dev: true
 
+  /make-dir@1.3.0:
+    resolution: {integrity: sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==}
+    engines: {node: '>=4'}
+    dependencies:
+      pify: 3.0.0
+    dev: true
+
   /make-fetch-happen@11.1.1:
     resolution: {integrity: sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==}
     engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
@@ -4096,7 +4470,6 @@ packages:
   /mime-db@1.52.0:
     resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==}
     engines: {node: '>= 0.6'}
-    dev: false
 
   /mime-types@2.1.35:
     resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==}
@@ -4116,6 +4489,11 @@ packages:
     hasBin: true
     dev: true
 
+  /mimic-response@1.0.1:
+    resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==}
+    engines: {node: '>=4'}
+    dev: true
+
   /mimic-response@3.1.0:
     resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==}
     engines: {node: '>=10'}
@@ -4433,10 +4811,27 @@ packages:
     engines: {node: '>=0.10.0'}
     dev: true
 
+  /normalize-url@2.0.1:
+    resolution: {integrity: sha512-D6MUW4K/VzoJ4rJ01JFKxDrtY1v9wrgzCX5f2qj/lzH1m/lW6MhUZFKerVsnyjOhOsYzI9Kqqak+10l4LvLpMw==}
+    engines: {node: '>=4'}
+    dependencies:
+      prepend-http: 2.0.0
+      query-string: 5.1.1
+      sort-keys: 2.0.0
+    dev: true
+
   /normalize.css@8.0.1:
     resolution: {integrity: sha512-qizSNPO93t1YUuUhP22btGOo3chcvDFqFaj2TRybP0DMxkHOCTYwp3n34fel4a31ORXy4m1Xq0Gyqpb5m33qIg==}
     dev: false
 
+  /npm-conf@1.1.3:
+    resolution: {integrity: sha512-Yic4bZHJOt9RCFbRP3GgpqhScOY4HH3V2P8yBj6CeYq118Qr+BLXqT2JvpJ00mryLESpgOxf5XlFv4ZjXxLScw==}
+    engines: {node: '>=4'}
+    dependencies:
+      config-chain: 1.1.13
+      pify: 3.0.0
+    dev: true
+
   /npmlog@6.0.2:
     resolution: {integrity: sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==}
     engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0}
@@ -4546,7 +4941,7 @@ packages:
   /oslllo-svg2@2.0.2:
     resolution: {integrity: sha512-Pg1e7op02QaGoUWAuAfORj7TrtJuTXFAOm+5Ycq8iBOvcg/0ZZc3Laxj3Ceh3f9Ad8zmt7qvz90amKPLqXjk7g==}
     dependencies:
-      '@resvg/resvg-js': 2.4.1
+      '@resvg/resvg-js': 2.6.0
       domino: 2.1.6
       jimp: 0.16.13
       oslllo-validator: 3.1.0
@@ -4560,6 +4955,28 @@ packages:
       validator: 13.11.0
     dev: true
 
+  /p-cancelable@0.4.1:
+    resolution: {integrity: sha512-HNa1A8LvB1kie7cERyy21VNeHb2CWJJYqyyC2o3klWFfMGlFmWv2Z7sFgZH8ZiaYL95ydToKTFVXgMV/Os0bBQ==}
+    engines: {node: '>=4'}
+    dev: true
+
+  /p-event@2.3.1:
+    resolution: {integrity: sha512-NQCqOFhbpVTMX4qMe8PF8lbGtzZ+LCiN7pcNrb/413Na7+TRoe1xkKUzuWa/YEJdGQ0FvKtj35EEbDoVPO2kbA==}
+    engines: {node: '>=6'}
+    dependencies:
+      p-timeout: 2.0.1
+    dev: true
+
+  /p-finally@1.0.0:
+    resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==}
+    engines: {node: '>=4'}
+    dev: true
+
+  /p-is-promise@1.1.0:
+    resolution: {integrity: sha512-zL7VE4JVS2IFSkR2GQKDSPEVxkoH43/p7oEnwpdCndKYJO0HVeRB7fA8TJwuLOTBREtK0ea8eHaxdwcpob5dmg==}
+    engines: {node: '>=4'}
+    dev: true
+
   /p-limit@3.1.0:
     resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==}
     engines: {node: '>=10'}
@@ -4588,6 +5005,13 @@ packages:
       aggregate-error: 3.1.0
     dev: true
 
+  /p-timeout@2.0.1:
+    resolution: {integrity: sha512-88em58dDVB/KzPEx1X0N3LwFfYZPyDc4B6eF38M1rk9VTZMbxXXgjugz8mmwpS9Ox4BDZ+t6t3QP5+/gazweIA==}
+    engines: {node: '>=4'}
+    dependencies:
+      p-finally: 1.0.0
+    dev: true
+
   /pako@1.0.11:
     resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==}
     dev: true
@@ -4690,6 +5114,10 @@ packages:
     engines: {node: '>=8'}
     dev: true
 
+  /pend@1.2.0:
+    resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==}
+    dev: true
+
   /periscopic@3.1.0:
     resolution: {integrity: sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==}
     dependencies:
@@ -4711,6 +5139,28 @@ packages:
     engines: {node: '>=8.6'}
     dev: true
 
+  /pify@2.3.0:
+    resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==}
+    engines: {node: '>=0.10.0'}
+    dev: true
+
+  /pify@3.0.0:
+    resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==}
+    engines: {node: '>=4'}
+    dev: true
+
+  /pinkie-promise@2.0.1:
+    resolution: {integrity: sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==}
+    engines: {node: '>=0.10.0'}
+    dependencies:
+      pinkie: 2.0.4
+    dev: true
+
+  /pinkie@2.0.4:
+    resolution: {integrity: sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==}
+    engines: {node: '>=0.10.0'}
+    dev: true
+
   /pirates@4.0.6:
     resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==}
     engines: {node: '>= 6'}
@@ -4852,6 +5302,11 @@ packages:
     engines: {node: '>= 0.8.0'}
     dev: true
 
+  /prepend-http@2.0.0:
+    resolution: {integrity: sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA==}
+    engines: {node: '>=4'}
+    dev: true
+
   /prettier-plugin-svelte@2.10.1(prettier@2.8.8)(svelte@4.2.0):
     resolution: {integrity: sha512-Wlq7Z5v2ueCubWo0TZzKc9XHcm7TDxqcuzRuGd0gcENfzfT4JZ9yDlCbEgxWgiPmLHkBjfOtpAWkcT28MCDpUQ==}
     peerDependencies:
@@ -4894,6 +5349,10 @@ packages:
       retry: 0.12.0
     dev: true
 
+  /proto-list@1.2.4:
+    resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==}
+    dev: true
+
   /proxy-addr@2.0.7:
     resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==}
     engines: {node: '>= 0.10'}
@@ -4928,6 +5387,15 @@ packages:
       side-channel: 1.0.4
     dev: false
 
+  /query-string@5.1.1:
+    resolution: {integrity: sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==}
+    engines: {node: '>=0.10.0'}
+    dependencies:
+      decode-uri-component: 0.2.2
+      object-assign: 4.1.1
+      strict-uri-encode: 1.1.0
+    dev: true
+
   /queue-microtask@1.2.3:
     resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
     dev: true
@@ -5060,6 +5528,12 @@ packages:
       supports-preserve-symlinks-flag: 1.0.0
     dev: true
 
+  /responselike@1.0.2:
+    resolution: {integrity: sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ==}
+    dependencies:
+      lowercase-keys: 1.0.1
+    dev: true
+
   /ret@0.1.15:
     resolution: {integrity: sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==}
     engines: {node: '>=0.12'}
@@ -5149,6 +5623,13 @@ packages:
     resolution: {integrity: sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==}
     dev: true
 
+  /seek-bzip@1.0.6:
+    resolution: {integrity: sha512-e1QtP3YL5tWww8uKaOCQ18UxIT2laNBXHjV/S2WYCiK4udiv8lkG89KRIoCjUagnAmCBurjF4zEVX2ByBbnCjQ==}
+    hasBin: true
+    dependencies:
+      commander: 2.20.3
+    dev: true
+
   /semver@7.5.4:
     resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==}
     engines: {node: '>=10'}
@@ -5357,6 +5838,27 @@ packages:
       sander: 0.5.1
     dev: true
 
+  /sort-keys-length@1.0.1:
+    resolution: {integrity: sha512-GRbEOUqCxemTAk/b32F2xa8wDTs+Z1QHOkbhJDQTvv/6G3ZkbJ+frYWsTcc7cBB3Fu4wy4XlLCuNtJuMn7Gsvw==}
+    engines: {node: '>=0.10.0'}
+    dependencies:
+      sort-keys: 1.1.2
+    dev: true
+
+  /sort-keys@1.1.2:
+    resolution: {integrity: sha512-vzn8aSqKgytVik0iwdBEi+zevbTYZogewTUM6dtpmGwEcdzbub/TX4bCzRhebDCRC3QzXgJsLRKB2V/Oof7HXg==}
+    engines: {node: '>=0.10.0'}
+    dependencies:
+      is-plain-obj: 1.1.0
+    dev: true
+
+  /sort-keys@2.0.0:
+    resolution: {integrity: sha512-/dPCrG1s3ePpWm6yBbxZq5Be1dXGLyLn9Z791chDC3NFrpkVbWGzkBwPN1knaciexFXgRJ7hzdnwZ4stHSDmjg==}
+    engines: {node: '>=4'}
+    dependencies:
+      is-plain-obj: 1.1.0
+    dev: true
+
   /source-map-js@1.0.2:
     resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==}
     engines: {node: '>=0.10.0'}
@@ -5436,6 +5938,11 @@ packages:
       queue-tick: 1.0.1
     dev: false
 
+  /strict-uri-encode@1.1.0:
+    resolution: {integrity: sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ==}
+    engines: {node: '>=0.10.0'}
+    dev: true
+
   /string-width@4.2.3:
     resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==}
     engines: {node: '>=8'}
@@ -5479,6 +5986,12 @@ packages:
       ansi-regex: 6.0.1
     dev: true
 
+  /strip-dirs@2.1.0:
+    resolution: {integrity: sha512-JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g==}
+    dependencies:
+      is-natural-number: 4.0.1
+    dev: true
+
   /strip-indent@3.0.0:
     resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==}
     engines: {node: '>=8'}
@@ -5502,6 +6015,13 @@ packages:
       acorn: 8.10.0
     dev: true
 
+  /strip-outer@1.0.1:
+    resolution: {integrity: sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==}
+    engines: {node: '>=0.10.0'}
+    dependencies:
+      escape-string-regexp: 1.0.5
+    dev: true
+
   /strtok3@6.3.0:
     resolution: {integrity: sha512-fZtbhtvI9I48xDSywd/somNqgUHl2L2cstmXCCif0itOf96jeW18MBSyrLuNicYQVkvpOxkZtkzujiTJ9LW5Jw==}
     engines: {node: '>=10'}
@@ -5589,10 +6109,10 @@ packages:
       svelte: 4.2.0
     dev: true
 
-  /svelte-markdoc-preprocess@1.1.0:
-    resolution: {integrity: sha512-/FSCXZYgWHPLLbekWovwwVLgEoEYdBxCiLKOXu5wVbwK2iR29+Z/qL+u6/ngya0pYoC1l8IO6UUXjYgAWi1kTA==}
+  /svelte-markdoc-preprocess@1.1.2:
+    resolution: {integrity: sha512-+ibBByksxWNRrRTfjbzg1qrXasETQstZGEcyvm+QOz1ZgpZd+LaLGLsv8KhrsW0RvLZtp+AwPN0YTu2eGVjCRQ==}
     dependencies:
-      '@markdoc/markdoc': 0.3.2
+      '@markdoc/markdoc': 0.3.4
       html-escaper: 3.0.3
       js-yaml: 4.1.0
       lovely-logs: 1.2.2
@@ -5778,6 +6298,19 @@ packages:
       tar-stream: 3.1.6
     dev: false
 
+  /tar-stream@1.6.2:
+    resolution: {integrity: sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==}
+    engines: {node: '>= 0.8.0'}
+    dependencies:
+      bl: 1.2.3
+      buffer-alloc: 1.2.0
+      end-of-stream: 1.4.4
+      fs-constants: 1.0.0
+      readable-stream: 2.3.8
+      to-buffer: 1.1.1
+      xtend: 4.0.2
+    dev: true
+
   /tar-stream@2.2.0:
     resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==}
     engines: {node: '>=6'}
@@ -5837,6 +6370,15 @@ packages:
       xtend: 4.0.2
     dev: true
 
+  /through@2.3.8:
+    resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==}
+    dev: true
+
+  /timed-out@4.0.1:
+    resolution: {integrity: sha512-G7r3AhovYtr5YKOWQkta8RKAPb+J9IsO4uVmzjl8AZwfhs8UcUwTiD6gcJYSgOtzyjvQKrKYn41syHbUWMkafA==}
+    engines: {node: '>=0.10.0'}
+    dev: true
+
   /timm@1.7.1:
     resolution: {integrity: sha512-IjZc9KIotudix8bMaBW6QvMuq64BrJWFs1+4V0lXwWGQZwH+LnX87doAYhem4caOEusRP9/g6jVDQmZ8XOk1nw==}
     dev: true
@@ -5866,6 +6408,10 @@ packages:
     engines: {node: '>=14.0.0'}
     dev: true
 
+  /to-buffer@1.1.1:
+    resolution: {integrity: sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==}
+    dev: true
+
   /to-object-path@0.3.0:
     resolution: {integrity: sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==}
     engines: {node: '>=0.10.0'}
@@ -5927,6 +6473,13 @@ packages:
     resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==}
     dev: false
 
+  /trim-repeated@1.0.0:
+    resolution: {integrity: sha512-pkonvlKk8/ZuR0D5tLW8ljt5I8kmxp2XKymhepUeOdCEfKpZaktSArkLHZt76OB1ZvO9bssUsDty4SWhLvZpLg==}
+    engines: {node: '>=0.10.0'}
+    dependencies:
+      escape-string-regexp: 1.0.5
+    dev: true
+
   /ts-interface-checker@0.1.13:
     resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==}
     dev: true
@@ -5981,7 +6534,6 @@ packages:
     resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==}
     dependencies:
       safe-buffer: 5.2.1
-    dev: false
 
   /type-check@0.4.0:
     resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==}
@@ -6022,6 +6574,13 @@ packages:
     resolution: {integrity: sha512-RsPyTbqORDNDxqAdQPQBpgqhWle1VcTSou/FraClYlHf6TZnQcGslpLcAphNR+sQW4q5lLWLbOsRlh9j24baQg==}
     dev: true
 
+  /unbzip2-stream@1.4.3:
+    resolution: {integrity: sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==}
+    dependencies:
+      buffer: 5.7.1
+      through: 2.3.8
+    dev: true
+
   /undici@5.23.0:
     resolution: {integrity: sha512-1D7w+fvRsqlQ9GscLBwcAJinqcZGHUKjbOmXdlE/v8BvEGXjeWAax+341q44EuTcHXXnfyKNbKRq4Lg7OzhMmg==}
     engines: {node: '>=14.0'}
@@ -6082,6 +6641,18 @@ packages:
     deprecated: Please see https://github.com/lydell/urix#deprecated
     dev: true
 
+  /url-parse-lax@3.0.0:
+    resolution: {integrity: sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ==}
+    engines: {node: '>=4'}
+    dependencies:
+      prepend-http: 2.0.0
+    dev: true
+
+  /url-to-options@1.0.1:
+    resolution: {integrity: sha512-0kQLIzG4fdk/G5NONku64rSH/x32NOA39LVQqlK8Le6lvTF6GGRJpqaQFGgU+CLwySIqBSMdwYM0sYcW9f6P4A==}
+    engines: {node: '>= 4'}
+    dev: true
+
   /use@3.1.1:
     resolution: {integrity: sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==}
     engines: {node: '>=0.10.0'}
@@ -6415,6 +6986,13 @@ packages:
       yargs-parser: 21.1.1
     dev: true
 
+  /yauzl@2.10.0:
+    resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==}
+    dependencies:
+      buffer-crc32: 0.2.13
+      fd-slicer: 1.1.0
+    dev: true
+
   /yocto-queue@0.1.0:
     resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==}
     engines: {node: '>=10'}
@@ -6425,8 +7003,8 @@ packages:
     engines: {node: '>=12.20'}
     dev: true
 
-  github.com/appwrite/appwrite/fce18647d2352e4cfce7ce75fd103a21bafbf7d0:
-    resolution: {tarball: https://codeload.github.com/appwrite/appwrite/tar.gz/fce18647d2352e4cfce7ce75fd103a21bafbf7d0}
+  github.com/appwrite/appwrite/3a53dce467c7bf731009963402da00be4ccab7e5:
+    resolution: {tarball: https://codeload.github.com/appwrite/appwrite/tar.gz/3a53dce467c7bf731009963402da00be4ccab7e5}
     name: '@appwrite.io/repo'
     version: 0.0.0
     dev: false
diff --git a/src/partials/account-vs-user.md b/src/partials/account-vs-user.md
index f4d5c5b1211..36484661559 100644
--- a/src/partials/account-vs-user.md
+++ b/src/partials/account-vs-user.md
@@ -6,5 +6,5 @@ Sessions respect [permissions](/docs/advanced/platform/permissions), which means
 
 The Users API is a dedicated API for managing users from an admin's perspective.
 It should be used with backend or server-side applications with [Server SDKs](/docs/sdks#server). Users API uses API keys instead of sessions. 
-This means they're not resticted by permissions, but by the scopes granted to the API key used.
+This means they're not restricted by permissions, but by the scopes granted to the API key used.
 {% /info %}
\ No newline at end of file
diff --git a/src/routes/blog/post/dont-blame-the-readers-write-the-docs-they-need/+page.markdoc b/src/routes/blog/post/dont-blame-the-readers-write-the-docs-they-need/+page.markdoc
index 7bd1cc052ea..aecbae72113 100644
--- a/src/routes/blog/post/dont-blame-the-readers-write-the-docs-they-need/+page.markdoc
+++ b/src/routes/blog/post/dont-blame-the-readers-write-the-docs-they-need/+page.markdoc
@@ -26,7 +26,7 @@ Over the past year, we’ve noticed conversations like this in Appwrite communit
 
 # Identifying the issues
 
-The Appwrite team has always valued documentation as a core part of the product. After all, most adoption begins at the documentation. The old documentation was minimalistic and to the point and reflects our product philosophy. You can skim through it in one sitting and learn how to start building with Appwrite.
+The Appwrite team has always valued documentation as a core part of the product. After all, most adoption begins at the documentation. The old documentation was minimal and to the point and reflects our product philosophy. You can skim through it in one sitting and learn how to start building with Appwrite.
 
 The old Appwrite docs are good but designed for a different audience and a different product. As Appwrite’s capabilities grow, so does the amount of documentation. 
 More features simply need more words to explain, and the single-side navigation becomes more bloated with more information than we ever intended. 
diff --git a/src/routes/blog/post/hacktoberfest-2023/+page.markdoc b/src/routes/blog/post/hacktoberfest-2023/+page.markdoc
index 471cd84fda3..96d91b11955 100644
--- a/src/routes/blog/post/hacktoberfest-2023/+page.markdoc
+++ b/src/routes/blog/post/hacktoberfest-2023/+page.markdoc
@@ -11,38 +11,38 @@ category: hacktoberfest
 
 Hacktoberfest is back, celebrating a decade of open source! Appwrite is proud to support open-source developers for the fifth consecutive year of [Hacktoberfest 2023](https://hacktoberfest.com), partnered with DigitalOcean. Here is how you can get involved and grab some cool Appwrite swag!
 
-## Quick Guide to Getting Involved
+## Quick guide to getting involved
 
 
-### 1. Appwrite Repository:
-- Check out the Appwrite repository on [GitHub](https://github.com/appwrite). Ensure you “Star” and “Like” the repo so you can find it easily
+### 1. Appwrite repository:
+- Check out the Appwrite repository on [GitHub](https://github.com/appwrite). Ensure you “Star” and “Like” the repository so you can find it easily
 
-### 2. Search for Issues:
+### 2. Search for issues:
 - Look for [issues labeled `hacktoberfest`](https://github.com/appwrite/appwrite/labels/hacktoberfest). Not seeing enough to choose from? Do not worry, we will be adding more issues throughout the month
 - Can't find an issue you want to work on? You can create an issue if you have great ideas on how you can contribute to improving Appwrite. Keep in mind this years focus is on quality, not quantity
 
-### 3. Choose Your Contribution:
+### 3. Choose your contribution:
 - Find the Issue you want to contribute to
 - Reply with a comment, “I would like to work on this. Can you assign it to me?”
 - Be sure to follow up with the issue within 3 days, so we know you are still working on it
 - Once your PR is ready, link the PR in the issue and tag a maintainer to let them know it is ready for review
 - Your PR will be confirmed within 7 days, and if it's accepted, we will label it as `hacktoberfest-accepted`
 
-### 4. Get Support:
+### 4. Get support:
 - Our maintainers are here to assist, guide, and mentor you through your contribution. Need alternative ways to contribute or additional help? Contact us on [Discord](https://appwrite.io/discord)!
 
-### 5. Win Swags:
+### 5. Win swags:
 - Earn an Appwrite hoodie and stickers for contributing only one accepted and merged PR!
 - Earn a Digital Swag Bag from DigitalOcean for contributing 4 PRs+ from any open-source project participating in Hacktoberfest. We have a surprise gift inside this swag bag waiting for you
 
 ![Hacktoberfest swag](/images/blog/hacktoberfest2023-swag.png)
 
-## How Appwrite Supports Developers
+## How Appwrite supports developers
 
 - We are hosting several events that you can find in the Appwrite Discord community to introduce you to open-source projects, guide your contributions, and prep you for October. We are hosting two PR Review parties each week where you can watch our engineers live reviewing your pull requests and giving tips on contributing
 
 - We are consistently sharing content on how to build with Appwrite and become a better developer
 
-## Join the Appwrite Community
+## Join the Appwrite community
 
-Stay informed on new announcements, events, and features, and interact with other Appwriters from the community! [Join us on Discord](https://appwrite.io/discord), join the #hacktoberfest channel, and celebrate open-source together!
+Stay informed on new announcements, events, and features, and interact with other Appwriters from the community! [Join us on Discord](https://appwrite.io/discord), join the `#hacktoberfest` channel, and celebrate open-source together!
diff --git a/src/routes/blog/post/its-the-contributors-in-open-source-who-make-the-community-great/+page.markdoc b/src/routes/blog/post/its-the-contributors-in-open-source-who-make-the-community-great/+page.markdoc
index 1ebe9ece91d..72b588ada93 100644
--- a/src/routes/blog/post/its-the-contributors-in-open-source-who-make-the-community-great/+page.markdoc
+++ b/src/routes/blog/post/its-the-contributors-in-open-source-who-make-the-community-great/+page.markdoc
@@ -24,7 +24,7 @@ But what does this actually mean to be open source as a company? It means that o
 
 ## 1.4 contributors
 
-The latest version of Appwrite was built with the help of over 40 developers, truly showing off what building together can achieve and how the community comes together. The collective knowledge and skills of the open source community make it possible to do a lot more with less. With this in mind, we want to shed light on the contributors of the Appwrite 1.4 release and thank every single dev in the community who helped us launch. It was the biggest release to date, and that also led to having the most contributions ever. We are grateful for each contribution, from coding to translations to documentation, with each pull request Appwrite improved. We want to celebrate each and every one of you. Therefore our deepest gratitude goes out to:
+The latest version of Appwrite was built with the help of over 40 developers, truly showing off what building together can achieve and how the community comes together. The collective knowledge and skills of the open source community make it possible to do a lot more with less. With this in mind, we want to shed light on the contributors of the Appwrite 1.4 release and thank every single developer in the community who helped us launch. It was the biggest release to date, and that also led to having the most contributions ever. We are grateful for each contribution, from coding to translations to documentation, with each pull request Appwrite improved. We want to celebrate each and every one of you. Therefore our deepest gratitude goes out to:
 
 - [@keul](https://github.com/keul) who [contributed to our Readme](https://github.com/appwrite/appwrite/pull/4537)
 - [@sarthakroy2002](https://github.com/sarthakroy2002) who updated [codeql-action to v3](https://github.com/appwrite/appwrite/pull/4534)
@@ -32,8 +32,8 @@ The latest version of Appwrite was built with the help of over 40 developers, tr
 - [@kalpeshT101](https://github.com/kalpeshT101) who [contributed to our Readme](https://github.com/appwrite/appwrite/pull/4298)
 - [@Sushrut1101](https://github.com/Sushrut1101) who [updated actions/checkout to v3](https://github.com/appwrite/appwrite/pull/4332)
 - [@karniv00l](https://github.com/karniv00l) who helped us [fix a bug that appeared when user not found exception happened](https://github.com/appwrite/appwrite/pull/4506)
-- [@vimode](https://github.com/vimode) who helped us [update Windows powershell commands](https://github.com/appwrite/appwrite/pull/4533)
-- [@megatank58](https://github.com/megatank58) who helped us [fix Appwrite upgradation bug](https://github.com/appwrite/appwrite/pull/4341)
+- [@vimode](https://github.com/vimode) who helped us [update Windows PowerShell commands](https://github.com/appwrite/appwrite/pull/4533)
+- [@megatank58](https://github.com/megatank58) who helped us [fix Appwrite upgrade bug](https://github.com/appwrite/appwrite/pull/4341)
 - [@pomarec](https://github.com/pomarec) who [fixed French translation](https://github.com/appwrite/appwrite/pull/4783)
 - [@aayushbisen](https://github.com/aayushbisen) who [added a restart policy in the `appwrite-worker-messaging` service](https://github.com/appwrite/appwrite/pull/4994)
 - [@motasimmakki](https://github.com/motasimmakki) who [contributed to docs](https://github.com/appwrite/appwrite/pull/4556)
@@ -61,7 +61,7 @@ The latest version of Appwrite was built with the help of over 40 developers, tr
 - [@erezhod](https://github.com/erezhod) who helped us [fix Apple code snippet bugs in our documentation](https://github.com/appwrite/console/pull/468)
 - [@Chaitanya-Upadhye](https://github.com/Chaitanya-Upadhye) who helped us [fix a bug that appeared in indexes](https://github.com/appwrite/console/pull/486)
 - [@safwanyp](https://github.com/safwanyp) who helped us [fix a bug that prevented the document from updating after deleting the array element](https://github.com/appwrite/console/pull/495)
-- [@KaranJagtiani](https://github.com/KaranJagtiani) who helped us [fiix CDN code sample](https://github.com/appwrite/console/pull/504)
+- [@KaranJagtiani](https://github.com/KaranJagtiani) who helped us [fix CDN code sample](https://github.com/appwrite/console/pull/504)
 
 Every single contributor and every single contribution made the product better for the next developer. That is what makes it all the more exciting, knowing that your PR actually has value for the next person. With that in mind, shouldn't we all contribute to OSS projects? Maybe, but where to begin?
 
@@ -69,7 +69,7 @@ Every single contributor and every single contribution made the product better f
 
 As mentioned previously, many of our team members were first contributors before they joined. Our very own [Christy Jacob](https://github.com/christyjacob4) once started as a contributor during [Hacktoberfest](https://appwrite.io/blog/post/hacktoberfest-2023), the largest celebration of open source, and is now a Lead Engineer building Appwrite Cloud. It all starts with that first step and pull request.
 
-![hacktoberfest partecipants](/images/blog/badge.png)
+![Hacktoberfest participants](/images/blog/badge.png)
 
 So there is more to open source contributing than just helping build a project. It can help you progress in your future career by learning, building your portfolio, networking, and even finding job opportunities. All the more reasons to jump on the wagon. With that said, we also understand that for some, contributing might seem daunting, but it really isn't if you get the right help and guidance. This is where [Hacktoberfest](https://appwrite.io/blog/post/hacktoberfest-2023) comes in. It is an amazing event that allows you to contribute to many different projects in many different ways together with others, so you don't have to start your journey alone. It started on the 1st of October 2023, and you can join the entire month. This is your chance to kickstart your open source journey.
 
diff --git a/src/routes/blog/post/leveraging-baas-tools-to-scale-faster/+page.markdoc b/src/routes/blog/post/leveraging-baas-tools-to-scale-faster/+page.markdoc
index 829cf305dbc..d045e32e78c 100644
--- a/src/routes/blog/post/leveraging-baas-tools-to-scale-faster/+page.markdoc
+++ b/src/routes/blog/post/leveraging-baas-tools-to-scale-faster/+page.markdoc
@@ -10,17 +10,17 @@ category: engineering
 featured: false
 ---
 
-There are many tools that developers use every day to abstract away complexity, but many are seriously underutilizing the benefits of "Backend As A Service" tools for developing the entire backend of an app, or at least the key components.
+There are many tools that developers use every day to abstract away complexity, but many are seriously underutilizing the benefits of "Backend as a Service" tools for developing the entire backend of an app, or at least the key components.
 
 The idea of trusting such a vital part of the development process to a 3rd party tool can be scary; we get it. It's natural to want to have control over every bit of code and build things from scratch, but at what cost?
 
 Many of the features we require in most apps are necessary but don't represent the core product. This includes authentication, security, file storage and database management. Do you really need to reinvent the wheel and build this from scratch every time?
 
-We believe in most cases there is an easier way, which is where the idea of "Backend As A Service" can help.
+We believe in most cases there is an easier way, which is where the idea of "Backend as a Service" can help.
 
 # What is a Backend as a Service (BaaS)
 
-A backend as a service is a third party service that lets you develop the backend part of your application without building things from scratch. It's about NOT reinventing the wheel for every app you launch.
+A Backend as a Service is a third party service that lets you develop the backend part of your application without building things from scratch. It's about NOT reinventing the wheel for every app you launch.
 
 Each BaaS platform has its own set of tools and features, so let's use  [Appwrite](https://appwrite.io/)  as an example of offerings you may see. A service like Appwrite provides you with a console from which you can manage your entire backend. From your console's dashboard you'll have the ability to create and manage services such as:
 
@@ -45,7 +45,7 @@ In the process of writing this article, we did some research to find out which c
 
 Many developers at the highest level are adopting the idea of using these tools to optimize their effectiveness and efficiency. We've seen this in cases from developers trying to get a product to market in the shortest possible time or integrating features with efficiency into large-scale applications.
 
-In one interview, the CEO of Appwrite,  [Eldad Fux](https://twitter.com/eldadfux), said, "Appwrite was born out of necessity". After working on multiple startups and years of experience in the industry, Eldad said, "I didn't want to suffer from doing the same thing over and over again."
+In one interview, the CEO of Appwrite, [Eldad Fux](https://twitter.com/eldadfux), said, "Appwrite was born out of necessity". After working on multiple startups and years of experience in the industry, Eldad said, "I didn't want to suffer from doing the same thing over and over again."
 
 # Choosing a BaaS provider
 
@@ -65,7 +65,7 @@ One of the main concerns with using Firebase is that the data stored in Firebase
 
 ## The open-source solution
 
-These concerns are exactly why Appwrite was developed as the truly 100% open source Backend As A Service. A platform that is committed to giving you control over your tools and data while developing with the open source community.
+These concerns are exactly why Appwrite was developed as the truly 100% open source Backend as a Service. A platform that is committed to giving you control over your tools and data while developing with the open source community.
 
 Appwrite has addressed many of the problems developers in the community face, which is why it is being adopted at an incredible pace with amazing support! Since its launch in 2019, Appwrite has raised $37 million in seed rounds, was named Product Hunt's #1 product of the day after launching version 1.0, has gained over 33k GitHub stars with over 700 open source contributors, and has grown one of the most active developer communities on discord with over 17,000 members!
 
diff --git a/src/routes/blog/post/password-protection/+page.markdoc b/src/routes/blog/post/password-protection/+page.markdoc
index 73e6a9d01a6..58f5d01a049 100644
--- a/src/routes/blog/post/password-protection/+page.markdoc
+++ b/src/routes/blog/post/password-protection/+page.markdoc
@@ -61,7 +61,7 @@ Implement password reset functionality using a secure token that expires after a
 Always store hashed and salted passwords instead of plain text. Hashing is a one-way function that transforms a password into a fixed-length string of characters, while salting adds a random value to the password before hashing to prevent precomputed attacks like rainbow tables. Use modern hashing algorithms like `bcrypt`, `scrypt`, or `Argon2`, which are designed to be slow and computationally expensive, making brute-force attacks more difficult.
     
 - **Use rate limiting and account lockout mechanisms**  
-Prevent brute-force attacks by temporarily locking accounts or requiring users to complete a captcha after a certain number of failed login attempts. Implement rate limiting to limit the number of authentication attempts within a specific time frame. This will also give your team time to investigate and prevent attacks before damage is caused.
+Prevent brute-force attacks by temporarily locking accounts or requiring users to complete a CAPTCHA after a certain number of failed login attempts. Implement rate limiting to limit the number of authentication attempts within a specific time frame. This will also give your team time to investigate and prevent attacks before damage is caused.
     
 - **Monitor and audit**  
 Regularly monitor and audit your authentication system for suspicious activity and maintain logs to help with incident response and forensic analysis.
@@ -70,6 +70,6 @@ Regularly monitor and audit your authentication system for suspicious activity a
 Please help your users understand why setting strong passwords is necessary and how password managers like LastPass, 1Password, or Bitwarden can help them generate and manage their passwords.
     
 
-## Moving Forward
+## Moving forward
 
 Security is a shared responsibility between developers and users. Collaborating with them in this process is essential to implement better password protection and keep your applications secure. As a developer, by the way, if you would like to try an authentication solution that implements better password protection policies out-of-the-box, look at [Appwrite](https://appwrite.io/docs/products/auth). With various features such as password hashing, session limits, a strong permissions system, password history, a password dictionary, and personal data checks in passwords, [Appwrite Authentication](https://appwrite.io/docs/products/auth) offers an easy-to-implement yet robust authentication system for you to build with.
diff --git a/src/routes/blog/post/public-beta/+page.markdoc b/src/routes/blog/post/public-beta/+page.markdoc
index d5534c8bc4e..28fd516284d 100644
--- a/src/routes/blog/post/public-beta/+page.markdoc
+++ b/src/routes/blog/post/public-beta/+page.markdoc
@@ -1,7 +1,7 @@
 ---
 layout: post
 title: Appwrite Cloud is now in public beta
-description: We're happy to announce Cloud is now available for everyone to signup.
+description: We're happy to announce Cloud is now available for everyone to sign up.
 date: 2023-05-02
 cover: /images/blog/cloud-beta.png
 timeToRead: 5
@@ -39,7 +39,7 @@ We’re conducting a series of interviews & surveys with participants of the Pub
 If you’re part of the Beta and would like to participate in these interviews, please reach out to me on the Appwrite Discord or my email, and we’d be glad to set up a call.
 
 ## Pricing
-Our goal is to make Appwrite Cloud affordable and accessible to all developers. We’ve had some really great feedback from our initial pricing survey and are really close to sharing our model with you all. We will continue working together with the Appwrite community to refine this pricing model. Rest assured, there will be a generous free tier for all the hobby projects you’ve been wanting to create!
+Our goal is to make Appwrite Cloud affordable and accessible to all developers. We’ve had some really great feedback from our initial pricing survey and are really close to sharing our model with you all. We will continue working together with the Appwrite community to refine this pricing model. There will be a generous free tier for all the hobby projects you’ve been wanting to create!
 
 ## Self-hosted edition
 A lot of us may have questions about the open source version of Appwrite and its future. We can proudly say, we will continue to stand among the handful of companies that have been open-source first. Our vibrant community is a testament that, for the longest time, we have prioritized the open source version, and we will continue to do so. In fact, all major features will roll out to the open source version even before they hit the cloud! Appwrite will forever remain open source!
@@ -48,8 +48,7 @@ A lot of us may have questions about the open source version of Appwrite and its
 During the Beta, we’re operating with Frankfurt as our primary region. This is a careful decision to ensure we are geographically centrally located. As we get closer to general availability, we will focus on 3 more regions, namely San Francisco, New York, and Singapore with more regions to follow.
 
 ## Compliance
-Compliances are frameworks that help organizations ensure they are meeting certain standards and requirements in regard to data security and privacy. For most SaaS/BaaS companies, SOC 2, HIPAA & GDPR are the essential ones. These certifications help companies demonstrate to their customers and stakeholders they are taking data security and privacy seriously, and are committed to protecting their sensitive information.
-
+Compliance frameworks help organizations ensure they meet certain standards and requirements, especially in regard to data security and privacy. For many SaaS/BaaS companies, key standards include SOC 2, HIPAA, and GDPR. Adhering to these standards helps companies demonstrate to their customers and stakeholders that they take data security and privacy seriously, and are committed to protecting sensitive information.
 These usually involve a lot of paperwork, documentation, and administrative processes. We’re in the process of ensuring we meet the highest standards for data security and privacy.
 
 ## Support for more function runtimes
diff --git a/src/routes/blog/post/the-journey-and-meaning-behind-our-new-logo/+page.markdoc b/src/routes/blog/post/the-journey-and-meaning-behind-our-new-logo/+page.markdoc
index e221e4f445b..2714f7a9155 100644
--- a/src/routes/blog/post/the-journey-and-meaning-behind-our-new-logo/+page.markdoc
+++ b/src/routes/blog/post/the-journey-and-meaning-behind-our-new-logo/+page.markdoc
@@ -61,12 +61,12 @@ The new logo features lines that converge to form a globe. This represents our d
 
 The lines in the logo evoke the idea of code - lines of code coming together to build something meaningful. This symbolism reflects the essence of our platform, empowering developers to create with ease and efficiency. These lines also feature prominently in our imagery style.
 
-Finally, its overall look is reminiscent of the lowercase letter 'a,' standing for the first letter of appwrite.
+Finally, its overall look is reminiscent of the lowercase letter 'a,' standing for the first letter of Appwrite.
 
 ![Decorative lines](/images/blog/the-journey-and-meaning-behind-our-new-logo/lines.png)
 
 
-Our new logo inspired the rest of our visual identity. Our [website](https://appwrite.io/), promotional materials, and even [documentation](https://appwrite.io/docs) are now harmonized with this new identity, giving Appwrite a fresh, meaningful, and cohesive look.
+Our new logo inspired the remainder of our visual identity. Our [website](https://appwrite.io/), promotional materials, and even [documentation](https://appwrite.io/docs) are now harmonized with this new identity, giving Appwrite a fresh, meaningful, and cohesive look.
 
 # The road ahead
 
diff --git a/src/routes/docs/advanced/platform/response-codes/+page.markdoc b/src/routes/docs/advanced/platform/response-codes/+page.markdoc
index 607802dca27..8e5f44da764 100644
--- a/src/routes/docs/advanced/platform/response-codes/+page.markdoc
+++ b/src/routes/docs/advanced/platform/response-codes/+page.markdoc
@@ -52,140 +52,140 @@ For example, a `400` HTTP response code could indicate a Bad Request due to a va
 
 | Code | Type | Description |
 | ---- | ---- | ----------- |
-| 400  | general_mock | General errors thrown by the mock controller used for testing. |
-| 400  | general_argument_invalid | The request contains one or more invalid arguments. Please refer to the endpoint documentation. |
-| 400  | general_query_limit_exceeded | Query limit exceeded for the current attribute. Usage of more than 100 query values on a single attribute is prohibited. |
-| 400  | general_query_invalid | The query's syntax is invalid. Please check the query and try again. |
-| 400  | general_cursor_not_found | The cursor is invalid. This can happen if the item represented by the cursor has been deleted. |
-| 400  | user_password_mismatch | Passwords do not match. Please check the password and confirm password. |
-| 400  | password_recently_used | The password you are trying to use is similar to your previous password. For your security, please choose a different password and try again. |
-| 400  | password_personal_data | The password you are trying to use contains references to your name, email, phone or userID. For your security, please choose a different password and try again. |
-| 400  | user_phone_not_found | The current user does not have a phone number associated with their account. |
-| 400  | user_missing_id | Missing ID from OAuth2 provider. |
-| 400  | user_oauth2_bad_request | OAuth2 provider rejected the bad request. |
-| 400  | storage_device_not_found | The requested storage device could not be found. |
-| 400  | storage_file_empty | Empty file passed to the endpoint. |
-| 400  | storage_file_type_unsupported | The given file extension is not supported. |
-| 400  | storage_invalid_file_size | The file size is either not valid or exceeds the maximum allowed size. Please check the file or the value of the `_APP_STORAGE_LIMIT` environment variable. |
-| 400  | storage_invalid_content_range | The content range is invalid. Please check the value of the `Content-Range` header. |
-| 400  | storage_invalid_appwrite_id | The value for `x-appwrite-id` header is invalid. Please check the value of the `x-appwrite-id` header is a valid id and not `unique()`. |
-| 400  | general_provider_failure | VCS (Version Control System) provider failed to process the request. We believe this is an error with the VCS provider. Try again, or contact support for more information. |
-| 400  | build_not_ready | Build with the requested ID is building and not ready for execution. |
-| 400  | build_in_progress | Build with the requested ID is already in progress. Please wait before you can retry. |
-| 400  | collection_limit_exceeded | The maximum number of collections has been reached. |
-| 400  | document_invalid_structure | The document structure is invalid. Please ensure the attributes match the collection definition. |
-| 400  | document_missing_data | The document data is missing. Try again with document data populated. |
-| 400  | document_missing_payload | The document data and permissions are missing. You must provide either document data or permissions to be updated. |
-| 400  | attribute_unknown | The attribute required for the index could not be found. Please confirm all your attributes are in the available state. |
-| 400  | attribute_not_available | The requested attribute is not yet available. Please try again later. |
-| 400  | attribute_format_unsupported | The requested attribute format is not supported. |
-| 400  | attribute_default_unsupported | Default values cannot be set for array or required attributes. |
-| 400  | attribute_limit_exceeded | The maximum number of attributes has been reached. |
-| 400  | attribute_value_invalid | The attribute value is invalid. Please check the type, range and value of the attribute. |
-| 400  | attribute_type_invalid | The attribute type is invalid. |
-| 400  | index_limit_exceeded | The maximum number of indexes has been reached. |
-| 400  | index_invalid | Index invalid. |
-| 400  | project_unknown | The project ID is either missing or not valid. Please check the value of the `X-Appwrite-Project` header to ensure the correct project ID is being used. |
-| 400  | project_invalid_success_url | Invalid redirect URL for OAuth success. |
-| 400  | project_invalid_failure_url | Invalid redirect URL for OAuth failure. |
-| 400  | project_reserved_project | The project ID is reserved. Please choose another project ID. |
-| 400  | project_smtp_config_invalid | Provided SMTP config is invalid. Please check the configured values and try again. |
-| 400  | graphql_no_query | Param "query" is not optional. |
-| 400  | graphql_too_many_queries | Too many queries. |
-| 401  | general_access_forbidden | Access to this API is forbidden. |
-| 401  | general_unauthorized_scope | The current user or API key does not have the required scopes to access the requested resource. |
-| 401  | user_jwt_invalid | The JWT token is invalid. Please check the value of the `X-Appwrite-JWT` header to ensure the correct token is being used. |
-| 401  | user_blocked | The current user has been blocked. You can unblock the user by making a request to the User API's "Update User Status" endpoint or in the Appwrite Console's Auth section. |
-| 401  | user_invalid_token | Invalid token passed in the request. |
-| 401  | user_email_not_whitelisted | Console registration is restricted to specific emails. Contact your administrator for more information. |
-| 401  | user_invalid_code | The specified code is not valid. Contact your administrator for more information. |
-| 401  | user_ip_not_whitelisted | Console registration is restricted to specific IPs. Contact your administrator for more information. |
-| 401  | user_invalid_credentials | Invalid credentials. Please check the email and password. |
-| 401  | user_anonymous_console_prohibited | Anonymous users cannot be created for the console project. |
-| 401  | user_session_already_exists | Creation of anonymous users is prohibited when a session is active. |
-| 401  | user_unauthorized | The current user is not authorized to perform the requested action. |
-| 401  | user_oauth2_unauthorized | OAuth2 provider rejected the unauthorized request. |
-| 401  | team_invalid_secret | The team invitation secret is invalid. Please request a new invitation and try again. |
-| 401  | team_invite_mismatch | The invite does not belong to the current user. |
-| 401  | project_key_expired | The project key has expired. Please generate a new key using the Appwrite console. |
-| 401  | rule_verification_failed | Domain verification failed. Please check if your DNS records are correct and try again. |
-| 401  | project_template_default_deletion | You can't delete default template. If you are trying to reset your template changes, you can ignore this error as it's already been reset. |
-| 403  | general_unknown_origin | The request originated from an unknown origin. If you trust this domain, please list it as a trusted platform in the Appwrite console. |
-| 403  | storage_invalid_file | The uploaded file is invalid. Please check the file and try again. |
-| 403  | document_delete_restricted | Document cannot be deleted because it is referenced by another document. |
-| 404  | general_route_not_found | The requested route was not found. Please refer to the API docs and try again. |
-| 404  | user_not_found | User with the requested ID could not be found. |
-| 404  | user_session_not_found | The current user session could not be found. |
-| 404  | user_identity_not_found | The identity could not be found. Please sign in with OAuth provider to create identity first. |
-| 404  | team_not_found | Team with the requested ID could not be found. |
-| 404  | team_invite_not_found | The requested team invitation could not be found. |
-| 404  | team_membership_mismatch | The membership ID does not belong to the team ID. |
-| 404  | membership_not_found | Membership with the requested ID could not be found. |
-| 404  | avatar_set_not_found | The requested avatar set could not be found. |
-| 404  | avatar_not_found | The request avatar could not be found. |
-| 404  | avatar_image_not_found | The requested image was not found at the URL. |
-| 404  | avatar_remote_url_failed | Failed to fetch favicon from the requested URL. |
-| 404  | avatar_icon_not_found | The requested favicon could not be found. |
-| 404  | storage_file_not_found | The requested file could not be found. |
-| 404  | storage_bucket_not_found | Storage bucket with the requested ID could not be found. |
-| 404  | installation_not_found | Installation with the requested ID could not be found. Check to see if the ID is correct, or create the installation. |
-| 404  | provider_repository_not_found | VCS (Version Control System) repository with the requested ID could not be found. Check to see if the ID is correct, and if it belongs to installationId you provided. |
-| 404  | repository_not_found | Repository with the requested ID could not be found. Check to see if the ID is correct, or create the repository. |
-| 404  | function_not_found | Function with the requested ID could not be found. |
-| 404  | function_runtime_unsupported | The requested runtime is either inactive or unsupported. Please check the value of the `_APP_FUNCTIONS_RUNTIMES` environment variable. |
-| 404  | function_runtime_unsupported | Entrypoint for your Appwrite Function is missing. Please specify it when making deployment or update the entrypoint under your function's "Settings" > "Configuration" > "Entrypoint". |
-| 404  | build_not_found | Build with the requested ID could not be found. |
-| 404  | deployment_not_found | Deployment with the requested ID could not be found. |
-| 404  | execution_not_found | Execution with the requested ID could not be found. |
-| 404  | database_not_found | Database not found |
-| 404  | collection_not_found | Collection with the requested ID could not be found. |
-| 404  | document_not_found | Document with the requested ID could not be found. |
-| 404  | attribute_not_found | Attribute with the requested ID could not be found. |
-| 404  | index_not_found | Index with the requested ID could not be found. |
-| 404  | project_not_found | Project with the requested ID could not be found. Please check the value of the `X-Appwrite-Project` header to ensure the correct project ID is being used. |
-| 404  | router_host_not_found | Host is not trusted. This could occur because you have not configured a custom domain. Add a custom domain to your project first and try again. |
-| 404  | rule_resource_not_found | Resource could not be found. Please check if the `resourceId` and `resourceType` are correct, or if the resource actually exists. |
-| 404  | rule_not_found | Rule with the requested ID could not be found. Please check if the ID provided is correct or if the rule actually exists. |
-| 404  | webhook_not_found | Webhook with the requested ID could not be found. |
-| 404  | key_not_found | Key with the requested ID could not be found. |
-| 404  | platform_not_found | Platform with the requested ID could not be found. |
-| 404  | variable_not_found | Variable with the requested ID could not be found. |
-| 404  | migration_not_found | Migration with the requested ID could not be found. Please verify that the provided ID is correct and try again. |
-| 405  | general_not_implemented | This method was not fully implemented yet. If you believe this is a mistake, please upgrade your Appwrite server version. |
-| 409  | user_already_exists | A user with the same id, email, or phone already exists in this project. |
-| 409  | user_email_already_exists | A user with the same email already exists in the current project. |
-| 409  | user_phone_already_exists | A user with the same phone number already exists in the current project. |
-| 409  | team_invite_already_exists | User has already been invited or is already a member of this team |
-| 409  | team_already_exists | Team with requested ID already exists. Please choose a different ID and try again. |
-| 409  | membership_already_confirmed | Membership is already confirmed. |
-| 409  | storage_file_already_exists | A storage file with the requested ID already exists. |
-| 409  | storage_bucket_already_exists | A storage bucket with the requested ID already exists. Try again with a different ID or use `unique()` to generate a unique ID. |
-| 409  | provider_contribution_conflict | External contribution is already authorized. |
-| 409  | database_already_exists | Database already exists |
-| 409  | collection_already_exists | A collection with the requested ID already exists. Try again with a different ID or use `unique()` to generate a unique ID. |
-| 409  | document_already_exists | Document with the requested ID already exists. Try again with a different ID or use `unique()` to generate a unique ID. |
-| 409  | document_update_conflict | Remote document is newer than local. |
-| 409  | attribute_already_exists | Attribute with the requested ID already exists. Try again with a different ID or use `unique()` to generate a unique ID. |
-| 409  | index_already_exists | Index with the requested ID already exists. Try again with a different ID or use `unique()` to generate a unique ID. |
-| 409  | project_already_exists | Project with the requested ID already exists. Try again with a different ID or use `unique()` to generate a unique ID. |
-| 409  | rule_already_exists | Domain is already used. Please try again with a different domain. |
-| 409  | variable_already_exists | Variable with the same ID already exists in this project. Try again with a different ID. |
-| 409  | migration_already_exists | Migration with the requested ID already exists. Try again with a different ID. |
-| 409  | migration_in_progress | Migration is already in progress. You can check the status of the migration in your Appwrite Console's "Settings" > "Migrations". |
-| 412  | user_password_reset_required | The current user requires a password reset. |
-| 412  | project_provider_disabled | The chosen OAuth provider is disabled. You can enable the OAuth provider using the Appwrite console. |
-| 416  | storage_invalid_range | The requested range is not satisfiable. Please check the value of the `Range` header. |
-| 424  | user_oauth2_provider_error | OAuth2 provider returned some error. |
-| 429  | general_rate_limit_exceeded | Rate limit for the current endpoint has been exceeded. Please try again after some time. |
-| 500  | general_unknown | An unknown error has occurred. Please check the logs for more information. |
-| 500  | general_server_error | An internal server error occurred. |
-| 500  | general_protocol_unsupported | The request cannot be fulfilled with the current protocol. Please check the value of the `_APP_OPTIONS_FORCE_HTTPS` environment variable. |
-| 500  | general_codes_disabled | Invitation codes are disabled on this server. Please contact the server administrator. |
-| 500  | router_domain_not_configured | `_APP_DOMAIN`, `_APP_DOMAIN_TARGET`, and `_APP_DOMAIN_FUNCTIONS` environment variables have not been configured. Please configure the domain environment variables before accessing the Appwrite Console via any IP address or hostname other than localhost. This value could be an IP like 203.0.113.0 or a hostname like example.com. |
-| 501  | general_usage_disabled | Usage stats is not configured. Please check the value of the `_APP_USAGE_STATS` environment variable of your Appwrite server. |
-| 501  | user_count_exceeded | The current project has exceeded the maximum number of users. Please check your user limit in the Appwrite console. |
-| 501  | user_auth_method_unsupported | The requested authentication method is either disabled or unsupported. Please check the supported authentication methods in the Appwrite console. |
-| 501  | project_provider_unsupported | The chosen OAuth provider is unsupported. Please check the Create OAuth2 Session docs for the complete list of supported OAuth providers. |
-| 503  | general_service_disabled | The requested service is disabled. You can enable the service from the Appwrite console. |
-| 503  | general_smtp_disabled | SMTP is disabled on your Appwrite instance. You can learn more about setting up SMTP in our docs. |
-| 503  | general_phone_disabled | Phone provider is not configured. Please check the `_APP_SMS_PROVIDER` environment variable of your Appwrite server. |
\ No newline at end of file
+| 400  | `general_mock` | General errors thrown by the mock controller used for testing. |
+| 400  | `general_argument_invalid` | The request contains one or more invalid arguments. Please refer to the endpoint documentation. |
+| 400  | `general_query_limit_exceeded` | Query limit exceeded for the current attribute. Usage of more than 100 query values on a single attribute is prohibited. |
+| 400  | `general_query_invalid` | The query's syntax is invalid. Please check the query and try again. |
+| 400  | `general_cursor_not_found` | The cursor is invalid. This can happen if the item represented by the cursor has been deleted. |
+| 400  | `user_password_mismatch` | Passwords do not match. Please check the password and confirm password. |
+| 400  | `password_recently_used` | The password you are trying to use is similar to your previous password. For your security, please choose a different password and try again. |
+| 400  | `password_personal_data` | The password you are trying to use contains references to your name, email, phone or userID. For your security, please choose a different password and try again. |
+| 400  | `user_phone_not_found` | The current user does not have a phone number associated with their account. |
+| 400  | `user_missing_id` | Missing ID from OAuth2 provider. |
+| 400  | `user_oauth2_bad_request` | OAuth2 provider rejected the bad request. |
+| 400  | `storage_device_not_found` | The requested storage device could not be found. |
+| 400  | `storage_file_empty` | Empty file passed to the endpoint. |
+| 400  | `storage_file_type_unsupported` | The given file extension is not supported. |
+| 400  | `storage_invalid_file_size` | The file size is either not valid or exceeds the maximum allowed size. Please check the file or the value of the `_APP_STORAGE_LIMIT` environment variable. |
+| 400  | `storage_invalid_content_range` | The content range is invalid. Please check the value of the `Content-Range` header. |
+| 400  | `storage_invalid_appwrite_id` | The value for `x-appwrite-id` header is invalid. Please check the value of the `x-appwrite-id` header is a valid id and not `unique()`. |
+| 400  | `general_provider_failure` | VCS (Version Control System) provider failed to process the request. We believe this is an error with the VCS provider. Try again, or contact support for more information. |
+| 400  | `build_not_ready` | Build with the requested ID is building and not ready for execution. |
+| 400  | `build_in_progress` | Build with the requested ID is already in progress. Please wait before you can retry. |
+| 400  | `collection_limit_exceeded` | The maximum number of collections has been reached. |
+| 400  | `document_invalid_structure` | The document structure is invalid. Please ensure the attributes match the collection definition. |
+| 400  | `document_missing_data` | The document data is missing. Try again with document data populated. |
+| 400  | `document_missing_payload` | The document data and permissions are missing. You must provide either document data or permissions to be updated. |
+| 400  | `attribute_unknown` | The attribute required for the index could not be found. Please confirm all your attributes are in the available state. |
+| 400  | `attribute_not_available` | The requested attribute is not yet available. Please try again later. |
+| 400  | `attribute_format_unsupported` | The requested attribute format is not supported. |
+| 400  | `attribute_default_unsupported` | Default values cannot be set for array or required attributes. |
+| 400  | `attribute_limit_exceeded` | The maximum number of attributes has been reached. |
+| 400  | `attribute_value_invalid` | The attribute value is invalid. Please check the type, range and value of the attribute. |
+| 400  | `attribute_type_invalid` | The attribute type is invalid. |
+| 400  | `index_limit_exceeded` | The maximum number of indexes has been reached. |
+| 400  | `index_invalid` | Index invalid. |
+| 400  | `project_unknown` | The project ID is either missing or not valid. Please check the value of the `X-Appwrite-Project` header to ensure the correct project ID is being used. |
+| 400  | `project_invalid_success_url` | Invalid redirect URL for OAuth success. |
+| 400  | `project_invalid_failure_url` | Invalid redirect URL for OAuth failure. |
+| 400  | `project_reserved_project` | The project ID is reserved. Please choose another project ID. |
+| 400  | `project_smtp_config_invalid` | Provided SMTP config is invalid. Please check the configured values and try again. |
+| 400  | `graphql_no_query` | Param "query" is not optional. |
+| 400  | `graphql_too_many_queries` | Too many queries. |
+| 401  | `general_access_forbidden` | Access to this API is forbidden. |
+| 401  | `general_unauthorized_scope` | The current user or API key does not have the required scopes to access the requested resource. |
+| 401  | `user_jwt_invalid` | The JWT token is invalid. Please check the value of the `X-Appwrite-JWT` header to ensure the correct token is being used. |
+| 401  | `user_blocked` | The current user has been blocked. You can unblock the user by making a request to the User API's "Update User Status" endpoint or in the Appwrite Console's Auth section. |
+| 401  | `user_invalid_token` | Invalid token passed in the request. |
+| 401  | `user_email_not_whitelisted` | Console registration is restricted to specific emails. Contact your administrator for more information. |
+| 401  | `user_invalid_code` | The specified code is not valid. Contact your administrator for more information. |
+| 401  | `user_ip_not_whitelisted` | Console registration is restricted to specific IPs. Contact your administrator for more information. |
+| 401  | `user_invalid_credentials` | Invalid credentials. Please check the email and password. |
+| 401  | `user_anonymous_console_prohibited` | Anonymous users cannot be created for the console project. |
+| 401  | `user_session_already_exists` | Creation of anonymous users is prohibited when a session is active. |
+| 401  | `user_unauthorized` | The current user is not authorized to perform the requested action. |
+| 401  | `user_oauth2_unauthorized` | OAuth2 provider rejected the unauthorized request. |
+| 401  | `team_invalid_secret` | The team invitation secret is invalid. Please request a new invitation and try again. |
+| 401  | `team_invite_mismatch` | The invite does not belong to the current user. |
+| 401  | `project_key_expired` | The project key has expired. Please generate a new key using the Appwrite console. |
+| 401  | `rule_verification_failed` | Domain verification failed. Please check if your DNS records are correct and try again. |
+| 401  | `project_template_default_deletion` | You can't delete default template. If you are trying to reset your template changes, you can ignore this error as it's already been reset. |
+| 403  | `general_unknown_origin` | The request originated from an unknown origin. If you trust this domain, please list it as a trusted platform in the Appwrite console. |
+| 403  | `storage_invalid_file` | The uploaded file is invalid. Please check the file and try again. |
+| 403  | `document_delete_restricted` | Document cannot be deleted because it is referenced by another document. |
+| 404  | `general_route_not_found` | The requested route was not found. Please refer to the API docs and try again. |
+| 404  | `user_not_found` | User with the requested ID could not be found. |
+| 404  | `user_session_not_found` | The current user session could not be found. |
+| 404  | `user_identity_not_found` | The identity could not be found. Please sign in with OAuth provider to create identity first. |
+| 404  | `team_not_found` | Team with the requested ID could not be found. |
+| 404  | `team_invite_not_found` | The requested team invitation could not be found. |
+| 404  | `team_membership_mismatch` | The membership ID does not belong to the team ID. |
+| 404  | `membership_not_found` | Membership with the requested ID could not be found. |
+| 404  | `avatar_set_not_found` | The requested avatar set could not be found. |
+| 404  | `avatar_not_found` | The request avatar could not be found. |
+| 404  | `avatar_image_not_found` | The requested image was not found at the URL. |
+| 404  | `avatar_remote_url_failed` | Failed to fetch favicon from the requested URL. |
+| 404  | `avatar_icon_not_found` | The requested favicon could not be found. |
+| 404  | `storage_file_not_found` | The requested file could not be found. |
+| 404  | `storage_bucket_not_found` | Storage bucket with the requested ID could not be found. |
+| 404  | `installation_not_found` | Installation with the requested ID could not be found. Check to see if the ID is correct, or create the installation. |
+| 404  | `provider_repository_not_found` | VCS (Version Control System) repository with the requested ID could not be found. Check to see if the ID is correct, and if it belongs to installationId you provided. |
+| 404  | `repository_not_found` | Repository with the requested ID could not be found. Check to see if the ID is correct, or create the repository. |
+| 404  | `function_not_found` | Function with the requested ID could not be found. |
+| 404  | `function_runtime_unsupported` | The requested runtime is either inactive or unsupported. Please check the value of the `_APP_FUNCTIONS_RUNTIMES` environment variable. |
+| 404  | `function_runtime_unsupported` | Entrypoint for your Appwrite Function is missing. Please specify it when making deployment or update the entrypoint under your function's "Settings" > "Configuration" > "Entrypoint". |
+| 404  | `build_not_found` | Build with the requested ID could not be found. |
+| 404  | `deployment_not_found` | Deployment with the requested ID could not be found. |
+| 404  | `execution_not_found` | Execution with the requested ID could not be found. |
+| 404  | `database_not_found` | Database not found |
+| 404  | `collection_not_found` | Collection with the requested ID could not be found. |
+| 404  | `document_not_found` | Document with the requested ID could not be found. |
+| 404  | `attribute_not_found` | Attribute with the requested ID could not be found. |
+| 404  | `index_not_found` | Index with the requested ID could not be found. |
+| 404  | `project_not_found` | Project with the requested ID could not be found. Please check the value of the `X-Appwrite-Project` header to ensure the correct project ID is being used. |
+| 404  | `router_host_not_found` | Host is not trusted. This could occur because you have not configured a custom domain. Add a custom domain to your project first and try again. |
+| 404  | `rule_resource_not_found` | Resource could not be found. Please check if the `resourceId` and `resourceType` are correct, or if the resource actually exists. |
+| 404  | `rule_not_found` | Rule with the requested ID could not be found. Please check if the ID provided is correct or if the rule actually exists. |
+| 404  | `webhook_not_found` | Webhook with the requested ID could not be found. |
+| 404  | `key_not_found` | Key with the requested ID could not be found. |
+| 404  | `platform_not_found` | Platform with the requested ID could not be found. |
+| 404  | `variable_not_found` | Variable with the requested ID could not be found. |
+| 404  | `migration_not_found` | Migration with the requested ID could not be found. Please verify that the provided ID is correct and try again. |
+| 405  | `general_not_implemented` | This method was not fully implemented yet. If you believe this is a mistake, please upgrade your Appwrite server version. |
+| 409  | `user_already_exists` | A user with the same id, email, or phone already exists in this project. |
+| 409  | `user_email_already_exists` | A user with the same email already exists in the current project. |
+| 409  | `user_phone_already_exists` | A user with the same phone number already exists in the current project. |
+| 409  | `team_invite_already_exists` | User has already been invited or is already a member of this team |
+| 409  | `team_already_exists` | Team with requested ID already exists. Please choose a different ID and try again. |
+| 409  | `membership_already_confirmed` | Membership is already confirmed. |
+| 409  | `storage_file_already_exists` | A storage file with the requested ID already exists. |
+| 409  | `storage_bucket_already_exists` | A storage bucket with the requested ID already exists. Try again with a different ID or use `unique()` to generate a unique ID. |
+| 409  | `provider_contribution_conflict` | External contribution is already authorized. |
+| 409  | `database_already_exists` | Database already exists |
+| 409  | `collection_already_exists` | A collection with the requested ID already exists. Try again with a different ID or use `unique()` to generate a unique ID. |
+| 409  | `document_already_exists` | Document with the requested ID already exists. Try again with a different ID or use `unique()` to generate a unique ID. |
+| 409  | `document_update_conflict` | Remote document is newer than local. |
+| 409  | `attribute_already_exists` | Attribute with the requested ID already exists. Try again with a different ID or use `unique()` to generate a unique ID. |
+| 409  | `index_already_exists` | Index with the requested ID already exists. Try again with a different ID or use `unique()` to generate a unique ID. |
+| 409  | `project_already_exists` | Project with the requested ID already exists. Try again with a different ID or use `unique()` to generate a unique ID. |
+| 409  | `rule_already_exists` | Domain is already used. Please try again with a different domain. |
+| 409  | `variable_already_exists` | Variable with the same ID already exists in this project. Try again with a different ID. |
+| 409  | `migration_already_exists` | Migration with the requested ID already exists. Try again with a different ID. |
+| 409  | `migration_in_progress` | Migration is already in progress. You can check the status of the migration in your Appwrite Console's "Settings" > "Migrations". |
+| 412  | `user_password_reset_required` | The current user requires a password reset. |
+| 412  | `project_provider_disabled` | The chosen OAuth provider is disabled. You can enable the OAuth provider using the Appwrite console. |
+| 416  | `storage_invalid_range` | The requested range is not satisfiable. Please check the value of the `Range` header. |
+| 424  | `user_oauth2_provider_error` | OAuth2 provider returned some error. |
+| 429  | `general_rate_limit_exceeded` | Rate limit for the current endpoint has been exceeded. Please try again after some time. |
+| 500  | `general_unknown` | An unknown error has occurred. Please check the logs for more information. |
+| 500  | `general_server_error` | An internal server error occurred. |
+| 500  | `general_protocol_unsupported` | The request cannot be fulfilled with the current protocol. Please check the value of the `_APP_OPTIONS_FORCE_HTTPS` environment variable. |
+| 500  | `general_codes_disabled` | Invitation codes are disabled on this server. Please contact the server administrator. |
+| 500  | `router_domain_not_configured` | `_APP_DOMAIN`, `_APP_DOMAIN_TARGET`, and `_APP_DOMAIN_FUNCTIONS` environment variables have not been configured. Please configure the domain environment variables before accessing the Appwrite Console via any IP address or hostname other than localhost. This value could be an IP like 203.0.113.0 or a hostname like example.com. |
+| 501  | `general_usage_disabled` | Usage stats is not configured. Please check the value of the `_APP_USAGE_STATS` environment variable of your Appwrite server. |
+| 501  | `user_count_exceeded` | The current project has exceeded the maximum number of users. Please check your user limit in the Appwrite console. |
+| 501  | `user_auth_method_unsupported` | The requested authentication method is either disabled or unsupported. Please check the supported authentication methods in the Appwrite console. |
+| 501  | `project_provider_unsupported` | The chosen OAuth provider is unsupported. Please check the Create OAuth2 Session docs for the complete list of supported OAuth providers. |
+| 503  | `general_service_disabled` | The requested service is disabled. You can enable the service from the Appwrite console. |
+| 503  | `general_smtp_disabled` | SMTP is disabled on your Appwrite instance. You can learn more about setting up SMTP in our docs. |
+| 503  | `general_phone_disabled` | Phone provider is not configured. Please check the `_APP_SMS_PROVIDER` environment variable of your Appwrite server. |
\ No newline at end of file
diff --git a/src/routes/docs/advanced/self-hosting/environment-variables/+page.markdoc b/src/routes/docs/advanced/self-hosting/environment-variables/+page.markdoc
index 9bf2c7abe21..a198bed67b1 100644
--- a/src/routes/docs/advanced/self-hosting/environment-variables/+page.markdoc
+++ b/src/routes/docs/advanced/self-hosting/environment-variables/+page.markdoc
@@ -7,7 +7,7 @@ description: Customize the behavior of your self-hosted Appwrite instance to you
 
 Appwrite environment variables allow you to edit your server setup configuration and customize it. You can easily change the environment variables by changing them when running Appwrite using Docker CLI or Docker Compose.
 
-Updating your Appwrite environment variables requires you to edit your Appwrite `.env` file. Your Docker files should be located inside the "appwrite" folder at the location where you first run the Appwrite installation script. It's recommended to use the `.env` file as a central point for updating your Appwrite configuration rather than changing them directly in your `docker-compose.yml` file.
+Updating your Appwrite environment variables requires you to edit your Appwrite `.env` file. Your Docker files should be located inside the `appwrite` folder at the location where you first run the Appwrite installation script. It's recommended to use the `.env` file as a central point for updating your Appwrite configuration rather than changing them directly in your `docker-compose.yml` file.
 
 After editing your `docker-compose.yml` or `.env` files, you will need to recreate your Appwrite stack by running the following compose command in your terminal:
 ```bash
@@ -33,8 +33,8 @@ docker compose exec appwrite vars
 | `_APP_CONSOLE_WHITELIST_ROOT`| This option allows you to disable the creation of new users on the Appwrite console. When enabled only 1 user will be able to use the registration form. New users can be added by inviting them to your project. By default this option is enabled. |
 | `_APP_CONSOLE_WHITELIST_EMAILS` | This option allows you to limit creation of new users on the Appwrite console. This option is very useful for small teams or sole developers. To enable it, pass a list of allowed email addresses separated by a comma. |
 | `_APP_CONSOLE_WHITELIST_IPS` | This last option allows you to limit creation of users in Appwrite console for users sharing the same set of IP addresses. This option is very useful for team working with a VPN service or a company IP. To enable/activate this option, pass a list of allowed IP addresses separated by a comma. |
-| `_APP_SYSTEM_EMAIL_NAME`| This is the sender name value that will appear on email messages sent to developers from the Appwrite console. The default value is: 'Appwrite'. You can use url encoded strings for spaces and special chars. |
-| `_APP_SYSTEM_EMAIL_ADDRESS`  | This is the sender email address that will appear on email messages sent to developers from the Appwrite console. The default value is 'team@appwrite.io'. You should choose an email address that is allowed to be used from your SMTP server to avoid the server email ending in the users' SPAM folders. |
+| `_APP_SYSTEM_EMAIL_NAME`| This is the sender name value that will appear on email messages sent to developers from the Appwrite console. The default value is: 'Appwrite'. You can use URL encoded strings for spaces and special chars. |
+| `_APP_SYSTEM_EMAIL_ADDRESS`  | This is the sender email address that will appear on email messages sent to developers from the Appwrite console. The default value is `team@appwrite.io`. You should choose an email address that is allowed to be used from your SMTP server to avoid the server email ending in the users' SPAM folders. |
 | `_APP_SYSTEM_RESPONSE_FORMAT` | Use this environment variable to set the default Appwrite HTTP response format to support an older version of Appwrite. This option is useful to overcome breaking changes between versions. You can also use the `X-Appwrite-Response-Format` HTTP request header to overwrite the response for a specific request. This variable accepts any valid Appwrite version. To use the current version format, leave the value of the variable empty. |
 | `_APP_SYSTEM_SECURITY_EMAIL_ADDRESS` | This is the email address used to issue SSL certificates for custom domains or the user agent in your webhooks payload. |
 | `_APP_USAGE_STATS` | This variable allows you to disable the collection and displaying of usage stats. This value is set to 'enabled' by default, to disable the usage stats set the value to 'disabled'. When disabled, it's recommended to turn off the Worker Usage container to reduce resource usage. |
diff --git a/src/routes/docs/advanced/self-hosting/production/+page.markdoc b/src/routes/docs/advanced/self-hosting/production/+page.markdoc
index 426c013a876..aff7ad9885b 100644
--- a/src/routes/docs/advanced/self-hosting/production/+page.markdoc
+++ b/src/routes/docs/advanced/self-hosting/production/+page.markdoc
@@ -25,7 +25,7 @@ Appwrite provides three different methods to limit access to your Appwrite Conso
 
 1. Whitelist a group of developers by IP using the `_APP_CONSOLE_WHITELIST_IPS` environment variable.
 2. Whitelist a group of developers by email using the `_APP_CONSOLE_WHITELIST_EMAILS` environment variable.
-3. Only the root user can signup. All other developers must be added through invitations. This is configured using the `_APP_CONSOLE_WHITELIST_ROOT` environment variable.
+3. Only the root user can sign up. All other developers must be added through invitations. This is configured using the `_APP_CONSOLE_WHITELIST_ROOT` environment variable.
 
 By default, only the first user can sign up on the Appwrite instance's dashboard. All other users must be added to the dashboard through invitation.
 
diff --git a/src/routes/docs/apis/realtime/+page.markdoc b/src/routes/docs/apis/realtime/+page.markdoc
index 0235a8e3385..f855c23e56a 100644
--- a/src/routes/docs/apis/realtime/+page.markdoc
+++ b/src/routes/docs/apis/realtime/+page.markdoc
@@ -109,7 +109,7 @@ More information and examples of authenticating users can be found in the dedica
 # Examples {% #examples %}
 The examples below will show you how you can use Realtime in various ways.
 
-## Subscribe to a Channel {% #subscribe-to-a-channel %}
+## Subscribe to a channel {% #subscribe-to-a-channel %}
 In this example we are subscribing to all updates related to our account by using the `account` channel. This will be triggered by any update related to the authenticated user, like updating the user's name or e-mail address.
 
 {% multicode %}
@@ -177,7 +177,7 @@ val subscription = realtime.subscribe("account") {
 
 {% /multicode %}
 
-## Subscribe to Multiple Channels  {% #subscribe-to-multiple-channel %}
+## Subscribe to multiple channels  {% #subscribe-to-multiple-channel %}
 
 You can also listen to multiple channels at once by passing an array of channels. This will trigger the callback for any events for all channels passed.
 
diff --git a/src/routes/docs/products/auth/accounts/+page.markdoc b/src/routes/docs/products/auth/accounts/+page.markdoc
index 27d42654390..de9a960ce1b 100644
--- a/src/routes/docs/products/auth/accounts/+page.markdoc
+++ b/src/routes/docs/products/auth/accounts/+page.markdoc
@@ -1,23 +1,23 @@
 ---
 layout: article
 title: Accounts
-description: Unlock advanced user management - Appwrite's Account API for seamless signups, store user preferences, and dynamic permissions.
+description: Unlock advanced user management - Appwrite's Account API for seamless sign ups, store user preferences, and dynamic permissions.
 ---
 
-Appwrite Account API is used for user signup and login in client applications.
+Appwrite Account API is used for user sign up and login in client applications.
 Users can be organized into teams and be given labels, so they can be given different permissions and access different resources. 
 Each user's account can also have their own preference object, which you can use to save preferences such as theme, language, and notification settings.
 
 {% partial file="account-vs-user.md" /%}
 
-# Signup and login {% #signup-login %}
+# Sign up and login {% #signup-login %}
 
-You can signup and login a user with an account create through 
+You can sign up and login a user with an account create through 
 [email password](/docs/products/auth/email-password),
 [phone (SMS)](/docs/products/auth/phone-sms),
 [Anonymous](/docs/products/auth/anonymous),
 [magic URL](/docs/products/auth/magic-url), and
-[OAuth 2](/docs/products/auth/oauth2)
+[OAuth2](/docs/products/auth/oauth2)
 authentication.
 
 # Preferences {% #preferences %}
diff --git a/src/routes/docs/products/auth/email-password/+page.markdoc b/src/routes/docs/products/auth/email-password/+page.markdoc
index 2ae01695ffe..c2d048ea62b 100644
--- a/src/routes/docs/products/auth/email-password/+page.markdoc
+++ b/src/routes/docs/products/auth/email-password/+page.markdoc
@@ -6,7 +6,7 @@ description: Implement email and password authentication with Appwrite. Securely
 
 Email and password login is the most commonly used authentication method. Appwrite Authentication promotes a safer internet by providing secure APIs and promoting better password choices to end users. Appwrite supports added security features like blocking personal info in passwords, password dictionary, and password history to help users choose good passwords.
 
-# Signup {% #sign-up %}
+# Sign up {% #sign-up %}
 
 You can use the Appwrite Client SDKs to create an account using email and password.
 
@@ -56,7 +56,7 @@ promise.then(function (response) {
 
 Next, implement the verification page in your app. This page will parse the secrets passed in through the `userId` and `secret` query parameters. In this example, the code below will be found in the page served at `https://example.com/verify`.
 
-Since the secrets are passed in through url params, it will be easiest to perform this step in the browser.
+Since the secrets are passed in through URL params, it will be easiest to perform this step in the browser.
 
 ```js
 import { Client, Account } from "appwrite";
@@ -102,7 +102,7 @@ promise.then(function (response) {
 });
 ```
 
-# Password Recovery {% #password-recovery %}
+# Password recovery {% #password-recovery %}
 
 If a user forgets their password, they can initiate a password recovery flow to recover their password. The Create Password Recovery endpoint sends the user an email with a temporary secret key for password reset. When the user clicks the confirmation link, they are redirected back to the password reset URL with the secret key and email address values attached to the URL as query strings.
 
diff --git a/src/routes/docs/products/auth/jwt/+page.markdoc b/src/routes/docs/products/auth/jwt/+page.markdoc
index 24f1a181b1f..0048e77c34b 100644
--- a/src/routes/docs/products/auth/jwt/+page.markdoc
+++ b/src/routes/docs/products/auth/jwt/+page.markdoc
@@ -8,13 +8,13 @@ You can extend Appwrite's APIs by building backend apps using [Server SDKs](/doc
 
 If you are already authenticated on your client-side app and need your backend app to **act on behalf of the user**, this guide will walk you through the process.
 
-# Proof of Identity {% #proof-of-identity %}
+# Proof of identity {% #proof-of-identity %}
 
 Before making requests to your backend APIs, your client application needs to first create a session **directly with Appwrite** using the account service. This session will act like an ID card for the user and can be used to access resources in Appwrite. The client will **only receive information accessible to the user** based on the resources' [permissions](/docs/advanced/platform/permissions).
 
 When you build backend APIs to extend Appwrite's functionality, these APIs should still **respect access permissions** to keep user data secure. Appwrite's backend SDKs allow you to securely act on behalf of a user with the same permissions by using JWT authentication.
 
-# JWT Authentication {% #jwt %}
+# JWT authentication {% #jwt %}
 
 [JSON Web Tokens](https://jwt.io/introduction) (JWTs) are a secure means to transfer information or claims between two parties. JWTs act like temporary copies of the user's ID card that allow Appwrite's Server SDKs to access information on behalf of a user.
 
@@ -169,9 +169,9 @@ var client = new Client()
 {% /multicode %}
 
 
-# When should I use JWTs? {% #when-to-use %}
+# When to use JWT authentication? {% #when-to-use %}
 
-JWT auth is useful when you need your backend app's Server SDK to be restricted by the same set of permissions.
+JWT authentication is useful when you need your backend app's Server SDK to be restricted by the same set of permissions.
 
 If your backend app's Server SDK is using an [API key](/docs/advanced/platform/api-keys), it will fetch **all resources** regardless of permissions. This means the Server SDK might fetch files and documents your user should not be able to see, which is not helpful when you need to act on behalf of a user.
 
diff --git a/src/routes/docs/products/auth/oauth2/+page.markdoc b/src/routes/docs/products/auth/oauth2/+page.markdoc
index d984076d179..114db43f4e3 100644
--- a/src/routes/docs/products/auth/oauth2/+page.markdoc
+++ b/src/routes/docs/products/auth/oauth2/+page.markdoc
@@ -1,28 +1,28 @@
 ---
 layout: article
-title: OAuth 2 login
+title: OAuth2 login
 description: Integrate OAuth2 authentication seamlessly with Appwrite. Learn how to connect your application with third-party OAuth2 providers for secure user login and access.
 ---
 
 OAuth authentication allows users to log in using accounts from other popular services. This can be convenient for users because they can start using your app without creating a new account. It can also be more secure, because the user has one less password that could become vulnerable.
 
-When using OAuth to authenticate, the authentication request is initiated from the client application. The user is then redirected to an OAuth 2 provider to complete the authentication step, and finally, the user is redirected back to the client application.
+When using OAuth to authenticate, the authentication request is initiated from the client application. The user is then redirected to an OAuth2 provider to complete the authentication step, and finally, the user is redirected back to the client application.
 
-# Configure OAuth 2 login {% #configure %}
+# Configure OAuth2 login {% #configure %}
 
-Before using OAuth 2 login, you need to enable and configure an OAuth 2 login provider.
+Before using OAuth2 login, you need to enable and configure an OAuth2 login provider.
 
 1. Navigate to your Appwrite project.
 2. Navigate to **Auth** > **Settings**.
 3. Find and open the OAuth provider.
-4. In the OAuth 2 settings modal, use the toggle to enable the provider.
-5. Create and OAuth 2 app on the provider's developer platform.
+4. In the OAuth2 settings modal, use the toggle to enable the provider.
+5. Create and OAuth2 app on the provider's developer platform.
 6. Copy information from your OAuth2 provider's developer platform to fill the **OAuth2 Settings** modal in the Appwrite Console.
-7. Configure redirect URL in your OAuth 2 provider's developer platform. Set it to URL provided to you by **OAuth2 Settings** modal in Appwrite Console.
+7. Configure redirect URL in your OAuth2 provider's developer platform. Set it to URL provided to you by **OAuth2 Settings** modal in Appwrite Console.
 
-# Initialize OAuth 2 login {% #init %}
+# Initialize OAuth2 login {% #init %}
 
-To initialize the OAuth 2 login process, use the [Create OAuth 2 Session](/docs/references/cloud/client-web/account#createOAuth2Session) route.
+To initialize the OAuth2 login process, use the [Create OAuth2 Session](/docs/references/cloud/client-web/account#createOAuth2Session) route.
 
 {% tabs %}
 {% tabsitem #js title="Javascript" %}
@@ -131,15 +131,15 @@ try await account.createOAuth2Session(provider: "amazon")
 {% /tabsitem %}
 {% /tabs %}
 
-You'll be redirected to the OAuth 2 provider's login page to log in. Once complete, your user will be redirected back to your app.
+You'll be redirected to the OAuth2 provider's login page to log in. Once complete, your user will be redirected back to your app.
 
 You can optionally configure `success` or `failure` redirect links on web to handle success and failure scenarios.
 
-# OAuth 2 profile {% #profile %}
+# OAuth2 profile {% #profile %}
 
-After authenticating a user through their OAuth 2 provider, you can fetch their profile information such as their avatar image or name. To do this you can use the access token from the OAuth 2 provider and make API calls to the provider.
+After authenticating a user through their OAuth2 provider, you can fetch their profile information such as their avatar image or name. To do this you can use the access token from the OAuth2 provider and make API calls to the provider.
 
-After creating an OAuth 2 session, you can fetch the session to get information about the provider.
+After creating an OAuth2 session, you can fetch the session to get information about the provider.
 
 {% multicode %}
 ```js
@@ -221,20 +221,20 @@ print(session.providerAccessToken);
 {% /multicode %}
 
 
-An OAuth 2 [session](/docs/references/cloud/models/session) will have the following attributes.
+An OAuth2 [session](/docs/references/cloud/models/session) will have the following attributes.
 
 | Property                   | Description                                                                                               |
 | -------------------------- | --------------------------------------------------------------------------------------------------------- |
 | provider                   | The OAuth2 Provider.                                                                                       |
-| providerUid                | User ID from the OAuth 2 Provider.                                                                         |
-| providerAccessToken        | Access token from the OAuth 2 provider. Use this to **make requests to the OAuth 2 provider** to fetch personal data. |
+| providerUid                | User ID from the OAuth2 Provider.                                                                         |
+| providerAccessToken        | Access token from the OAuth2 provider. Use this to **make requests to the OAuth2 provider** to fetch personal data. |
 | providerAccessTokenExpiry  | Check this value to know if an access token is about to expire.                                            |
 
-You can use the `providerAccessToken` to make requests to your OAuth 2 provider. Refer to the docs for the OAuth 2 provider you're using to learn about making API calls with the access token.
+You can use the `providerAccessToken` to make requests to your OAuth2 provider. Refer to the docs for the OAuth2 provider you're using to learn about making API calls with the access token.
 
-# OAuth 2 profile {% #profile %}
+# OAuth2 profile {% #profile %}
 
-OAuth 2 sessions expire to protect from security risks. OAuth 2 sessions should be refreshed periodically, so access tokens don't expire. Check value of `providerAccessTokenExpiry` to know if the token is expired or is about to expire. Refreshing before every request might cause rate limit problems. You can do this by calling the [Update OAuth Session](/docs/references/cloud/client-web/account#updateSession) endpoint when ever your user visits your app.
+OAuth2 sessions expire to protect from security risks. OAuth2 sessions should be refreshed periodically, so access tokens don't expire. Check value of `providerAccessTokenExpiry` to know if the token is expired or is about to expire. Refreshing before every request might cause rate limit problems. You can do this by calling the [Update OAuth Session](/docs/references/cloud/client-web/account#updateSession) endpoint when ever your user visits your app.
 
 {% multicode %}
 ```js
@@ -294,5 +294,5 @@ let session = try await account.updateSession(
 {% /multicode %}
 
 {% info title="GraphQL" %}
-OAuth 2 is not available through the GraphQL API. You can use the REST API or any Client SDK instead.
+OAuth2 is not available through the GraphQL API. You can use the REST API or any Client SDK instead.
 {% /info %}
\ No newline at end of file
diff --git a/src/routes/docs/products/auth/quick-start/+page.markdoc b/src/routes/docs/products/auth/quick-start/+page.markdoc
index 341767b3ed3..44f7a916a81 100644
--- a/src/routes/docs/products/auth/quick-start/+page.markdoc
+++ b/src/routes/docs/products/auth/quick-start/+page.markdoc
@@ -1,10 +1,10 @@
 ---
 layout: article
 title: Start with Authentication
-description: Effortlessly add authentication to your apps - simple signup & login in just minutes with Appwrite Authentication
+description: Effortlessly add authentication to your apps - simple sign up & login in just minutes with Appwrite Authentication
 ---
 You can get up and running with Appwrite Authentication in minutes. 
-Adding signup and login is as simple as this.
+Adding sign up and login is as simple as this.
 
 # Sign up {% #sign-up %}
 
@@ -169,11 +169,11 @@ mutation {
 {% /multicode %}
 
 # More ways to authenticate {% #more-ways-to-authenticate %}
-You can signup and login a user with an account create through 
+You can sign up and login a user with an account create through 
 [email password](/docs/products/auth/email-password),
 [phone (SMS)](/docs/products/auth/phone-sms),
 [Anonymous](/docs/products/auth/anonymous)
 [magic URL](/docs/products/auth/magic-url), and
-[OAuth 2](/docs/products/auth/oauth2)
+[OAuth2](/docs/products/auth/oauth2)
 authentication. 
 
diff --git a/src/routes/docs/products/auth/security/+page.markdoc b/src/routes/docs/products/auth/security/+page.markdoc
index 4d9a3e0b3da..5681765b7c9 100644
--- a/src/routes/docs/products/auth/security/+page.markdoc
+++ b/src/routes/docs/products/auth/security/+page.markdoc
@@ -17,7 +17,7 @@ Only keep user sessions active as long as needed and maintain exactly **one** in
 |  {% width=70 %} | Framework {% width=120 %} | Storage method |
 |:----------------------------------------------------------------------------------------------------:|:---:|:----------------------------------------------------------------------------------------------------------------------:|
 | {% only_dark %}{% icon_image src="/images/platforms/dark/javascript.svg" alt="Javascript logo" size="m" /%}{% /only_dark %}{% only_light %}{% icon_image src="/images/platforms/javascript.svg" alt="Javascript logo" size="m" /%}{% /only_light %} | Web | Uses a secure session cookie and falls back to local storage when a session cookie is not available. |
-| {% only_dark %}{% icon_image src="/images/platforms/dark/flutter.svg" alt="Javascript logo" size="m" /%}{% /only_dark %}{% only_light %}{% icon_image src="/images/platforms/flutter.svg" alt="Javascript logo" size="m" /%}{% /only_light %}  | Flutter | Uses a session cookie stored in Application Documents through the **path_provider** package. |
+| {% only_dark %}{% icon_image src="/images/platforms/dark/flutter.svg" alt="Javascript logo" size="m" /%}{% /only_dark %}{% only_light %}{% icon_image src="/images/platforms/flutter.svg" alt="Javascript logo" size="m" /%}{% /only_light %}  | Flutter | Uses a session cookie stored in Application Documents through the `path_provider` package. |
 | {% only_dark %}{% icon_image src="/images/platforms/dark/apple.svg" alt="Javascript logo" size="m" /%}{% /only_dark %}{% only_light %}{% icon_image src="/images/platforms/apple.svg" alt="Javascript logo" size="m" /%}{% /only_light %}  | Apple | Uses a session cookie stored in **UserDefaults**. |
 | {% only_dark %}{% icon_image src="/images/platforms/dark/android.svg" alt="Javascript logo" size="m" /%}{% /only_dark %}{% only_light %}{% icon_image src="/images/platforms/android.svg" alt="Javascript logo" size="m" /%}{% /only_light %}  | Android | Uses a session cookie stored in **SharedPreferences**. |
 
diff --git a/src/routes/docs/products/databases/collections/+page.markdoc b/src/routes/docs/products/databases/collections/+page.markdoc
index 78c79e13926..036a80fcb70 100644
--- a/src/routes/docs/products/databases/collections/+page.markdoc
+++ b/src/routes/docs/products/databases/collections/+page.markdoc
@@ -228,7 +228,7 @@ You can also configure **permissions** in the `createCollection` method, learn m
 # Permissions {% #permissions %}
 Appwrite uses permissions to control data access.
 For security, only users that are granted permissions can access a resource. 
-This helps prevent accidental data leaks by forcing you to make more concious decisions around permissions.
+This helps prevent accidental data leaks by forcing you to make more conscious decisions around permissions.
 
 By default, Appwrite doesn't grant permissions to any users when a new collection is created.
 This means users can't create new documents or read, update, and delete existing documents.
diff --git a/src/routes/docs/products/databases/databases/+page.markdoc b/src/routes/docs/products/databases/databases/+page.markdoc
index a24cebefbbe..f9f41866b27 100644
--- a/src/routes/docs/products/databases/databases/+page.markdoc
+++ b/src/routes/docs/products/databases/databases/+page.markdoc
@@ -7,13 +7,13 @@ Databases are the largest organizational unit in Appwrite.
 Each database contains a group [collections](/docs/products/databases/collections).
 In future versions, different databases may be backed by a different database technology of your choosing.
 
-# Create in Console {% #create-in-console %}
+# Create in Appwrite Console {% #create-in-console %}
 The easiest way to create a database using the Appwrite Console.
 You can create a database by navigating to the **Databases** page and clicking **Create database**.
 
 
 
-# Create using Server SDKs {% #create-using-server-sdks %}
+# Create using server SDKs {% #create-using-server-sdks %}
 You can programmatically create databases using a [Server SDK](/docs/sdks#server). Appwrite [Server SDKs](/docs/sdks#server) require an [API key](/docs/advanced/platform/api-keys).
 
 {% multicode %}
diff --git a/src/routes/docs/products/databases/relationships/+page.markdoc b/src/routes/docs/products/databases/relationships/+page.markdoc
index 7f403968f69..217d77f7b50 100644
--- a/src/routes/docs/products/databases/relationships/+page.markdoc
+++ b/src/routes/docs/products/databases/relationships/+page.markdoc
@@ -13,7 +13,7 @@ These types of association between entities can be modeled in Appwrite using rel
 Appwrite Relationships is an experimental feature. The API and behavior are subject to change in future versions.
 {% /info %}
 
-# Relationship Attributes {% #relationship-attributes %}
+# Relationship attributes {% #relationship-attributes %}
 
 Relationships are represented in a collection using **relationship attributes**. 
 The relationship attribute contains the ID of related documents, which it references during read, update, and delete operations. 
@@ -512,7 +512,7 @@ databases.createDocument(
 # Queries {% #queries %}
 Queries are currently not available in the experimental version of Appwrite Relationships but will be added in a later version.
 
-# Update Relationships {% #update %}
+# Update relationships {% #update %}
 Relationships can be updated by updating the relationship attribute.
 
 {% multicode %}
diff --git a/src/routes/docs/products/functions/deployment/+page.markdoc b/src/routes/docs/products/functions/deployment/+page.markdoc
index 1abd0cec8fc..98f1d6581f1 100644
--- a/src/routes/docs/products/functions/deployment/+page.markdoc
+++ b/src/routes/docs/products/functions/deployment/+page.markdoc
@@ -21,7 +21,7 @@ The recommended way to manage your Appwrite Function deployments is to use a ver
 
 ## Create function  {% #create-function %} 
 
-Before deploying your function with Git, create a new function attached to your Git repo.
+Before deploying your function with Git, create a new function attached to your Git repository.
 
 1. Navigate to **Functions** from the side bar of the Appwrite Console.
 2. Click **Create function**.
@@ -63,7 +63,7 @@ appwrite deploy function
 
 If you made changes in the Appwrite Console that are different from your `appwrite.json`, using the CLI deploy command will overwrite your console changes. Update your `appwrite.json` manually before deploying.
 
-# Manual Deployment {% #manual %} 
+# Manual deployment {% #manual %} 
 
 You can upload your functions to be deployed using the Appwrite Console. The example below shows a simple Node.js function.
 
@@ -113,7 +113,7 @@ To find or add a domain:
 
 DNS records can take up to 48 hours to propagate.
 
-# Debugging Build {% #debugging %} 
+# Debugging build {% #debugging %} 
 
 After deploying a function, you can find the status and build logs in the Appwrite Console.
 
@@ -122,7 +122,7 @@ After deploying a function, you can find the status and build logs in the Appwri
 3. Under the **Deployments** tab, find the status of the current and previous deployments.
 4. Access build logs by clicking the **Build logs** button.
 
-# Redeploy Builds {% #redeploy %} 
+# Redeploy builds {% #redeploy %} 
 
 After updating the configuration, redeploy your function for changes to take effect. You can also redeploy to retry failed builds.
 
diff --git a/src/routes/docs/products/functions/development/+page.markdoc b/src/routes/docs/products/functions/development/+page.markdoc
index 3de8d1f8032..7f5c28ef632 100644
--- a/src/routes/docs/products/functions/development/+page.markdoc
+++ b/src/routes/docs/products/functions/development/+page.markdoc
@@ -420,7 +420,7 @@ You'll find these properties in the context object.
 | req      | Contains request information like method, body, and headers. See full examples [in the request section](#request).                                     |
 | res      | Contains methods to build a response and return information. See full examples [in the response section](#response).                                     |
 | log()    | Method to log information to the Appwrite Console, end users will not be able to see these logs. See full examples [in the logging section](#logging). |
-| error()  | Methoc to log errors to the Appwrite Console, end users will not be able to see these errors. See full examples [in the logging section](#logging).    |
+| error()  | Method to log errors to the Appwrite Console, end users will not be able to see these errors. See full examples [in the logging section](#logging).    |
 
 ### Destructuring assignment {% #destructuring %}
 Some languages, namely JavaScript, support destructuring. 
diff --git a/src/routes/docs/products/functions/quick-start/+page.markdoc b/src/routes/docs/products/functions/quick-start/+page.markdoc
index afff98e8c10..510060d8e8f 100644
--- a/src/routes/docs/products/functions/quick-start/+page.markdoc
+++ b/src/routes/docs/products/functions/quick-start/+page.markdoc
@@ -3,36 +3,40 @@ layout: article
 title: Start with Functions
 description: Get started quickly with Appwrite Functions. Follow a step-by-step guide to create your first serverless function, define triggers, and execute code.
 ---
+
 You can create and execute your first Appwrite Function in minutes.
 
-# Create function {% #create-function %} 
+# Create function {% #create-function %}
 
 Before deploying your function with Git, create a new function attached to your Git repository.
 
 {% only_dark %}
 ![Create function screen](/images/docs/functions/quick-start/dark/create-function.png)
 {% /only_dark %}
+
 {% only_light %}
 ![Create function screen](/images/docs/functions/quick-start/create-function.png)
 {% /only_light %}
 
 1. In the Appwrite Console's sidebar, click **Functions**.
-2. Click **Create function**.
-3. Under **Connect Git repository**, select your provider.
-4. After connecting to GitHub, under **Quick start**, select a starter template.
-5. Follow the step-by-step wizard and create the function.
-6. The function will be created and a build will begin. Once the build completes, you'll have created your first function.
+1. Click **Create function**.
+1. Under **Connect Git repository**, select your provider.
+1. After connecting to GitHub, under **Quick start**, select a starter template.
+1. Follow the step-by-step wizard and create the function.
+1. The function will be created and a build will begin. Once the build completes, you'll have created your first function.
+
+You can find the code used by the starter template in your newly created Git repository.
+Each push to your Git repository will trigger a new deployment.
 
-You can find the code used by the starter template in your newly created Git repository. 
-Each push to your Git repo will trigger a new deployment.
+## Execute {% #execute %}
 
-## Execute {% #execute %} 
 You can execute your Appwrite Function through [many different triggers](/docs/products/functions/execution).
 The easiest way to execute your first function is to use the Appwrite Console.
 
 {% only_dark %}
 ![Execution-screen](/images/docs/functions/quick-start/dark/function-execution.png)
 {% /only_dark %}
+
 {% only_light %}
 ![Execution-screen](/images/docs/functions/quick-start/function-execution.png)
 {% /only_light %}
@@ -42,16 +46,16 @@ The easiest way to execute your first function is to use the Appwrite Console.
 1. Click **Execute** to execute the starter template function.
 1. Wait for the execution to be marked **completed** and click to view the execution logs.
 
-
 # Explore {% #explore %}
+
 Use this your first function as a springboard to explore the flexible and powerful features of Appwrite Functions.
 
-| Explore                                                                 |                                                    |
-|-------------------------------------------------------------------------|----------------------------------------------------|
-| [Develop](/docs/products/functions/development)                | Learn about how to parse request, build responses, and log to Console in Appwrite Functions. |
-| [Response](/docs/products/functions/development#response)       | Learn about function response types, like text, json, html, redirect, and empty responses.|
-| [Deploy](/docs/products/functions/deployment)                | Learn to deploy Appwrite Functions from Git, the CLI, or manual uploads. |
-| [Execute](/docs/products/functions/execution)            | Appwrite functions can be executed in a variety of ways, like SDK, domains, schedules, events, and more. Learn about executions.  |
-| [Domains](/docs/products/functions/execution#domains)       | Each Appwrite Function can be executed through it's own domain, generated or custom. Learn about domains.  |
-| [Runtime](/docs/products/functions/runtimes)            | Appwrite supports over a dozen runtimes to meet your preferences. Learn about runtimes.  |
-| [Examples](/docs/products/functions/examples)            | Enjoy learning from examples? Checkout these examples functions.  |
+| Explore                                                                                                                          |                                                                                                                                  |
+| -------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------- |
+| [Develop](/docs/products/functions/development)                                                                                  | Learn about how to parse request, build responses, and log to Console in Appwrite Functions.                                     |
+| [Response](/docs/products/functions/development#response)                                                                        | Learn about function response types, like text, JSON, HTML, redirect, and empty responses.                                       |
+| [Deploy](/docs/products/functions/deployment)                                                                                    | Learn to deploy Appwrite Functions from Git, the CLI, or manual uploads.                                                         |
+| [Execute](/docs/products/functions/execution)                                                                                    | Appwrite functions can be executed in a variety of ways, like SDK, domains, schedules, events, and more. Learn about executions. |
+| [Domains](/docs/products/functions/execution#domains)                                                                            | Each Appwrite Function can be executed through it's own domain, generated or custom. Learn about domains.                        |
+| [Runtime](/docs/products/functions/runtimes)                                                                                     | Appwrite supports over a dozen runtimes to meet your preferences. Learn about runtimes.                                          |
+| [Examples](/docs/products/functions/examples)                                                                                    | Enjoy learning from examples? Checkout these examples functions.                                                                 |
diff --git a/src/routes/docs/products/storage/buckets/+page.markdoc b/src/routes/docs/products/storage/buckets/+page.markdoc
index aefb8d40821..1f750dcda25 100644
--- a/src/routes/docs/products/storage/buckets/+page.markdoc
+++ b/src/routes/docs/products/storage/buckets/+page.markdoc
@@ -7,7 +7,7 @@ description: Organize and manage your files effectively with Appwrite Storage Bu
 Storage buckets are a group of files, similar to collections in Appwrite Databases.
 Buckets let you limit file size and extensions, whether or not to encrypt the files, and more. 
 
-# Create Bucket {% #create-bucket %}
+# Create bucket {% #create-bucket %}
 You can create your bucket from the Appwrite Console or a [Server SDK](/docs/sdks#server). 
 
 {% tabs %}
@@ -224,14 +224,14 @@ You can also configure permission, file size and extension restrictions, and mor
 # Permissions {% #permissions %}
 Appwrite uses permissions to control file access.
 For security, only users that are granted permissions can access a file. 
-This helps prevent accidental data leaks by forcing you to make more concious decisions around permissions.
+This helps prevent accidental data leaks by forcing you to make more conscious decisions around permissions.
 
 By default, Appwrite doesn't grants permissions to any users when a new bucket is created.
 This means users can't create new files or read, update, and delete existing files.
 
 [Learn about configuring permissions](/docs/products/storage/permissions).
 
-# Encrption {% #encryption %}
+# Encryption {% #encryption %}
 Appwrite provides added security settings for your buckets. Enable encryption under your bucket's **Settings** > **Security settings**.
 You can enable encryption to encrypt files in your buckets. If your files are leaked, encrypted files cannot be read by the malicious actor.
 Files bigger than 20MB cannot be encrypted.
diff --git a/src/routes/docs/products/storage/upload-download/+page.markdoc b/src/routes/docs/products/storage/upload-download/+page.markdoc
index 7131a8e2d4e..deb84474342 100644
--- a/src/routes/docs/products/storage/upload-download/+page.markdoc
+++ b/src/routes/docs/products/storage/upload-download/+page.markdoc
@@ -127,7 +127,7 @@ When you are trying to upload any files above 5MB, you will need to upload them
 If you're using an Appwrite SDK, this is handled automatically. 
 If you're not using an SDK, you can [learn more about REST API file handling](/docs/apis/rest#files).
 
-# InputFile {% #input-file %}
+# Input file {% #input-file %}
 Every language and platform handles file inputs differently. This section documents the expected input type of each SDK. Where applicable, Appwrite provides an `InputFile` class to accept multiple file sources, like paths, buffers, streams, or plain text.
 
 # Client SDKs {% #client-sdks %}
@@ -489,7 +489,7 @@ class MainActivity : AppCompatActivity() {
 ```
 {% /multicode %}
 
-# Get File {% #get-file %}
+# Get file {% #get-file %}
 To get a file, use the `getFile` method.
 
 {% multicode %}
@@ -598,7 +598,7 @@ class MainActivity : AppCompatActivity() {
 ```
 {% /multicode %}
 
-# Get File Preview {% #get-file-preview %}
+# Get file preview {% #get-file-preview %}
 To get a file preview image , use the `getFilePreview` method.
 
 {% multicode %}
@@ -703,7 +703,7 @@ class MainActivity : AppCompatActivity() {
 ```
 {% /multicode %}
 
-# View File {% #view-file%}
+# View file {% #view-file%}
 
 To view a file, use the `getFileView` method.
 
diff --git a/src/routes/docs/quick-starts/android/+page.markdoc b/src/routes/docs/quick-starts/android/+page.markdoc
index 35b2b9ccb7d..97d6f72901d 100644
--- a/src/routes/docs/quick-starts/android/+page.markdoc
+++ b/src/routes/docs/quick-starts/android/+page.markdoc
@@ -32,7 +32,7 @@ If this is your first time using Appwrite, create an account and create your fir
 
 Then, under **Add a platform**, add an **Android app**.
 
-Add your app's **name** and **package name**, your package name is the one entered when creating an Android project. For existing projects, you should use the **applicationId** in your app-level [build.gradle](https://github.com/appwrite/playground-for-android/blob/master/app/build.gradle#L11) file.
+Add your app's **name** and **package name**, your package name is the one entered when creating an Android project. For existing projects, you should use the `applicationId` in your app-level [build.gradle](https://github.com/appwrite/playground-for-android/blob/master/app/build.gradle#L11) file.
 
 {% only_dark %}
 ![Add a platform](/images/docs/quick-starts/dark/add-platform.png)
@@ -46,7 +46,7 @@ You can skip optional steps.
 {% /section %}
 
 {% section #step-3 step=3 title="Add the Appwrite SDK" %}
-To add the Appwrite SDK for Android as a dependency, add the following to your app-level **build.gradle.kts** file inside the **dependencies** block.
+To add the Appwrite SDK for Android as a dependency, add the following to your app-level `build.gradle.kts` file inside the **dependencies** block.
 
 ```kotlin
 implementation("io.appwrite:sdk-for-android:4.0.0")
diff --git a/src/routes/docs/quick-starts/flutter/+page.markdoc b/src/routes/docs/quick-starts/flutter/+page.markdoc
index 1cd81e991de..681ecef31c3 100644
--- a/src/routes/docs/quick-starts/flutter/+page.markdoc
+++ b/src/routes/docs/quick-starts/flutter/+page.markdoc
@@ -29,13 +29,13 @@ Head to the [Appwrite Console](https://cloud.appwrite.io/console).
 
 If this is your first time using Appwrite, create an account and create your first project.
 
-Then, under **Add a platform**, add a **Flutter app**. You can choose between many different platfroms.
+Then, under **Add a platform**, add a **Flutter app**. You can choose between many different platforms.
 
 {% tabs %}
 {% tabsitem #web title="Web" %}
 Add your app **name** and **Hostname**. If you're testing your app locally, **Hostname** should be `localhost`.
 
-For web, in order to capture the OAuth2 callback URL and send it to the application using JavaScript `postMessage()`, you need to create an html file inside `./web` folder of your Flutter project. For example `auth.html` with the following content.
+For web, in order to capture the OAuth2 callback URL and send it to the application using JavaScript `postMessage()`, you need to create an HTML file inside `./web` folder of your Flutter project. For example `auth.html` with the following content.
 
 ```html
 <!DOCTYPE html>
@@ -63,21 +63,21 @@ In production, Appwrite allows you to set multiple [custom-domains](/docs/advanc
 
 {% tabsitem #ios title="iOS" %}
 
-Add your app **name** and **Bundle ID**. You can find your **Bundle Identifier** in the **General** tab for your app's primary target in XCode.
+Add your app **name** and **Bundle ID**. You can find your **Bundle Identifier** in the **General** tab for your app's primary target in Xcode.
 
 The Appwrite SDK uses `ASWebAuthenticationSession` on iOS 12+ and `SFAuthenticationSession` on iOS 11 to allow OAuth authentication. 
 You have to change your iOS Deployment Target in Xcode to be iOS >= 11 to be able to build your app on an emulator or a real device.
 
-1. In **XCode**, open `Runner.xcworkspace` in your app's iOS folder.
-2. To view your app's settings, select the Runner project in the XCode project navigator. Then, in the main view sidebar, select the **Runner target**.
+1. In **Xcode**, open `Runner.xcworkspace` in your app's iOS folder.
+2. To view your app's settings, select the Runner project in the Xcode project navigator. Then, in the main view sidebar, select the **Runner target**.
 3. Select the **General** tab.
 4. In **Deployment Info** > **Target**, select iOS 11.0 or above
 {% /tabsitem %}
 
 {% tabsitem #android title="Android" %}
-Add your app's **name** and **package name**, Your package name is generally the **applicationId** in your app-level [build.gradle](https://github.com/appwrite/playground-for-flutter/blob/master/android/app/build.gradle#L41) file.
+Add your app's **name** and **package name**, Your package name is generally the `applicationId` in your app-level [build.gradle](https://github.com/appwrite/playground-for-flutter/blob/master/android/app/build.gradle#L41) file.
 
-In order to capture the Appwrite OAuth callback url, the following activity needs to be added inside the `<application>` tag, along side the existing `<activity>` tags in your [AndroidManifest.xml](https://github.com/appwrite/playground-for-flutter/blob/master/android/app/src/main/AndroidManifest.xml). 
+In order to capture the Appwrite OAuth callback URL, the following activity needs to be added inside the `<application>` tag, along side the existing `<activity>` tags in your [AndroidManifest.xml](https://github.com/appwrite/playground-for-flutter/blob/master/android/app/src/main/AndroidManifest.xml). 
 Be sure to replace the **[PROJECT_ID]** string with your actual Appwrite project ID. 
 You can find your Appwrite project ID in you project settings screen in your Appwrite Console.
 
@@ -111,11 +111,11 @@ You should get the application ID needed to add in the received error message.
 
 {% tabsitem #macos title="macOS" %}
 
-Add your app **name** and **Bundle ID**. You can find your **Bundle Identifier** in the **General** tab for your app's primary target in XCode.
+Add your app **name** and **Bundle ID**. You can find your **Bundle Identifier** in the **General** tab for your app's primary target in Xcode.
 
-The Appwrite SDK uses `ASWebAuthenticationSession` on macOS 10.15+ to allow OAuth authentication. You have to change your macOS **Deployment Target** in XCode to be macOS >= 10.15 to be able to build your app for macOS.
+The Appwrite SDK uses `ASWebAuthenticationSession` on macOS 10.15+ to allow OAuth authentication. You have to change your macOS **Deployment Target** in Xcode to be macOS >= 10.15 to be able to build your app for macOS.
 
-In order to capture the Appwrite OAuth 2 callback url, the following URL scheme needs to added to your `Info.plist`.
+In order to capture the Appwrite OAuth2 callback URL, the following URL scheme needs to added to your `Info.plist`.
 
 ```xml
 <key>CFBundleURLTypes</key>
@@ -197,9 +197,10 @@ void main() {
 {% /section %}
 {% section #step-5 step=5 title="Create a login page" %}
 Then, append the following widgets to `lib/main.dart` create your login page.
-import 'package:appwrite/appwrite.dart';
 
 ```dart
+import 'package:appwrite/appwrite.dart';
+
 class MyForm extends StatefulWidget {
   final Account account;
 
diff --git a/src/routes/docs/references/+page.markdoc b/src/routes/docs/references/+page.markdoc
index c7f75eff9dd..14a56231966 100644
--- a/src/routes/docs/references/+page.markdoc
+++ b/src/routes/docs/references/+page.markdoc
@@ -5,7 +5,7 @@ description: Complete API references for Appwrite SDK, REST, and GraphQL APIs. L
 ---
 Appwrite lets you build integrations on web, mobile, native, and server platforms through a set of APIs. You can use one of our many [SDKs](/docs/sdks) or integrate directly through the [REST API](/docs/apis/rest) or [GraphQL API](/docs/apis/graphql).
 
-## Client vs Server APIs {% #client-vs-server %}
+## Client vs server APIs {% #client-vs-server %}
 
 Client APIs and SDKs are for integrating with Appwrite to build client-based applications and websites. 
 Client APIs only give access to resources if users have been [granted permissions](/docs/advanced/platform/permissions).
@@ -28,7 +28,7 @@ Server APIs require [API keys](/docs/advanced/platform/api-keys).
 
 {% cards %}
 {% cards_item href="/docs/references/cloud/client-web/account" title="Account" %}
-Add signup, login, logout, and other common authentication methods to client apps.
+Add sign up, login, logout, and other common authentication methods to client apps.
 {% /cards_item %}
 {% cards_item href="/docs/references/cloud/server-nodejs/users" title="Users" %}
 Manage users from an admin scope to build server integrations.
diff --git a/src/routes/docs/references/[version]/[platform]/[service]/descriptions/locale.md b/src/routes/docs/references/[version]/[platform]/[service]/descriptions/locale.md
index bd373a09388..bcb77802265 100644
--- a/src/routes/docs/references/[version]/[platform]/[service]/descriptions/locale.md
+++ b/src/routes/docs/references/[version]/[platform]/[service]/descriptions/locale.md
@@ -1,3 +1,3 @@
 The Locale service allows you to customize your app based on your users' location. Using this service, you can get your users' location, IP address, list of countries and continents names, phone codes, currencies, and more. Country codes returned follow the [ISO 3166-1](https://en.wikipedia.org/wiki/ISO_3166-1) standard.
 
-The user service supports multiple locales. This feature allows you to fetch countries and continents information in your app language. To switch locales, all you need to do is pass the 'X-Appwrite-Locale' header or set the 'setLocale' method using any of our available SDKs. [View here the list of available locales](https://github.com/appwrite/appwrite/blob/master/app/config/locale/codes.php).
+The user service supports multiple locales. This feature allows you to fetch countries and continents information in your app language. To switch locales, all you need to do is pass the `X-Appwrite-Locale` header or set the `setLocale` method using any of our available SDKs. [View here the list of available locales](https://github.com/appwrite/appwrite/blob/master/app/config/locale/codes.php).
diff --git a/src/routes/docs/sdks/+page.markdoc b/src/routes/docs/sdks/+page.markdoc
index dd3ae43ed98..9d015b644d3 100644
--- a/src/routes/docs/sdks/+page.markdoc
+++ b/src/routes/docs/sdks/+page.markdoc
@@ -15,7 +15,7 @@ Client libraries for integrating with Appwrite to build client-based application
 {% table %}
 * &nbsp; {% width=48 %}
 * Platform
-* GitHub Repository
+* GitHub repository
 * &nbsp; {% width=80 %}
 ---
 * {% only_dark %}{% icon_image src="/images/platforms/dark/javascript.svg" alt="Javascript logo" size="m" /%}{% /only_dark %}
@@ -50,7 +50,7 @@ Server libraries for integrating with Appwrite to build server side integrations
 {% table %}
 * &nbsp; {% width=48 %}
 * Platform
-* GitHub Repository
+* GitHub repository
 * &nbsp; {% width=80 %}
 ---
 * {% only_dark %}{% icon_image src="/images/platforms/dark/nodejs.svg" alt="Node.js logo" size="m" /%}{% /only_dark %}
diff --git a/src/routes/docs/tooling/command-line/deployment/+page.markdoc b/src/routes/docs/tooling/command-line/deployment/+page.markdoc
index 7954563056e..ef825e481dc 100644
--- a/src/routes/docs/tooling/command-line/deployment/+page.markdoc
+++ b/src/routes/docs/tooling/command-line/deployment/+page.markdoc
@@ -28,7 +28,7 @@ You can fetch all the existing teams in your current project using:
 appwrite init team
 ```
 
-# Deploying Functions {% #deploying-function %}
+# Deploying functions {% #deploying-function %}
 
 The CLI also handles the creation and deployment of Appwrite Functions. Run this command in the folder holding your `appwrite.json` file.
 
@@ -50,7 +50,7 @@ appwrite deploy function
 ✓ Success Deployed Awesome Function ( 621229798628cf5bf712 )
 ```
 
-# Deploying Collections {% #deploying-collections %}
+# Deploying collections {% #deploying-collections %}
 
 The Appwrite CLI also helps you deploy your project's databases and collections schema from one project to another.
 
@@ -62,7 +62,7 @@ The deploy command will overwrite existing collections causing existing data to
 appwrite deploy collection
 ```
 
-# Deploying Teams {% #deploying-teams %}
+# Deploying teams {% #deploying-teams %}
 
 The Appwrite CLI can create teams to organize users. Teams can be used to grant access permissions to a group of users. Learn more about permissions.
 
@@ -72,7 +72,7 @@ Deploy teams by running this command in the folder holding your `appwrite.json`
 appwrite deploy team
 ```
 
-# Deploying Storage {% #deploying-storage %}
+# Deploying storage {% #deploying-storage %}
 
 The Appwrite CLI allows you to configure and deploy buckets across projects. All the bucket's settings are available through the [appwrite.json](/docs/tooling/command-line/deployment#appwrite-json) file.
 
diff --git a/src/routes/docs/tutorials/react/step-5/+page.markdoc b/src/routes/docs/tutorials/react/step-5/+page.markdoc
index c834cef653e..ca39202336c 100644
--- a/src/routes/docs/tutorials/react/step-5/+page.markdoc
+++ b/src/routes/docs/tutorials/react/step-5/+page.markdoc
@@ -9,7 +9,7 @@ In our app we want to have a navigation bar that is always visible. We will add
 - a logout button if the user is logged in.
 - a login button if the user is not logged in.
 
-Update the App componenent in `src/App.jsx`:
+Update the App component in `src/App.jsx`:
 
 ```js
 import { Login } from "./pages/Login";
@@ -22,7 +22,7 @@ function App() {
   return (
     <div>
       <UserProvider>
-        <Navbar /> {/* Add the navbar before page content */}
+        <Navbar /> {/* Add the navigation bar before page content */}
         <main>{isLoginPage ? <Login /> : <Home />}</main>
       </UserProvider>
     </div>
diff --git a/src/routes/docs/tutorials/react/step-6/+page.markdoc b/src/routes/docs/tutorials/react/step-6/+page.markdoc
index e90a9ed455b..5804ba0d29a 100644
--- a/src/routes/docs/tutorials/react/step-6/+page.markdoc
+++ b/src/routes/docs/tutorials/react/step-6/+page.markdoc
@@ -4,22 +4,26 @@ title: Add database
 description: Add a database to your React application using Appwrite Web SDK.
 step: 6
 ---
+
 # Create collection {% #create-collection %}
+
 In Appwrite, data is stored as a collection of documents. Create a collection in the [Appwrite Console](https://cloud.appwrite.io/) to store our ideas.
 
 {% only_dark %}
 ![Create project screen](/images/docs/tutorials/dark/idea-tracker-collection.png)
 {% /only_dark %}
+
 {% only_light %}
 ![Create project screen](/images/docs/tutorials/idea-tracker-collection.png)
 {% /only_light %}
 
 Create a new collection with the following attributes:
-| Field       | Type   | Required |
-|-------------|--------|----------|
-| userId      | String | Yes      |
-| title       | String | Yes      |
-| description | String | No       |
+
+| Field         | Type          | Required      |
+| ------------- | ------------- | ------------- |
+| `userId`      | String        | Yes           |
+| `title`       | String        | Yes           |
+| `description` | String        | No            |
 
 # Ideas context {% #ideas-context %}
 
@@ -79,4 +83,3 @@ export function IdeasProvider(props) {
   );
 }
 ```
-
diff --git a/src/routes/docs/tutorials/sveltekit/step-5/+page.markdoc b/src/routes/docs/tutorials/sveltekit/step-5/+page.markdoc
index f8d17f271a9..ce0bce035c9 100644
--- a/src/routes/docs/tutorials/sveltekit/step-5/+page.markdoc
+++ b/src/routes/docs/tutorials/sveltekit/step-5/+page.markdoc
@@ -5,7 +5,7 @@ description: Add navigation to your SvelteKit application with Appwrite authenti
 step: 5
 ---
 
-Create a layout component, used by all pages, to display a navbar. The navbar will show a login button if the user is not logged in, and a logout button if the user is logged in.
+Create a layout component, used by all pages, to display a navigation bar. The navigation bar will show a login button if the user is not logged in, and a logout button if the user is logged in.
 
 In this component, we can call our `user.init()` function to check if the user is logged in when the page loads.
 
diff --git a/src/routes/docs/tutorials/sveltekit/step-6/+page.markdoc b/src/routes/docs/tutorials/sveltekit/step-6/+page.markdoc
index a7343065452..a6159ba08d7 100644
--- a/src/routes/docs/tutorials/sveltekit/step-6/+page.markdoc
+++ b/src/routes/docs/tutorials/sveltekit/step-6/+page.markdoc
@@ -4,24 +4,29 @@ title: Add database
 description: Add databases and queries to store user data in you SvelteKit project.
 step: 6
 ---
+
 # Create collection {% #create-collection %}
+
 In Appwrite, data is stored as a collection of documents. Create a collection in the [Appwrite Console](https://cloud.appwrite.io/) to store our ideas.
 
 {% only_dark %}
 ![Create project screen](/images/docs/tutorials/dark/idea-tracker-collection.png)
 {% /only_dark %}
+
 {% only_light %}
 ![Create project screen](/images/docs/tutorials/idea-tracker-collection.png)
 {% /only_light %}
 
 Create a new collection with the following attributes:
-| Field       | Type   | Required |
-|-------------|--------|----------|
-| userId      | String | Yes      |
-| title       | String | Yes      |
-| description | String | No       |
+
+| Field         | Type          | Required      |
+| ------------- | ------------- | ------------- |
+| `userId`      | String        | Yes           |
+| `title`       | String        | Yes           |
+| `description` | String        | No            |
 
 # Add and remove methods {% #add-and-remove-methods %}
+
 Now that you have a collection to hold ideas, we can read and write to it from our app.
 Create a new file `src/lib/stores/ideas.js` and add the following code to it.
 
@@ -74,4 +79,4 @@ export const ideas = {
 };
 ```
 
-Remember to use a store to hold data returned from Appwrite Databases, so your components can be updated when the data changes.
\ No newline at end of file
+Remember to use a store to hold data returned from Appwrite Databases, so your components can be updated when the data changes.
diff --git a/src/routes/docs/tutorials/vue/step-5/+page.markdoc b/src/routes/docs/tutorials/vue/step-5/+page.markdoc
index 9d708785900..b2781d3d442 100644
--- a/src/routes/docs/tutorials/vue/step-5/+page.markdoc
+++ b/src/routes/docs/tutorials/vue/step-5/+page.markdoc
@@ -9,7 +9,7 @@ In our app we want to have a navigation bar that is always visible. Use the `use
 - a logout button if the user is logged in.
 - a login button if the user is not logged in.
 
-Update the App componenent in `src/App.vue`:
+Update the App component in `src/App.vue`:
 
 ```vue
 <script setup>
diff --git a/src/routes/docs/tutorials/vue/step-6/+page.markdoc b/src/routes/docs/tutorials/vue/step-6/+page.markdoc
index a646b240683..ceefdfdc168 100644
--- a/src/routes/docs/tutorials/vue/step-6/+page.markdoc
+++ b/src/routes/docs/tutorials/vue/step-6/+page.markdoc
@@ -4,22 +4,26 @@ title: Add database
 description: Add data storage to your Vue.js project powered by Appwrite Cloud databases.
 step: 6
 ---
+
 # Create collection {% #create-collection %}
+
 In Appwrite, data is stored as a collection of documents. Create a collection in the [Appwrite Console](https://cloud.appwrite.io/) to store our ideas.
 
 {% only_dark %}
 ![Create project screen](/images/docs/tutorials/dark/idea-tracker-collection.png)
 {% /only_dark %}
+
 {% only_light %}
 ![Create project screen](/images/docs/tutorials/idea-tracker-collection.png)
 {% /only_light %}
 
 Create a new collection with the following attributes:
-| Field       | Type   | Required |
-|-------------|--------|----------|
-| userId      | String | Yes      |
-| title       | String | Yes      |
-| description | String | No       |
+
+| Field         | Type          | Required      |
+| ------------- | ------------- | ------------- |
+| `userId`      | String        | Yes           |
+| `title`       | String        | Yes           |
+| `description` | String        | No            |
 
 # Ideas context {% #ideas-context %}
 
