I'm writing my own mesh renderer, and I previously was able to apply a normal map to a sphere, so I understand the basic process of applying a normal map. But my understanding is that in order to apply it, you need a consistent tangent space at every point on the mesh. It's possible on a sphere because you can calculate the spherical coordinates and then pick orthogonal tangents parallel to lines of longitude/latitude, but as far as I can tell, there's no clear way to do that to a mesh.
To give a specific example, I found this free .obj file online, and I can render it with textures, just without normal mapping. But I can open up the model in the generic Windows "3D Viewer", and in that program, it has normal mapping applied, so clearly it's possible. I couldn't find anything online, is there a way to do this?