JavaScript client framework