From 78fd198ac487020feb7d7d48771d88d75b990bf8 Mon Sep 17 00:00:00 2001 From: k1enn Date: Tue, 9 Jun 2026 12:38:05 +0000 Subject: [PATCH] feat(frontend): improve SEO with sitemap, schema, canonical, and llms.txt - replace @nuxtjs/seo umbrella with explicit @nuxtjs/sitemap, nuxt-schema-org, nuxt-og-image (umbrella's seo-utils altered page titles) - generate flat /sitemap.xml (exclude utility/dynamic routes); add /llms.txt - add self-referencing canonical, og:url/type/site_name - add JSON-LD: Organization, WebSite, WebPage, SoftwareApplication - set ; noindex /settings, /unlock, /[shortCode] - fix "URLS" -> "URLs" typo in meta descriptions - bump @takumi-rs to ^1.0.0-beta.3 for nuxt-og-image 6.5 compatibility --- apps/frontend/nuxt.config.ts | 21 + apps/frontend/package.json | 2 + apps/frontend/src/app/app.vue | 35 + apps/frontend/src/app/pages/[shortCode].vue | 3 + apps/frontend/src/app/pages/index.vue | 10 + apps/frontend/src/app/pages/settings.vue | 1 + apps/frontend/src/app/pages/unlock.vue | 3 + apps/frontend/src/i18n/locales/en.json | 4 +- apps/frontend/src/public/llms.txt | 16 + pnpm-lock.yaml | 1325 +++++++++++++++---- pnpm-workspace.yaml | 8 +- 11 files changed, 1189 insertions(+), 239 deletions(-) create mode 100644 apps/frontend/src/public/llms.txt diff --git a/apps/frontend/nuxt.config.ts b/apps/frontend/nuxt.config.ts index f8e329c..74b2885 100644 --- a/apps/frontend/nuxt.config.ts +++ b/apps/frontend/nuxt.config.ts @@ -5,6 +5,8 @@ export default defineNuxtConfig({ "@nuxtjs/color-mode", "@vueuse/nuxt", "@regle/nuxt", + "@nuxtjs/sitemap", + "nuxt-schema-org", "nuxt-og-image", "vue-sonner/nuxt", "@nuxtjs/i18n", @@ -60,6 +62,25 @@ export default defineNuxtConfig({ }, }, }, + // SEO site config (consumed by nuxt-site-config — pulled in by sitemap/schema/og). + // Single fixed domain — absolute URL so sitemap + schema resolve correctly. + site: { + url: "https://solitar.link", + name: "Solitar", + }, + // Global (H3). No title template is applied (seo-utils intentionally + // not used), so page titles render exactly as authored (H4). + app: { + head: { + htmlAttrs: { lang: "en" }, + }, + }, + // Sitemap (C1): single flat /sitemap.xml (one locale — skip i18n index split); + // only public pages, exclude utility/dynamic routes. + sitemap: { + autoI18n: false, + exclude: ["/settings", "/unlock"], + }, // Build nitro: { prerender: { diff --git a/apps/frontend/package.json b/apps/frontend/package.json index 63a5445..e2c8a7e 100644 --- a/apps/frontend/package.json +++ b/apps/frontend/package.json @@ -33,12 +33,14 @@ }, "devDependencies": { "@iconify-json/tabler": "catalog:frontend", + "@nuxtjs/sitemap": "catalog:frontend", "@takumi-rs/core": "catalog:frontend", "@takumi-rs/wasm": "catalog:frontend", "@unocss/nuxt": "catalog:frontend", "@vueuse/core": "catalog:frontend", "@vueuse/nuxt": "catalog:frontend", "nuxt-og-image": "catalog:frontend", + "nuxt-schema-org": "catalog:frontend", "oxlint": "catalog:lint", "oxlint-tsgolint": "catalog:lint", "unocss": "catalog:frontend", diff --git a/apps/frontend/src/app/app.vue b/apps/frontend/src/app/app.vue index d867a77..817c225 100644 --- a/apps/frontend/src/app/app.vue +++ b/apps/frontend/src/app/app.vue @@ -1,3 +1,38 @@ + +