Sketchy filter (hand-drawn aesthetic)
The SVG feTurbulence filter that gives collection icons their hand-drawn, organic wobble.
The garden’s icons don’t look crisp and geometric. They wobble slightly, as if drawn with a pen. This is achieved with a single SVG filter.
The filter
<svg style="display: none">
<filter id="sketchy">
<feTurbulence
type="turbulence"
baseFrequency="0.015"
numOctaves="3"
seed="5"
/>
<feDisplacementMap
in="SourceGraphic"
in2="turbulence"
scale="0.4"
xChannelSelector="R"
yChannelSelector="G"
/>
</filter>
</svg>
Applied to an icon: filter="url(#sketchy)" on the SVG element.
How it works
feTurbulence generates a noise field, a procedurally generated pattern of smooth random values. feDisplacementMap uses that noise field to displace (shift) the pixels of the source graphic. Each pixel moves a small amount based on its position in the noise field.
The result: straight lines get a subtle wave, corners become slightly soft. It reads as hand-drawn without being cartoonish.
Key parameters
baseFrequency: 0.015: very low frequency = large, slow waves. Higher values produce a jagged effect; lower values produce gentle drift. At 0.015, a 100px icon shifts by only a few pixels at its edges.scale: 0.4: displacement strength. The default would be 1, which would be extreme. At 0.4, the distortion is barely perceptible but still present.numOctaves: 3: layers of noise stacked for organic complexity. More octaves = more texture but higher compute cost.seed: 5: the random seed. Changing this changes the exact shape of the distortion while keeping the same character.
Where the filter is defined
src/components/SketchyFilter.astro, a tiny component that outputs just the SVG definition. It’s included in PageLayout.astro so it’s available on every page without repeating the markup.
Applied on
Collection icons in CollectionIcon.astro, the icons in the header mega menu, collection index page headings, and post detail headers.
Trade-off
SVG filters run on the GPU and are generally fast. At scale: 0.4, there’s no visible performance cost. Avoid applying the filter to large raster images or animated elements.