How the project is organised
app/layout.tsx – fonts, page title and description, theme colour
app/globals.css – the interface styles and colour variables
components/Journey.tsx – Lenis smooth scrolling, chapter snapping and the scroll height
components/scene/ – the WebGL scene: Experience.tsx (canvas and post-processing), CameraRig.tsx (camera path), Bodies.tsx (Sun, planets, rings, Moon, orbits) and Particles.tsx (stars, asteroid belt, dust)
components/ui/ – the overlay: loader, headlines, stats, chapter rail and distance readouts
lib/bodies.ts – the content and look of every chapter
lib/shaders.ts – the GLSL for every surface
lib/journey.ts – the per-frame state shared between scroll and scene
Edit the copy
- Chapters: each entry in
BODIES in lib/bodies.ts has a name, a kicker (the small line above the headline), a tagline and four stats pairs such as ["Diameter", "12,742 km"].
- Intro and outro: edit the
INTRO and OUTRO objects at the top of components/ui/Overlay.tsx.
- Page title and description: edit
metadata in app/layout.tsx.
- Brand mark: the "HELIOS" wordmark in the header is in
components/ui/Overlay.tsx.
Add, remove or reorder chapters
The chapter list is built from BODIES: an overview, one chapter per body, then the outro. Remove an entry to drop a chapter, or copy one and change its id, orbit, angle and size to add one. The camera path, chapter rail and page height update automatically. Scene positions are artistic, so choose orbits that keep bodies apart.
Change colours
- Interface: change
--bg, --fg, --dim, --faint and --accent at the top of app/globals.css, and themeColor in app/layout.tsx.
- Scene background: the
<color attach="background"> value in components/scene/Experience.tsx.
- Each body:
colors is a three-colour palette (dark, mid, light) fed to the shader, atmosphere sets the glow on the limb, rings adds rings, and seed changes the noise pattern. Change these to recolour a planet without touching GLSL.
Change fonts
The display and mono fonts are loaded with next/font/google in app/layout.tsx (Space Grotesk and JetBrains Mono). Replace the imports with any other Google font, or next/font/local for your own files, and keep the --font-display and --font-mono variable names.
Models and textures
HELIOS uses no 3D model or texture files: every surface is generated in lib/shaders.ts. To show your own object in a chapter, load a GLB with three.js's GLTFLoader (or useLoader from React Three Fiber) inside components/scene/Bodies.tsx and place it at that body's position; the camera rig frames whatever sits at the body's orbit, angle and size.
Tune motion and effects
- Scroll feel:
lerp and wheelMultiplier in the Lenis options, and the snap delay and duration, are in components/Journey.tsx.
- Camera: distances, side offset and the portrait framing are in
buildStops in components/scene/CameraRig.tsx.
- Post-processing: bloom intensity and threshold, grain opacity, vignette darkness and the chromatic aberration strength are in the
Effects component in components/scene/Experience.tsx. Remove an effect by deleting its line.
- Particles: star, belt and dust counts are the first argument of each
makeCloud call in components/scene/Particles.tsx; lower them for weaker devices.