diff --git a/app/pages/@[org].vue b/app/pages/@[org].vue
index b4b79fa889..7194f37517 100644
--- a/app/pages/@[org].vue
+++ b/app/pages/@[org].vue
@@ -1,7 +1,7 @@
 <script setup lang="ts">
 import type { FilterChip, SortOption } from '#shared/types/preferences'
-import { debounce } from 'perfect-debounce'
 import { normalizeSearchParam } from '#shared/utils/url'
+import { debounce } from 'perfect-debounce'
 
 definePageMeta({
   name: 'org',
@@ -131,7 +131,11 @@ useHead({
 
 useSeoMeta({
   title: () => `@${orgName.value} - npmx`,
+  ogTitle: () => `@${orgName.value} - npmx`,
+  twitterTitle: () => `@${orgName.value} - npmx`,
   description: () => `npm packages published by the ${orgName.value} organization`,
+  ogDescription: () => `npm packages published by the ${orgName.value} organization`,
+  twitterDescription: () => `npm packages published by the ${orgName.value} organization`,
 })
 
 defineOgImageComponent('Default', {
diff --git a/app/pages/about.vue b/app/pages/about.vue
index 8c1326b4f5..be1032d073 100644
--- a/app/pages/about.vue
+++ b/app/pages/about.vue
@@ -9,7 +9,11 @@ interface GitHubContributor {
 
 useSeoMeta({
   title: () => `${$t('about.title')} - npmx`,
+  ogTitle: () => `${$t('about.title')} - npmx`,
+  twitterTitle: () => `${$t('about.title')} - npmx`,
   description: () => $t('about.meta_description'),
+  ogDescription: () => $t('about.meta_description'),
+  twitterDescription: () => $t('about.meta_description'),
 })
 
 defineOgImageComponent('Default', {
diff --git a/app/pages/compare.vue b/app/pages/compare.vue
index 61bbe0e05b..2513ad960e 100644
--- a/app/pages/compare.vue
+++ b/app/pages/compare.vue
@@ -50,10 +50,26 @@ useSeoMeta({
     packages.value.length > 0
       ? $t('compare.packages.meta_title', { packages: packages.value.join(' vs ') })
       : $t('compare.packages.meta_title_empty'),
+  ogTitle: () =>
+    packages.value.length > 0
+      ? $t('compare.packages.meta_title', { packages: packages.value.join(' vs ') })
+      : $t('compare.packages.meta_title_empty'),
+  twitterTitle: () =>
+    packages.value.length > 0
+      ? $t('compare.packages.meta_title', { packages: packages.value.join(' vs ') })
+      : $t('compare.packages.meta_title_empty'),
   description: () =>
     packages.value.length > 0
       ? $t('compare.packages.meta_description', { packages: packages.value.join(', ') })
       : $t('compare.packages.meta_description_empty'),
+  ogDescription: () =>
+    packages.value.length > 0
+      ? $t('compare.packages.meta_description', { packages: packages.value.join(', ') })
+      : $t('compare.packages.meta_description_empty'),
+  twitterDescription: () =>
+    packages.value.length > 0
+      ? $t('compare.packages.meta_description', { packages: packages.value.join(', ') })
+      : $t('compare.packages.meta_description_empty'),
 })
 </script>
 
diff --git a/app/pages/index.vue b/app/pages/index.vue
index b422abc9dc..01284293c3 100644
--- a/app/pages/index.vue
+++ b/app/pages/index.vue
@@ -27,7 +27,6 @@ useSeoMeta({
   title: () => $t('seo.home.title'),
   ogTitle: () => $t('seo.home.title'),
   twitterTitle: () => $t('seo.home.title'),
-  twitterCard: 'summary_large_image',
   description: () => $t('seo.home.description'),
   ogDescription: () => $t('seo.home.description'),
   twitterDescription: () => $t('seo.home.description'),
diff --git a/app/pages/package-code/[...path].vue b/app/pages/package-code/[...path].vue
index 5248fabe34..cd32c86c23 100644
--- a/app/pages/package-code/[...path].vue
+++ b/app/pages/package-code/[...path].vue
@@ -283,7 +283,21 @@ useSeoMeta({
     }
     return `Code - ${packageName.value}@${version.value} - npmx`
   },
+  ogTitle: () => {
+    if (filePath.value) {
+      return `${filePath.value} - ${packageName.value}@${version.value} - npmx`
+    }
+    return `Code - ${packageName.value}@${version.value} - npmx`
+  },
+  twitterTitle: () => {
+    if (filePath.value) {
+      return `${filePath.value} - ${packageName.value}@${version.value} - npmx`
+    }
+    return `Code - ${packageName.value}@${version.value} - npmx`
+  },
   description: () => `Browse source code for ${packageName.value}@${version.value}`,
+  ogDescription: () => `Browse source code for ${packageName.value}@${version.value}`,
+  twitterDescription: () => `Browse source code for ${packageName.value}@${version.value}`,
 })
 
 defineOgImageComponent('Default', {
diff --git a/app/pages/package-docs/[...path].vue b/app/pages/package-docs/[...path].vue
index 3d8f4c07e7..bc16154ea7 100644
--- a/app/pages/package-docs/[...path].vue
+++ b/app/pages/package-docs/[...path].vue
@@ -95,6 +95,11 @@ const pageTitle = computed(() => {
 
 useSeoMeta({
   title: () => pageTitle.value,
+  ogTitle: () => pageTitle.value,
+  twitterTitle: () => pageTitle.value,
+  description: () => pkg.value?.license ?? '',
+  ogDescription: () => pkg.value?.license ?? '',
+  twitterDescription: () => pkg.value?.license ?? '',
 })
 
 defineOgImageComponent('Default', {
diff --git a/app/pages/package/[...package].vue b/app/pages/package/[...package].vue
index cf9f21d0de..c3df7e2f41 100644
--- a/app/pages/package/[...package].vue
+++ b/app/pages/package/[...package].vue
@@ -443,7 +443,11 @@ useHead({
 
 useSeoMeta({
   title: () => (pkg.value?.name ? `${pkg.value.name} - npmx` : 'Package - npmx'),
+  ogTitle: () => (pkg.value?.name ? `${pkg.value.name} - npmx` : 'Package - npmx'),
+  twitterTitle: () => (pkg.value?.name ? `${pkg.value.name} - npmx` : 'Package - npmx'),
   description: () => pkg.value?.description ?? '',
+  ogDescription: () => pkg.value?.description ?? '',
+  twitterDescription: () => pkg.value?.description ?? '',
 })
 
 onKeyStroke(
diff --git a/app/pages/search.vue b/app/pages/search.vue
index 046ce95f9c..e01985bfe4 100644
--- a/app/pages/search.vue
+++ b/app/pages/search.vue
@@ -583,10 +583,22 @@ onKeyDown(['ArrowDown', 'ArrowUp', 'Enter'], handleResultsKeydown)
 useSeoMeta({
   title: () =>
     `${query.value ? $t('search.title_search', { search: query.value }) : $t('search.title_packages')} - npmx`,
+  ogTitle: () =>
+    `${query.value ? $t('search.title_search', { search: query.value }) : $t('search.title_packages')} - npmx`,
+  twitterTitle: () =>
+    `${query.value ? $t('search.title_search', { search: query.value }) : $t('search.title_packages')} - npmx`,
   description: () =>
     query.value
       ? $t('search.meta_description', { search: query.value })
       : $t('search.meta_description_packages'),
+  ogDescription: () =>
+    query.value
+      ? $t('search.meta_description', { search: query.value })
+      : $t('search.meta_description_packages'),
+  twitterDescription: () =>
+    query.value
+      ? $t('search.meta_description', { search: query.value })
+      : $t('search.meta_description_packages'),
 })
 
 defineOgImageComponent('Default', {
diff --git a/app/pages/settings.vue b/app/pages/settings.vue
index 91211c50b0..de75f63ad6 100644
--- a/app/pages/settings.vue
+++ b/app/pages/settings.vue
@@ -20,7 +20,11 @@ onKeyStroke(
 
 useSeoMeta({
   title: () => `${$t('settings.title')} - npmx`,
+  ogTitle: () => `${$t('settings.title')} - npmx`,
+  twitterTitle: () => `${$t('settings.title')} - npmx`,
   description: () => $t('settings.meta_description'),
+  ogDescription: () => $t('settings.meta_description'),
+  twitterDescription: () => $t('settings.meta_description'),
 })
 
 defineOgImageComponent('Default', {
diff --git a/app/pages/~[username]/index.vue b/app/pages/~[username]/index.vue
index 7139d5cda3..224d24f414 100644
--- a/app/pages/~[username]/index.vue
+++ b/app/pages/~[username]/index.vue
@@ -163,7 +163,11 @@ watch(username, () => {
 
 useSeoMeta({
   title: () => `~${username.value} - npmx`,
+  ogTitle: () => `~${username.value} - npmx`,
+  twitterTitle: () => `~${username.value} - npmx`,
   description: () => `npm packages maintained by ${username.value}`,
+  ogDescription: () => `npm packages maintained by ${username.value}`,
+  twitterDescription: () => `npm packages maintained by ${username.value}`,
 })
 
 defineOgImageComponent('Default', {
diff --git a/app/pages/~[username]/orgs.vue b/app/pages/~[username]/orgs.vue
index 5cad2bba46..6a1654ceb7 100644
--- a/app/pages/~[username]/orgs.vue
+++ b/app/pages/~[username]/orgs.vue
@@ -99,7 +99,11 @@ function getRoleBadgeClass(role: string | null): string {
 
 useSeoMeta({
   title: () => `@${username.value} Organizations - npmx`,
+  ogTitle: () => `@${username.value} Organizations - npmx`,
+  twitterTitle: () => `@${username.value} Organizations - npmx`,
   description: () => `npm organizations for ${username.value}`,
+  ogDescription: () => `npm organizations for ${username.value}`,
+  twitterDescription: () => `npm organizations for ${username.value}`,
 })
 
 defineOgImageComponent('Default', {
diff --git a/nuxt.config.ts b/nuxt.config.ts
index 68bf20c6b5..778509b985 100644
--- a/nuxt.config.ts
+++ b/nuxt.config.ts
@@ -68,6 +68,7 @@ export default defineNuxtConfig({
           href: '/opensearch.xml',
         },
       ],
+      meta: [{ name: 'twitter:card', content: 'summary_large_image' }],
     },
   },
 
