Web client framework