<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Building ApiJolt]]></title><description><![CDATA[Building ApiJolt]]></description><link>https://apijolt.hashnode.dev</link><image><url>https://cdn.hashnode.com/uploads/logos/69f668480ab374db993c3e34/9370f38d-8d04-4222-89e1-19a69c40fe66.png</url><title>Building ApiJolt</title><link>https://apijolt.hashnode.dev</link></image><generator>RSS for Node</generator><lastBuildDate>Wed, 16 Sep 2026 15:06:22 GMT</lastBuildDate><atom:link href="https://apijolt.hashnode.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Why I built my own PDF generation API (and how you can avoid my mistakes)]]></title><description><![CDATA[Every developer has a "PDF horror story." Mine involved a production server crashing at 3 AM because a headless Chrome instance decided to eat 4GB of RAM for a single invoice.
After years of fighting ]]></description><link>https://apijolt.hashnode.dev/why-i-built-my-own-pdf-generation-api-and-how-you-can-avoid-my-mistakes</link><guid isPermaLink="true">https://apijolt.hashnode.dev/why-i-built-my-own-pdf-generation-api-and-how-you-can-avoid-my-mistakes</guid><category><![CDATA[PDF generation]]></category><category><![CDATA[pdf]]></category><category><![CDATA[pdf library]]></category><category><![CDATA[api]]></category><category><![CDATA[PDF Generation]]></category><category><![CDATA[Pdfgenerator]]></category><category><![CDATA[PDF Conversion]]></category><category><![CDATA[Document Processing]]></category><category><![CDATA[Document Conversion API]]></category><category><![CDATA[Document Conversion ]]></category><category><![CDATA[image to pdf converter]]></category><category><![CDATA[markdown to PDF]]></category><dc:creator><![CDATA[Gábor Liktor]]></dc:creator><pubDate>Tue, 05 May 2026 12:52:59 GMT</pubDate><content:encoded><![CDATA[<hr />
<p>Every developer has a "PDF horror story." Mine involved a production server crashing at 3 AM because a headless Chrome instance decided to eat 4GB of RAM for a single invoice.</p>
<p>After years of fighting wkhtmltopdf, Puppeteer, and complex credit-based APIs with expiring balances, I decided to build a solution that actually respects developers. This is the story of why I built APIJolt and the technical hurdles I hit along the way.</p>
<h2>The Problem: The "Infrastructure Tax"</h2>
<p>Generating a PDF looks simple on paper, but in production, you quickly hit what I call the "infrastructure tax." You end up spending more time managing the PDF engine than building your actual product.</p>
<h3>1. wkhtmltopdf: The Aging Classic</h3>
<p>It’s a time capsule from 2012. It’s simple to install, but the moment your designer wants Flexbox or CSS Grid, you're in trouble. It’s unmaintained, and trying to hack modern layouts into it is a waste of your life.</p>
<h3>2. Puppeteer / Playwright: The Memory Hog</h3>
<p>This is the modern standard, and it's what I use under the hood for HTML-to-PDF. But self-hosting it is a nightmare. Chrome needs specific Docker flags, heavy base images, and constant version pinning. If you don't manage your browser pool perfectly, you'll hit OOM (Out Of Memory) errors during every traffic spike.</p>
<h3>3. LibreOffice Headless: The Office Specialist</h3>
<p>For DOCX or XLSX to PDF, this is the only reliable path. But it’s heavy, requires a display server (like Xvfb), and has a painfully slow cold start. It’s powerful software, but it’s not meant to be a lightweight microservice.</p>
<h2>Building in Public: What's under the hood of APIJolt</h2>
<p>I didn't want to build just another wrapper. I wanted to build the infrastructure I wish I had 5 years ago. For <strong>APIJolt</strong>, I focused on three main pillars:</p>
<ul>
<li><p><strong>Hardened Sandboxing</strong>: Each request runs in an isolated environment to prevent SSRF (Server-Side Request Forgery) or local file access.</p>
</li>
<li><p><strong>Flat Pricing</strong>: I hate credit systems. APIJolt uses flat monthly pricing with a hard cap. You know exactly what you're paying, and your balance never "expires."</p>
</li>
<li><p><strong>Full Format Support</strong>: One API for everything — HTML, URL, Word, Excel, PowerPoint, and even auto-detecting formats.</p>
</li>
</ul>
<h2>The Developer Experience</h2>
<p>I wanted the integration to be a 5-minute task. Here is how you convert an HTML string to a PDF:</p>
<pre><code class="language-bash">curl -X POST https://apijolt.com \
  -H "Authorization: Bearer aj_live_xxxx" \
  -H "Content-Type: application/json" \
  -d '{"html": "&lt;h1&gt;Invoice #1042&lt;/h1&gt;&lt;p&gt;Due: $240.00&lt;/p&gt;"}'
</code></pre>
<p>And for Word documents:</p>
<pre><code class="language-bash">curl -X POST https://apijolt.com \
  -F "file=@contract.docx" \
  -H "Authorization: Bearer aj_live_xxxx"
</code></pre>
<h2>Why I'm launching this now</h2>
<p>APIJolt is currently in beta. I’ve built the core engine, and now I’m looking for fellow developers and indie hackers to stress-test it and tell me what’s missing.</p>
<p>The <strong>Free Tier is 1,000 conversions/month</strong> — no watermarks, no credit card required, and no expiring "trial credits."</p>
<h2>I need your feedback!</h2>
<p>I’m building this for <strong>you</strong>. Please help me prioritize the roadmap (S3 uploads? Json templates?):</p>
<p>👉 <a href="https://tally.so/r/xX9Qdr?source=hashnode"><strong>Take the 90-second Roadmap Survey</strong></a></p>
<p>Check it out at: <a href="https://apijolt.com">apijolt.com</a></p>
]]></content:encoded></item></channel></rss>