Skip to content
Back to skills

Seo Content

ASecurity

Research keywords and write or optimise a search-friendly page for the Reader.md site — use-case pages, feature docs pages, landing copy. Use whenever the user wants a new use-case page, mentions SEO, keywords, search intent, meta descriptions, structured data or schema markup, "rank for", or making pages easier for AI/LLMs to extract — even if they don't say "SEO".

  • 5 stars
  • 0 votes
  • 0 copies
  • 1 view
  • Added October 5, 2026
ai-agentsgoswiftgit

Works with

  • cli

Security analysis

A100/100

Scanned October 5, 2026

npx -y skills add jnahian/reader.md --skill seo-content --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Seo Content?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Seo Content
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/jnahian-seo-content/badge)](https://www.skillsdirectory.com/skills/jnahian-seo-content)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: seo-content
description: Research keywords and write or optimise a search-friendly page for the Reader.md site — use-case pages, feature docs pages, landing copy. Use whenever the user wants a new use-case page, mentions SEO, keywords, search intent, meta descriptions, structured data or schema markup, "rank for", or making pages easier for AI/LLMs to extract — even if they don't say "SEO".
---

# seo-content

One page at a time: a keyword map, then a page built on it. Generic SEO you
already know; this skill is how it lands on **this** site's plumbing, and the
rules that keep it honest.

**Three gates, none auto-approved:**

| # | When | User approves |
|---|------|---------------|
| 1 | Before drafting | The keyword map (and, for a new page type, where it lives) |
| 2 | Before commit | The finished page |
| 3 | Before push | Publishing — anything in `docs/` merged to `main` is live |

## 1. Keyword map, per topic

Load search with `ToolSearch` (`select:WebSearch,WebFetch`). There is no volume
tool. **Never invent search volumes or difficulty scores** — rank by relevance
and intent, and give the reason in one phrase.

For each topic find four buckets:

- **Primary** — the 1–2 terms the page must own ("markdown viewer mac").
- **Long-tail** — specific, low-competition phrasings that match a real job
  ("preview README files before pushing", "read markdown over ssh").
- **Questions** — from People Also Ask, forums, GitHub issues, Reddit
  ("how do I view markdown on mac without an editor").
- **Commercial** — comparison/choice intent ("best markdown viewer for mac",
  "free typora alternative", "marked 2 alternative").

Check the live SERP for each primary: what ranks (docs page, listicle, app
store, forum) is the intent Google has settled on — match it or pick another
term. Competitors worth reading: Typora, MacDown, Marked 2, Obsidian, Quick
Look plugins.

Drop a keyword the app can't truthfully satisfy, however attractive. Present
the map as a table (keyword · bucket · intent · why it fits · target section)
and stop for gate 1.

## 2. Where it lives

- Docs and feature pages: `docs/*.md`, `docs/features/<slug>.md` → `/docs/<slug>`.
  The filename *is* the URL — short, lowercase, hyphenated, primary keyword in it.
- **Use cases**: `docs/use-cases/<slug>.md` → `/use-cases/<slug>`, a separate
  `useCases` collection (`web/src/content.config.ts`) — not under `/docs/`.
  Frontmatter: `title`, `order`, `summary`, optional `related` (docs page ids).
  The `/use-cases` index, nav, `llms.txt` and sitemap pick a new file up with no
  other edit; a link to it from docs is a relative path (`../use-cases/<slug>.md`).
- Any other new page type is the user's call; ask. A new `docs/` subdirectory
  published under `/docs/` needs all three of `DOC_PATTERNS`, `docId` and
  `isDocPage` in `web/plugins/docs-pages.mjs` — `isDocPage`'s regex hardcodes
  `features/`, and missing it silently breaks link rewriting.
- Never put page prose in `web/src/`. The markdown is the only copy.

## 3. Page checklist → where each lives

| Requirement | Here |
|---|---|
| Search title | frontmatter `title`; renders as `<title>{title} — Reader.md</title>` — keep `title` ≤ ~48 chars, primary keyword first |
| Clear H1 | the `# ` line; may be the human phrasing while `title` carries the query phrasing |
| Meta description | frontmatter `summary`, ~150–160 chars — also the og:description, the `/docs` hub card and `llms.txt` line, so it must read as a sentence, not a keyword list |
| H2/H3 | one idea per H2; H3 for questions and sub-steps; headings in the reader's words |
| Internal links | relative `.md` paths (`features/git.md#scope`), rewritten at build; plus `related: [ids]` in frontmatter for the footer. Every new page links to 2+ existing pages and gets linked *from* 1+ |
| Hub placement | `category` + `order`; a category sorts by its lowest `order`, so a low number moves a whole group up the hub |
| Intent match | first screen answers what the SERP showed the searcher wants |

## 4. Section shape: question → answer → context → proof

For the sections that carry a keyword or question:

1. **Question** as the H2/H3, phrased as searched.
2. **Direct answer** — first 1–2 sentences, standalone, no "it" referring
   upward. This is the sentence an AI or a snippet lifts.
3. **Context** — how, when, limits, the shortcut "Label (⌘X)".
4. **Proof** — a real screenshot/clip, a command, a link to the feature doc.

Screenshots come only from a `<slug>.shots.json` manifest captured by the
`reader-docs` skill — never shot by hand. Capture writes to
`docs/assets/screenshots/<page>/` wherever the page lives.

## 5. AI-extractable

- Self-contained paragraphs; name the thing ("Reader.md renders Mermaid…"),
  not "it does".
- Facts as lists or tables, not buried in prose. Exact names for keys, flags,
  file paths in code spans.
- New pages appear in `/llms.txt` automatically — `summary` is the line an
  agent sees first. Every page also gets a `.md` twin at its URL plus `.md`.

## 6. Structured data

Markdown can't declare it, and **never hand-write JSON-LD in a page**. It is
built in `web/src/pages/docs/[...slug].astro` from frontmatter and passed to
`Base.astro`'s `schema` prop.

- Today only `faq.md` gets `FAQPage` (`rehype-faq-accordion` is scoped to that
  file). Question/answer sections elsewhere produce **no** FAQ schema.
- Use-case pages get `TechArticle` + `BreadcrumbList` from
  `web/src/pages/use-cases/[slug].astro`; the index gets `CollectionPage`.
- The same for docs pages is issue #92. Until it lands, docs pages carry no
  schema — say so; don't claim it.
- Keep `title` and `summary` accurate: they become `headline`/`description`.

## 7. Truth rules

- Claim only behaviour documented in `docs/features/`. Shortcuts are checked
  against the `.keyboardShortcut` bindings in `ReaderMdApp.swift`.
- Comparisons with competitors: factual, current, no disparagement; drop a
  claim you can't source.
- Free, MIT, macOS 13+, Apple silicon only — never imply Intel or Windows.

## 8. Verify and ship

```sh
cd web && npm run build
grep -rho 'href="[^"]*\.md[^"]*"' dist   # only absolute GitHub URLs
```

Check `dist/docs/<slug>/index.html`: one `<h1>`, `<title>`, `<meta name="description">`,
and the JSON-LD if #92 is in. Gate 2, commit, gate 3, then push + `gh pr create`
with the `web` label if `web/` changed.

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.