<?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: Eli Payano</title>
    <description>The latest articles on DEV Community by Eli Payano (@eli7pm).</description>
    <link>https://dev.to/eli7pm</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3870462%2Fb63b77a0-a368-42c8-8e94-2f8758031dfd.jpg</url>
      <title>DEV Community: Eli Payano</title>
      <link>https://dev.to/eli7pm</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/eli7pm"/>
    <language>en</language>
    <item>
      <title>My first post! I'm kinda excited</title>
      <dc:creator>Eli Payano</dc:creator>
      <pubDate>Fri, 22 May 2026 15:39:05 +0000</pubDate>
      <link>https://dev.to/eli7pm/my-first-post-im-kinda-excited-3ja6</link>
      <guid>https://dev.to/eli7pm/my-first-post-im-kinda-excited-3ja6</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/eli7pm/invoice-purgatory-how-i-escaped-the-monthly-click-fest-by-building-my-own-invoicing-tool-4i1b" class="crayons-story__hidden-navigation-link"&gt;Invoice Purgatory: How I escaped the monthly click-fest by building my own invoicing tool&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/eli7pm" class="crayons-avatar  crayons-avatar--l  "&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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3870462%2Fb63b77a0-a368-42c8-8e94-2f8758031dfd.jpg" alt="eli7pm profile" class="crayons-avatar__image" width="96" height="96"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/eli7pm" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Eli Payano
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Eli Payano
                
              
              &lt;div id="story-author-preview-content-3720469" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/eli7pm" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3870462%2Fb63b77a0-a368-42c8-8e94-2f8758031dfd.jpg" class="crayons-avatar__image" alt="" width="96" height="96"&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Eli Payano&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/eli7pm/invoice-purgatory-how-i-escaped-the-monthly-click-fest-by-building-my-own-invoicing-tool-4i1b" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;May 21&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/eli7pm/invoice-purgatory-how-i-escaped-the-monthly-click-fest-by-building-my-own-invoicing-tool-4i1b" id="article-link-3720469"&gt;
          Invoice Purgatory: How I escaped the monthly click-fest by building my own invoicing tool
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/javascript"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;javascript&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/tooling"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;tooling&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/invoice"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;invoice&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/productivity"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;productivity&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/eli7pm/invoice-purgatory-how-i-escaped-the-monthly-click-fest-by-building-my-own-invoicing-tool-4i1b" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;4&lt;span class="hidden s:inline"&gt;&amp;nbsp;reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/eli7pm/invoice-purgatory-how-i-escaped-the-monthly-click-fest-by-building-my-own-invoicing-tool-4i1b#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              &lt;span class="hidden s:inline"&gt;Add&amp;nbsp;Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            3 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
      <category>automation</category>
      <category>productivity</category>
      <category>showdev</category>
      <category>sideprojects</category>
    </item>
    <item>
      <title>Invoice Purgatory: How I escaped the monthly click-fest by building my own invoicing tool</title>
      <dc:creator>Eli Payano</dc:creator>
      <pubDate>Thu, 21 May 2026 22:10:47 +0000</pubDate>
      <link>https://dev.to/eli7pm/invoice-purgatory-how-i-escaped-the-monthly-click-fest-by-building-my-own-invoicing-tool-4i1b</link>
      <guid>https://dev.to/eli7pm/invoice-purgatory-how-i-escaped-the-monthly-click-fest-by-building-my-own-invoicing-tool-4i1b</guid>
      <description>&lt;p&gt;Every month, same ritual. Open the browser, navigate to the invoice generator, update the date, bump the invoice number, change the line item description, download the PDF, open my email, attach it, send it.&lt;/p&gt;

&lt;p&gt;It's maybe five minutes. But it's five minutes of pure purgatory.&lt;/p&gt;

&lt;p&gt;So I built my own. And I kind of love it.&lt;/p&gt;

&lt;h2&gt;
  
  
  A little context
&lt;/h2&gt;

&lt;p&gt;I'm a Senior Support Engineer; I'm not a full-blown developer, but I know how to build things — and there's always the good ol' Claude Code to help me ship faster. This project started as a weekend idea and turned into something I actually use every month.&lt;/p&gt;

