fix(landing): reposition residual meta framing and demote homepage tool count (#471)

Follow-up to #469. Homepage/enterprise/FAQ JSON-LD and meta now say 'file-processing infrastructure' (not 'suite'), and the visible homepage counts (ToolGrid subtitle, Pricing bullet) plus SEO meta say '200+'. Removed the orphaned toolCount/TOOLS references. Leaves the /tools catalog and ToolGrid filter-tab functional counts exact. Admin merge: landing-src-only PR, required matrix contexts path-skip and never report.
This commit is contained in:
SnapOtter
2026-07-10 15:00:55 +08:00
committed by GitHub
parent 10ae6d1d3d
commit 958c3e8513
5 changed files with 8 additions and 16 deletions
+1 -4
View File
@@ -1,11 +1,8 @@
---
// biome-ignore-all lint/correctness/noUnusedImports: Astro template consumes component imports.
// biome-ignore-all lint/correctness/noUnusedVariables: Astro template consumes frontmatter values.
import { TOOLS } from "@snapotter/shared";
import SectionHeading from "./SectionHeading.astro";
const toolCount = TOOLS.length;
const checkIcon =
'<svg class="h-4 w-4 shrink-0 text-success" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"/></svg>';
---
@@ -45,7 +42,7 @@ const checkIcon =
<ul class="mt-8 space-y-3">
{[
`All ${toolCount} tools across 5 modalities`,
"All 200+ tools across 5 modalities",
"Unlimited usage, no rate limits",
"Full REST API with OpenAPI docs",
"Pipeline automation & batch processing",
+1 -2
View File
@@ -6,7 +6,6 @@ import * as lucideIcons from "lucide";
import type { ModalityFilter, ToolSearchItem } from "../lib/tool-search";
import SectionHeading from "./SectionHeading.astro";
const toolCount = TOOLS.length;
const categoryMap = new Map(CATEGORIES.map((c) => [c.id, c]));
type ToolModality = ToolSearchItem["modality"];
@@ -155,7 +154,7 @@ const safeDefaultToolIdsJson = JSON.stringify(defaultToolIds).replace(/</g, "\\u
<section class="bg-background-alt px-6 py-20 md:py-28" id="features">
<SectionHeading
title="One platform. Every file workflow."
subtitle={`Search ${toolCount} self-hosted tools by task, format, modality, or workflow.`}
subtitle="Search 200+ self-hosted tools by task, format, modality, or workflow."
/>
<div class="mx-auto max-w-6xl">
+2 -4
View File
@@ -1,14 +1,11 @@
---
// biome-ignore-all lint/correctness/noUnusedImports: Astro template consumes component imports.
// biome-ignore-all lint/correctness/noUnusedVariables: Astro template consumes frontmatter values.
import { TOOLS } from "@snapotter/shared";
import Footer from "@/components/Footer.astro";
import JsonLd from "@/components/JsonLd.astro";
import Navbar from "@/components/Navbar.astro";
import Base from "@/layouts/Base.astro";
const toolCount = TOOLS.length;
const breadcrumbJsonLd = {
"@context": "https://schema.org",
"@type": "BreadcrumbList",
@@ -27,7 +24,8 @@ const productJsonLd = {
"@context": "https://schema.org",
"@type": "Product",
name: "SnapOtter Enterprise",
description: `Enterprise-grade self-hosted file processing suite with ${toolCount} tools, SAML SSO, audit logging, per-tool permissions, and multi-tenancy.`,
description:
"Enterprise-grade self-hosted file-processing infrastructure with 200+ tools, SAML SSO, audit logging, per-tool permissions, and multi-tenancy.",
brand: { "@type": "Organization", name: "SnapOtter" },
url: "https://snapotter.com/enterprise",
offers: {
+1 -1
View File
@@ -71,7 +71,7 @@ const breadcrumbJsonLd = {
<Base
title="FAQ | SnapOtter"
description="Frequently asked questions about SnapOtter, the self-hosted file processing suite."
description="Frequently asked questions about SnapOtter, self-hosted file-processing infrastructure."
canonical="https://snapotter.com/faq"
>
<Fragment slot="head">
+3 -5
View File
@@ -1,7 +1,6 @@
---
// biome-ignore-all lint/correctness/noUnusedImports: Astro template consumes component imports.
// biome-ignore-all lint/correctness/noUnusedVariables: Astro template consumes frontmatter values.
import { TOOLS } from "@snapotter/shared";
import EnterpriseSection from "@/components/EnterpriseSection.astro";
import FeatureHighlights from "@/components/FeatureHighlights.astro";
import Footer from "@/components/Footer.astro";
@@ -13,8 +12,6 @@ import Pricing from "@/components/Pricing.astro";
import ToolGrid from "@/components/ToolGrid.astro";
import Base from "@/layouts/Base.astro";
const toolCount = TOOLS.length;
const pageTitle = "SnapOtter | Self-Hosted File-Processing Infrastructure";
const pageDescription =
"Open-source, self-hosted file-processing infrastructure. Convert, compress, OCR, transcribe, and run local AI across image, video, audio, PDF, and documents, through a UI, REST API, and pipelines. The private, self-hosted alternative to CloudConvert, Smallpdf, and TinyPNG.";
@@ -24,7 +21,8 @@ const websiteSchema = {
"@type": "WebSite",
name: "SnapOtter",
url: "https://snapotter.com",
description: `Self-hosted file processing suite with ${toolCount} tools across 5 modalities.`,
description:
"Open-source, self-hosted file-processing infrastructure with 200+ tools across image, video, audio, PDF, and documents.",
publisher: {
"@type": "Organization",
name: "SnapOtter",
@@ -55,7 +53,7 @@ const softwareSchema = {
license: "https://www.gnu.org/licenses/agpl-3.0.en.html",
downloadUrl: "https://hub.docker.com/r/snapotter/snapotter",
featureList: [
`${toolCount} file processing tools`,
"200+ file processing tools",
"5 modalities: image, video, audio, PDF, files",
"Free layer-based image editor with brushes, shapes, filters, curves, and keyboard shortcuts",
"Local AI models for background removal, OCR, upscaling, transcription",