<?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: Skojio Community</title>
    <description>The latest articles on DEV Community by Skojio Community (@skojiocommunity).</description>
    <link>https://dev.to/skojiocommunity</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%2F3942038%2F8cc647c1-bcdb-490e-8433-06e8130e2c50.png</url>
      <title>DEV Community: Skojio Community</title>
      <link>https://dev.to/skojiocommunity</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/skojiocommunity"/>
    <language>en</language>
    <item>
      <title>Three cron mistakes that quietly break overnight jobs</title>
      <dc:creator>Skojio Community</dc:creator>
      <pubDate>Thu, 28 May 2026 22:43:25 +0000</pubDate>
      <link>https://dev.to/skojiocommunity/three-cron-mistakes-that-quietly-break-overnight-jobs-417d</link>
      <guid>https://dev.to/skojiocommunity/three-cron-mistakes-that-quietly-break-overnight-jobs-417d</guid>
      <description>&lt;p&gt;A cron expression is five fields. How wrong can it go? Quite wrong, as it turns out — and the failure mode is usually silent. The job runs, it just runs at the wrong time, or sixty times in a row, or never on the day you actually need it.&lt;/p&gt;

&lt;p&gt;Here are the three patterns I've watched break production overnight, and how to spot them before they bite.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mistake 1 — Treating &lt;code&gt;*/5&lt;/code&gt; as "every 5 from now"
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;*/5 * * * *&lt;/code&gt; does not mean "run every 5 minutes starting from when you save this". It means "run at minutes 0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55 of every hour".&lt;/p&gt;

&lt;p&gt;If you save the cron at 14:03 expecting the first run at 14:08, you will be wrong. The first run will be at 14:05.&lt;/p&gt;

&lt;p&gt;Worse, &lt;code&gt;*/7 * * * *&lt;/code&gt; runs at minutes 0, 7, 14, 21, 28, 35, 42, 49, 56 — and then &lt;strong&gt;0 again 4 minutes later&lt;/strong&gt;, because the next hour resets the cycle. Anything that isn't a divisor of 60 will misbehave at the hour boundary.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mistake 2 — Day-of-month AND day-of-week
&lt;/h2&gt;

&lt;p&gt;The fifth field (day of week) and the third field (day of month) have a non-obvious interaction. If &lt;strong&gt;either&lt;/strong&gt; is unrestricted (&lt;code&gt;*&lt;/code&gt;), cron treats the other as the active filter. If &lt;strong&gt;both&lt;/strong&gt; are specified, cron runs when &lt;strong&gt;either&lt;/strong&gt; matches — an OR, not an AND.&lt;/p&gt;

&lt;p&gt;So &lt;code&gt;0 9 1 * 1&lt;/code&gt; does NOT mean "9am on Mondays that fall on the 1st". It means "9am on the 1st of every month, AND 9am every Monday". That's roughly 8 runs per month instead of zero or one.&lt;/p&gt;

&lt;p&gt;If you want a true AND, you have to filter inside the script:&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="o"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;date&lt;/span&gt; +&lt;span class="se"&gt;\%&lt;/span&gt;u&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nt"&gt;-eq&lt;/span&gt; 1 &lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; /path/to/job.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or use a cron-like scheduler that supports compound conditions natively (Quartz, for instance).&lt;/p&gt;

&lt;h2&gt;
  
  
  Mistake 3 — Timezone drift
&lt;/h2&gt;

&lt;p&gt;Most cron daemons run in &lt;strong&gt;the system's local timezone&lt;/strong&gt;, which is often UTC on cloud VMs and often local time on developer machines.&lt;/p&gt;

&lt;p&gt;Two failure modes:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;DST transitions.&lt;/strong&gt; A cron set to &lt;code&gt;0 2 * * *&lt;/code&gt; in a region that observes daylight saving will either skip a day (spring forward) or run twice (fall back) on transition nights.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Container drift.&lt;/strong&gt; A container's TZ defaults to UTC. If your developer laptop says BST and the production container says UTC, the same crontab runs at different wall-clock times.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The fix is to always be explicit:&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="c"&gt;# In crontab itself (Linux):&lt;/span&gt;
&lt;span class="nv"&gt;CRON_TZ&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;Europe/London
0 2 &lt;span class="k"&gt;*&lt;/span&gt; &lt;span class="k"&gt;*&lt;/span&gt; &lt;span class="k"&gt;*&lt;/span&gt; /path/to/backup.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or run everything in UTC and convert in the application layer.&lt;/p&gt;

&lt;h2&gt;
  
  
  A safer authoring loop
&lt;/h2&gt;

&lt;p&gt;Before you commit a cron expression to production, paste it into a parser that shows you the next 10 fire times. If the times match what you expected, ship it. If they don't, you've caught the mistake before it costs you a night.&lt;/p&gt;



&lt;p&gt;The Skojio cron helper does exactly that — paste an expression, see the next 10 fire times in your chosen timezone, plus a plain-English description of what the expression actually means. It catches all three of the mistakes above in seconds.&lt;/p&gt;

