I'm actually interested in what's causing the microjittering at the bottom. Lack of dampening? Friction?
The main loop updates at 200fps, so that's 5 ms between updates. Gravity is applied every 5ms, which accelerates each particle to some velocity. Even if it might theoretically collide with the bottom in 1ms, the full 5ms delta v is applied, and then it bounces up with a dampened upwards velocity and makes it to the same height before main loops again.
The solution I'll be implementing is a time solver for collisions, as opposed to a lower elasticity value or minimum rebound value. Both of the latter would work fine but they're workarounds, and finding the time of collision also makes for more robust collision between everything else so I might as well do it right