diff --git a/layouts/default.vue b/layouts/default.vue
index 4ae2ad029..b474b1afd 100644
--- a/layouts/default.vue
+++ b/layouts/default.vue
@@ -391,7 +391,6 @@ const config = useRuntimeConfig()
const route = useRoute()
const link = config.public.siteUrl + route.path.replace(/\/+$/, '')
useHead({
- meta: [{ name: 'og:url', content: link }],
link: [
{
rel: 'canonical',
@@ -400,6 +399,34 @@ useHead({
],
})
+const description =
+ 'Download Minecraft mods, plugins, datapacks, shaders, resourcepacks, and modpacks on Modrinth. ' +
+ 'Discover and publish projects on Modrinth with a modern, easy to use interface and API.'
+
+useSeoMeta({
+ title: 'Modrinth',
+ description,
+ publisher: 'Rinth, Inc.',
+ themeColor: [
+ { color: '#1bd96a', media: '(prefers-color-scheme:no-preference)' },
+ { color: '#1bd96a', media: '(prefers-color-scheme:dark)' },
+ { color: '#00af5c', media: '(prefers-color-scheme:light)' },
+ ],
+ colorScheme: 'dark light',
+
+ // OpenGraph
+ ogTitle: 'Modrinth',
+ ogSiteName: 'Modrinth',
+ ogDescription: description,
+ ogType: 'website',
+ ogImage: 'https://cdn.modrinth.com/modrinth-new.png',
+ ogUrl: link,
+
+ // Twitter
+ twitterCard: 'summary',
+ twitterSite: '@modrinth',
+})
+
let developerModeCounter = 0
function developerModeIncrement() {
diff --git a/nuxt.config.ts b/nuxt.config.ts
index b163cc14c..d1162404e 100644
--- a/nuxt.config.ts
+++ b/nuxt.config.ts
@@ -22,25 +22,6 @@ const favicons = {
'(prefers-color-scheme:dark)': '/favicon.ico',
}
-const meta = {
- description:
- 'Download Minecraft mods, plugins, datapacks, shaders, resourcepacks, and modpacks on Modrinth. Discover and publish projects on Modrinth with a modern, easy to use interface and API.',
- publisher: 'Rinth, Inc.',
- 'apple-mobile-web-app-title': 'Modrinth',
- 'theme-color': '#1bd96a',
- 'color-scheme': 'dark light',
- // OpenGraph
- 'og:title': 'Modrinth',
- 'og:site_name': 'Modrinth',
- 'og:description': 'An open source modding platform',
- 'og:type': 'website',
- 'og:url': 'https://modrinth.com',
- 'og:image': 'https://cdn.modrinth.com/modrinth-new.png?',
- // Twitter
- 'twitter:card': 'summary',
- 'twitter:site': '@modrinth',
-}
-
/**
* Tags of locales that are auto-discovered besides the default locale.
*
@@ -70,9 +51,6 @@ export default defineNuxtConfig({
lang: 'en',
},
title: 'Modrinth',
- meta: Object.entries(meta).map(([name, content]): object => {
- return { name, content }
- }),
link: [
// The type is necessary because the linter can't always compare this very nested/complex type on itself
...preloadedFonts.map((font): object => {
diff --git a/pages/[type]/[id].vue b/pages/[type]/[id].vue
index c9accfa3e..c978a8896 100644
--- a/pages/[type]/[id].vue
+++ b/pages/[type]/[id].vue
@@ -125,31 +125,6 @@
-
-
{{ project.title }} - Minecraft {{ projectTypeDisplay }}
-
-
-
-
-
-
-
@@ -878,11 +853,6 @@ featuredVersions.value.sort((a, b) => {
return gameVersions.indexOf(aLatest) - gameVersions.indexOf(bLatest)
})
-const projectTypeDisplay = computed(() =>
- data.$formatProjectType(
- data.$getProjectTypeForDisplay(project.value.project_type, project.value.loaders)
- )
-)
const licenseIdDisplay = computed(() => {
const id = project.value.license.id
@@ -896,6 +866,28 @@ const licenseIdDisplay = computed(() => {
})
const featuredGalleryImage = computed(() => project.value.gallery.find((img) => img.featured))
+const projectTypeDisplay = data.$formatProjectType(
+ data.$getProjectTypeForDisplay(project.value.project_type, project.value.loaders)
+)
+const title = `${project.value.title} - Minecraft ${projectTypeDisplay}`
+const description = `${project.value.description} - Download the Minecraft ${projectTypeDisplay} ${
+ project.value.title
+} by ${members.value.find((x) => x.role === 'Owner').user.username} on Modrinth`
+
+if (!route.name.startsWith('type-id-settings')) {
+ useSeoMeta({
+ title,
+ description,
+ ogTitle: title,
+ ogDescription: project.value.description,
+ ogImage: project.value.icon_url ?? 'https://cdn.modrinth.com/placeholder.png',
+ robots:
+ project.value.status === 'approved' || project.value.status === 'archived'
+ ? 'all'
+ : 'noindex',
+ })
+}
+
async function resetProject() {
const newProject = await useBaseFetch(`project/${project.value.id}`)
diff --git a/pages/[type]/[id]/changelog.vue b/pages/[type]/[id]/changelog.vue
index 1373ec7e6..5f8706b12 100644
--- a/pages/[type]/[id]/changelog.vue
+++ b/pages/[type]/[id]/changelog.vue
@@ -1,12 +1,5 @@
-
-
{{ project.title }} - Changelog
-
-
-
-
-
`View the changelog of ${props.project.title}'s ${props.versions.length} versions.`
-)
+const title = `${props.project.title} - Changelog`
+const description = `View the changelog of ${props.project.title}'s ${props.versions.length} versions.`
+
+useSeoMeta({
+ title,
+ description,
+ ogTitle: title,
+ ogDescription: description,
+})
const route = useRoute()
const currentPage = ref(Number(route.query.p ?? 1))
diff --git a/pages/[type]/[id]/gallery.vue b/pages/[type]/[id]/gallery.vue
index 9838f4b16..b9db22d91 100644
--- a/pages/[type]/[id]/gallery.vue
+++ b/pages/[type]/[id]/gallery.vue
@@ -1,12 +1,5 @@
-
-
{{ project.title }} - Gallery
-
-
-
-
-
-
-
-
diff --git a/pages/legal/rules.vue b/pages/legal/rules.vue
index dde99914a..e4f9d9434 100644
--- a/pages/legal/rules.vue
+++ b/pages/legal/rules.vue
@@ -134,35 +134,14 @@
-
-
-
diff --git a/pages/legal/security.vue b/pages/legal/security.vue
index 577f5b1cd..94c4ee33e 100644
--- a/pages/legal/security.vue
+++ b/pages/legal/security.vue
@@ -52,35 +52,14 @@
-
-
-
diff --git a/pages/legal/terms.vue b/pages/legal/terms.vue
index bbe4d3e21..e64436290 100644
--- a/pages/legal/terms.vue
+++ b/pages/legal/terms.vue
@@ -583,35 +583,14 @@
-
-
-
diff --git a/pages/moderation.vue b/pages/moderation.vue
index 3cf2b4780..82c547a9d 100644
--- a/pages/moderation.vue
+++ b/pages/moderation.vue
@@ -37,4 +37,3 @@ definePageMeta({
middleware: 'auth',
})
-
diff --git a/pages/moderation/reports.vue b/pages/moderation/reports.vue
index 44c9d4540..67c076499 100644
--- a/pages/moderation/reports.vue
+++ b/pages/moderation/reports.vue
@@ -14,4 +14,3 @@ useHead({
title: 'Reports - Modrinth',
})
-
diff --git a/pages/search/[searchProjectType].vue b/pages/search/[searchProjectType].vue
index d6c1bc86f..9da784bde 100644
--- a/pages/search/[searchProjectType].vue
+++ b/pages/search/[searchProjectType].vue
@@ -7,17 +7,7 @@
}"
>
- Search {{ $formatProjectType(projectType.display) }}s - Modrinth
-
-
-
-
+ Search {{ projectType.display }}s - Modrinth