SEO: FAQ schema, per-product OG cards, stable sitemap dates

- Add FAQPage structured data + visible FAQ sections to Wownerogue, Webshops,
  Neroswap, and Services (covers high-intent 'provably fair', 'no-KYC', and
  'revenue share' style queries; visible Q&A matches the schema).
- Generate branded 1200x630 OG cards per product and wire them into each
  product page's openGraph + twitter (summary_large_image), replacing the
  square app icons that previously got cropped in social previews.
- Sitemap: stop stamping every static page with new Date() on each build; use
  a single content-update date so freshness signals are not diluted.
This commit is contained in:
jwinterm
2026-06-01 10:39:27 -04:00
parent f51a1257c5
commit 97a8026ed6
21 changed files with 165 additions and 26 deletions
+22
View File
@@ -6,8 +6,17 @@ import { ScrollReveal } from "@/components/scroll-reveal";
import Image from "next/image";
import Link from "next/link";
import { Card } from "@repo/ui/components/card";
import { JsonLd, faqLd } from "@/components/seo/json-ld";
import type { Metadata } from "next";
const faqs = [
{ q: "What does Such Software build?", a: "Custom e-commerce on Medusa v2, real-time web apps and multiplayer experiences, and cryptocurrency and Monero integrations and consulting. We work across the stack, from backend infrastructure to accessible front-ends." },
{ q: "Where are you based?", a: "We are a software studio in Kennett Square, Pennsylvania, working with clients remotely across the US and beyond." },
{ q: "Do you build for accessibility?", a: "Yes. We build to WCAG 2.2 and audit for accessibility and Core Web Vitals as part of every project, not as an afterthought." },
{ q: "How does a project start?", a: "Reach out through the contact form with what you need. We scope it, propose an approach, and from there it can run as a fixed project or a performance-based revenue-share partnership." },
{ q: "Do you take revenue-share work?", a: "Yes. For a limited number of partners we build and operate products (such as webshops) for a share of revenue instead of a large upfront fee, so our incentives line up with yours." },
];
export const metadata: Metadata = {
title: "Medusa, Web App & Crypto Development Services | Such Software",
description: "Custom e-commerce on Medusa v2, real-time web apps, and Monero/crypto consulting. A Kennett Square, PA studio building for scale, accessibility, and performance.",
@@ -24,6 +33,7 @@ export const metadata: Metadata = {
export default function ServicesPage() {
return (
<main className="relative min-h-screen flex flex-col items-center bg-background text-foreground overflow-hidden">
<JsonLd data={faqLd(faqs)} />
<DataGrid />
<Header />
@@ -170,6 +180,18 @@ export default function ServicesPage() {
</Card>
</ScrollReveal>
<ScrollReveal className="mt-20">
<h2 className="text-3xl font-bold mb-8 tracking-tight">Frequently Asked Questions</h2>
<div className="space-y-6">
{faqs.map((f) => (
<div key={f.q}>
<h3 className="text-xl font-bold mb-1">{f.q}</h3>
<p className="text-muted-foreground leading-relaxed">{f.a}</p>
</div>
))}
</div>
</ScrollReveal>
<ScrollReveal className="mt-20 p-16 rounded-[2.5rem] bg-gradient-to-br from-slate-900 via-slate-800 to-indigo-950 text-white text-center shadow-2xl relative overflow-hidden group border-2 border-white/5">
<div className="absolute inset-0 bg-blue-500/10 opacity-0 group-hover:opacity-100 transition-opacity" />
<h2 className="text-4xl font-bold mb-6 relative z-10 tracking-tight">Let's build together</h2>