<?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: Aditya Raj</title>
    <description>The latest articles on DEV Community by Aditya Raj (@aytidadev).</description>
    <link>https://dev.to/aytidadev</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%2F1205013%2F1510e814-9813-43c1-a2c0-9baa7765c7b6.png</url>
      <title>DEV Community: Aditya Raj</title>
      <link>https://dev.to/aytidadev</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/aytidadev"/>
    <language>en</language>
    <item>
      <title>Why is Linux Lying to you ? Inodes explained</title>
      <dc:creator>Aditya Raj</dc:creator>
      <pubDate>Wed, 30 Sep 2026 12:20:39 +0000</pubDate>
      <link>https://dev.to/aytidadev/why-is-linux-lying-to-you-inodes-explained-18m0</link>
      <guid>https://dev.to/aytidadev/why-is-linux-lying-to-you-inodes-explained-18m0</guid>
      <description>&lt;h1&gt;
  
  
  No space left on device, but df says the disk is 1% full
&lt;/h1&gt;

&lt;p&gt;I hit this on a box with 56 MB free and a filesystem that refused to create an empty file.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;df&lt;/span&gt; &lt;span class="nt"&gt;-h&lt;/span&gt; /mnt/demo
Filesystem  Size  Used Avail Use%
/dev/loop0   60M   24K   56M   1%

&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;touch &lt;/span&gt;index.js
&lt;span class="nb"&gt;touch&lt;/span&gt;: cannot &lt;span class="nb"&gt;touch&lt;/span&gt; &lt;span class="s1"&gt;'index.js'&lt;/span&gt;: No space left on device
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The disk is almost empty. The error says it is full. Both are true, because they are talking about different things.&lt;/p&gt;

&lt;h2&gt;
  
  
  Reproduce it in thirty seconds
&lt;/h2&gt;

&lt;p&gt;You don't need a broken server. Make a tiny filesystem with a tiny inode table:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;dd &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/dev/zero &lt;span class="nv"&gt;of&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/tmp/tiny.img &lt;span class="nv"&gt;bs&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1M &lt;span class="nv"&gt;count&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;64
mkfs.ext4 &lt;span class="nt"&gt;-N&lt;/span&gt; 128 &lt;span class="nt"&gt;-F&lt;/span&gt; /tmp/tiny.img
&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; /mnt/demo
mount &lt;span class="nt"&gt;-o&lt;/span&gt; loop /tmp/tiny.img /mnt/demo

&lt;span class="k"&gt;for &lt;/span&gt;i &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;seq &lt;/span&gt;1 128&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do &lt;/span&gt;&lt;span class="nb"&gt;touch&lt;/span&gt; /mnt/demo/&lt;span class="nv"&gt;$i&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;done

&lt;/span&gt;&lt;span class="nb"&gt;touch&lt;/span&gt; /mnt/demo/newfile     &lt;span class="c"&gt;# No space left on device&lt;/span&gt;
&lt;span class="nb"&gt;df&lt;/span&gt; &lt;span class="nt"&gt;-h&lt;/span&gt; /mnt/demo             &lt;span class="c"&gt;# 56M free&lt;/span&gt;
&lt;span class="nb"&gt;df&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; /mnt/demo             &lt;span class="c"&gt;# IUse 100%&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;-N 128&lt;/code&gt; is the whole trick. It tells &lt;code&gt;mkfs.ext4&lt;/code&gt; to build an inode table with room for 128 inodes and nothing more, ever.&lt;/p&gt;

&lt;h2&gt;
  
  
  What an inode actually is
&lt;/h2&gt;

&lt;p&gt;A file on Linux is three separate things.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;inode&lt;/strong&gt; is a record holding the metadata: permissions, owner, timestamps, size, and pointers to where the data lives. The &lt;strong&gt;data blocks&lt;/strong&gt; hold the contents. And the &lt;strong&gt;directory entry&lt;/strong&gt; holds the name.&lt;/p&gt;

&lt;p&gt;That last one surprises people. The filename is not in the inode. A directory is a list that maps names to inode numbers, and that is the only place a name exists.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ ls -li
12 -rw-r--r-- 1 eradon eradon 4232 notes.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That leading &lt;code&gt;12&lt;/code&gt; is the inode number. The name &lt;code&gt;notes.txt&lt;/code&gt; is just an entry in the directory pointing at inode 12.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why moving a huge file is instant
&lt;/h2&gt;

