- Fetch published posts from /api/public/blog (10-min sessionStorage cache)
- Fall back to PORTFOLIO_DATA.blogArticles if API is unavailable or empty
- Preserves all existing display logic unchanged
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- index.html: JSON-LD Organization + Services ItemList schema, Plausible
Analytics, canonical link
- app.jsx: dynamic document.title + meta description/OG per hash route;
service detail routing (services/:id → ServiceDetailPage)
- pages.jsx: ServiceDetailPage with hero, metric, use cases (3 per
service), process timeline, highlights, and CTA; registered on window
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Testimonials section on home page (4 client quotes with service tags)
- Pricing page (#/pricing) — 3 tiers: Starter $499 / Growth $1499 / Enterprise custom
- Blog page (#/blog) — 4 articles with full content and category tags
- Nav: Services | Pricing | Blog | Timeline | Contact (conversion-focused)
- Contact form now POSTs to dashboard API (real email via Resend)
- PricingPage + BlogPage exposed as window globals
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Live Demo button appears when svc.demo exists,
View Repo button appears when svc.repo exists.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>