&lt;h2&gt;
  
  
  Recap
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Mistake&lt;/th&gt;
&lt;th&gt;How to spot it&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;*/N&lt;/code&gt; where N doesn't divide 60&lt;/td&gt;
&lt;td&gt;Hour-boundary glitch&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Day-of-month + day-of-week both set&lt;/td&gt;
&lt;td&gt;More runs than expected&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Implicit timezone&lt;/td&gt;
&lt;td&gt;DST or container drift&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Cron is fine when you respect it. The above three failure modes account for nearly every "why did this run / not run" Slack thread I've seen.&lt;/p&gt;

</description>
      <category>cron</category>
      <category>devops</category>
      <category>developertips</category>
    </item>
    <item>
      <title>How to format JSON in Chrome without an extension</title>
      <dc:creator>Skojio Community</dc:creator>
      <pubDate>Thu, 28 May 2026 22:43:24 +0000</pubDate>
      <link>https://dev.to/skojiocommunity/how-to-format-json-in-chrome-without-an-extension-9pm</link>
      <guid>https://dev.to/skojiocommunity/how-to-format-json-in-chrome-without-an-extension-9pm</guid>
      <description>&lt;p&gt;Anyone who has stared at a 600-line JSON response from an API knows the moment: you want to scan it, but Chrome's default view is a single wall of text with no indentation, no folding, no hope.&lt;/p&gt;

&lt;p&gt;You can solve this without installing anything. Three browser-native tricks cover most cases, and one free Skojio tool covers the rest.&lt;/p&gt;

&lt;h2&gt;
  
  
  Trick 1 — Use the DevTools Network panel
&lt;/h2&gt;

&lt;p&gt;Open DevTools, switch to the Network tab, click the request that returned the JSON, then open the &lt;strong&gt;Response&lt;/strong&gt; sub-tab and click the small &lt;code&gt;{}&lt;/code&gt; pretty-print button at the bottom-left of the panel.&lt;/p&gt;

&lt;p&gt;Chrome reformats the response in place: indentation, line breaks, the lot. No extension required.&lt;/p&gt;

&lt;p&gt;The catch: this only works for responses Chrome captured during a network request. If you have JSON pasted from a Slack message or saved to a &lt;code&gt;.json&lt;/code&gt; file, this trick doesn't help.&lt;/p&gt;

&lt;h2&gt;
  
  
  Trick 2 — Paste it into the Console
&lt;/h2&gt;

&lt;p&gt;The DevTools Console gives you a real JavaScript REPL. Paste this in:&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="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`&amp;lt;paste your JSON here&amp;gt;`&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Chrome renders the parsed object as a collapsible tree. You can click to expand and collapse, search within keys with &lt;code&gt;Ctrl+F&lt;/code&gt;, and copy individual values cleanly.&lt;/p&gt;

&lt;p&gt;This works well for moderately sized payloads. It struggles when the JSON contains backticks (which break the template literal) or when the payload is large enough to make the console laggy.&lt;/p&gt;

&lt;h2&gt;
  
  
  Trick 3 — view-source: for static files
&lt;/h2&gt;

&lt;p&gt;If you have JSON saved as a file or hosted somewhere static, prefix the URL with &lt;code&gt;view-source:&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;view-source:https://api.example.com/data.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Chrome renders it monospace with line numbers. Combined with &lt;code&gt;Ctrl+F&lt;/code&gt; this is enough to scan structure quickly.&lt;/p&gt;

&lt;h2&gt;
  
  
  When the tricks fall short
&lt;/h2&gt;

&lt;p&gt;The browser tricks fail when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You want to &lt;strong&gt;validate&lt;/strong&gt; the JSON, not just view it (catch missing commas, wrong quote types)&lt;/li&gt;
&lt;li&gt;You want to &lt;strong&gt;minify&lt;/strong&gt; for production (strip whitespace)&lt;/li&gt;
&lt;li&gt;You want to &lt;strong&gt;compare&lt;/strong&gt; two JSON payloads visually&lt;/li&gt;
&lt;li&gt;You're pasting JSON with embedded backticks or other awkward characters&lt;/li&gt;
&lt;li&gt;You want a permanent URL you can bookmark&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;The Skojio JSON Formatter runs entirely in your browser — no data leaves your machine — and handles all of the above in a single panel. It validates with line-number errors, lets you toggle between formatted and minified views, and you can paste anything (backticks included) without losing your mind.&lt;/p&gt;

&lt;h2&gt;
  
  
  Picking the right tool for the moment
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Situation&lt;/th&gt;
&lt;th&gt;Best option&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;API response in DevTools&lt;/td&gt;
&lt;td&gt;Pretty-print button in Network panel&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Quick tree view of pasted JSON&lt;/td&gt;
&lt;td&gt;Console &lt;code&gt;JSON.parse(...)&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Static &lt;code&gt;.json&lt;/code&gt; file&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;view-source:&lt;/code&gt; prefix&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Validation, minification, sharing&lt;/td&gt;
&lt;td&gt;Skojio JSON Formatter&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;None of these require installing an extension. Pick the one that fits the moment.&lt;/p&gt;

