optbrew 0.0.0-stage → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +6 -0
- package/.claude-plugin/plugin.json +6 -0
- package/.codex-plugin/plugin.json +13 -0
- package/CHANGELOG.md +50 -0
- package/LICENSE +21 -0
- package/README.ko.md +149 -0
- package/README.md +148 -2
- package/THIRD_PARTY_NOTICES.md +10 -0
- package/bin/optbrew.mjs +4 -0
- package/docs/platforms.md +107 -0
- package/docs/release.md +14 -0
- package/lib/cli.mjs +116 -0
- package/lib/doctor.mjs +45 -0
- package/lib/install.mjs +158 -0
- package/lib/paths.mjs +30 -0
- package/lib/records.mjs +44 -0
- package/lib/reinstall.mjs +92 -0
- package/lib/transaction.mjs +205 -0
- package/lib/update.mjs +189 -0
- package/package.json +39 -4
- package/plugin.json +13 -0
- package/skills/optbrew/LICENSE +21 -0
- package/skills/optbrew/SKILL.md +17 -0
- package/skills/optbrew/THIRD_PARTY_NOTICES.md +10 -0
- package/skills/optbrew/agents/openai.yaml +4 -0
- package/skills/optbrew/bundle-manifest.json +687 -0
- package/skills/optbrew/licenses/firecrawl-seo-audit.txt +15 -0
- package/skills/optbrew/licenses/magnus-seo.txt +21 -0
- package/skills/optbrew/licenses/marketing-search.txt +21 -0
- package/skills/optbrew/licenses/mblode-seo.txt +21 -0
- package/skills/optbrew/licenses/naver-searchadvisor.txt +29 -0
- package/skills/optbrew/licenses/seranking-seo.txt +21 -0
- package/skills/optbrew/modules/firecrawl-seo-audit/GUIDE.md +64 -0
- package/skills/optbrew/modules/magnus-seo/GUIDE.md +79 -0
- package/skills/optbrew/modules/magnus-seo/README.md +45 -0
- package/skills/optbrew/modules/magnus-seo/assets/audit-report-template.md +76 -0
- package/skills/optbrew/modules/magnus-seo/references/aeo-methodology.md +105 -0
- package/skills/optbrew/modules/magnus-seo/references/agent-readable-content.md +28 -0
- package/skills/optbrew/modules/magnus-seo/references/content-and-entity-architecture.md +100 -0
- package/skills/optbrew/modules/magnus-seo/references/content-strategy-seo.md +142 -0
- package/skills/optbrew/modules/magnus-seo/references/discovery-and-freshness.md +47 -0
- package/skills/optbrew/modules/magnus-seo/references/evidence-boundaries.md +75 -0
- package/skills/optbrew/modules/magnus-seo/references/ghost-metadata.md +204 -0
- package/skills/optbrew/modules/magnus-seo/references/implementation-playbook.md +114 -0
- package/skills/optbrew/modules/magnus-seo/references/measurement-and-experimentation.md +47 -0
- package/skills/optbrew/modules/magnus-seo/references/onpage-seo.md +154 -0
- package/skills/optbrew/modules/magnus-seo/references/platform-guidance.md +30 -0
- package/skills/optbrew/modules/magnus-seo/references/schema-markup.md +244 -0
- package/skills/optbrew/modules/magnus-seo/references/source-index.md +36 -0
- package/skills/optbrew/modules/magnus-seo/references/structured-data.md +56 -0
- package/skills/optbrew/modules/magnus-seo/references/technical-seo.md +99 -0
- package/skills/optbrew/modules/magnus-seo/scripts/aeo_audit.py +158 -0
- package/skills/optbrew/modules/magnus-seo/scripts/build_prompt_matrix.py +52 -0
- package/skills/optbrew/modules/magnus-seo/templates/aeo-implementation-plan.md +53 -0
- package/skills/optbrew/modules/magnus-seo/templates/citation-observation-log.md +16 -0
- package/skills/optbrew/modules/magnus-seo/templates/llms.txt.template +15 -0
- package/skills/optbrew/modules/magnus-seo/templates/question-cluster.md +27 -0
- package/skills/optbrew/modules/magnus-seo/templates/robots-ai-crawlers.txt +23 -0
- package/skills/optbrew/modules/marketing-search/skills/ai-seo/GUIDE.md +483 -0
- package/skills/optbrew/modules/marketing-search/skills/ai-seo/references/agent-readiness.md +57 -0
- package/skills/optbrew/modules/marketing-search/skills/ai-seo/references/citations-vs-recommendations.md +85 -0
- package/skills/optbrew/modules/marketing-search/skills/ai-seo/references/content-patterns.md +287 -0
- package/skills/optbrew/modules/marketing-search/skills/ai-seo/references/content-types.md +71 -0
- package/skills/optbrew/modules/marketing-search/skills/ai-seo/references/format-volatility.md +98 -0
- package/skills/optbrew/modules/marketing-search/skills/ai-seo/references/okf.md +104 -0
- package/skills/optbrew/modules/marketing-search/skills/ai-seo/references/platform-ranking-factors.md +154 -0
- package/skills/optbrew/modules/marketing-search/skills/ai-seo/references/youtube-ai-citations.md +60 -0
- package/skills/optbrew/modules/marketing-search/skills/analytics/GUIDE.md +303 -0
- package/skills/optbrew/modules/marketing-search/skills/analytics/references/event-library.md +260 -0
- package/skills/optbrew/modules/marketing-search/skills/analytics/references/ga4-implementation.md +300 -0
- package/skills/optbrew/modules/marketing-search/skills/analytics/references/gtm-implementation.md +390 -0
- package/skills/optbrew/modules/marketing-search/skills/content-strategy/GUIDE.md +432 -0
- package/skills/optbrew/modules/marketing-search/skills/content-strategy/references/content-distribution.md +83 -0
- package/skills/optbrew/modules/marketing-search/skills/content-strategy/references/headless-cms.md +194 -0
- package/skills/optbrew/modules/marketing-search/skills/programmatic-seo/GUIDE.md +231 -0
- package/skills/optbrew/modules/marketing-search/skills/programmatic-seo/references/playbooks.md +308 -0
- package/skills/optbrew/modules/marketing-search/skills/schema/GUIDE.md +172 -0
- package/skills/optbrew/modules/marketing-search/skills/schema/references/schema-examples.md +398 -0
- package/skills/optbrew/modules/marketing-search/skills/seo-audit/GUIDE.md +492 -0
- package/skills/optbrew/modules/marketing-search/skills/seo-audit/references/ai-writing-detection.md +200 -0
- package/skills/optbrew/modules/marketing-search/skills/seo-audit/references/international-seo.md +230 -0
- package/skills/optbrew/modules/marketing-search/skills/site-architecture/GUIDE.md +350 -0
- package/skills/optbrew/modules/marketing-search/skills/site-architecture/references/mermaid-templates.md +216 -0
- package/skills/optbrew/modules/marketing-search/skills/site-architecture/references/navigation-patterns.md +305 -0
- package/skills/optbrew/modules/marketing-search/skills/site-architecture/references/site-type-templates.md +293 -0
- package/skills/optbrew/modules/mblode-seo/GUIDE.md +74 -0
- package/skills/optbrew/modules/mblode-seo/references/answer-engines.md +58 -0
- package/skills/optbrew/modules/mblode-seo/references/audit.md +78 -0
- package/skills/optbrew/modules/mblode-seo/references/brief-template.md +47 -0
- package/skills/optbrew/modules/mblode-seo/references/monitoring.md +56 -0
- package/skills/optbrew/modules/mblode-seo/references/nextjs-implementation.md +65 -0
- package/skills/optbrew/modules/mblode-seo/references/research-protocol.md +37 -0
- package/skills/optbrew/modules/mblode-seo/references/sources.md +47 -0
- package/skills/optbrew/modules/mblode-seo/references/validation-evidence.md +21 -0
- package/skills/optbrew/modules/naver-searchadvisor/GUIDE.md +75 -0
- package/skills/optbrew/modules/naver-searchadvisor/NOTICE.md +59 -0
- package/skills/optbrew/modules/naver-searchadvisor/references/INDEX.md +97 -0
- package/skills/optbrew/modules/naver-searchadvisor/scripts/audit.mjs +742 -0
- package/skills/optbrew/modules/naver-searchadvisor/scripts/robots.mjs +77 -0
- package/skills/optbrew/modules/seranking-seo/skills/seo-ai-search-share-of-voice/GUIDE.md +94 -0
- package/skills/optbrew/modules/seranking-seo/skills/seo-api/GUIDE.md +186 -0
- package/skills/optbrew/modules/seranking-seo/skills/seo-api/references/api-surface-map.md +207 -0
- package/skills/optbrew/modules/seranking-seo/skills/seo-api/references/auth-and-keys.md +182 -0
- package/skills/optbrew/modules/seranking-seo/skills/seo-api/references/integration-patterns.md +283 -0
- package/skills/optbrew/modules/seranking-seo/skills/seo-api/references/rate-limits-and-credits.md +235 -0
- package/skills/optbrew/modules/seranking-seo/skills/seo-competitor-gap-analysis/GUIDE.md +117 -0
- package/skills/optbrew/modules/seranking-seo/skills/seo-content-audit/GUIDE.md +155 -0
- package/skills/optbrew/modules/seranking-seo/skills/seo-content-audit/references/cite.md +84 -0
- package/skills/optbrew/modules/seranking-seo/skills/seo-content-audit/references/core-eeat.md +147 -0
- package/skills/optbrew/modules/seranking-seo/skills/seo-content-audit/templates/verdict.md +63 -0
- package/skills/optbrew/modules/seranking-seo/skills/seo-firecrawl/GUIDE.md +141 -0
- package/skills/optbrew/modules/seranking-seo/skills/seo-firecrawl/references/preflight.md +73 -0
- package/skills/optbrew/modules/seranking-seo/skills/seo-geo/GUIDE.md +159 -0
- package/skills/optbrew/modules/seranking-seo/skills/seo-google/GUIDE.md +393 -0
- package/skills/optbrew/modules/seranking-seo/skills/seo-google/assets/templates/cwv-audit-report.md +48 -0
- package/skills/optbrew/modules/seranking-seo/skills/seo-google/assets/templates/gsc-performance-report.md +44 -0
- package/skills/optbrew/modules/seranking-seo/skills/seo-google/assets/templates/indexation-status-report.md +43 -0
- package/skills/optbrew/modules/seranking-seo/skills/seo-google/references/auth-setup.md +160 -0
- package/skills/optbrew/modules/seranking-seo/skills/seo-google/references/cross-skill-integration.md +187 -0
- package/skills/optbrew/modules/seranking-seo/skills/seo-google/references/ga4-data-api.md +184 -0
- package/skills/optbrew/modules/seranking-seo/skills/seo-google/references/indexing-api.md +109 -0
- package/skills/optbrew/modules/seranking-seo/skills/seo-google/references/keyword-planner-api.md +66 -0
- package/skills/optbrew/modules/seranking-seo/skills/seo-google/references/nlp-api.md +55 -0
- package/skills/optbrew/modules/seranking-seo/skills/seo-google/references/pagespeed-crux-api.md +204 -0
- package/skills/optbrew/modules/seranking-seo/skills/seo-google/references/rate-limits-quotas.md +75 -0
- package/skills/optbrew/modules/seranking-seo/skills/seo-google/references/search-console-api.md +156 -0
- package/skills/optbrew/modules/seranking-seo/skills/seo-google/references/supplementary-apis.md +99 -0
- package/skills/optbrew/modules/seranking-seo/skills/seo-google/references/youtube-api.md +49 -0
- package/skills/optbrew/modules/seranking-seo/skills/seo-keyword-niche/GUIDE.md +174 -0
- package/skills/optbrew/modules/seranking-seo/skills/seo-page/GUIDE.md +174 -0
- package/skills/optbrew/modules/seranking-seo/skills/seo-plan/GUIDE.md +220 -0
- package/skills/optbrew/modules/seranking-seo/skills/seo-schema/GUIDE.md +135 -0
- package/skills/optbrew/modules/seranking-seo/skills/seo-schema/references/google-rich-results.md +89 -0
- package/skills/optbrew/modules/seranking-seo/skills/seo-schema/templates/article.json +23 -0
- package/skills/optbrew/modules/seranking-seo/skills/seo-schema/templates/breadcrumb-list.json +18 -0
- package/skills/optbrew/modules/seranking-seo/skills/seo-schema/templates/faq-page.json +22 -0
- package/skills/optbrew/modules/seranking-seo/skills/seo-schema/templates/local-business.json +32 -0
- package/skills/optbrew/modules/seranking-seo/skills/seo-schema/templates/product.json +25 -0
- package/skills/optbrew/modules/seranking-seo/skills/seo-sitemap/GUIDE.md +128 -0
- package/skills/optbrew/modules/seranking-seo/skills/seo-technical-audit/GUIDE.md +235 -0
- package/skills/optbrew/modules/seranking-seo/skills/seo-technical-audit/references/severity-mapping.md +133 -0
- package/skills/optbrew/references/ai-crawlers.json +21 -0
- package/skills/optbrew/references/ai-crawlers.md +24 -0
- package/skills/optbrew/references/api.md +45 -0
- package/skills/optbrew/references/check-registry.json +28 -0
- package/skills/optbrew/references/evidence.md +9 -0
- package/skills/optbrew/references/intake.md +9 -0
- package/skills/optbrew/references/measurement.md +29 -0
- package/skills/optbrew/references/policies.md +7 -0
- package/skills/optbrew/references/profiles.json +13 -0
- package/skills/optbrew/references/remediations.json +12 -0
- package/skills/optbrew/references/report.md +29 -0
- package/skills/optbrew/references/routing.md +15 -0
- package/skills/optbrew/references/schemas/contract.schema.json +51 -0
- package/skills/optbrew/references/scoring.md +62 -0
- package/skills/optbrew/scripts/adapters/anthropic.mjs +116 -0
- package/skills/optbrew/scripts/adapters/imports.mjs +81 -0
- package/skills/optbrew/scripts/audit.mjs +124 -0
- package/skills/optbrew/scripts/cli.mjs +41 -0
- package/skills/optbrew/scripts/core/bootstrap.mjs +31 -0
- package/skills/optbrew/scripts/core/bundle.mjs +73 -0
- package/skills/optbrew/scripts/core/capabilities.mjs +19 -0
- package/skills/optbrew/scripts/core/collector.mjs +250 -0
- package/skills/optbrew/scripts/core/compare.mjs +47 -0
- package/skills/optbrew/scripts/core/contracts.mjs +144 -0
- package/skills/optbrew/scripts/core/cost-ledger.mjs +95 -0
- package/skills/optbrew/scripts/core/crawlers.mjs +11 -0
- package/skills/optbrew/scripts/core/derive.mjs +168 -0
- package/skills/optbrew/scripts/core/facts.mjs +189 -0
- package/skills/optbrew/scripts/core/findings.mjs +54 -0
- package/skills/optbrew/scripts/core/html.mjs +53 -0
- package/skills/optbrew/scripts/core/metrics.mjs +97 -0
- package/skills/optbrew/scripts/core/protocol.mjs +125 -0
- package/skills/optbrew/scripts/core/report.mjs +742 -0
- package/skills/optbrew/scripts/core/scope.mjs +52 -0
- package/skills/optbrew/scripts/core/score.mjs +71 -0
- package/skills/optbrew/scripts/core/weights.mjs +139 -0
- package/skills/optbrew/source-lock.json +2686 -0
- package/source-lock.json +2686 -0
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
# On-Page SEO Reference
|
|
2
|
+
|
|
3
|
+
On-page optimization ensures each piece of content is structured and written to communicate relevance to search engines while serving the reader.
|
|
4
|
+
|
|
5
|
+
## Title Tags
|
|
6
|
+
|
|
7
|
+
The title tag is the single most important on-page SEO element. It appears in SERPs as the clickable headline.
|
|
8
|
+
|
|
9
|
+
### Best Practices
|
|
10
|
+
- **Length:** 50-60 characters (Google typically displays the first 50-60 chars; titles longer than ~580px get truncated)
|
|
11
|
+
- **Keyword placement:** Primary keyword near the beginning (front-loaded)
|
|
12
|
+
- **Uniqueness:** Every page has a unique title tag — no duplicates
|
|
13
|
+
- **Branding:** Include site/brand name at the end (separated by `—` or `|` in SERPs, but per the publication style rule, NO emdashes in prose — for title tags, use `|` as separator)
|
|
14
|
+
- Example: `"SEO Audit for Ghost CMS Sites | Groktopus"`
|
|
15
|
+
- Example: `"The Artifact Pyramid: Progressive Disclosure for Agent Outputs | Example Author"`
|
|
16
|
+
- **Compelling:** Includes a value proposition or hook that earns the click
|
|
17
|
+
- **No keyword stuffing:** Sounds natural, not like a list of keywords
|
|
18
|
+
|
|
19
|
+
### Platform-specific implementation notes — Patterns
|
|
20
|
+
|
|
21
|
+
**example.com (Hugo, PaperMod theme):**
|
|
22
|
+
- Title set in frontmatter: `title: "..."`
|
|
23
|
+
- Hugo auto-generates `<title>` from the title field
|
|
24
|
+
- Verify: `title` in frontmatter is 50-60 chars
|
|
25
|
+
- Site name appended automatically by PaperMod: `"Title | Example Author"`
|
|
26
|
+
|
|
27
|
+
**example.com (Ghost Pro):**
|
|
28
|
+
- Meta title set in Ghost post settings → Meta Data → Custom Meta Title
|
|
29
|
+
- Default: Post title (which may be too long — always set a custom meta title)
|
|
30
|
+
- Ghost appends site name automatically in the `<title>` tag
|
|
31
|
+
- Verify: custom meta title under 60 chars
|
|
32
|
+
|
|
33
|
+
**example.org / example.net (Ghost, self-hosted):**
|
|
34
|
+
- Same as example.com — custom meta title in Ghost post settings
|
|
35
|
+
|
|
36
|
+
## Meta Descriptions
|
|
37
|
+
|
|
38
|
+
Not a direct ranking factor, but the second most important element for click-through rate from SERPs.
|
|
39
|
+
|
|
40
|
+
### Best Practices
|
|
41
|
+
- **Length:** 150-160 characters (longer descriptions may be truncated)
|
|
42
|
+
- **Includes primary keyword + secondary keyword naturally**
|
|
43
|
+
- **Includes a call to action** ("Learn how...", "Discover why...", "Read the analysis")
|
|
44
|
+
- **Unique per page** — no duplicate or auto-generated descriptions
|
|
45
|
+
- **Matches search intent** — if someone searches for "progressive disclosure for agents," the description should signal that the page delivers on that query
|
|
46
|
+
- **Contractions and natural language** — reads like a person wrote it
|
|
47
|
+
|
|
48
|
+
### Platform-specific implementation notes — Patterns
|
|
49
|
+
|
|
50
|
+
**example.com (Hugo, PaperMod):**
|
|
51
|
+
- Hugo auto-generates meta description from page summary/content if not specified
|
|
52
|
+
- Always set a `description:` field in frontmatter that's 150-160 chars
|
|
53
|
+
- This is the meta description and also used in card previews
|
|
54
|
+
|
|
55
|
+
**example.com (Ghost Pro):**
|
|
56
|
+
- Custom Meta Description in post settings → Meta Data
|
|
57
|
+
- Ghost also uses this for Open Graph description
|
|
58
|
+
- If not set, Ghost uses the post excerpt (which may be longer or shorter than ideal)
|
|
59
|
+
|
|
60
|
+
## Heading Structure
|
|
61
|
+
|
|
62
|
+
Headings communicate content hierarchy to search engines and provide scanability for readers.
|
|
63
|
+
|
|
64
|
+
### Hierarchy Rules
|
|
65
|
+
- **H1:** Exactly one per page. Should match the title tag (or be a slightly more readable version). Contains the primary keyword.
|
|
66
|
+
- **H2:** Major sections of the content. Each H2 should contain a related keyword or subtopic. Used as navigation anchors.
|
|
67
|
+
- **H3-H6:** Subsections under H2s. Deeper hierarchy for complex content.
|
|
68
|
+
- **No skipping levels:** Don't jump from H1 to H3. Hierarchically nested.
|
|
69
|
+
|
|
70
|
+
### Checklist
|
|
71
|
+
- [ ] Exactly one H1 per page
|
|
72
|
+
- [ ] H1 matches or closely relates to the title tag
|
|
73
|
+
- [ ] H1 contains primary keyword
|
|
74
|
+
- [ ] Headings form a logical outline of the page when read alone
|
|
75
|
+
- [ ] No empty headings or headings used purely for styling
|
|
76
|
+
- [ ] Keywords appear naturally in headings (not stuffed)
|
|
77
|
+
- [ ] H2s and H3s are descriptive, not generic ("Introduction" is weak; "Why Progressive Disclosure Matters for AI Agents" is strong)
|
|
78
|
+
|
|
79
|
+
## Content Quality
|
|
80
|
+
|
|
81
|
+
### Keyword Usage
|
|
82
|
+
- **Primary keyword appears in:** H1, first paragraph, at least one H2, URL slug
|
|
83
|
+
- **Keyword density:** Natural usage — don't target specific percentages. If the keyword appears naturally 3-5 times in a 1500-word article, that's fine.
|
|
84
|
+
- **LSI / related keywords:** Include semantically related terms that help establish topical relevance (e.g., for an article about "artifact pyramids," include terms like "progressive disclosure," "multi-agent pipelines," "agent collaboration")
|
|
85
|
+
- **No keyword stuffing:** Don't repeat the same phrase unnaturally
|
|
86
|
+
|
|
87
|
+
### Content Length
|
|
88
|
+
- **Blog posts:** 1500-2500 words is typical for long-form content. long-form articles often run longer because they're deep analytical pieces. Longer is fine if every word earns its place.
|
|
89
|
+
- **Minimum to rank:** 300 words for very simple queries; 1000+ for competitive terms
|
|
90
|
+
- **Quality over quantity:** A tight 800-word post that answers the query completely beats a padded 2000-word post that repeats itself
|
|
91
|
+
|
|
92
|
+
### Readability
|
|
93
|
+
- Short paragraphs (2-4 sentences for web reading)
|
|
94
|
+
- Bullet points and numbered lists for scannable information
|
|
95
|
+
- Bold key terms for emphasis (sparingly)
|
|
96
|
+
- Clear section breaks with descriptive headings
|
|
97
|
+
|
|
98
|
+
### Freshness
|
|
99
|
+
- Update dates on evergreen content when significantly revised
|
|
100
|
+
- Add "Last updated" or "Updated" notation for major content refreshes
|
|
101
|
+
- Google favors freshness for certain query types (news, recent events, technology)
|
|
102
|
+
|
|
103
|
+
## Internal Linking
|
|
104
|
+
|
|
105
|
+
Internal links distribute page authority throughout the site and help crawlers discover content.
|
|
106
|
+
|
|
107
|
+
### Best Practices
|
|
108
|
+
- **Link to related content:** Every post should link to 2-5 other posts/pages on the same site
|
|
109
|
+
- **Descriptive anchor text:** Use the target topic's keyword as the link text (not "click here" or "read more")
|
|
110
|
+
- **Link to cornerstone content:** Important pillar pages should receive more internal links
|
|
111
|
+
- **Natural placement:** Links should serve the reader — if it genuinely helps to read more about X, link it
|
|
112
|
+
- **Avoid:** Links in navigation that aren't needed, links to the same target with different anchor text, links on every instance of a term
|
|
113
|
+
|
|
114
|
+
### Platform-specific implementation notes — Patterns
|
|
115
|
+
|
|
116
|
+
**example.com:** Magnus uses [[wikilinks]] in draft which Hugo converts to hyperlinks. Check that wikilinks are rendering as live HTML links and pointing to existing pages.
|
|
117
|
+
|
|
118
|
+
**example.com (Ghost):** Manual internal links in the editor. Verify that linked posts exist and are published.
|
|
119
|
+
|
|
120
|
+
## Image Optimization
|
|
121
|
+
|
|
122
|
+
### Alt Text
|
|
123
|
+
- **Purpose:** Accessibility for screen readers + context for search engines (Google Images)
|
|
124
|
+
- **Every image** must have a descriptive alt attribute
|
|
125
|
+
- **Descriptive:** "Close-up of a Portia labiata spider's principal eyes showing the characteristic three-lens system" — not "Portia spider" or "image001.jpg"
|
|
126
|
+
- **Keyword-optimized:** Include relevant keywords naturally when they describe the image
|
|
127
|
+
- **No keyword stuffing:** Alt text is first for accessibility, second for SEO
|
|
128
|
+
- **Decorative images:** alt="" (empty alt) for purely decorative images so screen readers skip them
|
|
129
|
+
|
|
130
|
+
### File Names
|
|
131
|
+
- Descriptive, hyphenated: `portia-spider-eyes-closeup.jpg` not `IMG_4732.jpg`
|
|
132
|
+
- Include target keyword when appropriate
|
|
133
|
+
- Use hyphens, not underscores
|
|
134
|
+
|
|
135
|
+
### File Size
|
|
136
|
+
- Compress images before upload (target < 100KB for standard inline images)
|
|
137
|
+
- Use next-gen formats: WebP (with JPEG fallback for older browsers)
|
|
138
|
+
- Hugo: Use `.WebP` processing or serve via CDN that auto-converts
|
|
139
|
+
- Ghost: Compress before uploading — Ghost does minimal image optimization
|
|
140
|
+
|
|
141
|
+
## URL Structure
|
|
142
|
+
|
|
143
|
+
### Best Practices
|
|
144
|
+
- **Short, descriptive:** `/seo-audit-ghost-cms/` not `/post/12345/`
|
|
145
|
+
- **Include primary keyword:** When natural
|
|
146
|
+
- **Hyphens, not underscores:** Google treats hyphens as word separators
|
|
147
|
+
- **Lowercase:** /seo-audit not /SEO-Audit
|
|
148
|
+
- **Stop words:** Remove unnecessary "and", "the", "of", "for" where they don't add meaning
|
|
149
|
+
- **Stable:** Once published, never change a URL (breaks all inbound links)
|
|
150
|
+
|
|
151
|
+
### Platform-specific implementation notes — Patterns
|
|
152
|
+
- **example.com:** Hugo uses the post slug from frontmatter or filename. Verify slug is short and contains primary keyword.
|
|
153
|
+
- **example.com:** Ghost auto-generates slug from title. Set a custom slug in post settings if the auto-generated one is too long or doesn't contain the keyword.
|
|
154
|
+
- **Never change published slugs** without explicit approval from the site owner.
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# AEO platform guidance
|
|
2
|
+
|
|
3
|
+
## Google Search AI features
|
|
4
|
+
|
|
5
|
+
Google Search Central says AI Overviews and AI Mode use existing Search systems. Pages need to be indexed and snippet-eligible; there are no additional technical requirements or special AI markup. Continue people-first content, crawlable internal links, textual content, accurate structured data, and Search Console measurement. Google explicitly says `llms.txt`, mandatory chunking, exact long-tail rewrites, and inauthentic mentions are not required for Google Search AI features.
|
|
6
|
+
|
|
7
|
+
## Bing and Copilot
|
|
8
|
+
|
|
9
|
+
Bing documents AI Performance in Webmaster Tools: total citations, average cited pages, grounding queries, page-level activity, and trends. These are visibility observations, not ranking, authority, placement, or correctness measures. Bing also documents sitemaps, truthful `lastmod`, and IndexNow as discovery/freshness support. Use provider-native definitions and do not generalize dashboard data to all engines.
|
|
10
|
+
|
|
11
|
+
## OpenAI
|
|
12
|
+
|
|
13
|
+
OpenAI documents separate robots controls for OAI-SearchBot (search), GPTBot (training), and ChatGPT-User (user-triggered actions). Allowing one does not imply allowing the others. Treat published bot names, IP ranges, and propagation timing as version-sensitive.
|
|
14
|
+
|
|
15
|
+
## Perplexity and other answer providers
|
|
16
|
+
|
|
17
|
+
Use the provider's current crawler and publisher documentation when available. Do not infer search, training, user-fetch, or citation semantics from a user-agent string alone. If documentation is inaccessible or ambiguous, record the gap and avoid a policy change based on guesswork.
|
|
18
|
+
|
|
19
|
+
## Provider comparison table
|
|
20
|
+
|
|
21
|
+
| Question | Google | Bing | OpenAI | Other providers |
|
|
22
|
+
|---|---|---|---|---|
|
|
23
|
+
| What enables search visibility? | Search indexing and snippet eligibility | Bing indexing/crawl | OAI-SearchBot policy plus provider systems | Provider-specific |
|
|
24
|
+
| Is special AEO markup required? | No current special requirement | No universal requirement established | No universal requirement established | Unknown unless documented |
|
|
25
|
+
| Is `llms.txt` authoritative? | Google says it is ignored for Search | No universal requirement | Provider-specific/undocumented unless stated | Proposal-dependent |
|
|
26
|
+
| What can be measured? | Search Console AI reporting where available | AI Performance | Usually external observation unless provider publishes data | Provider-native or manual |
|
|
27
|
+
|
|
28
|
+
## Refresh triggers
|
|
29
|
+
|
|
30
|
+
Re-read official pages when a provider changes crawler names, AI surfaces, reporting definitions, robots controls, indexing guidance, or content policies. Record access date and exact scope in `references/source-index.md`.
|
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
# Schema Markup / Structured Data Reference
|
|
2
|
+
|
|
3
|
+
Structured data helps search engines understand the content of a page and enables rich results in SERPs (FAQ snippets, HowTo steps, breadcrumbs, article previews).
|
|
4
|
+
|
|
5
|
+
## JSON-LD Format
|
|
6
|
+
|
|
7
|
+
Google's preferred format. Structured data is typically JSON-LD injected through the CMS, application templates, or a supported code-injection mechanism.
|
|
8
|
+
|
|
9
|
+
### Basic Structure
|
|
10
|
+
|
|
11
|
+
```json
|
|
12
|
+
{
|
|
13
|
+
"@context": "https://schema.org",
|
|
14
|
+
"@type": "Article",
|
|
15
|
+
"headline": "Title of the Article",
|
|
16
|
+
"description": "150-160 char meta description",
|
|
17
|
+
"author": {
|
|
18
|
+
"@type": "Person",
|
|
19
|
+
"name": "Example Author"
|
|
20
|
+
},
|
|
21
|
+
"datePublished": "2026-05-01",
|
|
22
|
+
"dateModified": "2026-05-15",
|
|
23
|
+
"image": "https://example.com/image.jpg",
|
|
24
|
+
"publisher": {
|
|
25
|
+
"@type": "Organization",
|
|
26
|
+
"name": "Groktopus",
|
|
27
|
+
"logo": {
|
|
28
|
+
"@type": "ImageObject",
|
|
29
|
+
"url": "https://www.example.com/favicon.png"
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
## Schema Types for Platform-specific implementation notes
|
|
36
|
+
|
|
37
|
+
### TechArticle (example.com)
|
|
38
|
+
Use for technical/analytical content about AI, enterprise technology, and engineering.
|
|
39
|
+
|
|
40
|
+
```json
|
|
41
|
+
{
|
|
42
|
+
"@context": "https://schema.org",
|
|
43
|
+
"@type": "TechArticle",
|
|
44
|
+
"headline": "Article Title",
|
|
45
|
+
"description": "Description",
|
|
46
|
+
"author": {
|
|
47
|
+
"@type": "Person",
|
|
48
|
+
"name": "Example Author"
|
|
49
|
+
},
|
|
50
|
+
"datePublished": "2026-05-01",
|
|
51
|
+
"dateModified": "2026-05-15",
|
|
52
|
+
"proficiencyLevel": "Advanced",
|
|
53
|
+
"about": {
|
|
54
|
+
"@type": "Thing",
|
|
55
|
+
"name": "Topic area"
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
### Article / BlogPosting (example.com)
|
|
61
|
+
Use for personal blog and analytical long-form content.
|
|
62
|
+
|
|
63
|
+
```json
|
|
64
|
+
{
|
|
65
|
+
"@context": "https://schema.org",
|
|
66
|
+
"@type": "BlogPosting",
|
|
67
|
+
"headline": "Title",
|
|
68
|
+
"description": "Description",
|
|
69
|
+
"author": {
|
|
70
|
+
"@type": "Person",
|
|
71
|
+
"name": "Example Author"
|
|
72
|
+
},
|
|
73
|
+
"datePublished": "2026-05-01",
|
|
74
|
+
"dateModified": "2026-05-15"
|
|
75
|
+
}
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
For articles authored by Jasper:
|
|
79
|
+
|
|
80
|
+
```json
|
|
81
|
+
{
|
|
82
|
+
"@context": "https://schema.org",
|
|
83
|
+
"@type": "BlogPosting",
|
|
84
|
+
"headline": "Title",
|
|
85
|
+
"description": "Description",
|
|
86
|
+
"author": {
|
|
87
|
+
"@type": "Person",
|
|
88
|
+
"name": "Jasper"
|
|
89
|
+
},
|
|
90
|
+
"datePublished": "2026-05-01",
|
|
91
|
+
"dateModified": "2026-05-15"
|
|
92
|
+
}
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
### FAQPage (All Sites)
|
|
96
|
+
Use when the article answers multiple distinct questions. Enables FAQ rich results in SERPs.
|
|
97
|
+
|
|
98
|
+
```json
|
|
99
|
+
{
|
|
100
|
+
"@context": "https://schema.org",
|
|
101
|
+
"@type": "FAQPage",
|
|
102
|
+
"mainEntity": [
|
|
103
|
+
{
|
|
104
|
+
"@type": "Question",
|
|
105
|
+
"name": "Question 1?",
|
|
106
|
+
"acceptedAnswer": {
|
|
107
|
+
"@type": "Answer",
|
|
108
|
+
"text": "Answer text here."
|
|
109
|
+
}
|
|
110
|
+
},
|
|
111
|
+
{
|
|
112
|
+
"@type": "Question",
|
|
113
|
+
"name": "Question 2?",
|
|
114
|
+
"acceptedAnswer": {
|
|
115
|
+
"@type": "Answer",
|
|
116
|
+
"text": "Answer text here."
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
]
|
|
120
|
+
}
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
**Requirements for Google rich result eligibility:**
|
|
124
|
+
- Minimum 2 questions
|
|
125
|
+
- Questions must be visible text on the page (not hidden)
|
|
126
|
+
- Each Question must match visible content
|
|
127
|
+
- Answers must be clearly visible to the user (not just in schema)
|
|
128
|
+
- Google may show up to 4 FAQ entries in the SERP
|
|
129
|
+
|
|
130
|
+
### HowTo (Tutorials, Technical Guides)
|
|
131
|
+
Use for step-by-step guides and tutorials on any site.
|
|
132
|
+
|
|
133
|
+
```json
|
|
134
|
+
{
|
|
135
|
+
"@context": "https://schema.org",
|
|
136
|
+
"@type": "HowTo",
|
|
137
|
+
"name": "How to Title",
|
|
138
|
+
"description": "Description of the tutorial",
|
|
139
|
+
"step": [
|
|
140
|
+
{
|
|
141
|
+
"@type": "HowToStep",
|
|
142
|
+
"position": 1,
|
|
143
|
+
"name": "Step 1",
|
|
144
|
+
"text": "Description of step 1."
|
|
145
|
+
},
|
|
146
|
+
{
|
|
147
|
+
"@type": "HowToStep",
|
|
148
|
+
"position": 2,
|
|
149
|
+
"name": "Step 2",
|
|
150
|
+
"text": "Description of step 2."
|
|
151
|
+
}
|
|
152
|
+
]
|
|
153
|
+
}
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
### BreadcrumbList (Site Navigation)
|
|
157
|
+
Use on all sites to enable breadcrumb rich results in SERPs.
|
|
158
|
+
|
|
159
|
+
```json
|
|
160
|
+
{
|
|
161
|
+
"@context": "https://schema.org",
|
|
162
|
+
"@type": "BreadcrumbList",
|
|
163
|
+
"itemListElement": [
|
|
164
|
+
{
|
|
165
|
+
"@type": "ListItem",
|
|
166
|
+
"position": 1,
|
|
167
|
+
"name": "Home",
|
|
168
|
+
"item": "https://www.example.com/"
|
|
169
|
+
},
|
|
170
|
+
{
|
|
171
|
+
"@type": "ListItem",
|
|
172
|
+
"position": 2,
|
|
173
|
+
"name": "Category",
|
|
174
|
+
"item": "https://www.example.com/category/"
|
|
175
|
+
},
|
|
176
|
+
{
|
|
177
|
+
"@type": "ListItem",
|
|
178
|
+
"position": 3,
|
|
179
|
+
"name": "Article Title",
|
|
180
|
+
"item": "https://www.example.com/article-slug/"
|
|
181
|
+
}
|
|
182
|
+
]
|
|
183
|
+
}
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
### Organization (Site-level)
|
|
187
|
+
Use on all sites for site-level schema (injected globally, not per-page).
|
|
188
|
+
|
|
189
|
+
```json
|
|
190
|
+
{
|
|
191
|
+
"@context": "https://schema.org",
|
|
192
|
+
"@type": "Organization",
|
|
193
|
+
"name": "Site Name",
|
|
194
|
+
"url": "https://www.example.com/",
|
|
195
|
+
"logo": "https://www.example.com/favicon.png",
|
|
196
|
+
"sameAs": [
|
|
197
|
+
"https://twitter.com/username",
|
|
198
|
+
"https://github.com/username"
|
|
199
|
+
]
|
|
200
|
+
}
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
## Platform-Specific Implementation
|
|
204
|
+
|
|
205
|
+
### Ghost CMS (example.com, example.org, example.net)
|
|
206
|
+
|
|
207
|
+
**Per-page schema:**
|
|
208
|
+
- Ghost injects basic JSON-LD automatically (Article type with headline, dates, author)
|
|
209
|
+
- Custom schema (FAQPage, HowTo, TechArticle) goes in:
|
|
210
|
+
- Post-level: Settings → Code Injection → Post Header (`<script type="application/ld+json">...</script>`)
|
|
211
|
+
- Site-level: Settings → Code Injection → Site Header (BreadcrumbList, Organization)
|
|
212
|
+
|
|
213
|
+
**Verification:**
|
|
214
|
+
- View source → search for `application/ld+json`
|
|
215
|
+
- Test with Google Rich Results Test: https://search.google.com/test/rich-results
|
|
216
|
+
- Test with Schema.org Validator: https://validator.schema.org/
|
|
217
|
+
|
|
218
|
+
**Ghost auto-generated schema limitations:**
|
|
219
|
+
- Ghost only generates Article/BlogPosting schema by default
|
|
220
|
+
- FAQPage, HowTo, TechArticle, BreadcrumbList, Product all require custom injection
|
|
221
|
+
- Author info in Ghost's default schema may need enrichment (add author URL, sameAs)
|
|
222
|
+
|
|
223
|
+
### Hugo (example.com)
|
|
224
|
+
|
|
225
|
+
**Per-page schema:**
|
|
226
|
+
- Add JSON-LD via Hugo template in `layouts/partials/head.html` or `layouts/_default/single.html`
|
|
227
|
+
- Use Hugo's `.Params` to inject article-specific values
|
|
228
|
+
- Conditional schema: `{{ if .Params.faq }}` for FAQPage, `{{ if .Params.howto }}` for HowTo
|
|
229
|
+
|
|
230
|
+
**Site-level schema:**
|
|
231
|
+
- Organization and BreadcrumbList in the base template (`baseof.html`)
|
|
232
|
+
|
|
233
|
+
## Validation Checklist
|
|
234
|
+
|
|
235
|
+
- [ ] JSON is valid (no trailing commas, properly closed braces)
|
|
236
|
+
- [ ] Required fields present for each @type
|
|
237
|
+
- [ ] URLs are absolute (including https://)
|
|
238
|
+
- [ ] Dates are in ISO 8601 format (YYYY-MM-DD or YYYY-MM-DDTHH:MM:SSZ)
|
|
239
|
+
- [ ] Author names match the byline
|
|
240
|
+
- [ ] @context is set to "https://schema.org"
|
|
241
|
+
- [ ] No conflicting or duplicate schema on the page
|
|
242
|
+
- [ ] FAQPage content matches visible page content (no hidden answers)
|
|
243
|
+
- [ ] Google Rich Results Test passes without errors
|
|
244
|
+
- [ ] Schema content is visible to users where required (FAQPage, HowTo)
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# SEO, AEO, and GEO source index
|
|
2
|
+
|
|
3
|
+
This source map supports the skill. Re-check provider documentation before relying on version-sensitive crawler names, dashboards, policies, or controls. Initial research pass: 2026-08-26.
|
|
4
|
+
|
|
5
|
+
## Primary and standards sources
|
|
6
|
+
|
|
7
|
+
- [Aggarwal et al.: GEO: Generative Engine Optimization](https://arxiv.org/html/2311.09735v3) — KDD 2024 controlled benchmark and generative visibility metrics.
|
|
8
|
+
- [Liu et al.: Evaluating Verifiability in Generative Search Engines](https://arxiv.org/abs/2304.09848) — citation support and sentence support evaluation.
|
|
9
|
+
- [Google: AI features and your website](https://developers.google.com/search/docs/appearance/ai-features) — existing SEO fundamentals, no additional technical requirements or special AI markup, query fan-out, preview controls, and Search Console measurement.
|
|
10
|
+
- [Google: optimizing for generative AI features](https://developers.google.com/search/docs/fundamentals/ai-optimization-guide) — RAG, query fan-out, people-first content, technical structure, and mythbusting for `llms.txt`, chunking, exact rewrites, and inauthentic mentions.
|
|
11
|
+
- [OpenAI: crawler overview](https://platform.openai.com/docs/bots) — OAI-SearchBot for search, GPTBot for training, ChatGPT-User for user-triggered access, independent robots controls, and propagation caveats.
|
|
12
|
+
- [Bing: AI Performance](https://blogs.bing.com/webmaster/February-2026/Introducing-AI-Performance-in-Bing-Webmaster-Tools-Public-Preview) — citation counts, cited pages, grounding queries, page activity, trends, and metric limits.
|
|
13
|
+
- [Bing: sitemaps in AI search](https://blogs.bing.com/webmaster/July-2025/Keeping-Content-Discoverable-with-Sitemaps-in-AI-Powered-Search) — sitemap coverage, truthful `lastmod`, and IndexNow as discovery/freshness aids without an inclusion guarantee.
|
|
14
|
+
- [Perplexity: crawlers](https://docs.perplexity.ai/docs/resources/perplexity-crawlers) — provider crawler and robots guidance; verify directly when implementation depends on details.
|
|
15
|
+
- [Schema.org FAQPage](https://schema.org/FAQPage), [HowTo](https://schema.org/HowTo), and [FAQ](https://schema.org/docs/faq.html) — vocabulary semantics, not a citation guarantee.
|
|
16
|
+
- [IETF RFC 9309](https://datatracker.ietf.org/doc/html/rfc9309) — Robots Exclusion Protocol.
|
|
17
|
+
- [Sitemaps protocol](https://www.sitemaps.org/protocol.html) — XML sitemap format.
|
|
18
|
+
- [llms.txt proposal](https://llmstxt.org/) and [repository](https://github.com/AnswerDotAI/llms-txt) — optional community proposal; Google says it does not use it for Google Search visibility.
|
|
19
|
+
|
|
20
|
+
## Secondary methodology sources
|
|
21
|
+
|
|
22
|
+
- [Graphite / Ethan Smith](https://graphite.io/five-percent/aeo-is-the-new-seo) — hypothesis generation and test/reproduce framing.
|
|
23
|
+
- [AirOps AEO guide](https://www.airops.com/blog/aeo-answer-engine-optimization) — practitioner tactics and vendor-reported study claims.
|
|
24
|
+
- [Frase AEO guide](https://www.frase.io/blog/what-is-answer-engine-optimization-the-complete-guide-to-getting-cited-by-ai) — practical prompt baselines and citation tracking ideas.
|
|
25
|
+
- [CXL AEO guide](https://cxl.com/blog/answer-engine-optimization-aeo-the-comprehensive-guide/) — secondary taxonomy and implementation discussion.
|
|
26
|
+
|
|
27
|
+
## Rejected or bounded claims
|
|
28
|
+
|
|
29
|
+
- There is one universal AEO algorithm.
|
|
30
|
+
- FAQPage has a fixed citation multiplier.
|
|
31
|
+
- `llms.txt` improves Google AI visibility.
|
|
32
|
+
- Allowing every crawler guarantees citations.
|
|
33
|
+
- More short pages, exact-match questions, or web mentions always win.
|
|
34
|
+
- Citation count equals authority, ranking, correctness, traffic, or conversions.
|
|
35
|
+
|
|
36
|
+
These are unsupported, provider-specific, vendor-reported without portable evidence, or contradicted by current primary guidance.
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
# AEO structured data
|
|
2
|
+
|
|
3
|
+
## Principle
|
|
4
|
+
|
|
5
|
+
Schema.org describes content; it does not guarantee inclusion, ranking, or citation. Add JSON-LD only when the page visibly and materially satisfies the chosen type. Visible content is the source of truth. Provider rich-result support changes over time, so do not treat older FAQ-focused guidance or a schema type's existence as evidence of current Google eligibility.
|
|
6
|
+
|
|
7
|
+
## Type selection
|
|
8
|
+
|
|
9
|
+
- **Article/BlogPosting/TechArticle:** an authored article; include accurate headline, author, dates, publisher, and about fields.
|
|
10
|
+
- **FAQPage:** a page presenting real frequently asked questions and answers. Do not use it for implied answers or every heading.
|
|
11
|
+
- **HowTo:** a procedure with ordered steps, tools/supplies, and conditions. Do not use it for explanatory prose.
|
|
12
|
+
- **QAPage:** a user question with user-submitted answers, not a publisher FAQ.
|
|
13
|
+
- **Organization/Person:** identity and authorship only when the page and site can substantiate it.
|
|
14
|
+
- **BreadcrumbList:** navigational hierarchy, not a substitute for internal links.
|
|
15
|
+
|
|
16
|
+
Use the Schema.org type definition and the target provider's feature documentation. Schema.org's vocabulary is broader than any one search feature's eligibility rules.
|
|
17
|
+
|
|
18
|
+
## Parity checklist
|
|
19
|
+
|
|
20
|
+
For each JSON-LD block:
|
|
21
|
+
|
|
22
|
+
- every material name, answer, step, date, author, URL, and relationship appears visibly or is a faithful machine-readable equivalent;
|
|
23
|
+
- FAQ answers are complete enough to stand alone and match their visible wording;
|
|
24
|
+
- HowTo steps are ordered, actionable, and visible;
|
|
25
|
+
- dates describe publication or real modification, not deployment time;
|
|
26
|
+
- URLs are canonical and fetchable;
|
|
27
|
+
- no hidden or contradictory markup is added to influence systems;
|
|
28
|
+
- the JSON parses and the rendered page remains correct without JavaScript when feasible.
|
|
29
|
+
|
|
30
|
+
## Validation pattern
|
|
31
|
+
|
|
32
|
+
1. Parse JSON-LD as JSON.
|
|
33
|
+
2. Validate required shape for the selected type.
|
|
34
|
+
3. Extract visible headings, questions, answers, steps, names, and dates.
|
|
35
|
+
4. Compare material fields, allowing only documented normalization such as whitespace.
|
|
36
|
+
5. Run the provider's own rich-result or structured-data test where applicable.
|
|
37
|
+
6. Inspect the rendered page and record what the validator does not prove.
|
|
38
|
+
|
|
39
|
+
A valid JSON document proves syntax. It does not prove truth, visible parity, eligibility, retrieval, or citation.
|
|
40
|
+
|
|
41
|
+
## Common mistakes
|
|
42
|
+
|
|
43
|
+
- FAQ schema on a page without visible Q&A;
|
|
44
|
+
- HowTo schema on a conceptual article;
|
|
45
|
+
- multiple conflicting author or date values;
|
|
46
|
+
- `sameAs` links chosen from ambiguous search results;
|
|
47
|
+
- using schema to encode a vendor claim as an objective fact;
|
|
48
|
+
- assuming rich-result eligibility is an AEO performance metric;
|
|
49
|
+
- adding every plausible schema type instead of the smallest accurate set.
|
|
50
|
+
|
|
51
|
+
## Primary references
|
|
52
|
+
|
|
53
|
+
- [Schema.org FAQPage](https://schema.org/FAQPage)
|
|
54
|
+
- [Schema.org HowTo](https://schema.org/HowTo)
|
|
55
|
+
- [Schema.org FAQ](https://schema.org/docs/faq.html)
|
|
56
|
+
- [Google structured data policies](https://developers.google.com/search/docs/appearance/structured-data/sd-policies)
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
# Technical SEO Reference
|
|
2
|
+
|
|
3
|
+
Technical SEO ensures search engines can find, crawl, interpret, and index your content. If the technical foundation is broken, nothing else matters.
|
|
4
|
+
|
|
5
|
+
## Crawlability & Indexability
|
|
6
|
+
|
|
7
|
+
### Robots.txt
|
|
8
|
+
- **Purpose:** Directs crawlers which URLs to avoid
|
|
9
|
+
- **Check:** Does the site have a robots.txt at `/robots.txt`?
|
|
10
|
+
- **Check:** Are important pages accidentally disallowed? `Disallow: /` blocks ALL crawlers
|
|
11
|
+
- **Check:** Is the sitemap referenced? `Sitemap: https://example.com/sitemap.xml`
|
|
12
|
+
- **Best practice:** Allow CSS/JS files (modern crawlers need them for rendering)
|
|
13
|
+
- **Hosted CMS sites:** Ghost CMS auto-generates robots.txt; verify after any config change
|
|
14
|
+
|
|
15
|
+
### XML Sitemaps
|
|
16
|
+
- **Purpose:** Tells crawlers about all pages and their relative importance
|
|
17
|
+
- **Check:** Does the sitemap exist and is it referenced in robots.txt?
|
|
18
|
+
- **Check:** Are only canonical URLs included? (No pagination params, sort filters, etc.)
|
|
19
|
+
- **Check:** Are noindex pages excluded from the sitemap?
|
|
20
|
+
- **Check:** Lastmod dates are accurate (not all the same date)
|
|
21
|
+
- **Ghost split sitemaps:** Ghost generates `sitemap-posts.xml`, `sitemap-pages.xml`, `sitemap-tags.xml`, `sitemap-authors.xml`. Verify each is present and valid.
|
|
22
|
+
- **Hugo:** Verify sitemap.xml is generated with correct `changefreq` and `priority` settings
|
|
23
|
+
|
|
24
|
+
### Canonical URLs
|
|
25
|
+
- **Purpose:** Tells search engines which URL is the authoritative version of a page
|
|
26
|
+
- **Check:** Every page has a self-referencing canonical or points to the canonical version
|
|
27
|
+
- **Check:** No conflicting canonicals (page A canonicals to B, B canonicals to C)
|
|
28
|
+
- **Common issues:** HTTP/HTTPS duplication (canonical must use HTTPS if site is HTTPS), www/non-www duplication, trailing slash inconsistency
|
|
29
|
+
- **Ghost:** Canonical is auto-generated from the post/page slug. Verify no slug changes break inbound canonical signals.
|
|
30
|
+
|
|
31
|
+
### Meta Robots / Noindex
|
|
32
|
+
- **Purpose:** Prevents indexing of specific pages
|
|
33
|
+
- **Check:** Pages that should be indexed don't have `<meta name="robots" content="noindex">`
|
|
34
|
+
- **Check:** Thin pages (tag pages, author pages, pagination) have noindex if they shouldn't rank
|
|
35
|
+
- **Check:** Login/admin pages have noindex
|
|
36
|
+
|
|
37
|
+
## Page Speed
|
|
38
|
+
|
|
39
|
+
### Core Web Vitals (Google's ranking signals)
|
|
40
|
+
- **LCP (Largest Contentful Paint):** < 2.5s (good), 2.5-4.0s (needs improvement), > 4.0s (poor)
|
|
41
|
+
- **FID (First Input Delay) / INP (Interaction to Next Paint):** < 100ms (good), 100-300ms (needs improvement), > 300ms (poor)
|
|
42
|
+
- **CLS (Cumulative Layout Shift):** < 0.1 (good), 0.1-0.25 (needs improvement), > 0.25 (poor)
|
|
43
|
+
|
|
44
|
+
### Common Fixes by Platform
|
|
45
|
+
|
|
46
|
+
**Ghost CMS:**
|
|
47
|
+
- Enable lazy loading for images (Ghost 5+ has built-in)
|
|
48
|
+
- Use a CDN for image delivery (Ghost Pro includes; self-hosted needs Cloudflare or similar)
|
|
49
|
+
- Limit the number of visible posts on home/tag pages (paginate aggressively)
|
|
50
|
+
- Disable unused Ghost integrations and background tasks
|
|
51
|
+
- Verify the theme isn't loading unused CSS/JS (many Ghost themes are bloated)
|
|
52
|
+
|
|
53
|
+
**Hugo (example.com):**
|
|
54
|
+
- Hugo generates static HTML — inherently fast
|
|
55
|
+
- Image processing: use Hugo's built-in image processing to serve appropriately sized images (`.Resize`, `.Fill`, `.Fit`)
|
|
56
|
+
- Minify HTML output: `minify: true` in config
|
|
57
|
+
- Avoid excessive JavaScript (Hugo sites shouldn't need much JS)
|
|
58
|
+
- Verify CSS is not render-blocking (inline critical CSS if needed)
|
|
59
|
+
|
|
60
|
+
### Tools for Measurement
|
|
61
|
+
- Google PageSpeed Insights (lab + field data)
|
|
62
|
+
- Lighthouse (Chrome DevTools)
|
|
63
|
+
- Web Vitals library (RUM data)
|
|
64
|
+
- GTmetrix / Pingdom (third-party)
|
|
65
|
+
|
|
66
|
+
## Mobile-Friendliness
|
|
67
|
+
|
|
68
|
+
- **Check:** Responsive design — does the site render correctly at all viewport widths?
|
|
69
|
+
- **Check:** Viewport meta tag present: `<meta name="viewport" content="width=device-width, initial-scale=1">`
|
|
70
|
+
- **Check:** Font sizes are readable on mobile (min 16px body text recommended)
|
|
71
|
+
- **Check:** Tap targets are adequately sized (min 48x48px recommended)
|
|
72
|
+
- **Check:** Content not hidden behind unplayable media or unsupported formats
|
|
73
|
+
- **Test:** Google's Mobile-Friendly Test
|
|
74
|
+
|
|
75
|
+
## HTTPS & Security
|
|
76
|
+
|
|
77
|
+
- **Check:** Valid SSL certificate (not expired, not self-signed)
|
|
78
|
+
- **Check:** All resources load over HTTPS (no mixed content warnings)
|
|
79
|
+
- **Check:** HSTS header present for repeat visitors (Strict-Transport-Security)
|
|
80
|
+
- **Check:** Redirects HTTP → HTTPS (301 permanent redirect)
|
|
81
|
+
- **Check:** No security warnings in browser (mixed content, invalid cert)
|
|
82
|
+
|
|
83
|
+
## International SEO (If Applicable)
|
|
84
|
+
|
|
85
|
+
- **hreflang tags:** Correctly implemented for multi-language/multi-region sites
|
|
86
|
+
- **Check:** Self-referencing hreflang (each page includes its own language tag as well)
|
|
87
|
+
- **Check:** No conflicting signals (hreflang says X, redirect says Y)
|
|
88
|
+
|
|
89
|
+
## Ghost-Specific Technical SEO
|
|
90
|
+
|
|
91
|
+
| Check | Where to look | Action |
|
|
92
|
+
|-------|---------------|--------|
|
|
93
|
+
| Canonical URLs | Post settings → canonical URL | Verify self-referencing or correct canonical |
|
|
94
|
+
| Meta robots | Code injection → per-page | No thin pages indexed |
|
|
95
|
+
| Sitemap | `/sitemap.xml` | Verify split sitemaps present |
|
|
96
|
+
| Robots.txt | `/robots.txt` | Verify sitemaps referenced, no accidental disallows |
|
|
97
|
+
| Structured data | Source HTML → JSON-LD | Verify Ghost's built-in JSON-LD is correct + any custom |
|
|
98
|
+
| AMP | Ghost settings | Verify AMP is enabled/disabled intentionally (Ghost defaults to disabled in v5+) |
|
|
99
|
+
| Open Graph / Twitter Cards | Post social settings | Verify Facebook and Twitter card previews |
|