OK, I've investigated some more and I'm still pretty confused, but I think I have a workaround in place for v2.3.1: If you have BUTLER_API_KEY set, that key will now be reused instead of gui-butler prompting you for a second authorization. This doesn't work in all cases since the key that wharf creates doesn't have access to the "my-games" API used to fetch the projects, but a manually created API key should cover both wharf and gui-butler's scope requirements and allow the app to work as expected. I was able to confirm this by testing on a VirtualBox Ubuntu setup with a new key.
The workaround is needed because I couldn't figure out the "bailing out: No credentials and stdin is not a terminal" error. It comes from butler's auth here, and I traced this through to the underlying golang libraries, but can't follow the code well enough to understand why a node child process would be seen as a terminal on Windows but not on Linux.
As for the login getting stuck: The issue here seems to be that the custom protocol used as the oauth redirect isn't registering properly, so the app has no way of completing the flow (I'm not sure how it looks on Mac, but on Linux I was able to see it prompt for which app to open, but gui-butler wasn't in the list). I was missing a couple build properties required for custom protocols to work on Mac that may have fixed this, but the new workaround will skip this flow anyway so this will only be relevant if the "not a terminal" issue is fixed at some point.
Hopefully this helps, lmk if you still have issues!