In the age of AI, the human touch still matters! Since childhood, I have always learned best through handwritten notes, but writing them out simply takes too much time.

Finding a way to automate this is incredibly difficult. Genuine handwriting has natural variations, and no two characters ever look exactly the same. I searched everywhere for a solution. There were no GitHub repositories or paid SaaS tools that could convert digital text into truly natural handwriting. That does not even include the massive challenge of generating handwritten math equations and graphs.

The challenge was huge, but I knew people desperately needed a way to create authentic handwritten notes quickly. After a year of relentless hacking and testing to solve this exact problem, the solution is finally here.

What it does

Aipen for ChatGPT is a native ChatGPT app. Ask it for study notes, a worked math solution, a letter, or a report, and it renders the answer as a highly realistic, handwritten page right inside your conversation.

  • Proper math instead of screenshots using real MathJax rendered by hand.
  • Accurate hand drawn graphs and pie charts. GPT-5.6 computes the data with Python first so they are actually correct.
  • Humanized handwriting. Every repeated letter is drawn a little differently so it reads like a real person wrote it rather than a font.
  • A print ready vector PDF you can download and hand in.

One prompt, under a minute, without ever leaving ChatGPT. We built this for study, revision, and accessibility to help people who learn best by writing.

How we built it

The core engine handles handwritten math, graphs, pagination, and glyph humanization. We built it using Codex and GPT-5.6:

  • An MCP server (OpenAI Apps SDK) exposing a make_handwriting tool.
  • A headless Playwright pipeline that opens the render URL for Aipen, waits for the page to truly finish drawing, and captures per page previews plus a true vector PDF via Chromium's page.pdf().
  • An inline ChatGPT UI card featuring previews, page thumbnails, style controls, and a download button.
  • Cloud Run and private Google Cloud Storage for durable artifacts, complete with per IP rate limits and spoof proof asset origins.

The tool guidance instructs GPT-5.6 to calculate numeric results with Python before rendering. This means graphs and worked answers are based on real values rather than guessed numbers.

Challenges we ran into

We ran into quite a few walls, but each one taught me something valuable:

  • The renderer draws in the browser, so I built a headless render mode and had to make it signal exactly when the ink was really on the paper. My first captures came back totally blank!
  • Math renders asynchronously. The capture kept firing before MathJax finished, leaving grey placeholders behind.
  • A video embed step in the trailer quietly corrupted the audio timeline. Late narration silently vanished until I logged the exact placement times and moved the mix into ffmpeg.

The recurring lesson was simple: measure, do not guess.

Accomplishments that we're proud of

  • It genuinely works end to end and it is fully deployed. A judge can paste one URL into ChatGPT and be using it in under a minute.
  • Real handwritten math, graphs, and pie charts. It is not just a wrapper around a screenshot.
  • A hardened, public ready service rather than just a demo. It features per IP limits, private artifact storage, and single source rendering.
  • We built the entire integration with Codex, taking it from an empty folder all the way to a live Cloud Run service.

What we learned

Codex is genuinely good at diagnosing issues, beyond just writing code. It measured the blank page bug frame by frame instead of guessing and caught a stateless transport issue I would have missed for hours. I learned that the truly hard part of an AI app is getting perfect timing, capture, storage, and concurrency. Because it is built on MCP, the same server that runs in ChatGPT can later run in Claude with almost no extra work.

What's next for Aipen for ChatGPT

  • Account linking and credits so subscribers can upload and use their own handwriting from all around the world. Major European languages are already supported!
  • More templates for letters, flashcards, lab reports, branded stationery and more..
  • Adapting the core MCP for other clients like Claude.
  • Making the whole experience feel totally instant.

Built With

  • chatgtp
  • chromium
  • codex
  • googlecloudrun
  • googlecloudstorage
  • gpt5.6
  • mathjax
  • mcp
  • openaiappskd
  • paged.js
  • playwright
  • typescript
Share this project:

Updates