&lt;h2&gt;
  
  
  My first instinct
&lt;/h2&gt;

&lt;p&gt;My first instinct was to just replicate the online invoice generator — a clean web UI where I could fill in the details, hit a button, and get a PDF in my inbox. Full control over the template, no third-party tool, no clicking through the same form every month.&lt;/p&gt;

&lt;p&gt;And I built that. It works great. It remembers everything I've ever typed into it, has a light/dark theme, validates the recipient email, and sends the PDF directly to finance with one click.&lt;/p&gt;

&lt;p&gt;But halfway through I realized — I live in the terminal. Why am I opening a browser every month to fill out a form when I could just type &lt;code&gt;invoicer&lt;/code&gt; and answer three prompts?&lt;/p&gt;

&lt;p&gt;So the CLI became the real deliverable.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I actually use
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;invoicer
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;  invoicer CLI

? Invoice number: 5
? Month: May 2026
? Amount (USD): 1000000000 USD
? From: Eli Payano
? Bill to: Company XYZ
? Bank account: BANK USD
? Send to: finance@company.com
? Send via email? Yes

  Generating PDF...
  Sending email...

  ✓ Invoice sent to finance@company.com
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it. The month defaults to the current month. The due date is automatically set to the last day of that month. My sender details, client details, and bank accounts are all saved in an &lt;code&gt;invoice.config.json&lt;/code&gt; — I pick them from a list with arrow keys. The only things I ever change are the invoice number, the month, and the amount.&lt;/p&gt;

&lt;p&gt;From zero to sent in about 5 seconds.&lt;/p&gt;

&lt;h2&gt;
  
  
  How it works
&lt;/h2&gt;

&lt;p&gt;The stack is a pnpm monorepo with four packages:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;web&lt;/code&gt; — React + Vite invoice UI&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;api&lt;/code&gt; — Express backend&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;cli&lt;/code&gt; — the CLI tool&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;shared&lt;/code&gt; — the HTML template, PDF generation, and email sending&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The &lt;code&gt;shared&lt;/code&gt; package is my favorite part. The HTML invoice template lives there once and is used by both the web app and the CLI. Puppeteer converts it to a PDF, Resend delivers it. Change the template in one place, everything updates.&lt;/p&gt;

&lt;p&gt;For PDF generation I went with Puppeteer over something like jsPDF because it renders HTML exactly like a browser would — fonts, layout, everything. The output looks exactly like the web UI preview.&lt;/p&gt;

&lt;p&gt;For email I went with Resend over Gmail + Nodemailer because the developer experience is just better. One API key, done. No App Passwords, no OAuth, no wrestling with Google's security settings.&lt;/p&gt;

&lt;p&gt;The web UI uses IndexedDB instead of localStorage for caching the draft — more storage, async API, survives browser storage pressure. Every keystroke is saved automatically so I never lose a half-filled invoice.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I love about it
&lt;/h2&gt;

&lt;p&gt;I own the whole thing. The template is mine. The PDF looks exactly how I want it to look. There's no "upgrade to Pro to remove the watermark." There's no terms of service change that breaks my workflow. It runs locally, it's fast, and it does exactly one thing well.&lt;/p&gt;

&lt;p&gt;And honestly — the fact that I can type &lt;code&gt;invoicer&lt;/code&gt; from anywhere on my machine and have an invoice in someone's inbox less than 5 seconds later still makes me happy every time.&lt;/p&gt;

&lt;p&gt;If you're the kind of person who'd rather stay in the terminal than open a browser, and you're still using online tools that force you to context switch — maybe this is a good place to start.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's next
&lt;/h2&gt;

&lt;p&gt;I just published it to npm — &lt;code&gt;npm install -g @eli7pm/invoicer&lt;/code&gt; and you're good to go.&lt;/p&gt;

&lt;p&gt;Try it out and let me know what you think in the comments.&lt;/p&gt;

&lt;p&gt;The full source is on GitHub: &lt;a href="https://github.com/eli7pm/invoicer" rel="noopener noreferrer"&gt;github.com/eli7pm/invoicer&lt;/a&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>tooling</category>
      <category>invoice</category>
      <category>productivity</category>
    </item>
  </channel>
</rss>
