There are a number of implementations of sketchy rendering via rough.js available in Observable pages, but I was a little dissatisfied with either the work required to use them or their fragility. I’ve attempted to make a reasonably robust version that can be used with Observable Plot with minimal extra API surface (just add rough:{} to any mark specification).
There’s already a seed option available ({seed: n} where n is any integer or null for no seeding) to fix the perturbation. But good point about making it the default.
Thanks to the suggestions from Fil. I’ve updated the wrapper so it now allows top-level rough settings avoiding the need for per-mark changes. Finer level control is still possible on a per-mark basis when needed. I’ve also set the default to seed the random number generator so re-renders produce exactly the same result (unseeded randomisation is still possible by explicitly setting seed:0).