add caching, update docs