Skip to content
Dani Groupe

A cinematic WebGL stage for a Geneva builder

A multi-page editorial brand site for a Geneva general contractor, fronted by a hand-written Three.js shader hero and engineered for both desktop GPUs and mobile.

Dani Groupe | A cinematic WebGL stage for a Geneva builder project screenshot

The challenge

Dani Groupe is a Geneva-based general contractor and renovation company serving property owners across French-speaking Switzerland, alongside commercial and diplomatic clients like UN missions and embassies. They needed a brand presence that matched the precision and weight of their work across some sixteen trades, from asbestos removal and demolition to facade insulation and turnkey kitchens. A standard template would have undersold them. They wanted something that felt as considered as a finished build.

Our approach

We built a bespoke multi-page site on Next.js 16 and React 19, with a warm-dark editorial design system. The whole thing runs on a single content file, so every line of French-Swiss copy, every service, reference, and project lives in one editable place, with photography routed through a single 4K image map. The centerpiece is a custom WebGL hero: we hand-wrote GLSL vertex and fragment shaders that render the hero photography or 4K video on a high-poly plane, with simplex-noise breathing, a mouse-tracked ripple, scroll-driven displacement, chromatic aberration, and a face-safe mask so the subject stays sharp while the edges distort. We were deliberate about performance, shipping a lightweight HTML5 video hero on mobile so phones never pay the cost of the desktop shader.

What we delivered

Seven content pages plus a careers page: Home, Groupe (about), Competences (services), References (clients), Realisations (projects), Partenariat (sponsorships), and Contact
Custom Three.js WebGL hero with hand-written GLSL shaders: simplex-noise breathing, mouse-tracked ripple, scroll displacement, chromatic aberration, warm tint, vignette, and a noise-dissolve crossfade between textures
Photo-carousel or 4K MP4 video texture in the hero, with a face-safe radial mask keeping the subject crisp while the edges distort
Lightweight HTML5 video hero on mobile and touch devices that bypasses the GPU-heavy shader entirely
A second Three.js scene on the Contact page: a slowly rotating, mouse-tilting distorted icosahedron monolith
Realisations gallery with category filters, parallax masonry layout, and a draggable before/after comparator
Lenis-powered smooth scrolling with intercepted hash-anchor navigation and a top scroll-progress bar
Custom animated cursor with context-aware labels (Voir / Ecrire / Appeler) that hides on touch devices
Scroll-triggered count-up statistics, magnetic CTA buttons, sticky cinematic zoom blocks, and a sticky section index
References section pairing client logos with UN permanent missions and diplomatic representations, complete with country flags
Animated preloader with an honest 0-to-100 counter gated on both a minimum duration and full window load
Contact form that composes a structured message and hands off to the user's mail client via mailto, with no server-side email backend

Tech highlights

Next.js 16 (App Router) with React 19 and strict TypeScriptHand-authored GLSL shader pipeline, including a full inlined simplex-noise implementation, driving the WebGL heroThree.js 0.171 with react-three-fiber 9 and drei 10Tailwind CSS v4 with a CSS-first theme and an OKLCH burnt-copper-on-near-black color systemMotion (Framer Motion) animation and Lenis smooth scroll throughoutDevice-aware performance strategy: GPU shader on desktop, plain HTML5 video on mobile, with prefers-reduced-motion respected across preloader and scroll effectsAccessibility care: skip-to-content link, AA-checked OKLCH contrast tokens, focus-visible outlines, and preserved zoomStandalone Docker build deployed behind Traefik with Let's Encrypt TLS, security headers, rate limiting, www-redirect, and compression
We wanted the site to feel like the work itself: precise, weighty, and built to last. So we wrote the hero shader by hand rather than reaching for a library, then spent as much effort making sure a phone never has to run it. One content file drives the entire site, which means the copy and photography can evolve without us touching the engine underneath.

Dani Groupe

Dani Groupe

Like what you see?

Let's build something just as good, or better, for you.

Start a project