&lt;p&gt;Once names and inodes are separate, &lt;code&gt;mv&lt;/code&gt; inside one filesystem makes sense. It doesn't move data. It removes one directory entry and creates another pointing at the same inode. A 40 GB file "moves" in a millisecond because nothing moves.&lt;/p&gt;

&lt;p&gt;Across filesystems it's a real copy, because the inode number means nothing over there.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why ext4 runs out
&lt;/h2&gt;

&lt;p&gt;On ext4 the inode table is built when the filesystem is created, sized from a bytes-per-inode ratio, and it never grows. You can't add inodes later. There is no command for it.&lt;/p&gt;

&lt;p&gt;Every file costs exactly one inode, regardless of size. A 4 GB video costs one. An empty file costs one. So a filesystem full of tiny files runs out of inodes long before it runs out of space — logs, cache entries, session files, mail queues, &lt;code&gt;node_modules&lt;/code&gt;. None of them are big. All of them cost an inode.&lt;/p&gt;

&lt;p&gt;That's the whole bug. The disk had 56 MB free and zero inodes, and &lt;code&gt;touch&lt;/code&gt; needs an inode.&lt;/p&gt;

&lt;h2&gt;
  
  
  Recovering from it
&lt;/h2&gt;

&lt;p&gt;Your options on ext4 are thin:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;delete files you don't need, which frees inodes immediately&lt;/li&gt;
&lt;li&gt;move a directory tree to another filesystem&lt;/li&gt;
&lt;li&gt;create a new filesystem with a bigger inode count and mount it&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;resize2fs&lt;/code&gt; grows the filesystem, not the inode table. &lt;code&gt;tune2fs -l&lt;/code&gt; will show you the count but won't change it.&lt;/p&gt;

&lt;p&gt;XFS behaves differently — it allocates inodes dynamically, so it doesn't have a fixed ceiling in the same way. If you know a filesystem will hold millions of small files, that's a real argument for XFS, or for passing a much lower bytes-per-inode value at &lt;code&gt;mkfs&lt;/code&gt; time.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hard links: many names, one inode
&lt;/h2&gt;

&lt;p&gt;If names and inodes are separate, nothing stops two names pointing at the same inode. That's a hard link.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;ln &lt;/span&gt;notes.txt backup.txt
&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-li&lt;/span&gt; notes.txt backup.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Both show the same inode number, and the link count goes to 2. There's no original and no copy — the two names are equal, and the data exists once.&lt;/p&gt;

&lt;p&gt;Two consequences follow:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hard links can't cross filesystems.&lt;/strong&gt; An inode number only means something within its own filesystem, so &lt;code&gt;ln&lt;/code&gt; across a mount point gives you &lt;code&gt;Invalid cross-device link&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A hard link needs no new inode.&lt;/strong&gt; On our full filesystem, &lt;code&gt;touch&lt;/code&gt; fails but this works:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;ln&lt;/span&gt; /mnt/demo/1 /mnt/demo/another-name    &lt;span class="c"&gt;# fine&lt;/span&gt;
&lt;span class="nb"&gt;ln&lt;/span&gt; &lt;span class="nt"&gt;-s&lt;/span&gt; /mnt/demo/1 /mnt/demo/softlink     &lt;span class="c"&gt;# No space left on device&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A hard link adds a name to a directory. A symlink is a new file, so it needs an inode, so it fails. That one line is the clearest demonstration of the difference I know.&lt;/p&gt;

&lt;h2&gt;
  
  
  What rm actually does
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;rm&lt;/code&gt; doesn't delete a file. It removes a directory entry and decrements the link count. The syscall is even called &lt;code&gt;unlink&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The inode and its data survive while the link count is above zero. Only when the count hits zero &lt;strong&gt;and&lt;/strong&gt; no process holds the file open does the kernel reclaim the inode and the blocks.&lt;/p&gt;

&lt;p&gt;That second condition is the other classic "disk is full" mystery: delete a 40 GB log that nginx still has open, and &lt;code&gt;du&lt;/code&gt; says the space is gone while &lt;code&gt;df&lt;/code&gt; says it's still used. The space comes back when the process closes the descriptor, or you restart it. &lt;code&gt;lsof +L1&lt;/code&gt; lists these.&lt;/p&gt;

&lt;h2&gt;
  
  
  Symlinks
&lt;/h2&gt;

&lt;p&gt;A symlink is a file whose contents are a path. It gets its own inode, and that inode holds text like &lt;code&gt;/home/eradon/notes.txt&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Because it stores a path rather than an inode number, it can point anywhere, including another filesystem. Resolution costs an extra lookup: you hit the symlink's inode, the kernel reads the path out of it, and then resolves that path normally.&lt;/p&gt;

