01
Project name
Yeah Holding Company
Yeah Innovations
One-line description
A high-performance marketing and product showcase site for an African fintech holding company, with immersive 3D product experiences and CMS-driven content.
My role
Timeline
Category
Platforms
Tech stack
Links
02
Yeah Innovations needed a public-facing website that could present three distinct product brands (Boma, Paysafe, Get Yeah) with rich, product-specific storytelling, not a generic landing page. It had to feel premium and technically credible: interactive 3D demos, scroll-driven animations, and polished typography. Non-developers needed to update blogs, team profiles, and partner content without redeploying code for every copy change. The site also had to run on Oracle Cloud Infrastructure as a static site (no Node server in production), behind Cloudflare, with a custom domain, a very different hosting model from Vercel-style Next.js deployments. The core tension: build a modern Next.js experience locally, but ship it as static files that OCI Object Storage can serve reliably.
03
I built a multi-route marketing site using the Next.js App Router with output: "export" for fully static generation. The site includes a home page with an interactive 3D particle blob hero, product previews, team showcase, blog highlights, and partner ecosystem carousel. Dedicated product pages cover Boma (AI government orchestration), Paysafe (payroll deduction aggregator), and Get Yeah (payments infrastructure), each with custom layouts, 3D/WebGL sections, and scroll-linked storytelling. About, Blog, and Architecture pages source blog and team data from Sanity CMS at build time. A CI/CD pipeline (GitHub Actions) builds the static export, prepares OCI-friendly route folders (product/paysafe/index.html), and uploads assets to Oracle Object Storage with correct content types. Light/dark theme support runs across the entire site via CSS design tokens.
04
Interactive 3D hero blob
~3,500 instanced particles with simplex-noise morphing, mouse push/swirl, breathing animation, and gradient color cycling.
Product-specific 3D experiences
Boma: scroll-driven MacBook WebGL demo with video on screen mesh. Get Yeah: iPhone-style 3D product scroll with receipt and contactless payment mockups. Paysafe: MacBook showcase with architecture flow diagram (React Flow).
Scroll-driven animations
GSAP ScrollTrigger for pinned sections, typewriter hero effects, and expanding glass cards.
Sanity CMS integration
Blogs, team members, and ecosystem partners fetched at build time and baked into static HTML.
Dual-theme system
Light/dark mode with persisted user preference and theme-aware CSS variables.
Responsive design
Mobile-optimized WebGL (lighter lighting, touch-friendly scroll), adaptive typography, and collapsible navigation.
Automated OCI deployment
GitHub Actions build, postbuild route preparation, and object upload with MIME-type handling for fonts, video, GLB models, and HTML.
05
Next.js App Router with React Server Components for data-fetching pages and Client Components for interactivity (3D, nav, theme, carousels). Static export (output: "export", trailingSlash: true), no runtime server; all pages pre-rendered at build time. Postbuild script (scripts/prepare-oci-static-routes.mjs) ensures product routes export as product/{name}/index.html for OCI folder-style serving.
No traditional backend API in this repo. The site is fully static after build.
Next.js 16 + React 19 + TypeScript, App Router, next/font for local and Google fonts, next/image for optimized images. Tailwind CSS v4 with design tokens in globals.css (:root and html[data-theme="dark"]). Three.js + React Three Fiber + Drei for WebGL scenes. GSAP + Motion for scroll pinning and UI micro-interactions. Zustand for lightweight 3D scene state (MacBook screen texture, phone rotation).
No application database. Content lives in Sanity (headless CMS) and is fetched during next build.
Sanity CMS, GROQ queries for blog posts, team members, and partners; Portable Text rendering for rich blog content. Sanity image CDN via @sanity/image-url. Environment variables: NEXT_PUBLIC_SANITY_PROJECT_ID, NEXT_PUBLIC_SANITY_DATASET.
Oracle Cloud Infrastructure (OCI) Object Storage, public bucket hosts the static out/ folder. Cloudflare CDN and DNS in front of OCI (yeahinnovation.com). GitHub Actions on push to main: install → build → postbuild route prep → OCI CLI upload with per-extension content types (HTML, JS, CSS, WOFF2, GLB, MP4, etc.).
06
Static hosting ≠ Next.js dev server
OCI Object Storage serves files by exact object key, it does not map /product/paysafe to product/paysafe/index.html like a Node dev server. Enabled trailingSlash: true, removed duplicate dynamic product/[slug] route, added a postbuild script to guarantee product/{name}/index.html exists, aligned upload MIME types, and documented Cloudflare cache purge as part of deploy verification.
WebGL assets and CORS on static hosts
Three.js video/texture loaders can taint the canvas if assets lack proper CORS headers. Configured next.config.ts headers for .mp4, .svg, .png; used crossOrigin="anonymous" on loaders; added a fetch-based texture loader fallback for Turbopack/static export edge cases.
Sanity on a static site
No server means no runtime CMS fetches or ISR, content must be available at build time. Fetched Sanity data in Server Components during static generation. Home, About, and Blog pages bake CMS content into HTML at build. Documented that content updates require a rebuild and redeploy.
Mobile WebGL performance
Heavy 3D environments caused jank on mobile GPUs. Lazy-loaded 3D chunks (dynamic with ssr: false), simplified lighting on mobile, touch-action: pan-y on canvases so page scroll still works, and reduced particle/environment complexity on smaller viewports.
Invalid package.json breaking Tailwind in dev
A malformed build script ("build": "build": "next build") caused Tailwind/PostCSS to fail parsing package.json during dev. Split into "build": "next build" and "postbuild": "node scripts/prepare-oci-static-routes.mjs", valid JSON and clearer separation of concerns.
07
Shipped the production site at yeahinnovation.com. 10+ static routes including home, about, blog, architecture, and three full product pages. Automated deploy pipeline from GitHub to OCI on every push to main. CMS-driven sections (blogs, team, partners) editable without code changes, redeploy only when content updates. Immersive product storytelling with WebGL demos that differentiate Boma, Paysafe, and Get Yeah on a single cohesive brand site.
08
09
I design and ship production-ready systems at the intersection of cloud infrastructure, full-stack engineering, and human-centred product thinking.
Send email · kuzagbechristopher@gmail.com