If you didn't already, take a look at Remix.run. It's like building a React app with its own included backend. Still feels a bit like (the good kind of) magic. No need for FastAPI anymore and you can share TypeScript types across both server and client.