From b932d65658307350234f7869a49f66161804141f Mon Sep 17 00:00:00 2001 From: kyle Date: Sat, 4 Jul 2026 21:24:05 +0000 Subject: [PATCH] Adds future plan for SEO --- seo_plan.md | 122 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 122 insertions(+) create mode 100644 seo_plan.md diff --git a/seo_plan.md b/seo_plan.md new file mode 100644 index 0000000..84fa967 --- /dev/null +++ b/seo_plan.md @@ -0,0 +1,122 @@ +# SEO Plan for KMountain Flower Radio + +## Objective +Improve crawlability, indexability, and ranking quality for a JavaScript-rendered Angular site where core content is loaded after app bootstrap. + +## Current Baseline +- The app is client-rendered Angular (no SSR/prerender in current build pipeline). +- Nginx serves SPA fallback routes to index.html. +- Initial HTML is a minimal shell and most meaningful content is populated after JavaScript executes and API calls complete. +- Route-specific SEO metadata is not currently implemented (title updates are global/dynamic only). +- robots.txt and sitemap.xml are not currently present in public assets. + +## Target Outcomes +- Reliable indexing of all public routes. +- Better SERP snippets and relevance for branded and non-branded queries. +- Less dependence on crawler JavaScript/render budget. + +## Priority 1 (High Impact, Low Risk) + +### 1) Add robots.txt +- Allow crawling of public pages. +- Block sensitive/admin/auth endpoints if needed. +- Add a sitemap reference. + +### 2) Add sitemap.xml +- Include canonical URLs for: + - / + - /about + - /schedule + - /events + - /contact +- Keep lastmod values updated during deploys. +- Submit sitemap in Google Search Console and Bing Webmaster Tools. + +### 3) Implement route-level metadata +- Set unique title and meta description per public route. +- Add canonical tags per route. +- Add Open Graph and Twitter card defaults plus per-route overrides. +- Mark login/admin routes as noindex. + +### 4) Strengthen crawl path discovery +- Keep static crawlable links to all public pages in global navigation/footer. +- Ensure key public routes are linked from multiple relevant pages. + +### 5) Add structured data +- Add Organization schema site-wide. +- Add Event schema for upcoming events content. +- Include station identity fields consistently (name, URL, logo, contact where appropriate). + +## Priority 2 (Bigger Lift, Larger Upside) + +### 6) Introduce prerender or SSR for public routes +- Preferred first step: prerender static public routes. +- Alternative: full SSR if dynamic metadata/content requires runtime generation. +- Goal: deliver meaningful HTML to crawlers before JS execution. + +### 7) Ensure metadata appears in initial HTML +- Validate title/description/canonical in rendered source for each route. +- Ensure each route has a clear H1 and meaningful introductory text in server-delivered HTML. + +### 8) Keep baseline content available without API dependence +- Include useful fallback content for core sections (home/about/schedule/events intros). +- Treat API-loaded content as enhancement rather than sole source of indexable copy. + +## Priority 3 (Quality + Ranking Support) + +### 9) Improve Core Web Vitals +- Optimize home LCP image and dimensions. +- Defer non-critical work below the fold. +- Reduce layout shifts around async content blocks. + +### 10) Expand internal linking depth +- Add contextual links between About, Schedule, Events, and Contact pages. +- Use descriptive anchor text aligned with user intent. + +### 11) Media SEO pass +- Keep decorative images with empty alt attributes. +- Add descriptive alt text for content-bearing images. + +## Implementation Notes for This Repo +- Place robots.txt and sitemap.xml in public assets so they are copied to build output. +- Keep SPA fallback behavior in Nginx; SEO assets still resolve directly. +- Use a centralized route-to-metadata mapping to avoid duplicate/incorrect canonical logic. + +## Measurement Plan + +### Week 1 Baseline +- Capture Search Console index coverage and excluded reasons. +- Record impressions/clicks for branded and local intent queries. +- Run Lighthouse on all public routes. + +### Weeks 2-3 (after Priority 1) +- Validate robots.txt and sitemap accessibility. +- Validate route metadata and canonical correctness. +- Track indexed-page growth and snippet quality. + +### Weeks 4-8 (after Priority 2) +- Compare crawl stats and indexing completeness before/after prerender or SSR. +- Track ranking movement for schedule/events/community-intent terms. +- Validate rich result eligibility for structured data. + +## Acceptance Criteria +- robots.txt and sitemap.xml are live and valid. +- All public routes have unique title, description, and canonical. +- Public routes are indexable and admin/login are noindex. +- Search Console shows healthy discovery/indexing across primary routes. +- Public pages render useful content for crawlers without relying solely on JS. + +## Risks and Mitigations +- Risk: JS render delays cause partial indexing. + - Mitigation: prerender/SSR and stronger baseline HTML. +- Risk: API issues reduce crawler-visible content. + - Mitigation: robust fallback copy and error handling. +- Risk: canonical misconfiguration causes duplicate indexing. + - Mitigation: centralized canonical helper + validation checks. + +## Recommended Execution Order +1. robots.txt + sitemap.xml +2. route-level metadata and canonicals +3. structured data (Organization + Event) +4. prerender for public routes +5. performance and internal-linking refinement