The shader that runs on GPU is used as a coordinate input for the particles. With the intensive calculation pushed to the GPU, the browser can run a lot of particles without any slowing or lagging even on mobile. This is paired with collision detection calculation. For the collision detection, instead of passing in every vertices in the text geometry, I've decided to trade accuracy with speed, using only a limited number of vertices in random.
Due to the lack of support of render to floating point texture, this will not work in Apple iOS.