project setup and abstract component interfaces