It took me a minute to see the line after hxg3 ... had to pull up the analysis board. Not sure I would have seen that in an OTB situation. Good play at that point.
Though, I did it with 19. ... Rh1+. It's a little more forcing, and eliminates the spite checks. Also, after 21. ... Kf7 in your variation, White can still delay by one move, 22. Be8+, so 21. ... Kd8 would have made it mate in 1.
In this game I blundered in the opening against a much better player. Still, I kept up fighting and won the game after a beautiful construction on the kingside!
Here is the game!
Opponent (1995) - 02Wesley (1576) 0-1