Skip to content

Commit c7a40eb

Browse files
bholmesdevoz-agent
andcommitted
feat(www): SEO/AEO audit improvements
- Add site URL to astro.config.mjs (enables sitemap, canonical URLs) - Add Organization + WebSite JSON-LD structured data site-wide - Add Open Graph and Twitter Card meta tags site-wide - Create public/robots.txt with sitemap reference - Improve homepage <title> (keyword-rich, no emoji) and meta description - Add answer-first lead paragraphs for AEO on all package pages - Improve meta descriptions on all 8 content pages (120-155 chars, specific) - Add FAQPage JSON-LD schema to store and query pages - Build verified: sitemap auto-generates with all pages Co-Authored-By: Oz <oz-agent@warp.dev>
1 parent 70cb101 commit c7a40eb

10 files changed

Lines changed: 127 additions & 15 deletions

File tree

www/astro.config.mjs

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,55 @@ import starlight from "@astrojs/starlight";
22
import { defineConfig } from "astro/config";
33

44
export default defineConfig({
5+
site: "https://simple-stack.dev",
56
integrations: [
67
starlight({
78
title: "Simple Stack 🌱",
9+
head: [
10+
{
11+
tag: "meta",
12+
attrs: { property: "og:type", content: "website" },
13+
},
14+
{
15+
tag: "meta",
16+
attrs: { property: "og:site_name", content: "Simple Stack" },
17+
},
18+
{
19+
tag: "meta",
20+
attrs: { name: "twitter:card", content: "summary" },
21+
},
22+
{
23+
tag: "script",
24+
attrs: { type: "application/ld+json" },
25+
content: JSON.stringify({
26+
"@context": "https://schema.org",
27+
"@type": "WebSite",
28+
name: "Simple Stack",
29+
url: "https://simple-stack.dev",
30+
description:
31+
"A collection of lightweight developer tools for Astro and Vite including a reactive store, scoped IDs, and DOM query utilities.",
32+
author: {
33+
"@type": "Person",
34+
name: "Ben Holmes",
35+
url: "https://bholmes.dev",
36+
},
37+
}),
38+
},
39+
{
40+
tag: "script",
41+
attrs: { type: "application/ld+json" },
42+
content: JSON.stringify({
43+
"@context": "https://schema.org",
44+
"@type": "Organization",
45+
name: "Simple Stack",
46+
url: "https://simple-stack.dev",
47+
sameAs: [
48+
"https://github.com/bholmesdev/simple-stack",
49+
"https://wtw.dev/chat",
50+
],
51+
}),
52+
},
53+
],
854
social: [
955
{
1056
icon: "github",

www/public/robots.txt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
User-agent: *
2+
Allow: /
3+
4+
Sitemap: https://simple-stack.dev/sitemap-index.xml

www/src/content/docs/form/client.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
---
22
title: Add client validation
3-
description: Add client validation to your forms
3+
description: "Generate client-validated form components with Simple Form's CLI using the reward-early-punish-late pattern for accessible, framework-agnostic validation."
44
sidebar:
55
order: 3
66
---

www/src/content/docs/form/index.mdx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
---
22
title: Simple form
3-
description: The simple way to validate forms in your fullstack app.
3+
description: "Simple Form (simple-stack-form) is a deprecated Astro integration for Zod-based form validation. Use Astro Form Actions instead for server-side form handling."
44
sidebar:
55
label: Get started
66
order: 1

www/src/content/docs/form/parse.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
---
22
title: Parse form requests
3-
description: Validate forms server-side
3+
description: "Server-side form validation with Simple Form using validateForm() and Astro.locals.form helpers. Parse and validate FormData with Zod schemas."
44
sidebar:
55
order: 2
66
---

www/src/content/docs/index.mdx

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
---
2-
title: Simple stack 🌱
3-
description: A suite of tools built for Astro to simplify your workflow.
2+
title: Simple Stack
3+
description: Simple Stack is a collection of lightweight, zero-config developer tools for Astro and Vite. Includes a reactive store, scoped IDs, and DOM query utilities.
44
tableOfContents: false
55
head:
66
- tag: title
7-
content: Simple stack 🌱
7+
content: Simple Stack — Lightweight Developer Tools for Astro & Vite
88
---
99

10-
A collection of tools I've built to **make web development simpler.**
10+
Simple Stack is a collection of lightweight developer tools for Astro and Vite. Each package solves a single, focused use case with minimal configuration and zero unnecessary features — a reactive store with selectors, build-time scoped IDs, and a DOM query library for Astro components.
1111

12-
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.
12+
They follow a common theme: solve a simple use case without too many features.
1313

1414
import { CardGrid, Card, LinkCard } from '@astrojs/starlight/components';
1515

www/src/content/docs/query.mdx

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,40 @@
11
---
22
title: 💰 Simple Query
3-
description: A simple library to query the DOM from your Astro components.
3+
description: "Simple Query (@simplestack/query) is an Astro integration for querying DOM elements with scoped data-target selectors, signal-based reactivity, and server data passing."
4+
head:
5+
- tag: script
6+
attrs:
7+
type: application/ld+json
8+
content: |
9+
{
10+
"@context": "https://schema.org",
11+
"@type": "FAQPage",
12+
"mainEntity": [
13+
{
14+
"@type": "Question",
15+
"name": "How do I install Simple Query in Astro?",
16+
"acceptedAnswer": {
17+
"@type": "Answer",
18+
"text": "Run 'astro add @simplestack/query' to install and configure the integration automatically. It sets up RootElement, scoped data-target attributes, and TypeScript types."
19+
}
20+
},
21+
{
22+
"@type": "Question",
23+
"name": "How does Simple Query scope DOM selectors?",
24+
"acceptedAnswer": {
25+
"@type": "Answer",
26+
"text": "Simple Query automatically scopes data-target attribute values to prevent conflicts between components. Use RootElement.ready() with the $() function to select elements by their data-target name."
27+
}
28+
}
29+
]
30+
}
431
---
532

633
import { Tabs, TabItem, LinkCard } from '@astrojs/starlight/components';
734

835
<LinkCard href="https://github.com/bholmesdev/simplestack-query" title="Source code" />
936

10-
A simple library to query the DOM from your Astro components.
37+
Simple Query (`@simplestack/query`) is an Astro integration that provides a lightweight, scoped way to query DOM elements from Astro components. It uses `data-target` attributes with automatic scoping to prevent selector conflicts, and supports signal-based reactivity via the TC39 Signals proposal polyfill.
1138

1239
```astro
1340
<RootElement>

www/src/content/docs/scope.mdx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
---
22
title: 🔎 Simple scope
3-
description: Get a scoped ID for whatever file you're in. Resolved at build-time with zero client JS.
3+
description: "Simple Scope (vite-plugin-simple-scope) is a Vite plugin that generates unique, deterministic scoped IDs per file at build time with zero client-side JavaScript."
44
---
55

66
import { LinkCard } from '@astrojs/starlight/components';
77

88
<LinkCard href="https://github.com/bholmesdev/simplestack-scope" title="Source code" />
99

10-
Get a scoped ID for whatever file you're in. Resolved at build-time with zero client JS.
10+
Simple Scope (`vite-plugin-simple-scope`) is a Vite plugin that generates unique, deterministic scoped IDs for any file at build time with zero client-side JavaScript. It works with any Vite-based framework (Astro, Nuxt, SvelteKit) and produces the same ID on both server and client, preventing hydration mismatches.
1111

1212
```jsx
1313
import { scope } from 'simple:scope';

www/src/content/docs/store.mdx

Lines changed: 37 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,51 @@
11
---
22
title: 💾 Simple store
3-
description: A reactive store that combines the simplicity of signals with the power of "selectors" you'd find in Zustand or Redux.
3+
description: "Simple Store (@simplestack/store) is a lightweight reactive state library for React, Next.js, and Vite. Combines signal-like simplicity with Zustand-style selectors and nested sub-stores."
44
sidebar:
55
label: Get started
66
order: 1
7+
head:
8+
- tag: script
9+
attrs:
10+
type: application/ld+json
11+
content: |
12+
{
13+
"@context": "https://schema.org",
14+
"@type": "FAQPage",
15+
"mainEntity": [
16+
{
17+
"@type": "Question",
18+
"name": "How do I install Simple Store?",
19+
"acceptedAnswer": {
20+
"@type": "Answer",
21+
"text": "Install from npm with: npm i @simplestack/store. Then import the store function: import { store } from '@simplestack/store'."
22+
}
23+
},
24+
{
25+
"@type": "Question",
26+
"name": "Does Simple Store work with Next.js?",
27+
"acceptedAnswer": {
28+
"@type": "Answer",
29+
"text": "Yes. Simple Store is compatible with Next.js App Router. Stores initialize once per server request and client components hydrate with the initial value. Any component using useStoreValue must be a 'use client' component."
30+
}
31+
},
32+
{
33+
"@type": "Question",
34+
"name": "What are sub-stores in Simple Store?",
35+
"acceptedAnswer": {
36+
"@type": "Answer",
37+
"text": "Sub-stores let you operate on specific parts of a nested store by calling select('key') on the parent. Changes to a sub-store automatically update the parent, and vice versa."
38+
}
39+
}
40+
]
41+
}
742
---
843

944
import { LinkCard, Tabs, TabItem } from '@astrojs/starlight/components';
1045

1146
<LinkCard href="https://github.com/bholmesdev/simplestack-store" title="Source code" />
1247

13-
A reactive store that combines the simplicity of signals with the power of "selectors" you'd find in Zustand or Redux.
48+
Simple Store (`@simplestack/store`) is a lightweight reactive state management library for React, Next.js, and Vite applications. It combines the simplicity of signals with the power of "selectors" you'd find in Zustand or Redux — letting you create stores, select nested values with `select()`, and subscribe to fine-grained updates.
1449

1550
```tsx
1651
import { store } from "@simplestack/store";

www/src/content/docs/stream.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
---
22
title: Simple stream 🌊
3-
description: Suspend Astro components with fallback content. Like React Server Components, but Just HTML ™️
3+
description: "Simple Stream (simple-stack-stream) is a deprecated Astro integration for suspending components with fallback content. Use Astro Server Islands instead."
44
---
55

66
:::caution

0 commit comments

Comments
 (0)