From 74abf8985f964ab998b27a94f784c39fa6c8aa21 Mon Sep 17 00:00:00 2001 From: Anthony Ettinger Date: Mon, 8 Jun 2026 12:51:51 +0000 Subject: [PATCH] feat(web): og:image, /pricing + FAQ schema, llms-full.txt, GitHub nav MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit More AEO audit fixes (the content-independent quick wins): - Generated 1200x630 OpenGraph/Twitter card (app/opengraph-image.tsx); drop the SVG fallback and use summary_large_image. - /pricing page with question-style headings and FAQPage JSON-LD; clarifies the spec/tooling is free and implementation is $250/week. - /llms-full.txt — full markdown of the curated docs concatenated for large-context RAG ingestion. - GitHub link added to both navs (SPA rail + SiteShell) and Pricing nav item; /pricing added to the sitemap. Verified in a running build: og image renders as PNG and is referenced in head; /pricing serves FAQ + schema; /llms-full.txt concatenates docs. Co-Authored-By: Claude Opus 4.8 --- apps/logicsrc-web/src/app/layout.tsx | 4 +- .../src/app/llms-full.txt/route.ts | 32 ++++++++ apps/logicsrc-web/src/app/opengraph-image.tsx | 54 +++++++++++++ apps/logicsrc-web/src/app/pricing/page.tsx | 81 +++++++++++++++++++ apps/logicsrc-web/src/app/sitemap.ts | 1 + .../src/components/site-shell.tsx | 6 +- apps/logicsrc-web/src/lib/page-markup.ts | 2 + 7 files changed, 176 insertions(+), 4 deletions(-) create mode 100644 apps/logicsrc-web/src/app/llms-full.txt/route.ts create mode 100644 apps/logicsrc-web/src/app/opengraph-image.tsx create mode 100644 apps/logicsrc-web/src/app/pricing/page.tsx diff --git a/apps/logicsrc-web/src/app/layout.tsx b/apps/logicsrc-web/src/app/layout.tsx index 93bf19e..3782721 100644 --- a/apps/logicsrc-web/src/app/layout.tsx +++ b/apps/logicsrc-web/src/app/layout.tsx @@ -24,13 +24,11 @@ export const metadata: Metadata = { url: SITE_URL, title: "LogicSRC — Open Coordination Standards for Humans & AI Agents", description: DESCRIPTION, - images: ["/icon.svg"], }, twitter: { - card: "summary", + card: "summary_large_image", title: "LogicSRC — Open Coordination Standards", description: DESCRIPTION, - images: ["/icon.svg"], }, }; diff --git a/apps/logicsrc-web/src/app/llms-full.txt/route.ts b/apps/logicsrc-web/src/app/llms-full.txt/route.ts new file mode 100644 index 0000000..a94af4f --- /dev/null +++ b/apps/logicsrc-web/src/app/llms-full.txt/route.ts @@ -0,0 +1,32 @@ +import { DOC_SLUGS, docTitle, readDoc } from "@/lib/docs"; + +const SITE_URL = (process.env.PUBLIC_URL ?? "https://logicsrc.com").replace(/\/$/, ""); + +// GET /llms-full.txt — full markdown of every curated doc concatenated into a +// single response, so large-context models can ingest the whole reference at +// once (https://llmstxt.org). +export function GET(): Response { + const parts: string[] = [ + "# LogicSRC — Full Documentation", + "", + "> Open schemas, primitives, and conventions for coordination between humans, AI agents, plugins, payment systems, and hosted products. A Profullstack, Inc. open-specification project.", + "", + `Source: ${SITE_URL}`, + "", + ]; + + for (const slug of DOC_SLUGS) { + const md = readDoc(slug); + if (!md) continue; + parts.push(`\n---\n\n## ${docTitle(md, slug)} (${SITE_URL}/docs/${slug})\n`); + parts.push(md.trim()); + parts.push(""); + } + + return new Response(parts.join("\n"), { + headers: { + "content-type": "text/plain; charset=utf-8", + "cache-control": "public, max-age=3600", + }, + }); +} diff --git a/apps/logicsrc-web/src/app/opengraph-image.tsx b/apps/logicsrc-web/src/app/opengraph-image.tsx new file mode 100644 index 0000000..21835a5 --- /dev/null +++ b/apps/logicsrc-web/src/app/opengraph-image.tsx @@ -0,0 +1,54 @@ +import { ImageResponse } from "next/og"; + +export const alt = "LogicSRC — Open Coordination Standards for Humans & AI Agents"; +export const size = { width: 1200, height: 630 }; +export const contentType = "image/png"; + +// Branded 1200×630 social card generated at build/request time. +export default function OpengraphImage() { + return new ImageResponse( + ( +
+
+
+ LS +
+
LogicSRC
+
+
+ Open schemas, primitives, and conventions for coordination between + humans, AI agents, plugins, and hosted products. +
+
+ logicsrc.com +
+
+ ), + size, + ); +} diff --git a/apps/logicsrc-web/src/app/pricing/page.tsx b/apps/logicsrc-web/src/app/pricing/page.tsx new file mode 100644 index 0000000..71d5f4a --- /dev/null +++ b/apps/logicsrc-web/src/app/pricing/page.tsx @@ -0,0 +1,81 @@ +import type { ReactNode } from "react"; +import type { Metadata } from "next"; +import { SiteShell } from "@/components/site-shell"; + +export const metadata: Metadata = { + title: "Pricing · LogicSRC", + description: + "LogicSRC the open specification, schemas, SDKs, and CLI are free and open source. Implementation help is $250/week for accepted work, paid via CoinPay.", + alternates: { canonical: "/pricing" }, +}; + +const FAQ: Array<{ q: string; a: string }> = [ + { + q: "Is LogicSRC free?", + a: "Yes. The LogicSRC specification, JSON schemas, SDKs, CLI, TUI, and reference plugins are open source and free to use under the project license. There is no license fee to implement the standard.", + }, + { + q: "How does pricing work?", + a: "The standard is free. If you want Profullstack to build a LogicSRC-based system for you, implementation work is billed at $250/week for accepted work, paid via a CoinPay recurring invoice.", + }, + { + q: "Who is LogicSRC for?", + a: "Engineering and AI-platform teams building systems where humans and AI agents coordinate — boards, tasks, agent runs, identity, payments, and audit — without locking into a single vendor's proprietary platform.", + }, + { + q: "How do I pay or get started?", + a: "Read the docs and adopt the schemas for free, or submit a project through the Hire Us form. Accepted projects are invoiced weekly via CoinPay.", + }, +]; + +export default function PricingPage(): ReactNode { + const jsonLd = { + "@context": "https://schema.org", + "@type": "FAQPage", + mainEntity: FAQ.map((item) => ({ + "@type": "Question", + name: item.q, + acceptedAnswer: { "@type": "Answer", text: item.a }, + })), + }; + + return ( + +