basic model + frontend state