<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: KinetiNode</title>
    <description>The latest articles on DEV Community by KinetiNode (@kinetinode).</description>
    <link>https://dev.to/kinetinode</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4001741%2Fc46811de-c855-4218-be43-3372920007ce.png</url>
      <title>DEV Community: KinetiNode</title>
      <link>https://dev.to/kinetinode</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/kinetinode"/>
    <language>en</language>
    <item>
      <title>I Used AI as My Coding Partner for a Month. It Was Not What I Expected</title>
      <dc:creator>KinetiNode</dc:creator>
      <pubDate>Tue, 28 Jul 2026 17:17:10 +0000</pubDate>
      <link>https://dev.to/kinetinode/i-used-ai-as-my-coding-partner-for-a-month-it-was-not-what-i-expected-2ko8</link>
      <guid>https://dev.to/kinetinode/i-used-ai-as-my-coding-partner-for-a-month-it-was-not-what-i-expected-2ko8</guid>
      <description>&lt;p&gt;A year ago, the idea of an AI helping me write code felt strange.&lt;/p&gt;

&lt;p&gt;Now, having an AI assistant open while coding feels almost normal.&lt;/p&gt;

&lt;p&gt;But I started wondering:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Am I actually becoming a better developer with AI, or am I just getting faster at writing code I don't fully understand?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;So I changed the way I used AI.&lt;/p&gt;

&lt;p&gt;Instead of treating it like a code generator, I treated it like a coding partner.&lt;/p&gt;

&lt;h2&gt;
  
  
  The first mistake I made
&lt;/h2&gt;

&lt;p&gt;At the beginning, I used AI like this:&lt;/p&gt;

&lt;p&gt;"Write this feature for me."&lt;/p&gt;

&lt;p&gt;And yes, it worked.&lt;/p&gt;

&lt;p&gt;I got code quickly.&lt;/p&gt;

&lt;p&gt;But there was a problem.&lt;/p&gt;

&lt;p&gt;Sometimes I had code that worked, but I couldn't confidently explain why it worked.&lt;/p&gt;

&lt;p&gt;That bothered me.&lt;/p&gt;

&lt;p&gt;Getting an answer is easy.&lt;/p&gt;

&lt;p&gt;Understanding the answer is the real skill.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where AI actually helped me
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Getting unstuck
&lt;/h3&gt;

&lt;p&gt;The biggest benefit was not generating entire projects.&lt;/p&gt;

&lt;p&gt;It was removing small roadblocks.&lt;/p&gt;

&lt;p&gt;Things like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;explaining confusing errors&lt;/li&gt;
&lt;li&gt;suggesting debugging approaches&lt;/li&gt;
&lt;li&gt;helping understand unfamiliar libraries&lt;/li&gt;
&lt;li&gt;pointing out possible mistakes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The annoying 30-minute problem sometimes became a 5-minute problem.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Learning faster
&lt;/h2&gt;

&lt;p&gt;AI is surprisingly good at being a patient teacher.&lt;/p&gt;

&lt;p&gt;Instead of searching through multiple pages, I could ask:&lt;/p&gt;

&lt;p&gt;"Explain this concept like I'm new to it."&lt;/p&gt;

&lt;p&gt;Then:&lt;/p&gt;

&lt;p&gt;"Now explain it at a deeper level."&lt;/p&gt;

&lt;p&gt;Then:&lt;/p&gt;

&lt;p&gt;"Give me an example."&lt;/p&gt;

&lt;p&gt;That feedback loop is genuinely useful.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Reviewing my own code
&lt;/h2&gt;

&lt;p&gt;One of my favourite uses became asking:&lt;/p&gt;

&lt;p&gt;"What problems do you see in this code?"&lt;/p&gt;

&lt;p&gt;Not because AI is always right, but because it makes me look at my code differently.&lt;/p&gt;

&lt;p&gt;Sometimes it catches obvious things I missed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where AI disappointed me
&lt;/h2&gt;

&lt;h3&gt;
  
  
  It is very confident when wrong
&lt;/h3&gt;

