(01)Services(02)Work(03)Pricing(04)Writing(05)Kits(06)AboutBook a call →
Work / krishnaveni-school
School website · India · 2026

Krishnaveni— a school site with a CMS staff can actually use.

Indian school stuck on a static HTML site — any content change meant emailing a developer. Delivered a full Next.js 15 marketing website with 13 section types, a Sanity v5 CMS, and a custom content pipeline. Staff now manage all pages, posts, and facilities independently.

IndustryEducation · K-12 school
LocationIndia
ScopeMarketing website · headless CMS · handover
StackNext.js 15 · Sanity v5 · Tailwind v4 · GSAP · Radix UI · Vercel
DeliveredMay 2026
Livekrishnavenischool.co.in
SEO score
92
Lighthouse · sitemap, robots, per-page metadata, semantic HTML
Best Practices
100
Lighthouse · desktop and mobile · HTTPS, no console errors
Dev touch post-handover
0
staff manage all content through Sanity Studio independently
§ 01 · The brief

"Any time we needed to update a page or post an announcement, we had to email a developer and wait. We needed to be able to do it ourselves."

Client, Krishnaveni School

§ 02 · The problem
  • 01The school was running on a static HTML site. Every content change — a new gallery post, updated facilities list, announcement — required a developer. Staff had no autonomy.
  • 02A standard CMS would still break if staff accidentally edited the wrong field or reordered sections. The system needed to be opinionated enough to protect the layout.
  • 03Handover was a hard requirement. The school couldn't rely on ongoing developer availability — staff had to be self-sufficient from day one.
§ 03 · The decisions

The calls that meaningfully moved the outcome. Not the cosmetic stuff.

Sanity v5

Schema-first CMS with typed GROQ queries. Studio is clean and opinionated — staff adopted it without training docs. Validates all content before it reaches the frontend. Custom document types for posts, facilities, and page sections.

Polymorphic section architecture

Page body is an array of typed section objects. SectionRenderer maps each _type to its React component. Any page layout can be assembled in Studio by reordering or adding sections — no code change, no redeploy. 13 section types at handover.

Static data pipeline

fetch-sanity.mjs pulls a CMS snapshot → generate-data.mjs converts it into a typed TypeScript file baked into the bundle. Site runs with zero runtime CMS dependency. Trade-off: requires a script re-run and redeploy to pick up content changes, but keeps the production site fast and independent.

GSAP + Radix UI

GSAP for scroll-driven animations. Radix UI Dialog for the video testimonial lightbox and post media gallery with keyboard navigation (Escape, arrow keys). Radix Accordion for FAQ sections. Scoped JS — no heavy framework overhead on pages that don't need interactivity.

§ 04 · The work

Screens, not mockups. The actual product—annotated.

01 / 06 · Home · desktop · 1440pxSEO score: 92
Mobile · 375px
02 · Mobile · 375px
03 · Achievements · live Sanity update
04 · Facilities · full scroll
05 · About · full scroll
Contact page
06 · Contact page
§ 05 · In their words

"We're not a technical team — we gave Samridh the brief and he handled everything else. What we asked for, he delivered. Then he delivered more."

Krishnaveni School
India
Stack: Next.js 15 · Sanity v5 · Tailwind v4 · GSAP · Radix UI · Vercel
clupai.com/contact

Right. Shall
we scope it?

Twenty minutes. No slideshow. We'll ask what you sell, who's buying, and where the site is getting in the way. You'll leave with a realistic estimate—or a reason we're not the right fit.

Replies within one AU business dayABN · Melbourne · VIC