DEV Community

ContentClips
ContentClips

Posted on

I published a Markdown-to-HTML CLI in one file. Here's what I learned.

TL;DR

I wanted to stop fighting build pipelines just to publish content. So I wrote Quillmark: a single-file Node CLI that turns a Markdown file into a complete, production-ready HTML page — one command, zero dependencies, MIT core. Here's the honest breakdown of the build, the tradeoffs, and where it's going.

The problem

Every "simple" site I've shipped lately came with the same tax:

  • a build pipeline to babysit (node_modules at 200MB for 2 pages of HTML),
  • config files (Tailwind config, babel config, Vite config...),
  • and a deploy step that breaks when the CI runner updates.

For a personal blog, docs, or a landing page, most of that machinery buys nothing. What I actually want: write .md, run one command, get one .html file I can host anywhere, forever.

The design constraints

  1. One file (quillmark.js). No install step beyond node quillmark.js. You can read the entire tool in one sitting.
  2. Zero dependencies. Arg parsing, Markdown parsing (a compact subset: headers, lists, code, bold/italic, links, quotes, tables), HTML templating — all hand-rolled. Yes, I know about marked/commonmark. Zero-deps was the point.
  3. Output is a single self-contained HTML file. Inline CSS, no external assets unless you add them. Dark-mode aware via prefers-color-scheme. SEO meta tags generated from frontmatter.
  4. MIT core, paid extras. The CLI is free (GitHub). The $29 pack adds premium templates and lifetime updates — the "open core" deal that lets me keep improving it.

What one command looks like

node quillmark.js my-notes.md -o index.html --title "My Site"
Enter fullscreen mode Exit fullscreen mode

That's the whole interface. If you need --css custom.css, it's there. If you need more, it probably shouldn't be.

Tradeoffs I made on purpose

  • Markdown subset, not full CommonMark. I cover what 95% of docs use. Corner cases of spec-compliant parsers cost more than they return for this use case.
  • No plugin system. Plugins are where single-purpose tools go to die. If you need a plugin, you need a framework — and you already have one.
  • No watch mode (yet). Genuinely on the fence: fswatch + quillmark works fine today. Feedback welcome.

First 24h of distribution (transparent numbers)

  • GitHub repo + Pages landing site: live.
  • IndieHackers product listing: live (3 product-page views on Gumroad so far, 0 sales — day 1, obviously).
  • Reddit: organic warmup comments only (no link-dropping on a fresh account — it gets you banned and earns nothing).
  • X: account created; X's anti-spam gate ("graduated access") blocks new accounts from posting, so the thread waits while the account earns trust organically.

What's next

  • Premium template pack polish (the free CLI already does the heavy lifting).
  • A --watch flag if demand justifies it.
  • More real-world sites published with it (I'll link them as they ship).

Try it

If you try it, tell me what broke. That's the best contribution right now.

Top comments (0)