This is a tough one to crack. I haven't analysed it thoroughly but it appears to me that for at least most of the game the two of you played quite well, especially if the game was not correspondence.
Working backwards to see where you lost, I think that 23. Qf2 would have given you better practical chances, but due to being a pawn down with a chronically weak e-pawn you're probably still lost there.
On move 20.Be3 is indeed bad, however I'm struggling to find decent alternatives. The only two possibilities would be Bc1?! which undevelops your piece, leaving it in a bad way, and 0-0-0!?, which I think was your best shot. (on Rb1 or b3 ...Nxc4 leaves him 2 pawns up)
On move 16, saccing the knight by means of 0-0 or especially 0-0-0 looks like the best way to continue the attack, though he may have some defence. Example line: 16 0-0-0 gxf5 17 Qh5+ Ke7 and here you might try Qh6 or Qxh7, threatening Rxd5 and Bxf6+ to follow if they take the rook. Again, I think a defence probably exists.
I kind find much else better after the pawn sac on move 11, unless perhaps you tried to build the attack a bit more slowly. Just a tough game. I hope this helped.
In this game, I sacrificed a pawn speculatively, something I think Mikhail Tal would do. Though after the complications have ended, I was still a pawn down, made a bad move and lost in the endgame.