Temporal logic is a concise way of specifying complex tasks. However, motion planning to achieve temporal logic specifications is difficult, and existing methods struggle to scale to complex specifications and high-dimensional system dynamics. In this article, we cast linear temporal logic motion planning as a shortest path problem in a graph of convex sets and solve it with convex optimization. This approach brings together the best of modern optimization-based temporal logic planners and older automata-theoretic methods, addressing the limitations of each: we avoid clipping and pass-through by representing paths with continuous Bezier curves; computational complexity is polynomial (not exponential) in the number of sample points; global optimality can be certified (though it is not guaranteed); soundness and probabilistic completeness are guaranteed under mild assumptions; and, most importantly, the method scales to complex specifications and high-dimensional systems, including a 30-degree-of-freedom humanoid.