&lt;p&gt;Permissions work differently between the two. Hard links all share one inode, so they share its permission bits — &lt;code&gt;chmod&lt;/code&gt; through any name affects all of them. A symlink has its own inode and its own bits, but they're ignored: the kernel checks the &lt;strong&gt;target's&lt;/strong&gt; permissions. A symlink never grants access you don't already have.&lt;/p&gt;

&lt;h2&gt;
  
  
  "Everything is a file", so did we break everything?
&lt;/h2&gt;

&lt;p&gt;If files need inodes and inodes ran out, can the machine still fork a process or read &lt;code&gt;/proc&lt;/code&gt;?&lt;/p&gt;

&lt;p&gt;Yes, because there are two different things called an inode.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;On-disk inodes&lt;/strong&gt; belong to a filesystem like ext4. They live in that fixed table. They're what we exhausted.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;VFS inodes&lt;/strong&gt; are &lt;code&gt;struct inode&lt;/code&gt; objects in kernel memory. The VFS is the layer that makes everything look like a file, and not everything behind it is on a disk. &lt;code&gt;/proc&lt;/code&gt; and &lt;code&gt;/sys&lt;/code&gt; are synthesised by the kernel when you look at them:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ stat -c '%i %n' /proc/self/status
4026532042 /proc/self/status

$ df -i /proc
Filesystem  Inodes IUsed IFree IUse%
proc             0     0     0     -
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It has an inode number, but procfs has no table and nothing to run out of. Exhausting ext4's inodes exhausts &lt;em&gt;that filesystem&lt;/em&gt;, not some global pool.&lt;/p&gt;

&lt;p&gt;A rule of thumb that gets you most of the way: if you can hold a file descriptor to it, it has an inode — sockets, pipes, epoll, timerfd, &lt;code&gt;/proc&lt;/code&gt; entries. There are exceptions, but not many.&lt;/p&gt;

&lt;h2&gt;
  
  
  What to actually monitor
&lt;/h2&gt;

&lt;p&gt;Most monitoring watches disk space and stops there. Add inodes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;df&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt;                          &lt;span class="c"&gt;# inode usage per mount&lt;/span&gt;
&lt;span class="nb"&gt;du&lt;/span&gt; &lt;span class="nt"&gt;--inodes&lt;/span&gt; &lt;span class="nt"&gt;-x&lt;/span&gt; &lt;span class="nt"&gt;-d1&lt;/span&gt; /var        &lt;span class="c"&gt;# which directory is eating them&lt;/span&gt;
find /var/spool &lt;span class="nt"&gt;-xdev&lt;/span&gt; | &lt;span class="nb"&gt;wc&lt;/span&gt; &lt;span class="nt"&gt;-l&lt;/span&gt;  &lt;span class="c"&gt;# count in a suspect tree&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Alert on &lt;code&gt;df -i&lt;/code&gt; the same way you alert on &lt;code&gt;df -h&lt;/code&gt;. In production the things that generate millions of tiny files are exactly the things nobody watches: log directories without rotation, cache trees, session stores, CI workspaces.&lt;/p&gt;

&lt;p&gt;And in containers, remember overlayfs draws on the host filesystem's inodes. One runaway container can starve the host.&lt;/p&gt;

&lt;h2&gt;
  
  
  The takeaway
&lt;/h2&gt;

&lt;p&gt;Free space and a usable filesystem are not the same thing. When writes fail and &lt;code&gt;df -h&lt;/code&gt; looks fine, check &lt;code&gt;df -i&lt;/code&gt; before anything else.&lt;/p&gt;




</description>
      <category>linux</category>
      <category>filesystem</category>
      <category>docker</category>
    </item>
    <item>
      <title>The Linux process that even SIGKILL can't kill</title>
      <dc:creator>Aditya Raj</dc:creator>
      <pubDate>Tue, 22 Sep 2026 05:28:04 +0000</pubDate>
      <link>https://dev.to/aytidadev/the-linux-process-that-even-sigkill-cant-kill-418d</link>
      <guid>https://dev.to/aytidadev/the-linux-process-that-even-sigkill-cant-kill-418d</guid>
      <description>&lt;p&gt;The short version, for anyone who'd rather read it:&lt;/p&gt;

