Fisher Yates Shuffle
We use what is essentially known as the "knuth shuffle" or "fisher yates shuffle". More here:
https://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle
Now, how do we express that in code? The actual code that drives the shuffling on Untap.in is derived from an excellent article that visualizes shuffles using the knuth shuffle technique, see here: https://bost.ocks.org/mike/shuffle/
The only real modification we make is that we seed the knuth shuffle with a seed that we generate from the random.org API that generates true randoms numbers from atmospheric noise, see here: https://www.random.org/clients/http/
Every build we test the shuffle algorithm both known seed and simulate 50,000 shuffles and compare.
Hope that can ease your mind a little more on the topic.