From d1bcec96be3de62763345076999ea94c22ad112d Mon Sep 17 00:00:00 2001 From: Ben Holmes Date: Tue, 14 Apr 2026 09:04:41 +0000 Subject: [PATCH] =?UTF-8?q?feat(www):=20SEO/AEO=20audit=20=E2=80=94=20site?= =?UTF-8?q?=20config,=20robots.txt,=20structured=20data,=20improved=20meta?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add site URL to astro.config.mjs to enable sitemap, canonical URLs - Add Organization JSON-LD and Open Graph meta tags site-wide - Create public/robots.txt with sitemap reference - Improve page titles and descriptions for SERP/AEO optimization - Add SoftwareSourceCode JSON-LD to store, scope, and query pages - Remove redundant head title override on homepage - Remove emoji prefixes from page titles (kept in sidebar labels) - Improve homepage intro text with answer-first AEO structure Co-Authored-By: Oz --- www/astro.config.mjs | 25 +++++++++++++++++++++++++ www/public/robots.txt | 4 ++++ www/src/content/docs/form/client.md | 4 ++-- www/src/content/docs/form/index.mdx | 4 ++-- www/src/content/docs/form/parse.md | 4 ++-- www/src/content/docs/index.mdx | 11 ++++------- www/src/content/docs/query.mdx | 10 ++++++++-- www/src/content/docs/scope.mdx | 10 ++++++++-- www/src/content/docs/store.mdx | 12 +++++++++--- www/src/content/docs/stream.md | 4 ++-- 10 files changed, 66 insertions(+), 22 deletions(-) create mode 100644 www/public/robots.txt diff --git a/www/astro.config.mjs b/www/astro.config.mjs index 0d7e4c1..61b5a5d 100644 --- a/www/astro.config.mjs +++ b/www/astro.config.mjs @@ -2,9 +2,34 @@ import starlight from "@astrojs/starlight"; import { defineConfig } from "astro/config"; export default defineConfig({ + site: "https://simple-stack.dev", integrations: [ starlight({ title: "Simple Stack 🌱", + head: [ + { + tag: "script", + attrs: { type: "application/ld+json" }, + content: JSON.stringify({ + "@context": "https://schema.org", + "@type": "Organization", + name: "Simple Stack", + url: "https://simple-stack.dev", + logo: "https://simple-stack.dev/favicon.svg", + sameAs: [ + "https://github.com/bholmesdev/simple-stack", + ], + }), + }, + { + tag: "meta", + attrs: { property: "og:type", content: "website" }, + }, + { + tag: "meta", + attrs: { property: "og:site_name", content: "Simple Stack" }, + }, + ], social: [ { icon: "github", diff --git a/www/public/robots.txt b/www/public/robots.txt new file mode 100644 index 0000000..3214756 --- /dev/null +++ b/www/public/robots.txt @@ -0,0 +1,4 @@ +User-agent: * +Allow: / + +Sitemap: https://simple-stack.dev/sitemap-index.xml diff --git a/www/src/content/docs/form/client.md b/www/src/content/docs/form/client.md index 884c722..c9d63ec 100644 --- a/www/src/content/docs/form/client.md +++ b/www/src/content/docs/form/client.md @@ -1,6 +1,6 @@ --- -title: Add client validation -description: Add client validation to your forms +title: Add client validation to Simple Form +description: "Generate client-validated form components using Simple Form's CLI with the reward-early, punish-late pattern for accessible inline validation." sidebar: order: 3 --- diff --git a/www/src/content/docs/form/index.mdx b/www/src/content/docs/form/index.mdx index 3e1654e..cd368f8 100644 --- a/www/src/content/docs/form/index.mdx +++ b/www/src/content/docs/form/index.mdx @@ -1,6 +1,6 @@ --- -title: Simple form -description: The simple way to validate forms in your fullstack app. +title: Simple Form — validate forms in your fullstack Astro app +description: "Simple Form (deprecated) provided Zod-based form validation for Astro with auto-generated input props, server-side parsing, and client-side validation." sidebar: label: Get started order: 1 diff --git a/www/src/content/docs/form/parse.md b/www/src/content/docs/form/parse.md index 35116f9..bbebd78 100644 --- a/www/src/content/docs/form/parse.md +++ b/www/src/content/docs/form/parse.md @@ -1,6 +1,6 @@ --- -title: Parse form requests -description: Validate forms server-side +title: Parse and validate form requests server-side +description: "Use Simple Form's validateForm() and Astro.locals.form helpers to parse and validate form submissions on the server with Zod schemas." sidebar: order: 2 --- diff --git a/www/src/content/docs/index.mdx b/www/src/content/docs/index.mdx index 1e6d15c..9ceb273 100644 --- a/www/src/content/docs/index.mdx +++ b/www/src/content/docs/index.mdx @@ -1,15 +1,12 @@ --- -title: Simple stack 🌱 -description: A suite of tools built for Astro to simplify your workflow. +title: Simple Stack — lightweight tools for web development +description: Simple Stack is a collection of lightweight JavaScript tools for web development, including a reactive store, scoped IDs, and DOM query utilities for Astro and Vite projects. tableOfContents: false -head: - - tag: title - content: Simple stack 🌱 --- -A collection of tools I've built to **make web development simpler.** +Simple Stack is a collection of lightweight tools that **make web development simpler.** Each package solves a focused use case — a reactive store, scoped element IDs, and Astro DOM queries — without unnecessary complexity. -To be honest, there isn't a "story" connecting these packages together (I'm no TanStack). But they follow a common theme: solve a simple use case without too many features. +There isn't a grand "story" connecting these packages together (I'm no TanStack). But they follow a common theme: solve a simple use case without too many features. import { CardGrid, Card, LinkCard } from '@astrojs/starlight/components'; diff --git a/www/src/content/docs/query.mdx b/www/src/content/docs/query.mdx index 5549582..ccdedd1 100644 --- a/www/src/content/docs/query.mdx +++ b/www/src/content/docs/query.mdx @@ -1,6 +1,12 @@ --- -title: 💰 Simple Query -description: A simple library to query the DOM from your Astro components. +title: Simple Query — scoped DOM queries for Astro components +description: "Simple Query is an Astro integration that provides scoped DOM queries, lifecycle management, and signals-based state for interactive Astro components. Like jQuery, but built for modern Astro projects." +head: + - tag: script + attrs: + type: application/ld+json + content: | + {"@context":"https://schema.org","@type":"SoftwareSourceCode","name":"Simple Query","description":"An Astro integration for scoped DOM queries, lifecycle management, and signals-based state in Astro components.","url":"https://simple-stack.dev/query","codeRepository":"https://github.com/bholmesdev/simplestack-query","programmingLanguage":"TypeScript","runtimePlatform":"Node.js"} --- import { Tabs, TabItem, LinkCard } from '@astrojs/starlight/components'; diff --git a/www/src/content/docs/scope.mdx b/www/src/content/docs/scope.mdx index 93740de..bd4d3b5 100644 --- a/www/src/content/docs/scope.mdx +++ b/www/src/content/docs/scope.mdx @@ -1,6 +1,12 @@ --- -title: 🔎 Simple scope -description: Get a scoped ID for whatever file you're in. Resolved at build-time with zero client JS. +title: Simple Scope — scoped IDs at build time with zero JS +description: "Simple Scope is a Vite plugin that generates unique scoped IDs per file at build time with zero client JavaScript. Works with Astro, Nuxt, SvelteKit, and any Vite-based framework." +head: + - tag: script + attrs: + type: application/ld+json + content: | + {"@context":"https://schema.org","@type":"SoftwareSourceCode","name":"Simple Scope","description":"A Vite plugin that generates unique scoped IDs per file at build time with zero client JavaScript.","url":"https://simple-stack.dev/scope","codeRepository":"https://github.com/bholmesdev/simplestack-scope","programmingLanguage":"TypeScript","runtimePlatform":"Node.js"} --- import { LinkCard } from '@astrojs/starlight/components'; diff --git a/www/src/content/docs/store.mdx b/www/src/content/docs/store.mdx index cda86d1..bda0de9 100644 --- a/www/src/content/docs/store.mdx +++ b/www/src/content/docs/store.mdx @@ -1,9 +1,15 @@ --- -title: 💾 Simple store -description: A reactive store that combines the simplicity of signals with the power of "selectors" you'd find in Zustand or Redux. +title: Simple Store — reactive state management with selectors +description: "Simple Store is a lightweight reactive store for React that combines signal-like simplicity with Zustand-style selectors. Create stores, select nested state, and subscribe to fine-grained updates." sidebar: - label: Get started + label: "💾 Get started" order: 1 +head: + - tag: script + attrs: + type: application/ld+json + content: | + {"@context":"https://schema.org","@type":"SoftwareSourceCode","name":"Simple Store","description":"A lightweight reactive store for React that combines signal-like simplicity with Zustand-style selectors.","url":"https://simple-stack.dev/store","codeRepository":"https://github.com/bholmesdev/simplestack-store","programmingLanguage":"TypeScript","runtimePlatform":"Node.js"} --- import { LinkCard, Tabs, TabItem } from '@astrojs/starlight/components'; diff --git a/www/src/content/docs/stream.md b/www/src/content/docs/stream.md index 5c734fb..2f0b27c 100644 --- a/www/src/content/docs/stream.md +++ b/www/src/content/docs/stream.md @@ -1,6 +1,6 @@ --- -title: Simple stream 🌊 -description: Suspend Astro components with fallback content. Like React Server Components, but Just HTML ™️ +title: Simple Stream — suspend Astro components with fallback content +description: "Simple Stream (deprecated) lets you suspend Astro components and show fallback content while server-side components load, similar to React Server Components but using pure HTML streaming." --- :::caution