Much much cleaner types and DRY code for getting AI ready