What you are looking at
A flow field is a function that returns a direction for every point on the canvas. The particles know nothing else: they read the angle where they are, take a step, and repeat. No mass, no collisions, no accumulating forces, because none of it would show.
Everything interesting is in the field. That is why the three patterns run the same particles and produce pictures with nothing in common.
The noise has to be continuous
The requirement that decides everything is that neighbouring points return similar angles. Otherwise particles scatter instead of flowing.
That rules out the direct coordinate hash the site's sphere grain uses, which wants the opposite: a different value at every pixel. Here a lattice is hashed and the values between its corners are interpolated.
const u = smooth(x - Math.floor(x));
const v = smooth(y - Math.floor(y));
const w = smooth(z - Math.floor(z));
The smoothstep on the interpolant is not decoration: linear interpolation is continuous in value but not in slope, and that discontinuity shows up as a lattice of visible creases.
The bug that took a while to find
The first version interpolated x and y and passed time straight into the hash. Since time advances by a fraction each frame, hash(x, y, z) returned a value unrelated to the last one — the field was rebuilt from scratch sixty times a second.
The result was grey noise, and no setting fixed it, because the particles were not following anything. Interpolating the time axis too is what turns drift into a slow deformation instead of a flicker.
The trail is the accumulation
The canvas is never cleared. Each frame paints a translucent rectangle of the background colour over it, so a stroke drawn now is dark and one from two seconds ago has nearly dissolved.
That gives a relationship worth keeping in mind: a stroke survives roughly 1 / fade frames and covers speed pixels in each.
fade 0.055 · speed 1.1 -> 18 frames, 20px (a dash)
fade 0.012 · speed 1.6 -> 83 frames, 133px (a line)
At the first values a thousand particles drew a thousand dashes, which is a texture and not a field. The difference between the two pictures is that arithmetic, not the particle count.