Maxima Converter
Draw a mathematical expression by hand and get it back as Maxima source.
Try it
Open full screenDraw a mathematical expression and it is transcribed into Maxima syntax a moment after you stop. It runs on this site: the drawing goes to a vision model through this site’s own Worker, so there is no separate service behind it. It transcribes only what is drawn — it will not simplify or solve, and says so when a drawing cannot be read.
Python, Flask, Socket.IO, Canvas, MathJax, TypeScript, Cloudflare Workers, Claude API
How it works
You draw an expression on a canvas. A moment after you stop, the drawing is sent to a vision model that transcribes it into Maxima syntax and LaTeX, which is rendered back beside the code. The transcription is constrained to a fixed schema, so the model returns the two forms as separate fields rather than a string that has to be pulled apart.
The build
Made over two days at HackLondon 2025, where it placed second. Anton Lewis wrote the drawing surface; I built the server, the prompt that does the transcription, and the deployment. An early version shelled out to Maxima itself to render the LaTeX, which was dropped once the model turned out to produce it more reliably.
Rebuilt for this site
It first ran as a Flask app on a Heroku dyno, holding a Socket.IO connection open and compositing each frame with Pillow before the upload. All of that wrapped a single vision call, so it now runs as one request handler on the same Worker that serves this site: no dyno, no socket, and no image processing step. The drawing surface gained undo, a visible reading state, and errors that actually surface.
Second place — HackLondon 2025.
The converter transcribes only what is drawn; it does not simplify or solve. Unclear drawings are reported as unreadable rather than guessed at.