&lt;p&gt;This is probably the biggest lesson.&lt;/p&gt;

&lt;p&gt;AI can produce something that looks professional but has subtle issues.&lt;/p&gt;

&lt;p&gt;A developer still needs to know:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;what the code is doing&lt;/li&gt;
&lt;li&gt;what tradeoffs exist&lt;/li&gt;
&lt;li&gt;whether the solution makes sense&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Blindly accepting AI output is dangerous.&lt;/p&gt;

&lt;h2&gt;
  
  
  AI didn't remove the hard parts
&lt;/h2&gt;

&lt;p&gt;Programming is not just typing code.&lt;/p&gt;

&lt;p&gt;The difficult parts are still:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;understanding the problem&lt;/li&gt;
&lt;li&gt;designing a solution&lt;/li&gt;
&lt;li&gt;making decisions&lt;/li&gt;
&lt;li&gt;debugging unexpected behaviour&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;AI helps with implementation.&lt;/p&gt;

&lt;p&gt;It does not replace thinking.&lt;/p&gt;

&lt;h2&gt;
  
  
  What changed in my workflow
&lt;/h2&gt;

&lt;p&gt;I stopped asking:&lt;/p&gt;

&lt;p&gt;"Can AI write this?"&lt;/p&gt;

&lt;p&gt;and started asking:&lt;/p&gt;

&lt;p&gt;"How can AI help me think better?"&lt;/p&gt;

&lt;p&gt;That small change made a huge difference.&lt;/p&gt;

&lt;p&gt;AI is not a replacement for learning programming.&lt;/p&gt;

&lt;p&gt;But it is an incredibly powerful tool for developers who already want to understand what they are doing.&lt;/p&gt;

&lt;p&gt;The best developers won't be the ones who avoid AI.&lt;/p&gt;

&lt;p&gt;They will be the ones who know when to trust it, when to question it, and when to ignore it.&lt;/p&gt;

&lt;p&gt;What has been your experience using AI while coding?&lt;/p&gt;

</description>
      <category>ai</category>
      <category>beginners</category>
      <category>architecture</category>
      <category>learning</category>
    </item>
    <item>
      <title>I got tired of Puppeteer crashing my server, so I built a JSON-to-PDF engine using CSS Grid.</title>
      <dc:creator>KinetiNode</dc:creator>
      <pubDate>Thu, 25 Jun 2026 06:51:26 +0000</pubDate>
      <link>https://dev.to/kinetinode/i-got-tired-of-puppeteer-crashing-my-server-so-i-built-a-json-to-pdf-engine-using-css-grid-568g</link>
      <guid>https://dev.to/kinetinode/i-got-tired-of-puppeteer-crashing-my-server-so-i-built-a-json-to-pdf-engine-using-css-grid-568g</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ft21ygf42fp47bnq7pbij.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ft21ygf42fp47bnq7pbij.png" alt=" " width="439" height="615"&gt;&lt;/a&gt;Generating PDFs programmatically is a rite of passage for backend developers, and it is almost always a miserable experience.&lt;/p&gt;

&lt;p&gt;If you are building a SaaS app, eventually a user is going to want an invoice, a monthly analytics report, or an ID badge. When that ticket hits your desk, you usually have two choices, and they both suck:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;The Headless Browser Nightmare (Puppeteer / Playwright)&lt;br&gt;
You wire up a headless instance of Chrome to screenshot a hidden webpage. Suddenly, your lightweight server needs 500MB of RAM just to boot, cold-starts take 4 seconds, and your Docker container size triples. It is absolute overkill just to print a table and a logo.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The Low-Level PDF Library (pdf-lib)&lt;br&gt;
You decide to skip the browser and use a raw PDF library. But because PDFs are basically digital paper, these libraries don't understand HTML or CSS. You are forced to manually calculate X and Y coordinates for every single line of text.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If a user's name is too long? It doesn't wrap. It just bleeds over your pricing table.&lt;/p&gt;

&lt;p&gt;I was building a reporting dashboard and got so fed up with debugging overlapping text that I decided to build a third option: A modular layout engine that compiles raw JSON into W3C-compliant PDFs.&lt;/p&gt;

