mirror of
https://github.com/snapotter-hq/SnapOtter.git
synced 2026-08-03 07:46:42 +02:00
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:
@@ -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",
|
||||
|
||||
@@ -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">
|
||||
|
||||
@@ -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: {
|
||||
|
||||
@@ -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">
|
||||
|
||||
@@ -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",
|
||||
|
||||
Reference in New Issue
Block a user