The source for ezzyrappeport.com: a personal portfolio for Ezzy Rappeport, a software engineer, AI systems builder, and founder.
The site pairs an editorial portfolio with an interactive liquid surface. It is built to make the work legible first, then add motion and depth when the device can support it.
- A responsive landing page covering the portfolio, experience, about, location, and contact sections.
- Five project case studies with dedicated, statically generated routes: MonkeyClaw, Velox, FlowE, NexaRad, and Etch.
- Project-specific media, verified links, capability details, and clear demo/research boundaries where appropriate.
- A custom WebGL2 fluid renderer with a water-material hero title, pointer ripples, scroll response, and liquid-glass cards.
- A poster/CSS fallback when WebGL2 is unavailable, plus a static mode for reduced motion and data-saving contexts.
- Adaptive rendering quality based on input type, device memory, connection preferences, and frame timing.
- Next.js 15 with React 19 and TypeScript
- Custom WebGL2 shaders and fluid simulation (no 3D rendering dependency)
- CSS-first responsive design with
next/font - ESLint and TypeScript for static checks
- Node.js 18.18 or later
- npm (bundled with Node.js)
npm install
npm run devOpen http://localhost:3000.
The generated background assets are committed, so this is only needed when regenerating them:
npm run assets:fluid| Command | Purpose |
|---|---|
npm run dev |
Start the local development server. |
npm run build |
Create an optimized production build. |
npm run start |
Serve a production build. |
npm run lint |
Run ESLint. |
npm run typecheck |
Run TypeScript without emitting files. |
npm run assets:fluid |
Regenerate the liquid-background assets. |
The liquid treatment is decorative; the portfolio content, heading structure, navigation, project routes, and contact paths remain usable without it. The renderer selects a lower-cost or static profile for coarse pointers, prefers-reduced-motion, Save-Data, and constrained devices. If WebGL2 initialization fails, the page retains its poster treatment instead of blocking the content.
src/
app/ Next.js routes, metadata, and global styles
components/portfolio/ Portfolio sections and reusable interface pieces
features/kinetic-canvas/ WebGL2 renderer, shaders, fluid passes, quality profiles
lib/portfolio/ Portfolio content and shared liquid interaction state
public/
assets/ Generated liquid fallback assets
projects/ Case-study imagery and diagrams
scripts/
build-fluid-assets.mjs Fluid-image asset generator
Before publishing changes, run:
npm run lint
npm run typecheck
npm run buildAll rights reserved. The portfolio content and visual assets may not be reused without permission.