Sanity Blog
A personal portfolio-and-blog site on Next.js 15 with a Sanity Studio embedded directly in the app — one hand-written GROQ data layer drives the home profile, work history, projects, and Portable-Text blog posts from a single dataset.

Overview
A personal portfolio-and-blog site on Next.js 15 with a Sanity Studio embedded directly in the app — one hand-written GROQ data layer drives the home profile, work history, projects, and Portable-Text blog posts from a single dataset.
Tech Stack
Challenges & Learnings
The brief was a self-authored site where profile info, work history, portfolio projects, and blog posts all live in a headless CMS instead of hardcoded components. Sanity Studio is mounted inside the same Next.js app via a catch-all route rather than deployed separately, so editing and the public site ship from one codebase and one deployment. Content is split into four document types — profile, job, project, blog — each queried through dedicated GROQ statements in a small typed data layer. Blog bodies are stored as Sanity's Portable Text and rendered through next-sanity's PortableText component, with images resolved on demand rather than stored as static URLs. The one explicit freshness decision in the code is ISR on the blog index (30-second revalidation), giving new posts a short cache window without a full rebuild. The real tradeoff of co-locating the Studio inside the consumer app: it simplifies deployment to a single repo and project ID, but couples the CMS admin build to the frontend build.