Forging an Avant-Garde Identity: A Technical Deep Dive into My Blog Redesign
A behind-the-scenes look at transforming a standard Next.js blog into an immersive, avant-garde digital experience using Three.js, Framer Motion, and a bold new design system.
In the ever-evolving landscape of web development, a personal portfolio is more than just a resume—it's a statement. Recently, I embarked on a journey to completely overhaul my digital home, moving away from a clean, "Anthropic-style" aesthetic to something far more bold, expressive, and avant-garde.
This article details the technical decisions, design philosophy, and engineering challenges behind this transformation.
The Vision: Avant-Garde Minimalism
The goal was to create an interface that feels "alive" and "premium" without sacrificing usability. I wanted to move away from the safe blues and grays of the corporate web and embrace a high-contrast, dark-mode-first aesthetic punctuated by vibrant neon accents.
Key Design Pillars:
- Deep Dark Mode: A background of
#050505(almost pure black) provides infinite depth. - Neon Accents: "Acid Green" (
#ccff00) and "Neon Magenta" (#ff00ff) serve as aggressive, high-energy highlights. - Typography: We adopted
Syne, a font with unique character and distinct geometry, for headings, while keepingInterfor readability in body text.
Technical Architecture
The project is built on Next.js 15, leveraging the power of React Server Components and the App Router. However, the real magic lies in the frontend stack:
- Styling: Tailwind CSS v4 for utility-first styling.
- Motion: Framer Motion for complex UI transitions.
- 3D/Shaders: React Three Fiber (R3F) for immersive backgrounds.
- Smooth Scroll: Lenis for buttery-smooth navigation.
1. The Design System (globals.css)
We redefined the CSS variables to support a "true" dark mode and a high-contrast light mode.
:root {
/* Avant-Garde Palette */
--background: #050505;
--foreground: #ededed;
--primary: #ccff00; /* Acid Green */
--accent: #ff00ff; /* Neon Magenta */
--font-brand: "Syne", sans-serif;
}
By using CSS variables, we ensure that every component—from buttons to borders—automatically inherits the correct theme values, making the design system robust and maintainable.
2. The Immersive Shader Background
One of the standout features is the fluid, liquid-like background in the Hero section. Instead of a heavy video file or a static image, we used a WebGL Fragment Shader.
Using @react-three/fiber, we render a simple plane geometry and apply a custom shader material. The shader uses a combination of sine waves and time variables to create a non-repeating, hypnotic pattern that reacts to the user's scroll position.
// Simplified Shader Logic
void main() {
vec2 uv = vUv;
float time = uTime * 0.5;
// Create liquid distortion
float distortion = sin(uv.y * 10.0 + time) * 0.1;
uv.x += distortion;
// Mix neon colors
vec3 color = mix(vec3(0.05, 0.05, 0.05), vec3(0.8, 1.0, 0.0), uv.y);
gl_FragColor = vec4(color, 1.0);
}
This approach is incredibly performant, as it runs entirely on the GPU, freeing up the main thread for React's hydration and logic.
3. Smooth Scrolling with Lenis
Standard browser scrolling can feel "choppy," especially on sites with heavy creative elements. To counter this, I integrated Lenis, a lightweight smooth scrolling library.
// src/components/ui/smooth-scroll.tsx
"use client";
import { ReactLenis } from "lenis/react";
export function SmoothScroll({ children }: { children: React.ReactNode }) {
return (
<ReactLenis root options={{ lerp: 0.1, duration: 1.5 }}>
{children}
</ReactLenis>
);
}
This simple wrapper transforms the scrolling experience, giving it weight and momentum that matches the premium feel of the visual design.
4. Advanced Animations & Glitch Effects
Static text is boring. To capture the "hacker/cyberpunk" vibe of the avant-garde aesthetic, I built a custom AnimatedText component. It supports:
- Staggered Reveals: Words slide into view one by one.
- Glitch Effects: Random characters distort and shift colors (using the neon palette) at random intervals.
// Glitch Effect Hook
useEffect(() => {
if (!glitch) return;
const interval = setInterval(() => {
if (Math.random() > 0.95) {
setIsGlitching(true);
setTimeout(() => setIsGlitching(false), 200);
}
}, 1000);
return () => clearInterval(interval);
}, [glitch]);
This adds a layer of dynamism and unpredictability to the UI, keeping the user engaged.
The Result
The result is a website that feels less like a document and more like an experience. It reflects my journey as a developer—constantly pushing boundaries, exploring new technologies, and refusing to settle for the status quo.
This redesign wasn't just about changing colors; it was about rethinking the relationship between the user and the interface. By combining performant 3D graphics, fluid motion, and a bold design system, we've created a platform that truly stands out.
Welcome to the new era.