reimplement backend, add client side protocol (whoops)