John Ossai
johnossai20@gmail.com

development

EMRC Website Rebranding

Techno-economic, Regulatory and Financial services platform for Energy and Utility Businesses

Role

Full-Stack Dev

Year

2024

Category

development

EMRC Website Rebranding

Tech Stack

ReactNext.jsTailwindCSSShadcn UIServer Actions

The Problem

EMRC (Energy Markets and Rates Consultants) is a leading energy consultancy in Nigeria, producing regulatory research, hosting webinars, publishing podcasts, and advising on energy market policy. Their previous website was a static HTML site — no CMS, no ISR, and no way for the communications team to publish anything without a developer. The rebrand was an opportunity to fix all of that and give EMRC a digital presence that matched their standing in the sector.

The Execution

I rebuilt the site with Next.js 15 and TypeScript, using ISR for content-heavy sections so updates pushed through the CMS go live within seconds without triggering a full rebuild. The design system is built on Shadcn UI and Radix primitives, giving the communications team 80+ consistent, accessible components that can be assembled into new pages without writing CSS. Animations are handled by a combination of GSAP for scroll-triggered sequences and Framer Motion for component-level transitions. The PDF library uses a virtualized list to decouple DOM size from dataset size — only visible document entries are rendered at any time, keeping the Publications page fast regardless of archive size. Contact and consultation request forms use Nodemailer on the server side, with Next.js Server Actions handling form submissions progressively.

ISR-Powered Content Platform

Insights, project updates, and news pages use Incremental Static Regeneration with short revalidation windows. The marketing team publishes through the CMS and changes appear on the live site in under 10 seconds — no developer involvement, no rebuild.

Integrated Podcast & Webinar System

The site hosts a full podcast catalogue with an in-browser audio player and a webinar archive. Both are driven by the same content API, with episode pages generated statically at build time and updated via ISR.

Virtualized PDF Document Library

A 3,000-entry regulatory document archive rendered with a virtualized list. The Publications page loads in under 1.5 seconds regardless of archive size because only the documents visible in the viewport are in the DOM.

80+ Component Design System

Built on Shadcn UI and Radix primitives, the component library covers every content pattern on the site — hero sections, feature grids, testimonial carousels, form elements, and data tables — all consistently styled and accessible.

Impact

98/100

Lighthouse Score

< 10s

Content Update Time

1.4s

Publications Page Load

120+

Pages Delivered

Technical Notes

The animation architecture required careful coordination between GSAP and Framer Motion. I used GSAP ScrollTrigger for section-level entrance animations because it gives precise control over scroll positions and timeline sequencing. Framer Motion handles component-level animations — page transitions, modal entrances, hover states — because its React integration is cleaner for component-scoped motion. Running both libraries on the same page without conflicts required isolating their respective animation targets and ensuring neither was trying to animate the same elements. The rule I settled on: GSAP owns anything tied to scroll position, Framer Motion owns everything driven by React state.