css noise · svg filter · grain · perlin · runs locally
<svg xmlns="http://www.w3.org/2000/svg" width="0" height="0">
<filter id="noise" x="0%" y="0%" width="100%" height="100%">
<feTurbulence
type="turbulence"
baseFrequency="0.65"
numOctaves="1"
stitchTiles="stitch"
result="noise"
/>
<feColorMatrix
type="saturate"
values="0"
in="noise"
result="grayNoise"
/>
<feBlend
in="SourceGraphic"
in2="grayNoise"
mode="multiply"
result="blended"
/>
<feComposite in="blended" in2="SourceGraphic" operator="in" />
</filter>
</svg>
/* CSS usage */
.element {
filter: url(#noise);
/* or as background overlay: */
background-image: url("data:image/svg+xml,...");
opacity: 0.60;
}