good enough foundation i think. gonna write some APIs, will push responsibilities to the model as we go along
refactor based from pr comments