Viscose-carousel logo

Viscose-carousel

A wheel of work that never quite sets. Cards fuse as they meet, and draw into threads as they part.

Developer ToolsJavaScriptNOASSERTION 378 62
Next.js 16Three.js r185
Website GitHub

What is it?

What it is

A portfolio carousel built as a single WebGL shader using signed distance fields, where project cards ride a ring that sweeps past the viewer with viscous, thread‑like transitions.

Why it exists

To explore a novel rendering approach—merging card art, threads, glass refraction, and cursor effects in one shader—while providing an interactive, momentum‑driven showcase of work that feels tactile and visually striking.

Who should use it

Developers and designers interested in creative coding, WebGL shaders, interactive portfolio sites, and experimental UI effects using Next.js and Three.js.

Who should avoid it

Beginners unfamiliar with WebGL, shader programming, or those needing a simple, accessible, low-motion website; also teams requiring extensive testing, keyboard navigation, or reduced-motion support.

How it works

A quick walkthrough in plain English

How Viscose-carousel works

Step 1 of 3

You interact with it

Open Viscose-carousel, send a request, or connect it to your stack.

Features

Renders a portfolio carousel as a single full-screen WebGL fragment shader
Cards use distance-field shapes that melt and thread apart via smooth minimum blending
Interactive controls: scroll/drag with momentum snapping, hover softening, click to center, swipe on touch
Live dev panel (lil-gui) exposing ~136 tunable parameters grouped by effect
Responsive scaling based on a reference window with a “fit” button
Simple project addition by editing a single JavaScript array in projects.js
Built with Next.js 16 (App Router), React 19, Three.js, GSAP, and Tailwind v4
Source code released under MIT license

Advantages

  • Single draw call minimizes GPU overhead and eliminates multiple texture fetches
  • Fluid visual effect where cards appear to melt and form honey-like threads
  • Real-time interactive physics with smooth momentum for high engagement
  • Highly customizable via the dev panel without rebuilding the app
  • Easy to extend: new project cards require only a data-array update
  • Open-source MIT license permits free use and modification

Disadvantages

  • No reduced-motion support, making the animation inaccessible to some users
  • Missing keyboard navigation such as arrow keys
  • Phone width breakpoints are approximate and may drift on very small screens
  • No automated tests; runtime shader compilation can hide errors
  • Font licensing restrictions for PP Neue Montreal require separate commercial license
  • Third-party images in public/ have unclear reuse rights

Installation

cloud

Not mentioned in README

docker

Not mentioned in README

native

npm install && npm run dev

compose

Not mentioned in README

FAQ

How do I run the Viscose carousel locally?

Requires Node 20 or newer. Clone the repo, run `npm install`, then `npm run dev` to start the development server at http://localhost:3000. Use `npm run build` for production and `npm start` to serve it.

How can I interact with the carousel?

Scroll or drag to turn the ring (it snaps to cards). Hover cards to soften the field and stretch threads. Click off-center cards to smoothly center them. On touch devices, swipe to turn and press-and-hold for hover effects.

How do I add my own projects to the carousel?

Edit `components/ring/projects.js` to add your project entries with `file`, `name`, `type`, and `year` fields. Place images in the `public/` directory. The array order determines ring sequence—reorder rows to change the carousel flow.

What are the font licensing considerations?

PP Neue Montreal is bundled for development only and requires commercial licensing for use. Satoshi and Geist are free for commercial use. Swap `textFont` in `params.js` to use Satoshi instead if needed.

How does the development panel work?

A lil-gui panel appears top-right in development with ~136 tunables grouped by effect. Changes are live. Before tuning, ensure `fit/scale` reads `1.000` or click 'use this window as ref' to match your screen's reference. Controls are in `ring/gui.js`.

What are the current limitations of the carousel?

Clicking cards centers them but doesn't open links. No reduced-motion support or keyboard navigation. Phone widths below 500px may have layout issues. GLSL shaders compile at runtime, so build passes don't validate shader syntax.

Loading documentation…
View on GitHub

Featured in Videos

YouTube tutorials and walkthroughs for Viscose-carousel

Alternatives

Similar projects ranked by category, topics, and text overlap.

Compare