diff --git a/website/.vitepress/config.ts b/website/.vitepress/config.ts index d61068b6..c61dd38e 100644 --- a/website/.vitepress/config.ts +++ b/website/.vitepress/config.ts @@ -1,4 +1,4 @@ -import { defineConfig } from 'vitepress'; +import { defineConfig, HeadConfig } from 'vitepress'; import githubLinksPlugin from './plugins/github-links'; import { readFileSync } from 'fs'; import { resolve } from 'path'; @@ -9,7 +9,7 @@ import { localIconLoader } from 'vitepress-plugin-group-icons'; import { team } from './team.ts'; -import { taskDescription, taskName } from './meta.ts'; +import { taskDescription, taskName, ogUrl, ogImage } from './meta.ts'; import { fileURLToPath, URL } from 'node:url'; import llmstxt, { copyOrDownloadAsMarkdownButtons } from 'vitepress-plugin-llms'; @@ -40,7 +40,7 @@ export default defineConfig({ { rel: 'icon', type: 'image/x-icon', - href: '/img/favicon.icon', + href: '/img/favicon.ico', sizes: '48x48' } ], @@ -53,17 +53,23 @@ export default defineConfig({ href: '/img/logo.svg' } ], - [ - 'link', - { - rel: 'canonical', - href: 'https://taskfile.dev/' - } - ], [ 'meta', { name: 'author', content: `${team.map((c) => c.name).join(', ')}` } ], + // Open Graph + ['meta', { property: 'og:type', content: 'website' }], + ['meta', { property: 'og:site_name', content: taskName }], + ['meta', { property: 'og:title', content: taskName }], + ['meta', { property: 'og:description', content: taskDescription }], + ['meta', { property: 'og:image', content: ogImage }], + ['meta', { property: 'og:url', content: ogUrl }], + // Twitter Card + ['meta', { name: 'twitter:card', content: 'summary_large_image' }], + ['meta', { name: 'twitter:site', content: '@taskfiledev' }], + ['meta', { name: 'twitter:title', content: taskName }], + ['meta', { name: 'twitter:description', content: taskDescription }], + ['meta', { name: 'twitter:image', content: ogImage }], [ 'meta', { @@ -81,6 +87,22 @@ export default defineConfig({ } ] ], + transformHead({ pageData }) { + const head: HeadConfig[] = [] + + // Canonical URL dynamique + const canonicalUrl = `https://taskfile.dev/${pageData.relativePath + .replace(/\.md$/, '') + .replace(/index$/, '')}` + head.push(['link', { rel: 'canonical', href: canonicalUrl }]) + + // Noindex pour 404 + if (pageData.relativePath === '404.md') { + head.push(['meta', { name: 'robots', content: 'noindex, nofollow' }]) + } + + return head + }, srcDir: 'src', cleanUrls: true, markdown: { @@ -342,6 +364,12 @@ export default defineConfig({ } }, sitemap: { - hostname: 'https://taskfile.dev' + hostname: 'https://taskfile.dev', + transformItems: (items) => { + return items.map((item) => ({ + ...item, + lastmod: new Date().toISOString() + })); + } } }); diff --git a/website/.vitepress/meta.ts b/website/.vitepress/meta.ts index c6c1108a..5c944580 100644 --- a/website/.vitepress/meta.ts +++ b/website/.vitepress/meta.ts @@ -3,3 +3,4 @@ export const taskDescription = 'A fast, cross-platform build tool inspired by Make, designed for modern workflows.'; export const ogUrl = 'https://taskfile.dev/'; +export const ogImage = 'https://taskfile.dev/img/logo.png'; diff --git a/website/package.json b/website/package.json index 8562bb10..eca45ff3 100644 --- a/website/package.json +++ b/website/package.json @@ -20,10 +20,8 @@ "vitepress": "^1.6.3", "vitepress-plugin-group-icons": "^1.6.1", "vitepress-plugin-tabs": "^0.7.1", + "vitepress-plugin-llms": "^1.9.1", "vue": "^3.5.18" }, - "packageManager": "pnpm@10.26.0+sha512.3b3f6c725ebe712506c0ab1ad4133cf86b1f4b687effce62a9b38b4d72e3954242e643190fc51fa1642949c735f403debd44f5cb0edd657abe63a8b6a7e1e402", - "dependencies": { - "vitepress-plugin-llms": "^1.9.1" - } + "packageManager": "pnpm@10.26.0+sha512.3b3f6c725ebe712506c0ab1ad4133cf86b1f4b687effce62a9b38b4d72e3954242e643190fc51fa1642949c735f403debd44f5cb0edd657abe63a8b6a7e1e402" } diff --git a/website/pnpm-lock.yaml b/website/pnpm-lock.yaml index 138d6039..f88bbb8a 100644 --- a/website/pnpm-lock.yaml +++ b/website/pnpm-lock.yaml @@ -7,10 +7,6 @@ settings: importers: .: - dependencies: - vitepress-plugin-llms: - specifier: ^1.9.1 - version: 1.9.3 devDependencies: '@types/markdown-it': specifier: ^14.1.2 @@ -30,6 +26,9 @@ importers: vitepress-plugin-group-icons: specifier: ^1.6.1 version: 1.6.5(vite@5.4.19(@types/node@24.10.4)) + vitepress-plugin-llms: + specifier: ^1.9.1 + version: 1.9.3 vitepress-plugin-tabs: specifier: ^0.7.1 version: 0.7.3(vitepress@1.6.4(@algolia/client-search@5.35.0)(@types/node@24.10.4)(jwt-decode@4.0.0)(postcss@8.5.6)(search-insights@2.17.3)(typescript@5.9.3))(vue@3.5.25(typescript@5.9.3)) diff --git a/website/src/public/favicon.ico b/website/src/public/favicon.ico new file mode 100644 index 00000000..c80dce81 Binary files /dev/null and b/website/src/public/favicon.ico differ