Seif Elkady
WorkProjectsBlog
Let's Talk
Blogs
Share
Paper Shaders: The Complete Guide to Adding Real GPU Shaders to Any Project

Paper Shaders: The Complete Guide to Adding Real GPU Shaders to Any Project

Jul 5, 20265 min readdevtools
ShadersWebGLMesh GradientsFrontendAnimation

Paper Shaders is a library of ultra-fast, zero-dependency GPU shaders for your designs. No three.js, no GLSL to write, no canvas boilerplate. Just install the package and drop in a component.

terminal
npm i @paper-design/shaders-react

This post is written as a practical reference, the kind of doc you'd hand to an AI coding agent (or your future self) to actually build with this library. Every shader below has its import path, the props that matter, and when to reach for it.

Why This Library, Not Raw WebGL

Building this by hand means writing GLSL, setting up a canvas + render loop, handling resize and DPR scaling, and reimplementing noise functions from Shadertoy. Paper Shaders skips all of that:

tsx
import { MeshGradient } from "@paper-design/shaders-react"; <MeshGradient colors={["#000000", "#5B21B6", "#F97316", "#111111"]} speed={0.3} distortion={0.8} swirl={0.5} className="absolute inset-0 h-full w-full" />

No canvas ref, no requestAnimationFrame, no cleanup on unmount. The component owns the WebGL context lifecycle. Every prop maps straight to a shader uniform, so tweaking speed or distortion is a GPU-side update, not a re-render.

The Full Catalog

Paper Shaders splits into three groups: image filters (they take an input image/texture), logo animations (built for a mark or icon sitting on top), and effects (freestanding backgrounds/decoration). Import name matches the component name below unless noted.

Image Filters

These wrap an existing image or video and distort/stylize it.

ShaderComponentUse it for
Paper TexturePaperTextureGrainy print/scan look over an image
Fluted GlassFlutedGlassFrosted-glass / reeded-glass distortion over a photo
WaterWaterRipple/refraction distortion, hero images, product shots
Image DitheringImageDitheringRetro 1-bit / limited-palette dither over a photo
Halftone (Dots)HalftoneNewsprint dot-pattern over an image
Halftone CMYKHalftoneCMYKPrint-style CMYK offset halftone
tsx
import { Water } from "@paper-design/shaders-react"; <Water image="/hero.jpg" speed={0.4} className="h-[400px] w-full rounded-2xl" />

Logo Animations

Built to sit behind or around a logotype/icon and stay legible.

ShaderComponentUse it for
HeatmapHeatmapPulsing thermal-style glow behind a mark
Liquid MetalLiquidMetalChrome/mercury reflection over a logo shape
Gem SmokeGemSmokeFaceted, prismatic smoke behind a brand mark
tsx
import { LiquidMetal } from "@paper-design/shaders-react"; <LiquidMetal colorBack="#000000" colorTint="#c0c0c0" speed={0.6} className="h-40 w-40" />

Effects (Backgrounds, Decoration, Loaders)

The largest group, freestanding shaders for hero sections, page backgrounds, borders, and loading states.

ShaderComponentUse it for
Mesh GradientMeshGradientAnimated multi-color blend, the classic soft background
Static Mesh GradientStaticMeshGradientSame look, no animation, cheaper render, OG images
Static Radial GradientStaticRadialGradientSingle-point radial blend, spotlight/vignette effect
Grain GradientGrainGradientMesh gradient with heavy film grain baked in
DitheringDitheringStandalone 1-bit/ordered dither pattern, no source image needed
Dot OrbitDotOrbitParticles orbiting in a field, ambient motion
Dot GridDotGridAnimated grid of dots, subtle texture or interactive backdrop
WarpWarpDomain-warped flowing color field
SpiralSpiralRotating spiral pattern
SwirlSwirlSwirling color distortion, softer than Spiral
WavesWavesLayered sine-wave bands
Neuro NoiseNeuroNoiseOrganic, brain-like noise field
PerlinPerlinNoiseClassic Perlin noise texture
Simplex NoiseSimplexNoiseSimplex noise texture, less directional artifacting than Perlin
VoronoiVoronoiCellular/organic tiling pattern
Pulsing BorderPulsingBorderAnimated glowing border outline, great on cards/buttons
MetaballsMetaballsBlobby, merging liquid shapes
Color PanelsColorPanelsSliding/shifting flat color blocks
Smoke RingSmokeRingExpanding ring of smoke/energy
tsx
import { Voronoi, PulsingBorder } from "@paper-design/shaders-react"; <Voronoi colors={["#111111", "#7c3aed", "#f97316"]} distance={0.4} className="absolute inset-0 h-full w-full" /> <PulsingBorder colorBack="transparent" colors={["#f97316", "#7c3aed"]} className="pointer-events-none absolute inset-0 rounded-xl" />

Picking the Right One (Quick Decision Guide)

  • Need a soft animated hero background? MeshGradient or GrainGradient if you want visible texture.
  • Need it for an OG/share image or anywhere animation is wasted? StaticMeshGradient or StaticRadialGradient, same look, far cheaper.
  • Need something behind a logo? LiquidMetal, Heatmap, or GemSmoke, tuned to keep foreground marks legible.
  • Need a retro/print aesthetic? Dithering, Halftone, or HalftoneCMYK.
  • Need ambient motion without color, just texture? DotGrid, DotOrbit, Perlin, or SimplexNoise.
  • Need liquid/organic blob shapes? Metaballs or Warp.
  • Need a highlight/focus ring on a button or card? PulsingBorder.

Notes for Agentic Use

If you're an agent (or a human moving fast) wiring this into a codebase:

  1. Install once: npm i @paper-design/shaders-react. There's also a framework-agnostic @paper-design/shaders core package if the target isn't React.
  2. Import only what you use. Each shader is its own component/chunk, so tree-shaking keeps bundle size down even if you reference many of them across a codebase.
  3. Colors and numeric props are uniforms. Changing them doesn't trigger a DOM re-render, it's a cheap GPU uniform update. Safe to drive from state, scroll position, or a color picker in real time.
  4. Respect prefers-reduced-motion. These shaders don't auto-pause on that media query, gate the speed prop (or skip mounting the component) yourself if accessibility matters for the project.
  5. Client components only. Every shader here needs "use client" in Next.js App Router since it mounts a WebGL canvas.
  6. For a background layer, wrap in absolute inset-0 -z-10 h-full w-full and put content in a sibling with a higher z-index and a scrim/gradient overlay if text needs contrast (see shaders.paper.design for exact prop defaults per shader, they vary a bit component to component).

Where I Used It

On my own landing page intro, I swapped a static gradient div for a MeshGradient running behind the logo reveal, same GSAP timeline, just a living backdrop instead of a flat one. Total add: one import, one component, four color stops. No shader code touched.

For the full live playground with every parameter exposed and copy-paste code for React, Vue, and vanilla JS, go to shaders.paper.design.

Related Articles

Why I Built QuickShip CLI: Automating My Own Boilerplate

Jan 12, 2026

Replacing StackOverflow with Agent Skills

Feb 2, 2026

Why I Chosen Supabase Over Firebase for PaceFyndr

Feb 2, 2026
“Build something people want, ship it before it's perfect, and let the market tell you what to fix.”

· Seif Elkady

© 2026 Seif Elkady, All rights reserved

Cairo, Egypt GMT+3