</description>
      <category>json</category>
      <category>chrome</category>
      <category>developertips</category>
    </item>
    <item>
      <title>Strong passwords without a password manager — when it makes sense</title>
      <dc:creator>Skojio Community</dc:creator>
      <pubDate>Thu, 28 May 2026 15:45:43 +0000</pubDate>
      <link>https://dev.to/skojiocommunity/strong-passwords-without-a-password-manager-when-it-makes-sense-19hc</link>
      <guid>https://dev.to/skojiocommunity/strong-passwords-without-a-password-manager-when-it-makes-sense-19hc</guid>
      <description>&lt;p&gt;Password managers are the right answer for almost everything. They eliminate reuse, generate high-entropy secrets, and remove the human bottleneck. For 95% of accounts, install Bitwarden or 1Password and move on.&lt;/p&gt;

&lt;p&gt;But there is a small, specific set of accounts where a password manager is the &lt;strong&gt;wrong&lt;/strong&gt; answer. Knowing which ones — and how to handle them — is worth ten minutes of attention.&lt;/p&gt;

&lt;h2&gt;
  
  
  The accounts that don't belong in a manager
&lt;/h2&gt;

&lt;p&gt;Three categories, roughly:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;The master password of the manager itself.&lt;/strong&gt; Obviously. This one lives in your head.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Your primary email recovery account.&lt;/strong&gt; If you lose access to the manager and the recovery account is &lt;em&gt;also&lt;/em&gt; in the manager, you have created a circular dependency that locks you out of your own life.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Disk encryption keys, root passwords, and emergency-access codes for shared systems.&lt;/strong&gt; Anything you might need to type when your laptop won't boot, or read aloud to a colleague during an incident.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For these, you need passwords that are strong, memorable, and &lt;strong&gt;typeable&lt;/strong&gt;. That's a different problem from generic account passwords.&lt;/p&gt;

&lt;h2&gt;
  
  
  What "strong" actually means
&lt;/h2&gt;

&lt;p&gt;A password is strong because of entropy — the number of equally-likely possibilities an attacker has to try. Length contributes far more entropy than character variety, and a passphrase made of random common words can hit 70+ bits of entropy while still being typeable.&lt;/p&gt;

&lt;p&gt;A 12-character random string like &lt;code&gt;K7#m$pQ2!nXz&lt;/code&gt; has roughly 79 bits of entropy. A four-word passphrase like &lt;code&gt;correct-horse-battery-staple&lt;/code&gt; has roughly 44 bits. To match the random string you need 6-7 random words.&lt;/p&gt;

&lt;h2&gt;
  
  
  The two-list rule
&lt;/h2&gt;

&lt;p&gt;For the handful of accounts that don't belong in a manager:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;List A: passphrases&lt;/strong&gt; for things you must type frequently or under stress (login, disk unlock). 6+ random words, hyphenated, lowercase.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;List B: high-entropy strings&lt;/strong&gt; for things stored in a sealed envelope in a safe, never typed (root password, recovery codes). 24+ random characters.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For List A you can generate offline with &lt;code&gt;shuf&lt;/code&gt; or a wordlist. For List B you want a generator that runs in your browser so the secret never crosses the network.&lt;/p&gt;



&lt;p&gt;The Skojio password generator runs entirely client-side — no analytics, no server round trip — and supports both modes: configurable random strings and word-based passphrases. Use it once for each account on either list, write the result down on paper, store it appropriately.&lt;/p&gt;

&lt;h2&gt;
  
  
  What "appropriately" means
&lt;/h2&gt;

&lt;p&gt;For List A passphrases: nothing. Memorise them. If you can't, the passphrase is too long; pick a shorter one.&lt;/p&gt;

&lt;p&gt;For List B strings: a paper backup in a physically secure location. A safe deposit box, a fire-safe at home, a sealed envelope with a trusted person. Two copies in different locations is better than one.&lt;/p&gt;

&lt;p&gt;If the password ever needs to be typed by a human in an emergency, it belongs on List A. If it can be copy-pasted from paper, List B is fine.&lt;/p&gt;

&lt;h2&gt;
  
  
  What about MFA?
&lt;/h2&gt;

&lt;p&gt;MFA does not replace a strong password — it complements it. Every account that supports MFA should have it enabled, regardless of which list its password lives on. The categories above are about the &lt;em&gt;password&lt;/em&gt;; the second factor is a separate layer.&lt;/p&gt;

&lt;h2&gt;
  
  
  Recap
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Account type&lt;/th&gt;
&lt;th&gt;Where the password lives&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Generic web account&lt;/td&gt;
&lt;td&gt;Password manager, randomly generated&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Password manager itself&lt;/td&gt;
&lt;td&gt;In your head&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Email recovery account&lt;/td&gt;
&lt;td&gt;In your head + paper backup&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Disk encryption, root, emergency&lt;/td&gt;
&lt;td&gt;Paper backup, never in the manager&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The manager handles the 95% case beautifully. The 5% needs a different tool and a different storage strategy, and confusing the two is how people end up locked out of their own accounts.&lt;/p&gt;

</description>
      <category>security</category>
      <category>passwords</category>
      <category>tips</category>
    </item>
  </channel>
</rss>
