kawase blur + domain warp

bylogoBetter Lyrics
GitHub

Fluid animated backgrounds powered by WebGL, Kawase blur & domain warping.

Documentation

Kawarp is a zero-dependency, WebGL-powered library for creating fluid, animated background effects similar to Apple Music's album art visualization. It uses Kawase blur for efficient, high-quality blurring and simplex noise-based domain warping for organic motion. The library is optimized for performance with blur operations running on small textures only when the image changes, while per-frame rendering is minimal.

Installation

$ npm install @kawarp/core

Quick Start

import { Kawarp } from '@kawarp/core';

const canvas = document.querySelector('canvas');
const kawarp = new Kawarp(canvas);

await kawarp.loadImage('path/to/image.jpg');
kawarp.start();

Options

OptionTypeDefaultDescription
warpIntensitynumber1.0Warp effect strength (0-1)
blurPassesnumber8Kawase blur passes (1-40)
animationSpeednumber1.0Animation speed multiplier
transitionDurationnumber1000Crossfade duration in ms
saturationnumber1.5Color saturation multiplier
tintColor[r, g, b][0.16, 0.16, 0.24]Tint color for dark areas (0-1)
tintIntensitynumber0.15Tint effect strength (0-1)
ditheringnumber0.008Dithering strength (0-0.1)
scalenumber1.0Overall zoom level of the effect (0.01-4)

Methods

loadImage(url)Load image from URL
loadGradient(colors, angle?)Load gradient as source
loadBlob(blob)Load from Blob or File
start()Start animation
stop()Stop animation
resize()Update dimensions
dispose()Clean up resources

React

Installation

$ npm install @kawarp/react

Basic Usage

import { Kawarp } from '@kawarp/react';

function App() {
  return (
    <Kawarp
      src="/image.jpg"
      warpIntensity={0.8}
      style={{ width: '100%', height: '100vh' }}
    />
  );
}

useKawarp Hook

For operations that can't be done via props—like loading from files, blobs, or gradients—use the useKawarp hook.

import { Kawarp, useKawarp } from '@kawarp/react';

function App() {
  const { ref, loadImage, loadBlob } = useKawarp();

  const handleUpload = async (file: File) => {
    await loadBlob(file);
  };

  return (
    <>
      <Kawarp ref={ref} src="/initial.jpg" />
      <button onClick={() => loadImage('/new.jpg')}>
        Load New Image
      </button>
    </>
  );
}

Component Props

All core options are available as props, plus React-specific ones:

OptionTypeDefaultDescription
srcstring-Image URL (auto-loads on change)
autoPlaybooleantrueAuto-start animation
onLoad() => void-Called when image loads
onError(error) => void-Called on load error
classNamestring-Container class name
styleCSSProperties-Container styles