8.1 KiB
Context
This change adds a light-weight, SEO-focused website to grow social discovery and conversions for:
- YouTube channel (
youtube.com/santhoshj) - Instagram (
@santhoshjanan) - Podcast ("Irregular Mind") on major platforms
The site needs to:
- Be fast and crawlable (SEO-first).
- Surface "latest" content and "high-performing" videos prominently on the home page.
- Provide clear CTAs to convert site visitors into followers/subscribers/listeners.
- Provide analytics (target: Umami) and event tracking to measure progress against 10% month-over-month goals.
Constraints and unknowns:
- Current repo appears to contain only OpenSpec artifacts (no existing website stack captured here yet).
- Instagram "dynamic" ingestion is constrained by Meta platform rules and API availability; we should plan for a fallback.
- "High-performing" requires a definition (views/likes/comments/watch-time) and may require YouTube Data API access.
Goals / Non-Goals
Goals:
- Ship a static-first website architecture that is very fast, SEO-friendly, and easy to operate.
- Ingest content from YouTube + podcast RSS, and support Instagram via API where feasible or via embed/fallback.
- Provide a normalized content model usable by homepage modules (latest + featured/high-performing).
- Provide reusable CTAs with trackable outbound clicks and conversion measurement via Umami.
- Provide clear, testable SEO outputs: indexable pages, metadata, sitemap/robots, social sharing cards.
Non-Goals:
- Building a full CMS/editorial workflow (no admin UI in scope initially).
- Real-time updates (seconds/minutes). Near-real-time is not required; periodic refresh is acceptable.
- Complex personalization/recommendation engines.
- Replacing platform-native analytics; the goal is directional measurement for acquisition/conversion.
Decisions
1) Static-first framework and deployment
Decision: Use a static-first site generator (Astro is the default recommendation) and deploy on linode instance over docker container.
Rationale: Static output maximizes performance and SEO while minimizing operational complexity. Astro provides great HTML-by-default output and only hydrates where necessary, keeping the "light-weight" premise intact.
Alternatives considered:
- Next.js: good ecosystem, but easier to accidentally ship heavier runtime/hydration than needed.
- Pure static HTML/manual: too brittle and hard to keep "dynamic" content updated.
2) Content ingestion model (build-time with scheduled refresh)
Decision: Fetch and normalize social content at build time (SSG) into a local data cache (JSON) that drives rendering. Refresh content on a schedule (cron) and on-demand (manual trigger).
Rationale: Keeps runtime simple and fast; avoids exposing API keys to the browser; avoids rate-limit issues on every pageview.
Mechanics:
- A build step runs
fetch-contentto produce a normalized dataset (e.g.,content/cache/*.json). - CI triggers rebuild on a schedule (e.g., hourly or daily) and after new uploads (manual trigger).
Alternatives considered:
- Runtime serverless fetch: more moving parts, harder caching story, slower page loads, and higher risk of API failures impacting the site.
- Client-side fetch: worst for SEO and exposes third-party dependence to users.
3) Sources and fallbacks (YouTube, Instagram, podcast)
YouTube
- Decision: Prefer YouTube Data API (v3) when available to obtain reliable metadata and performance stats (views/likes) for "high-performing".
- Fallback: Use the channel RSS feed to list latest videos if API keys are not available; in this mode, "high-performing" becomes manually curated or based on a static list.
- Decision: Start with an embed-first approach for Instagram posts (oEmbed or platform embeds) and treat API-based ingestion as optional Phase 2.
- Rationale: Meta API access is frequently the longest pole (app review, token refresh, account type constraints). Embeds still allow reuse of posts without deep integration.
Podcast
- Decision: Use the podcast RSS feed as the canonical source; parse episodes into the normalized model. Link out to platform destinations (Apple/Spotify/etc).
4) Normalized content model and ranking
Decision: Define a unified content schema for the site (regardless of source), e.g.:
id,source(youtube|instagram|podcast),urltitle,description,publishedAtthumbnail,tags/categoriesmetrics(optional:views,likes,comments,duration)featured(manual override)
High-performing definition:
- Default: YouTube videos ranked by
views(optionally recency-weighted), with a manual override list for editorial selection. - Instagram and podcast "high-performing" starts as manual until reliable metrics are available.
5) Information architecture and SEO surface
Decision: Create a small set of indexable pages with stable URLs:
/home (latest + featured/high-performing + channel highlights + CTAs)/videos(YouTube list/detail, or list only initially)/podcast(episode list)/about(channel/personal bio, links)
SEO outputs:
- Per-page metadata (title/description), canonical URLs
- Open Graph + Twitter cards
sitemap.xmlandrobots.txt- Structured data (
JSON-LD) for Video/Podcast where appropriate
6) Conversion CTAs and event tracking
Decision: Implement CTAs as a reusable component that:
- Renders platform-specific primary actions (YouTube subscribe, Instagram follow, podcast listen)
- Uses outbound links that include UTM parameters
- Emits Umami events for
cta_clickwith dimensions likeplatform,placement,target
7) Analytics (Umami) and measurement plan
Decision: Use Umami for pageviews + custom events.
Events (initial):
cta_click(platform, placement)outbound_click(domain, placement)- Optional:
video_play/episode_playif embeds support reliable hooks (may be limited)
Reporting targets:
- Traffic by source (SEO vs social referrers)
- CTA click-through rate by placement
- Growth correlation: site referrals to channel follows (approximate; platform attribution is imperfect)
Risks / Trade-offs
- [Instagram API complexity] → Start embed-first; treat API ingestion as optional and document requirements for later.
- [YouTube API keys / quotas] → Cache results; minimize calls; RSS fallback; allow manual "featured" list.
- [“High-performing” ambiguity] → Specify a clear initial metric (views) and allow manual overrides; refine after baseline data.
- [Stale content due to build-time fetch] → Scheduled rebuilds; manual trigger; show "Last updated" timestamp.
- [SEO requires real content depth] → Add dedicated indexable pages (videos/podcast/about) and ensure metadata + structured data are correct.
- [Analytics privacy expectations] → Keep tracking minimal; avoid PII; document what is tracked.
Migration Plan
- Implement the static-first site skeleton and deploy a minimal version (home + about + analytics).
- Add ingestion for podcast RSS and YouTube (RSS first, upgrade to API when keys are available).
- Add homepage modules (latest + featured/high-performing) and CTA placements.
- Add SEO hardening (sitemap/robots/canonicals/structured data) and validate indexing.
- Add Instagram embed module (and/or API ingestion if chosen).
- Iterate on ranking and content presentation based on Umami data.
Rollback:
- Revert deploy to previous static build; ingestion failures should fail closed (serve last good cached dataset).
Open Questions
- Hosting target: Cloudflare Pages vs Netlify vs Vercel (affects cron/rebuild approach and any serverless options).
- Do you want a custom domain (and which), and should the site target a personal brand name vs channel name?
- Is a YouTube Data API key available, or should we start with RSS-only for v1?
- Should Instagram be embed-only for v1, or do you want to pursue API ingestion (which may require a business account/app setup)?
- Preferred measurement: which CTAs matter most (YouTube subs vs Instagram follows vs podcast listens) and where should they be placed (hero, sticky, end of sections)?