# 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