factored out canvas to its own package