&lt;p&gt;Here is how I built it, and how you can use it.&lt;/p&gt;

&lt;p&gt;The Architecture: Lego Blocks for Documents&lt;br&gt;
I realized that 90% of business documents are just combinations of the exact same UI components:&lt;/p&gt;

&lt;p&gt;A massive Header&lt;/p&gt;

&lt;p&gt;A 2-column Metadata Grid (Dates, Invoice #, etc.)&lt;/p&gt;

&lt;p&gt;A Data Table&lt;/p&gt;

&lt;p&gt;A KPI summary&lt;/p&gt;

&lt;p&gt;Instead of writing custom HTML for every new document, I built a routing engine that treats these components as pre-styled modules.&lt;/p&gt;

&lt;p&gt;The engine receives a JSON array of "blocks". It reads the array from top to bottom, matches the block type to a pre-defined CSS template, injects the data, and stacks them together.&lt;/p&gt;

&lt;p&gt;The JSON Payload&lt;br&gt;
Instead of writing this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// The old, painful way&lt;/span&gt;
&lt;span class="nx"&gt;pdfDoc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;drawText&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Total Due: $49.00&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;450&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;y&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;120&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt; 
&lt;span class="c1"&gt;// Pray that the Y coordinate doesn't overlap the row above it...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The engine just takes this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"filename"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"invoice.pdf"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"modular"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"blocks"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"hero_header"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"data"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Invoice #1042"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"subtitle"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Acme Corp"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"invoice_table"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"data"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"items"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"API Subscription"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"qty"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"price"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"49.00"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"total"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"49.00"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"subtotal"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"49.00"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"grand_total"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"49.00"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;How the Rendering Works&lt;br&gt;
To avoid the bloat of Puppeteer, I bypassed browsers entirely. The backend maps the JSON directly into Jinja2 templates.&lt;/p&gt;

&lt;p&gt;Those templates are styled using modern CSS features—including Flexbox and CSS Grid—and then passed through a native compiler (like WeasyPrint).&lt;/p&gt;

&lt;p&gt;Because it uses real CSS, the engine automatically handles the heavy lifting that low-level libraries fail at:&lt;/p&gt;

&lt;p&gt;Dynamic Word Wrapping: If a product description is 4 lines long, the row height expands automatically.&lt;/p&gt;

&lt;p&gt;Page Breaks: Using page-break-inside: avoid, the engine knows exactly when a table is about to spill off the bottom of the page, and cleanly moves that row to the next page instead of cutting it in half.&lt;/p&gt;

&lt;p&gt;Native Vector Charts: I built modules for Bar Charts and Line Graphs that render as raw SVGs, meaning they load in milliseconds and scale infinitely without pixelating.&lt;/p&gt;

&lt;p&gt;Try It Out: The KinetiPDF API&lt;br&gt;
Building the engine was a massive undertaking, but it completely solved my document generation bottlenecks.&lt;/p&gt;

&lt;p&gt;If you are interested in the architecture, I highly recommend trying to build a JSON-router for your own templates! But if you have a deadline on Friday and just want to generate a PDF without fighting with server configs or headless Chrome, I packaged the entire engine into a serverless API.&lt;/p&gt;

&lt;p&gt;It's called KinetiPDF.&lt;/p&gt;

&lt;p&gt;It runs on edge infrastructure, has zero third-party dependencies, and handles all the CSS Flexbox math for you.&lt;/p&gt;

&lt;p&gt;----&amp;gt; &lt;a href="https://rapidapi.com/velocityproductsdigital/api/kineticpdf" rel="noopener noreferrer"&gt;https://rapidapi.com/velocityproductsdigital/api/kineticpdf&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can test out the free tier right now. Let me know what you think of the JSON module approach, or if there are any specific layout blocks (like Gantt charts or Kanban boards) you'd want to see added to the engine!&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>beginners</category>
      <category>api</category>
      <category>html</category>
    </item>
  </channel>
</rss>
