Cross-End solution based on Canvas