ewan's projects — docs

projects

@ewanc26/noise-avatar

March 9, 2026

# typescript# canvas# svelte# library# pkgs

@ewanc26/noise-avatar generates unique, colourful avatar images from an arbitrary string seed. The same seed always produces the same image. It is a thin opinionated wrapper around @ewanc26/noise, fixing the colour mode to HSL and defaulting to a square 64×64 canvas so you don't have to think about noise options for the common avatar use-case.

Part of the @ewanc26/pkgs monorepo.

Install

pnpm add @ewanc26/noise-avatar

Ships as both ESM and CJS with full TypeScript type definitions.

How it works

Each pixel's colour is computed via bilinear interpolation over a small value-noise grid, using smoothstep blending for a smooth, organic look. The palette is derived from the seed: a djb2 hash determines the base hue, and a seeded LCG PRNG drives the noise grid and colour variance. Because everything is deterministic, the output is stable across environments — the same seed always maps to the same avatar.

The rendering is delegated entirely to @ewanc26/noise. For full control over dimensions, FBM octaves, and colour modes, use that package directly.

Usage

Vanilla JS / TypeScript

import { renderNoiseAvatar } from '@ewanc26/noise-avatar';

const canvas = document.querySelector('canvas');
renderNoiseAvatar(canvas, 'Alice|Subscription');

Svelte action

<script>
  import { noiseAvatarAction } from '@ewanc26/noise-avatar';

  let seed = 'did:plc:example';
</script>

<canvas use:noiseAvatarAction={seed} class="rounded-full"></canvas>

The action re-renders automatically when seed changes via Svelte's update lifecycle.

API

renderNoiseAvatar(canvas, seed, options?)

Renders a deterministic HSL value-noise texture onto canvas at displaySize × displaySize pixels.

Parameter Type Description
canvas HTMLCanvasElement Target element — will be resized
seed string Arbitrary string seed
options NoiseAvatarOptions Optional rendering config

noiseAvatarAction(canvas, seed, options?)

Svelte action wrapper. Re-renders whenever seed changes.

Re-exported primitives

hash32, makePrng, hslToRgb, makeValueNoiseSampler, and generateNoisePixels are all re-exported from @ewanc26/noise for convenience.

Options

All options are passed as the third argument to renderNoiseAvatar or noiseAvatarAction.

Option Type Default Description
gridSize number 5 Side length of the noise grid
displaySize number 64 Width and height of the rendered canvas in pixels
hueRange number 60 Hue spread in degrees around the seed-derived base hue
saturationRange [number, number] [45, 70] Saturation min/max as percentages
lightnessRange [number, number] [40, 70] Lightness min/max as percentages

Examples

// High-detail, large avatar
renderNoiseAvatar(canvas, seed, {
  gridSize: 10,
  displaySize: 128,
});

// Desaturated, dark palette
renderNoiseAvatar(canvas, seed, {
  hueRange: 20,
  saturationRange: [10, 30],
  lightnessRange: [20, 45],
});

Licence

AGPL-3.0-only — see the pkgs monorepo.


← all docs