Your opponent left book with 5.h3?! ... seems like a wasted tempo to me.
I very much liked 15...Qg6! I've read more than one instructor urging their students to develop a "target" mentality and to play moves with "force"... and 15...Qg6 is exactly that kind of move.
I liked his 18.Kd2... your queen might have easily gotten into some trouble from threats down that half open g-file now. I often wonder if it's worth it to win a g-pawn when it opens a file for the enemy rooks against my castled king... it seems like handing the enemy instant attacking plans... but your opponent failed to pursue this with energy and you kept the initiative with moves like 18...d4!?
I really wonder what A) an engine says about 18...d4, and B) what a strong player says about it. It's probably the move of the game, or else a mistake! Sacing a pawn to leave his king in uncomfortable water in the middle of the board... the more I think about it the better it looks... but going thru the game I hated it. (As a player I'm always looking to squeeze, and 18...d4 does not squeeze; it's slash and burn.)
From here it gets tactical and my hunch is you missed an opportunity or two but I can't find anything solid.
21...Qd5!? (it's probably the best move -- but I keep looking for more here... I thought 21....Qf3 was an improvement but after 22.Qg3 I don't think so.)
24...Rfd8?!... he let you off the hook with 25.Rc1? Did you evaluate 25.Bxf6! I don't know if it saves white's bacon but the position certainly get VERY sharp.
After 25.Rc1 the game is effectively over IMO.
Very nicely done.
I think re-reading Chernev's Logical Chess (or whatever it's called) where he keeps hammering in the idea that masters do not play for combinations etc., only according to well established chess principles and the combinations happen by themselves, has really helped my game.
In the following game I spent aroubnd 10 min on the opening, really thinking through each move and that gave me a strong advantage. Towards the end I didn't necessarily look for the best move as the game was anyway already won.