&lt;p&gt;When a process exits, the kernel frees basically everything: address space, file descriptors, and it never schedules the task again. What stays is a small record — the PID, the exit status, and some CPU accounting — because the parent may still want to read it. That record is the zombie. SIGKILL does nothing to it because there's nothing left to kill; the kill(2) call even returns success.&lt;/p&gt;

&lt;p&gt;It's removed when the parent calls wait(). If the parent dies first, the children are reparented to the nearest ancestor marked as a subreaper (PR_SET_CHILD_SUBREAPER), and failing that to PID 1 of that PID namespace. The walk stops at the namespace boundary, so a process in a container is never adopted by anything on the host.&lt;/p&gt;

&lt;p&gt;The part that bites in production: in a container your application is PID 1, which makes it the reaper for everything inside. Plenty of apps never call wait() on processes they didn't spawn directly, so orphans accumulate as zombies until the pids cgroup limit is hit and nothing can fork. Fixes are tini / &lt;code&gt;docker run --init&lt;/code&gt;, &lt;code&gt;initProcessEnabled&lt;/code&gt; on ECS, or &lt;code&gt;shareProcessNamespace&lt;/code&gt; on k8s so the pause container does the reaping.&lt;/p&gt;

</description>
      <category>linux</category>
      <category>containers</category>
      <category>docker</category>
    </item>
    <item>
      <title>Simplify PDF Generation in Node.js with html-to-pdf-pup</title>
      <dc:creator>Aditya Raj</dc:creator>
      <pubDate>Sun, 05 May 2024 18:02:10 +0000</pubDate>
      <link>https://dev.to/aytidadev/simplify-pdf-generation-in-nodejs-with-html-to-pdf-pup-4mep</link>
      <guid>https://dev.to/aytidadev/simplify-pdf-generation-in-nodejs-with-html-to-pdf-pup-4mep</guid>
      <description>&lt;p&gt;&lt;a href="https://nodei.co/npm/html-to-pdf-pup/" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fnodei.co%2Fnpm%2Fhtml-to-pdf-pup.png" alt="NPM"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Introduction:
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;I have created a new npm package &lt;code&gt;html-to-pdf-pup&lt;/code&gt;, a powerful Node.js package designed to simplify the PDF generation process. In this article, we'll explore how &lt;code&gt;html-to-pdf-pup&lt;/code&gt; works, its features, installation process, usage scenarios, and how its optimized.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  What is &lt;code&gt;html-to-pdf-pup&lt;/code&gt;?
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;It is a Node.js package that enables developers to convert HTML and CSS content into PDF documents seamlessly. Built on top of Puppeteer, a headless Chrome browser API, &lt;code&gt;html-to-pdf-pup&lt;/code&gt; offers a scalable, event-driven system for generating PDFs efficiently.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Features:
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Highly scalable event-driven system.&lt;/li&gt;
&lt;li&gt;Asynchronously convert multiple HTML files to PDF using multiple tabs or a single tab for queue PDF generation.&lt;/li&gt;
&lt;li&gt;Message queue system for managing the conversion process.&lt;/li&gt;
&lt;li&gt;Simple and easy-to-use API suitable for beginners.&lt;/li&gt;
&lt;li&gt;Configurable options for advanced users.&lt;/li&gt;
&lt;li&gt;Full control over the conversion process and PDF options.&lt;/li&gt;
&lt;li&gt;Returns PDF buffer for further processing.&lt;/li&gt;
&lt;li&gt;Dynamic height for PDFs by default.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Optimizations techniques used:
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;html-to-pdf-pup&lt;/code&gt; employs several optimization techniques to enhance performance and resource management:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Message Queue System&lt;/strong&gt;: Utilizes a message queue system to manage the conversion process efficiently, ensuring smooth operation even with multiple conversion requests.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Single Browser Instance&lt;/strong&gt;: Maintains only a single browser instance regardless of the number of conversion requests, reducing resource overhead.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Concurrent Tab Conversion&lt;/strong&gt;: Opens multiple tabs for concurrent PDF conversion, maximizing throughput and minimizing processing time.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Tab Recycling&lt;/strong&gt;: Once a tab completes PDF conversion, it immediately starts processing another request, optimizing tab utilization and reducing idle time.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Integration of Max Tab System&lt;/strong&gt;: Integrates the maximum tab system with a single browser instance for better resource management, balancing performance and resource consumption effectively.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Why choose this package over the others:-
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Light weight:&lt;/strong&gt; &lt;code&gt;html-to-pdf-pup&lt;/code&gt; is very light with only 17kb as unpacked size in the npm package.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Fully configurable:&lt;/strong&gt; Unlike other packages &lt;code&gt;html-to-pdf-pup&lt;/code&gt; is gives full control to the user with its many configurable options and also a dev mode.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Highly optimized for pdf creation:&lt;/strong&gt; &lt;code&gt;html-to-pdf-pup&lt;/code&gt; comes highly optimized out of the box. it has been tested to use minimal memory and resources of server. it gets these optimizations from features such as single browser instance , Tab recycling , zero resource comsumption in downtime,etc.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Scalablity:&lt;/strong&gt; The main selling point of &lt;code&gt;html-to-pdf-pup&lt;/code&gt; is its scalablity , here users can control how many concurrent request it can handle according to their available resources . handeling many request once can lead to faster performance but can also use more resources.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;here , user can find their sweet spot according to their needs.&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Open source and Documentation:&lt;/strong&gt;&lt;code&gt;html-to-pdf-pup&lt;/code&gt; is an open-source project with active development and maintenance. It benefits from contributions from developers worldwide, ensuring continuous improvement, updates, and enhancements. By using &lt;code&gt;html-to-pdf-pup&lt;/code&gt;, you contribute to and benefit from the vibrant open-source ecosystem.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Installation:
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;To install &lt;code&gt;html-to-pdf-pup&lt;/code&gt;, simply run the following command in your Node.js project directory:&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm i html-to-pdf-pup

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Basic Usage:
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;Using &lt;code&gt;html-to-pdf-pup&lt;/code&gt; is straightforward. Here's a basic example demonstrating how to convert HTML content to a PDF:&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;create_pdf&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;html-to-pdf-pup&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;htmlData&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;&amp;lt;html&amp;gt;&amp;lt;body&amp;gt;&amp;lt;h1&amp;gt;Hello World&amp;lt;/h1&amp;gt;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nf"&gt;create_pdf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;htmlData&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;pdfBuffer&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;pdfBuffer&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;})&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;catch&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Config Mode:
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;For advanced users, &lt;code&gt;html-to-pdf-pup&lt;/code&gt; offers a config mode to customize Puppeteer , PDF configurations and also a DEV mode:&lt;/p&gt;

