It's a team sport. You're not a team player. Don't stand there like a lump, "hiding". Create pressure, opportunity, and space for your teammates. The goal of the game is not for you to score. The goal of the game is for your team to score.
Assuming your vpn provides a stable remote IP, your client connection needs to use that. Try "whatsmyip" or similar over the vpn. The remote address almost certainly won't appear in the local output of ip a.
Locally, listen on the "this host", 0.0.0.0.
You may need to check your firewall locally.
You don't need to run your http service to troubleshoot - simple tools like netcat can listen for incoming requests - nc -l 0.0.0.0 8000 or what-have-you.
Finally: you might want to look at using a shell host as the client rather than targeting your vpn ip from your local host, just to take hairpin connections out of consideration when troubleshooting.
C++ is one if those languages where writing a library feels hugely different from using it. Boost is a case in point here: there are brilliant peiple behind it, but (error messages aside) the ergonomics of using thise libs in an application are usually pretty good.
(Scala felt similar to me. There are other languages where it feels much less like I'm swapping hats as I flip between parts of a codebase.)
What's in your mind does not coincide with the professional experience of Greg KH. You shoyld read what he had to say on the subject.