diff --git a/.github/workflows/deploy-docs.yml b/.github/workflows/deploy-docs.yml index 1acaa15..ad6be98 100644 --- a/.github/workflows/deploy-docs.yml +++ b/.github/workflows/deploy-docs.yml @@ -45,6 +45,16 @@ jobs: mkdir -p apps/docs/out/docs echo '' > apps/docs/out/docs/index.html + - name: Generate sitemap.xml + run: | + cd apps/docs/out + echo '' > sitemap.xml + echo '' >> sitemap.xml + find . -name "index.html" | sed 's|^\./||;s|/index\.html$|/|;s|^index\.html$|/|' | sort | while read -r path; do + echo " https://bromso.github.io/metapowers${path}" >> sitemap.xml + done + echo '' >> sitemap.xml + - name: Upload artifact uses: actions/upload-pages-artifact@v3 with: diff --git a/README.md b/README.md index ffe9938..3ee8e50 100644 --- a/README.md +++ b/README.md @@ -2,10 +2,19 @@ [![npm version](https://img.shields.io/npm/v/create-metapowers.svg)](https://www.npmjs.com/package/create-metapowers) [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) -[![LLM Plugin](https://img.shields.io/badge/LLM-Plugin-CC785C?logo=anthropic&logoColor=white)](https://bromso.github.io/metapowers/) +[![TypeScript](https://img.shields.io/badge/TypeScript-5.7-3178C6?logo=typescript&logoColor=white)](https://www.typescriptlang.org/) +[![Bun](https://img.shields.io/badge/Bun-1.3-fbf0df?logo=bun&logoColor=000)](https://bun.sh) +[![Turborepo](https://img.shields.io/badge/Turborepo-2.4-EF4444?logo=turborepo&logoColor=white)](https://turbo.build) +[![Next.js](https://img.shields.io/badge/Next.js-16-000?logo=nextdotjs&logoColor=white)](https://nextjs.org) +[![React](https://img.shields.io/badge/React-19-61DAFB?logo=react&logoColor=000)](https://react.dev) +[![Biome](https://img.shields.io/badge/Biome-1.9-60A5FA?logo=biome&logoColor=white)](https://biomejs.dev) +[![Vitest](https://img.shields.io/badge/Vitest-3.2-6E9F18?logo=vitest&logoColor=white)](https://vitest.dev) +[![Fumadocs](https://img.shields.io/badge/Fumadocs-16-F5A623)](https://fumadocs.vercel.app) +[![Claude Code](https://img.shields.io/badge/Claude_Code-Plugin-CC785C?logo=anthropic&logoColor=white)](https://claude.ai/code) [![Codex CLI](https://img.shields.io/badge/Codex_CLI-Compatible-10A37F?logo=openai&logoColor=white)](https://github.com/openai/codex) [![OpenCode](https://img.shields.io/badge/OpenCode-Compatible-6366F1)](https://opencode.ai) [![Cursor](https://img.shields.io/badge/Cursor-Compatible-000?logo=cursor&logoColor=white)](https://cursor.com) +[![Figma MCP](https://img.shields.io/badge/Figma-MCP_Server-F24E1E?logo=figma&logoColor=white)](https://www.figma.com) Structured, repeatable workflows for digital production domains. **275+ skills across 16 domains** — powered by proven methodologies. Works with any AI coding assistant — Claude Code, Codex CLI, OpenCode, Cursor, and more. diff --git a/apps/docs/app/layout.tsx b/apps/docs/app/layout.tsx index 0092779..15dcef7 100644 --- a/apps/docs/app/layout.tsx +++ b/apps/docs/app/layout.tsx @@ -1,10 +1,77 @@ import { RootProvider } from "fumadocs-ui/provider/next"; import type { ReactNode } from "react"; +import type { Metadata } from "next"; import "./global.css"; +const siteUrl = "https://bromso.github.io/metapowers"; + +export const metadata: Metadata = { + title: { + default: "Metapowers — Structured Workflows for AI Coding", + template: "%s | Metapowers", + }, + description: + "275+ skills across 16 domains — structured, repeatable workflows for design, research, development, marketing, and more. Works with Claude Code, Codex CLI, OpenCode, and Cursor.", + metadataBase: new URL(siteUrl), + openGraph: { + type: "website", + locale: "en_US", + url: siteUrl, + siteName: "Metapowers", + title: "Metapowers — Structured Workflows for AI Coding", + description: + "275+ skills across 16 domains — structured, repeatable workflows for design, research, development, marketing, and more.", + }, + twitter: { + card: "summary_large_image", + title: "Metapowers — Structured Workflows for AI Coding", + description: + "275+ skills across 16 domains. Works with Claude Code, Codex CLI, OpenCode, and Cursor.", + }, + icons: { + icon: "/metapowers/favicon.svg", + }, + other: { + "npm:package": "create-metapowers", + }, +}; + +// Static JSON-LD structured data — all values are hardcoded constants, no user input +const structuredData = JSON.stringify({ + "@context": "https://schema.org", + "@type": "SoftwareApplication", + name: "Metapowers", + description: + "Structured, repeatable workflows for digital production domains. 275+ skills across 16 domains.", + url: siteUrl, + applicationCategory: "DeveloperApplication", + operatingSystem: "Any", + license: "https://opensource.org/licenses/MIT", + author: { + "@type": "Person", + name: "Jonas Broms", + url: "https://github.com/bromso", + }, + codeRepository: "https://github.com/bromso/metapowers", + installUrl: "https://www.npmjs.com/package/create-metapowers", + offers: { + "@type": "Offer", + price: "0", + priceCurrency: "USD", + }, + softwareRequirements: "Claude Code, Codex CLI, OpenCode, or Cursor", +}); + export default function Layout({ children }: { children: ReactNode }) { return ( + + {/* Safe: structuredData is a compile-time constant with no user input */} +