&lt;p&gt;For more info refer :- &lt;a href="https://www.npmjs.com/package/html-to-pdf-pup" rel="noopener noreferrer"&gt;npm&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Conclusion:
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;html-to-pdf-pup&lt;/code&gt; simplifies the process of converting HTML and CSS content to PDF documents in Node.js. With its powerful features and optimization techniques, including scalability, asynchronous conversion, and configurable options, developers can efficiently generate PDFs for various use cases. Whether you're a beginner or an experienced developer, &lt;code&gt;html-to-pdf-pup&lt;/code&gt; provides a seamless solution for your PDF generation needs in Node.js. Try it out in your next project and experience the convenience it offers!&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>node</category>
      <category>puppeteer</category>
      <category>npm</category>
      <category>systemdesign</category>
    </item>
    <item>
      <title>Finally added the hacktober badges to github readme.md 😅️</title>
      <dc:creator>Aditya Raj</dc:creator>
      <pubDate>Wed, 08 Nov 2023 11:51:16 +0000</pubDate>
      <link>https://dev.to/aytidadev/finally-added-the-hacktober-badges-to-github-readmemd-10hg</link>
      <guid>https://dev.to/aytidadev/finally-added-the-hacktober-badges-to-github-readmemd-10hg</guid>
      <description>&lt;p&gt;&lt;a href="https://github.com/Aytida-dev"&gt;My github&lt;/a&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--jj0NiFhm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/q00iwnc5xlzomr2rby56.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--jj0NiFhm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/q00iwnc5xlzomr2rby56.png" alt="Profile" width="800" height="439"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Finally added the hacktober badges to github readme.md 😅️</title>
      <dc:creator>Aditya Raj</dc:creator>
      <pubDate>Wed, 08 Nov 2023 11:51:09 +0000</pubDate>
      <link>https://dev.to/aytidadev/finally-added-the-hacktober-badges-to-github-readmemd-5ch9</link>
      <guid>https://dev.to/aytidadev/finally-added-the-hacktober-badges-to-github-readmemd-5ch9</guid>
      <description>&lt;p&gt;&lt;a href="https://github.com/Aytida-dev"&gt;My github&lt;/a&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--jj0NiFhm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/q00iwnc5xlzomr2rby56.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--jj0NiFhm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/q00iwnc5xlzomr2rby56.png" alt="Profile" width="800" height="439"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
