feat: refactor web app