I've made a universal app in my language, single program running across multiple machines with function scope defining all interaction between the two computers.
A server function can simply return a function that will be the client app. All variables in scope on the server and used by the client are available on the client. But the client has no way to extend the environment it is sent so does not see any value it is not meant to use. This was enabled by implementing an interpreter, my language was compiled only before this. The server function captures the AST of the inner function and compiles it before sending to the client. Because the inner function is compiled it is still fast on the client. I don't know if there are any other languages that do this. But I am interested to see where this idea can take me.