<?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: Aniket Saini</title>
    <description>The latest articles on DEV Community by Aniket Saini (@aniket_saini_7).</description>
    <link>https://dev.to/aniket_saini_7</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%2F4011690%2F24890610-68fa-470d-a419-e75a48be1b27.png</url>
      <title>DEV Community: Aniket Saini</title>
      <link>https://dev.to/aniket_saini_7</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/aniket_saini_7"/>
    <language>en</language>
    <item>
      <title>Why I ripped out a cron parsing library and wrote my own</title>
      <dc:creator>Aniket Saini</dc:creator>
      <pubDate>Fri, 03 Jul 2026 04:13:27 +0000</pubDate>
      <link>https://dev.to/aniket_saini_7/why-i-ripped-out-a-cron-parsing-library-and-wrote-my-own-3d2</link>
      <guid>https://dev.to/aniket_saini_7/why-i-ripped-out-a-cron-parsing-library-and-wrote-my-own-3d2</guid>
      <description>&lt;p&gt;Building the cron builder for Quietbench, I started with an npm package for parsing and calculating next-run times. Get it working, move on. That lasted about a week.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The problem:&lt;/strong&gt; the library handled standard cron fine, but broke on real edge cases — conditional OR/AND behavior when day-of-week and day-of-month are combined, step values inside ranges (1-10/2), and off-by-one errors around DST transitions. When I checked its output against standard cron engines, the mismatches showed up fast.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why not patch it:&lt;/strong&gt; the parsing and "next run time" logic were tightly coupled internally. Fixing one edge case risked breaking another. Writing something scoped to exactly what I needed was less work than fighting someone else's abstraction.&lt;/p&gt;

&lt;p&gt;The rewrite keeps three things cleanly separate: tokenize/validate each field, normalize day-of-week/day-of-month interaction explicitly, and compute next executions by walking forward in time rather than solving algebraically. Slower in theory, irrelevant in practice — nobody notices a few milliseconds when they're reading 5 output times.&lt;/p&gt;

&lt;p&gt;Building the cron builder for Quietbench, I started with an npm package for parsing and calculating next-run times. Get it working, move on. That lasted about a week.&lt;/p&gt;

&lt;p&gt;The problem: the library handled standard cron fine, but broke on real edge cases — conditional OR/AND behavior when day-of-week and day-of-month are combined, step values inside ranges (1-10/2), and off-by-one errors around DST transitions. When I checked its output against standard cron engines, the mismatches showed up fast.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why not patch it:&lt;/strong&gt; the parsing and "next run time" logic were tightly coupled internally. Fixing one edge case risked breaking another. Writing something scoped to exactly what I needed was less work than fighting someone else's abstraction.&lt;/p&gt;

&lt;p&gt;The rewrite keeps three things cleanly separate: tokenize/validate each field, normalize day-of-week/day-of-month interaction explicitly, and compute next executions by walking forward in time rather than solving algebraically. Slower in theory, irrelevant in practice — nobody notices a few milliseconds when they're reading 5 output times.&lt;/p&gt;

&lt;p&gt;**The actual lesson: **reaching for a library first isn't wrong. But once I was spending more time reverse-engineering why the library disagreed with standard cron behavior than I would've spent writing the logic myself, that was the signal to just own it.&lt;/p&gt;

&lt;p&gt;Live at quietbench.dev/cron-builder — curious if anyone finds an edge case it still gets wrong. reaching for a library first isn't wrong. But once I was spending more time reverse-engineering why the library disagreed with standard cron behavior than I would've spent writing the logic myself, that was the signal to just own it.&lt;/p&gt;

&lt;p&gt;Live at quietbench.dev/cron-builder — curious if anyone finds an edge case it still gets wrong.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>productivity</category>
      <category>javascript</category>
      <category>tools</category>
    </item>
    <item>
      <title>I built a free, no-signup dev tools site because I was tired of ad-heavy formatters</title>
      <dc:creator>Aniket Saini</dc:creator>
      <pubDate>Thu, 02 Jul 2026 14:24:24 +0000</pubDate>
      <link>https://dev.to/aniket_saini_7/i-built-a-free-no-signup-dev-tools-site-because-i-was-tired-of-ad-heavy-formatters-5ha7</link>
      <guid>https://dev.to/aniket_saini_7/i-built-a-free-no-signup-dev-tools-site-because-i-was-tired-of-ad-heavy-formatters-5ha7</guid>
      <description>&lt;p&gt;Like a lot of developers, I have a handful of bookmarked utility sites I use constantly — JSON formatter, regex tester, that kind of thing. Over time most of them got slower, ad-heavier, or started asking for signups for basic features.&lt;/p&gt;

&lt;p&gt;So I built my own small suite:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;JSON Formatter&lt;/strong&gt; — format/validate/minify, with a tree view for nested objects&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Regex Tester&lt;/strong&gt; — live match highlighting plus a plain-English breakdown of what your pattern does&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cron Builder&lt;/strong&gt; — visual builder + parser, shows your next 5 execution times&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Contrast Checker&lt;/strong&gt; — WCAG AA/AAA contrast checking with a live preview&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;API Tester&lt;/strong&gt; — lightweight Postman-style request tester, no install&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Everything runs client-side in the browser — no backend, no data leaves your machine, no account needed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;### A few implementation notes for anyone curious&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The cron parser was the one piece I ended up writing from scratch rather than pulling in a library. I wanted predictable behavior for the "next 5 execution times" calculation without dragging in a heavy dependency.&lt;/p&gt;

&lt;p&gt;Writing a cron parser from scratch is a trap, though. I immediately hit a subtle bug in how Day-of-Month and Day-of-Week restrictions interact. In standard Unix cron, if both fields are restricted (i.e. not &lt;code&gt;*&lt;/code&gt;), the engine treats them as an &lt;code&gt;OR&lt;/code&gt; condition, not an &lt;code&gt;AND&lt;/code&gt;. My initial logic combined them with an &lt;code&gt;AND&lt;/code&gt; operator, which broke schedules like &lt;code&gt;0 0 1 * 1&lt;/code&gt; (which should run on the 1st of the month &lt;em&gt;or&lt;/em&gt; every Monday). I caught it when sanity-checking the next execution times against public standard engines, and had to rewrite the matching logic to correctly handle the conditional &lt;code&gt;OR&lt;/code&gt;/&lt;code&gt;AND&lt;/code&gt; split.&lt;/p&gt;

&lt;p&gt;Built with React + Vite + Tailwind, deployed as a static site.&lt;/p&gt;

&lt;p&gt;Would genuinely appreciate feedback — especially if anything looks broken on mobile, that's the area I'm least confident in right now.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://quietbench.dev" rel="noopener noreferrer"&gt;https://quietbench.dev&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>productivity</category>
      <category>javascript</category>
      <category>showdev</category>
    </item>
  </channel>
</rss>
