Behind ResumeMD: Building an AI-Paste Markdown Resume Generator and the Bugs That Broke It
An in-depth look at developing a Markdown-to-PDF resume builder, covering Tailwind v4 hurdles, massive font file sizes, and offline-first state synchronization challenges.

Stock photo for illustration only, not from the actual event
- Developer launches ResumeMD, a Markdown-based resume builder tailored for AI-paste workflows.
- Features an offline-first architecture storing data primarily in local browser storage.
- Overcame complex technical hurdles including CSS optimization, multi-language fonts, and PDF rendering.
- Offers a free tier with no watermarks and a $9/month pro tier for advanced automation features.
Over the past three years, job-hunting workflows have shifted dramatically. Many applicants now rely on ChatGPT, Claude, or Gemini to draft resume bullet points, only to spend valuable time manually re-formatting and adjusting font sizes in traditional word processors or drag-and-drop resume builders.
Large Language Models naturally speak Markdown. Asking any chatbot for a resume yields clean, structured Markdown text. Yet, conventional resume software forces users to discard this structure and manually re-enter data into strict form fields.
To solve this frustration, the creator built ResumeMD: a split-pane editor where users paste Markdown on the left, view a typeset preview on the right, select a template, and download a PDF. The tool requires no upfront signup and stores all data locally in the browser by default.
Opting for an offline-first architecture keeps operational server costs near zero for the free tier while giving users complete ownership and privacy over their personal career data.

Stock photo for illustration only, not from the actual event
The synchronization layer presented unique engineering challenges, particularly when Supabase real-time subscriptions captured stale closure values of active Markdown content. Changing templates during an active sync caused false conflict detections, overwriting user states. The solution required implementing React refs and an isSyncingRef guard to manage state updates accurately. Furthermore, race conditions during initial sign-in were resolved by introducing creation-specific guard references to prevent duplicate database entries.
Additional engineering obstacles included Tailwind v4's Lightning CSS optimizer, which aggressively restructured custom CSS rules and generated unintended pseudo-element declarations. Additionally, PDF generation via @react-pdf/renderer required embedding heavy font files—such as a 17-megabyte Noto Sans SC file for Simplified Chinese—prompting the creation of a dedicated Unicode-range script-detection module to support multiple global languages seamlessly.
Source: Dev.to
Found something wrong in this article? Report an issue with this article
Comments
Leave a Comment