use websockets to push updates; closes #1