mirror of
https://github.com/snapotter-hq/SnapOtter.git
synced 2026-08-03 07:46:42 +02:00
feat: add 52 per-tool SEO landing pages and public changelog (#145)
* feat: add 52 per-tool SEO landing pages and public changelog
- Create individual landing pages for all 52 tools at /tools/{slug}
with search-intent title tags, unique FAQs (156 Q&As), per-tool
features, and rich schema markup (BreadcrumbList, WebApplication,
HowTo, FAQPage)
- Replace static sitemap.xml with dynamic generation including all
tool URLs
- Refactor bento grid to import from @snapotter/shared (eliminates
330 lines of duplicated tool data) and link cards to tool pages
- Add @snapotter/shared as workspace dependency to landing site
- Add public changelog page to docs site with curated release notes
from v1.8 through v1.17
- Update docs nav and sidebar with changelog link
* feat: enhance SEO and performance with updated metadata, robots.txt, and llms.txt
This commit is contained in:
@@ -26,12 +26,25 @@ export default defineConfig({
|
||||
["meta", { property: "og:image:width", content: "1280" }],
|
||||
["meta", { property: "og:image:height", content: "640" }],
|
||||
["meta", { property: "og:image:alt", content: "SnapOtter - Self-Hosted Image Processing" }],
|
||||
["meta", { property: "og:url", content: "https://docs.snapotter.com" }],
|
||||
["meta", { property: "og:locale", content: "en_US" }],
|
||||
["meta", { name: "twitter:card", content: "summary_large_image" }],
|
||||
["meta", { name: "twitter:site", content: "@SnapOtterHQ" }],
|
||||
["meta", { name: "twitter:image", content: "https://docs.snapotter.com/og-image.png" }],
|
||||
],
|
||||
|
||||
transformHead({ pageData }) {
|
||||
const head: Array<[string, Record<string, string>]> = [];
|
||||
const canonicalUrl = `https://docs.snapotter.com/${pageData.relativePath.replace(/(^|\/)index\.md$/, "$1").replace(/\.md$/, "")}`;
|
||||
head.push(["meta", { property: "og:url", content: canonicalUrl }]);
|
||||
head.push(["meta", { property: "og:title", content: pageData.title }]);
|
||||
if (pageData.description) {
|
||||
head.push(["meta", { property: "og:description", content: pageData.description }]);
|
||||
head.push(["meta", { name: "twitter:description", content: pageData.description }]);
|
||||
}
|
||||
head.push(["meta", { name: "twitter:title", content: pageData.title }]);
|
||||
return head;
|
||||
},
|
||||
|
||||
vite: {
|
||||
plugins: [
|
||||
llmstxt({
|
||||
@@ -78,9 +91,10 @@ export default defineConfig({
|
||||
{ text: "Home", link: "/" },
|
||||
{ text: "Guide", link: "/guide/getting-started" },
|
||||
{ text: "API Reference", link: "/api/rest" },
|
||||
{ text: "Changelog", link: "/changelog" },
|
||||
{
|
||||
text: `v${pkg.version}`,
|
||||
link: "https://github.com/snapotter-hq/snapotter/releases",
|
||||
link: "/changelog",
|
||||
},
|
||||
],
|
||||
|
||||
@@ -110,6 +124,10 @@ export default defineConfig({
|
||||
{ text: "AI engine", link: "/api/ai" },
|
||||
],
|
||||
},
|
||||
{
|
||||
text: "Project",
|
||||
items: [{ text: "Changelog", link: "/changelog" }],
|
||||
},
|
||||
],
|
||||
|
||||
search: {
|
||||
|
||||
Reference in New Issue
Block a user