should be async if speed is at all of a concern here (and if we are writing this sync python seems like a better candidate in some ways)