updated based on challenges I found when building an actual project from this