It is somewhat whacky, but what I'm doing is:
I created a library to have distributed data types directly on the browser [1]. So there are no servers, data is sync'd directly between people's browsers.
Then I created a library to bind react components directly to my distributed data types [2]. So the app is just a static page, hosted anywhere, that works as an SPA.
[1] https://github.com/hyperhyperspace/hyperhyperspace-core
[2] https://github.com/hyperhyperspace/hyperhyperspace-react