<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="/feed.xsl" type="text/xsl"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <link rel="self" href="https://pbb.io/blog.atom"/>
  <subtitle>Posts and learnings about software development, functional programming, and the web.</subtitle>
  <author>
    <name>Phil-Bastian Berndt</name>
    <email>me@pbb.io</email>
  </author>
  <id>https://pbb.io/</id>
  <title/>
  <updated>2026-10-11T20:56:12.467752Z</updated>
  <entry>
    <content type="html">&amp;lt;p&amp;gt;Dropping the iframe only gets you halfway, because the thumbnail still phones home. What it takes to serve YouTube preview images from your own domain.&amp;lt;/p&amp;gt;&lt;p&gt;&lt;a href=&quot;https://pbb.io/blog/youtube-thumbnail-proxy&quot;&gt;Read more…&lt;/a&gt;&lt;/p&gt;</content>
    <published>2026-07-31T00:00:00Z</published>
    <author>
      <name>Phil-Bastian Berndt</name>
    </author>
    <link href="https://pbb.io/blog/youtube-thumbnail-proxy"/>
    <id>https://pbb.io/blog/youtube-thumbnail-proxy</id>
    <title>Embedding YouTube without leaking your readers&apos; IPs</title>
    <updated>2026-07-31T00:00:00Z</updated>
  </entry>
  <entry>
    <content type="html">&amp;lt;p&amp;gt;A book slug returning 400 as an Ecto.Query.CastError, because a sixteen-byte string is also a valid raw UUID. Why casting is the wrong way to tell ids and slugs apart.&amp;lt;/p&amp;gt;&lt;p&gt;&lt;a href=&quot;https://pbb.io/blog/ecto-uuid-cast-sixteen-bytes&quot;&gt;Read more…&lt;/a&gt;&lt;/p&gt;</content>
    <published>2026-07-30T00:00:00Z</published>
    <author>
      <name>Phil-Bastian Berndt</name>
    </author>
    <link href="https://pbb.io/blog/ecto-uuid-cast-sixteen-bytes"/>
    <id>https://pbb.io/blog/ecto-uuid-cast-sixteen-bytes</id>
    <title>Ecto.UUID.cast/1 will eat anything sixteen bytes long</title>
    <updated>2026-07-30T00:00:00Z</updated>
  </entry>
  <entry>
    <content type="html">&amp;lt;p&amp;gt;Sunday evening, three of the four Raspberry Pi nodes in my k3s cluster went NotReady at once. SSH? &amp;lt;code&amp;gt;Connection reset by peer&amp;lt;/code&amp;gt;. The nodes weren’t dead — they just wouldn’t talk to anyone. One of them only came back after a power cycle.&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;The culprit: swap. Raspberry Pi OS ships with &amp;lt;code&amp;gt;dphys-swapfile&amp;lt;/code&amp;gt; enabled, a swapfile sitting on the SD card. A stock kubelet refuses to start while swap is on (&amp;lt;code&amp;gt;--fail-swap-on&amp;lt;/code&amp;gt; defaults to true, and kubeadm’s preflight checks make you disable it), but k3s sets &amp;lt;code&amp;gt;fail-swap-on=false&amp;lt;/code&amp;gt; for you. So a k3s cluster on Pis runs on swap from day one, and nothing ever tells you.&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;Kubernetes wants swap off because its whole memory model assumes it. When a node runs out of RAM, the kubelet evicts pods or the kernel OOM-kills them, and they get restarted elsewhere. Ugly, but fast — and self-healing. With swap, the kernel instead does you the “favor” of paging memory out to storage. On an SD card, that means the node grinds into a thrash loop: nothing gets killed, nothing recovers, everything just gets slower until the kubelet misses its lease renewals (hello NotReady) and sshd can’t even finish a handshake. Swap converts a fast, recoverable pod failure into a slow node death that ends at the power outlet.&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;Two more things I learned while cleaning up:&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;swapoff&amp;lt;/code&amp;gt; on a struggling node looks hung. It isn’t — it has to page everything back into RAM first, and pulling that off an SD card under memory pressure takes minutes. Watch it instead of killing it:&amp;lt;/p&amp;gt;
&amp;lt;pre class=&amp;quot;lumis lumis-themes latte mocha&amp;quot; style=&amp;quot;--lumis-latte:#4c4f69; --lumis-latte-bg:#eff1f5; --lumis-mocha:#cdd6f4; --lumis-mocha-bg:#1e1e2e;&amp;quot;&amp;gt;&amp;lt;code class=&amp;quot;language-bash&amp;quot; translate=&amp;quot;no&amp;quot; tabindex=&amp;quot;0&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;l-line&amp;quot; data-line=&amp;quot;1&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;--lumis-latte:#1e66f5; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#89b4fa; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;watch&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;--lumis-latte:#40a02b; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#a6e3a1; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;&amp;amp;#39;cat /proc/swaps; echo; free -h&amp;amp;#39;&amp;lt;/span&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;
&amp;lt;p&amp;gt;The permanent fix on Raspberry Pi OS:&amp;lt;/p&amp;gt;
&amp;lt;pre class=&amp;quot;lumis lumis-themes latte mocha&amp;quot; style=&amp;quot;--lumis-latte:#4c4f69; --lumis-latte-bg:#eff1f5; --lumis-mocha:#cdd6f4; --lumis-mocha-bg:#1e1e2e;&amp;quot;&amp;gt;&amp;lt;code class=&amp;quot;language-bash&amp;quot; translate=&amp;quot;no&amp;quot; tabindex=&amp;quot;0&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;l-line&amp;quot; data-line=&amp;quot;1&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;--lumis-latte:#1e66f5; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#89b4fa; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;sudo&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;--lumis-latte:#40a02b; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#a6e3a1; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;dphys-swapfile&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;--lumis-latte:#40a02b; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#a6e3a1; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;swapoff&amp;lt;/span&amp;gt;
&amp;lt;/div&amp;gt;&amp;lt;div class=&amp;quot;l-line&amp;quot; data-line=&amp;quot;2&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;--lumis-latte:#1e66f5; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#89b4fa; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;sudo&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;--lumis-latte:#40a02b; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#a6e3a1; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;systemctl&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;--lumis-latte:#40a02b; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#a6e3a1; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;disable&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;--lumis-latte:#40a02b; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#a6e3a1; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;--now&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;--lumis-latte:#40a02b; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#a6e3a1; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;dphys-swapfile&amp;lt;/span&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;
&amp;lt;p&amp;gt;Postscript: since Kubernetes 1.34, swap is actually supported — &amp;lt;code&amp;gt;NodeSwap&amp;lt;/code&amp;gt; went GA with its &amp;lt;code&amp;gt;LimitedSwap&amp;lt;/code&amp;gt; mode for burstable pods. But that’s a deliberate, configured trade-off, not a distro quietly leaving a swapfile on your SD card.&amp;lt;/p&amp;gt;</content>
    <published>2026-04-12T00:00:00Z</published>
    <author>
      <name>Phil-Bastian Berndt</name>
    </author>
    <link href="https://pbb.io/blog/k8s-swap-zombie-nodes"/>
    <id>https://pbb.io/blog/k8s-swap-zombie-nodes</id>
    <title>TIL swap turns Kubernetes OOM kills into zombie nodes</title>
    <updated>2026-04-12T00:00:00Z</updated>
  </entry>
  <entry>
    <content type="html">&amp;lt;p&amp;gt;A simple CSS trick to make light-background screenshots look good in dark mode without maintaining two versions of every image.&amp;lt;/p&amp;gt;&lt;p&gt;&lt;a href=&quot;https://pbb.io/blog/invert-images-dark-mode-css&quot;&gt;Read more…&lt;/a&gt;&lt;/p&gt;</content>
    <published>2026-03-21T00:00:00Z</published>
    <author>
      <name>Phil-Bastian Berndt</name>
    </author>
    <link href="https://pbb.io/blog/invert-images-dark-mode-css"/>
    <id>https://pbb.io/blog/invert-images-dark-mode-css</id>
    <title>Inverting images for dark mode with pure CSS</title>
    <updated>2026-03-21T00:00:00Z</updated>
  </entry>
  <entry>
    <content type="html">&amp;lt;p&amp;gt;Since v1.3.9, Bun supports &amp;lt;code&amp;gt;--parallel&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;--sequential&amp;lt;/code&amp;gt; flags on &amp;lt;code&amp;gt;bun run&amp;lt;/code&amp;gt;,
eliminating the need for &amp;lt;code&amp;gt;npm-run-all2&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;
&amp;lt;pre class=&amp;quot;lumis lumis-themes latte mocha&amp;quot; style=&amp;quot;--lumis-latte:#4c4f69; --lumis-latte-bg:#eff1f5; --lumis-mocha:#cdd6f4; --lumis-mocha-bg:#1e1e2e;&amp;quot;&amp;gt;&amp;lt;code class=&amp;quot;language-json&amp;quot; translate=&amp;quot;no&amp;quot; tabindex=&amp;quot;0&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;l-line&amp;quot; data-line=&amp;quot;1&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;--lumis-latte:#7c7f93; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#9399b2; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;{&amp;lt;/span&amp;gt;
&amp;lt;/div&amp;gt;&amp;lt;div class=&amp;quot;l-line&amp;quot; data-line=&amp;quot;2&amp;quot;&amp;gt;  &amp;lt;span style=&amp;quot;--lumis-latte:#7287fd; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#b4befe; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;&amp;amp;quot;scripts&amp;amp;quot;&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;--lumis-latte:#7c7f93; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#9399b2; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;:&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;--lumis-latte:#7c7f93; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#9399b2; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;{&amp;lt;/span&amp;gt;
&amp;lt;/div&amp;gt;&amp;lt;div class=&amp;quot;l-line&amp;quot; data-line=&amp;quot;3&amp;quot;&amp;gt;    &amp;lt;span style=&amp;quot;--lumis-latte:#7287fd; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#b4befe; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;&amp;amp;quot;install&amp;amp;quot;&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;--lumis-latte:#7c7f93; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#9399b2; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;:&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;--lumis-latte:#40a02b; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#a6e3a1; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;&amp;amp;quot;bun run --sequential &amp;amp;#39;install:*&amp;amp;#39;&amp;amp;quot;&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;--lumis-latte:#7c7f93; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#9399b2; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;,&amp;lt;/span&amp;gt;
&amp;lt;/div&amp;gt;&amp;lt;div class=&amp;quot;l-line&amp;quot; data-line=&amp;quot;4&amp;quot;&amp;gt;    &amp;lt;span style=&amp;quot;--lumis-latte:#7287fd; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#b4befe; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;&amp;amp;quot;install:copy-files&amp;amp;quot;&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;--lumis-latte:#7c7f93; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#9399b2; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;:&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;--lumis-latte:#40a02b; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#a6e3a1; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;&amp;amp;quot;copy-files-from-to&amp;amp;quot;&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;--lumis-latte:#7c7f93; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#9399b2; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;,&amp;lt;/span&amp;gt;
&amp;lt;/div&amp;gt;&amp;lt;div class=&amp;quot;l-line&amp;quot; data-line=&amp;quot;5&amp;quot;&amp;gt;    &amp;lt;span style=&amp;quot;--lumis-latte:#7287fd; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#b4befe; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;&amp;amp;quot;install:whatever&amp;amp;quot;&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;--lumis-latte:#7c7f93; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#9399b2; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;:&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;--lumis-latte:#40a02b; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#a6e3a1; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;&amp;amp;quot;...&amp;amp;quot;&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;--lumis-latte:#7c7f93; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#9399b2; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;,&amp;lt;/span&amp;gt;
&amp;lt;/div&amp;gt;&amp;lt;div class=&amp;quot;l-line&amp;quot; data-line=&amp;quot;6&amp;quot;&amp;gt;    &amp;lt;span style=&amp;quot;--lumis-latte:#7287fd; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#b4befe; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;&amp;amp;quot;lint&amp;amp;quot;&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;--lumis-latte:#7c7f93; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#9399b2; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;:&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;--lumis-latte:#40a02b; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#a6e3a1; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;&amp;amp;quot;bun run --parallel &amp;amp;#39;lint:*&amp;amp;#39;&amp;amp;quot;&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;--lumis-latte:#7c7f93; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#9399b2; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;,&amp;lt;/span&amp;gt;
&amp;lt;/div&amp;gt;&amp;lt;div class=&amp;quot;l-line&amp;quot; data-line=&amp;quot;7&amp;quot;&amp;gt;    &amp;lt;span style=&amp;quot;--lumis-latte:#7287fd; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#b4befe; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;&amp;amp;quot;lint:credo&amp;amp;quot;&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;--lumis-latte:#7c7f93; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#9399b2; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;:&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;--lumis-latte:#40a02b; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#a6e3a1; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;&amp;amp;quot;mix credo --strict&amp;amp;quot;&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;--lumis-latte:#7c7f93; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#9399b2; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;,&amp;lt;/span&amp;gt;
&amp;lt;/div&amp;gt;&amp;lt;div class=&amp;quot;l-line&amp;quot; data-line=&amp;quot;8&amp;quot;&amp;gt;    &amp;lt;span style=&amp;quot;--lumis-latte:#7287fd; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#b4befe; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;&amp;amp;quot;lint:eslint&amp;amp;quot;&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;--lumis-latte:#7c7f93; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#9399b2; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;:&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;--lumis-latte:#40a02b; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#a6e3a1; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;&amp;amp;quot;eslint .&amp;amp;quot;&amp;lt;/span&amp;gt;
&amp;lt;/div&amp;gt;&amp;lt;div class=&amp;quot;l-line&amp;quot; data-line=&amp;quot;9&amp;quot;&amp;gt;  &amp;lt;span style=&amp;quot;--lumis-latte:#7c7f93; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#9399b2; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;}&amp;lt;/span&amp;gt;
&amp;lt;/div&amp;gt;&amp;lt;div class=&amp;quot;l-line&amp;quot; data-line=&amp;quot;10&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;--lumis-latte:#7c7f93; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#9399b2; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;}&amp;lt;/span&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;
&amp;lt;p&amp;gt;Glob patterns like &amp;lt;code&amp;gt;&amp;#39;install:*&amp;#39;&amp;lt;/code&amp;gt; match all scripts with that prefix (just like &amp;lt;code&amp;gt;npm-run-all2&amp;lt;/code&amp;gt;’s &amp;lt;code&amp;gt;run-s install:*&amp;lt;/code&amp;gt;).&amp;lt;/p&amp;gt;</content>
    <published>2026-02-09T00:00:00Z</published>
    <author>
      <name>Phil-Bastian Berndt</name>
    </author>
    <link href="https://pbb.io/blog/bun-run-parallel-sequential"/>
    <id>https://pbb.io/blog/bun-run-parallel-sequential</id>
    <title>TIL Bun has built-in parallel and sequential script running</title>
    <updated>2026-02-09T00:00:00Z</updated>
  </entry>
  <entry>
    <content type="html">&amp;lt;p&amp;gt;If a test triggers noisy log output, you can use &amp;lt;code&amp;gt;ExUnit.CaptureLog.capture_log/2&amp;lt;/code&amp;gt; to capture the noisy function:&amp;lt;/p&amp;gt;
&amp;lt;pre class=&amp;quot;lumis lumis-themes latte mocha&amp;quot; style=&amp;quot;--lumis-latte:#4c4f69; --lumis-latte-bg:#eff1f5; --lumis-mocha:#cdd6f4; --lumis-mocha-bg:#1e1e2e;&amp;quot;&amp;gt;&amp;lt;code class=&amp;quot;language-elixir&amp;quot; translate=&amp;quot;no&amp;quot; tabindex=&amp;quot;0&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;l-line&amp;quot; data-line=&amp;quot;1&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;--lumis-latte:#8839ef; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#cba6f7; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;import&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;--lumis-latte:#df8e1d; --lumis-latte-font-style:italic; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#f9e2af; --lumis-mocha-font-style:italic; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;ExUnit.CaptureLog&amp;lt;/span&amp;gt;
&amp;lt;/div&amp;gt;&amp;lt;div class=&amp;quot;l-line&amp;quot; data-line=&amp;quot;2&amp;quot;&amp;gt;
&amp;lt;/div&amp;gt;&amp;lt;div class=&amp;quot;l-line&amp;quot; data-line=&amp;quot;3&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;--lumis-latte:#1e66f5; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#89b4fa; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;test&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;--lumis-latte:#40a02b; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#a6e3a1; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;&amp;amp;quot;logs a warning&amp;amp;quot;&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;--lumis-latte:#8839ef; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#cba6f7; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;do&amp;lt;/span&amp;gt;
&amp;lt;/div&amp;gt;&amp;lt;div class=&amp;quot;l-line&amp;quot; data-line=&amp;quot;4&amp;quot;&amp;gt;  &amp;lt;span style=&amp;quot;--lumis-latte:#4c4f69; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#cdd6f4; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;log&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;--lumis-latte:#04a5e5; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#89dceb; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;=&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;--lumis-latte:#1e66f5; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#89b4fa; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;capture_log&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;--lumis-latte:#7c7f93; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#9399b2; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;(&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;--lumis-latte:#8839ef; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#cba6f7; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;fn&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;--lumis-latte:#04a5e5; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#89dceb; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;-&amp;amp;gt;&amp;lt;/span&amp;gt;
&amp;lt;/div&amp;gt;&amp;lt;div class=&amp;quot;l-line&amp;quot; data-line=&amp;quot;5&amp;quot;&amp;gt;    &amp;lt;span style=&amp;quot;--lumis-latte:#df8e1d; --lumis-latte-font-style:italic; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#f9e2af; --lumis-mocha-font-style:italic; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;MyApp&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;--lumis-latte:#04a5e5; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#89dceb; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;--lumis-latte:#1e66f5; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#89b4fa; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;noisy_function&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;--lumis-latte:#7c7f93; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#9399b2; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;()&amp;lt;/span&amp;gt;
&amp;lt;/div&amp;gt;&amp;lt;div class=&amp;quot;l-line&amp;quot; data-line=&amp;quot;6&amp;quot;&amp;gt;  &amp;lt;span style=&amp;quot;--lumis-latte:#8839ef; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#cba6f7; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;end&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;--lumis-latte:#7c7f93; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#9399b2; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;)&amp;lt;/span&amp;gt;
&amp;lt;/div&amp;gt;&amp;lt;div class=&amp;quot;l-line&amp;quot; data-line=&amp;quot;7&amp;quot;&amp;gt;
&amp;lt;/div&amp;gt;&amp;lt;div class=&amp;quot;l-line&amp;quot; data-line=&amp;quot;8&amp;quot;&amp;gt;  &amp;lt;span style=&amp;quot;--lumis-latte:#1e66f5; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#89b4fa; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;assert&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;--lumis-latte:#4c4f69; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#cdd6f4; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;log&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;--lumis-latte:#04a5e5; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#89dceb; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;=~&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;--lumis-latte:#40a02b; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#a6e3a1; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;&amp;amp;quot;something went wrong&amp;amp;quot;&amp;lt;/span&amp;gt;
&amp;lt;/div&amp;gt;&amp;lt;div class=&amp;quot;l-line&amp;quot; data-line=&amp;quot;9&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;--lumis-latte:#8839ef; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#cba6f7; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;end&amp;lt;/span&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;
&amp;lt;p&amp;gt;To silence logs for the whole test, use the &amp;lt;code&amp;gt;@tag&amp;lt;/code&amp;gt; attribute:&amp;lt;/p&amp;gt;
&amp;lt;pre class=&amp;quot;lumis lumis-themes latte mocha&amp;quot; style=&amp;quot;--lumis-latte:#4c4f69; --lumis-latte-bg:#eff1f5; --lumis-mocha:#cdd6f4; --lumis-mocha-bg:#1e1e2e;&amp;quot;&amp;gt;&amp;lt;code class=&amp;quot;language-elixir&amp;quot; translate=&amp;quot;no&amp;quot; tabindex=&amp;quot;0&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;l-line&amp;quot; data-line=&amp;quot;1&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;--lumis-latte:#fe640b; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#fab387; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;@&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;--lumis-latte:#fe640b; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#fab387; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;tag &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;--lumis-latte:#dd7878; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#f2cdcd; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;capture_log: &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;--lumis-latte:#fe640b; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#fab387; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;true&amp;lt;/span&amp;gt;
&amp;lt;/div&amp;gt;&amp;lt;div class=&amp;quot;l-line&amp;quot; data-line=&amp;quot;2&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;--lumis-latte:#1e66f5; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#89b4fa; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;test&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;--lumis-latte:#40a02b; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#a6e3a1; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;&amp;amp;quot;something that logs warnings&amp;amp;quot;&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;--lumis-latte:#8839ef; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#cba6f7; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;do&amp;lt;/span&amp;gt;
&amp;lt;/div&amp;gt;&amp;lt;div class=&amp;quot;l-line&amp;quot; data-line=&amp;quot;3&amp;quot;&amp;gt;  &amp;lt;span style=&amp;quot;--lumis-latte:#1e66f5; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#89b4fa; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;assert&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;--lumis-latte:#df8e1d; --lumis-latte-font-style:italic; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#f9e2af; --lumis-mocha-font-style:italic; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;MyApp&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;--lumis-latte:#04a5e5; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#89dceb; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;--lumis-latte:#1e66f5; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#89b4fa; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;noisy_function&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;--lumis-latte:#7c7f93; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#9399b2; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;()&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;--lumis-latte:#04a5e5; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#89dceb; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;==&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;--lumis-latte:#dd7878; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#f2cdcd; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;:ok&amp;lt;/span&amp;gt;
&amp;lt;/div&amp;gt;&amp;lt;div class=&amp;quot;l-line&amp;quot; data-line=&amp;quot;4&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;--lumis-latte:#8839ef; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#cba6f7; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;end&amp;lt;/span&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;
&amp;lt;p&amp;gt;Or enable it globally for all tests in &amp;lt;code&amp;gt;test/test_helper.exs&amp;lt;/code&amp;gt;:&amp;lt;/p&amp;gt;
&amp;lt;pre class=&amp;quot;lumis lumis-themes latte mocha&amp;quot; style=&amp;quot;--lumis-latte:#4c4f69; --lumis-latte-bg:#eff1f5; --lumis-mocha:#cdd6f4; --lumis-mocha-bg:#1e1e2e;&amp;quot;&amp;gt;&amp;lt;code class=&amp;quot;language-elixir&amp;quot; translate=&amp;quot;no&amp;quot; tabindex=&amp;quot;0&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;l-line&amp;quot; data-line=&amp;quot;1&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;--lumis-latte:#df8e1d; --lumis-latte-font-style:italic; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#f9e2af; --lumis-mocha-font-style:italic; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;ExUnit&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;--lumis-latte:#04a5e5; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#89dceb; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;--lumis-latte:#1e66f5; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#89b4fa; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;start&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;--lumis-latte:#7c7f93; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#9399b2; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;(&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;--lumis-latte:#dd7878; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#f2cdcd; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;capture_log: &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;--lumis-latte:#fe640b; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#fab387; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;true&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;--lumis-latte:#7c7f93; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#9399b2; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;)&amp;lt;/span&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;
&amp;lt;p&amp;gt;In all cases, if a test fails, the captured logs are included in the failure report.&amp;lt;/p&amp;gt;</content>
    <published>2025-12-05T00:00:00Z</published>
    <author>
      <name>Phil-Bastian Berndt</name>
    </author>
    <link href="https://pbb.io/blog/exunit-capture-log"/>
    <id>https://pbb.io/blog/exunit-capture-log</id>
    <title>TIL how to suppress log output in ExUnit tests</title>
    <updated>2025-12-05T00:00:00Z</updated>
  </entry>
  <entry>
    <content type="html">&amp;lt;p&amp;gt;macOS stores a “file create date” that most tools can’t modify.
&amp;lt;code&amp;gt;exiftool&amp;lt;/code&amp;gt; can change both the creation and modification dates of all files in a folder at once:&amp;lt;/p&amp;gt;
&amp;lt;pre class=&amp;quot;lumis lumis-themes latte mocha&amp;quot; style=&amp;quot;--lumis-latte:#4c4f69; --lumis-latte-bg:#eff1f5; --lumis-mocha:#cdd6f4; --lumis-mocha-bg:#1e1e2e;&amp;quot;&amp;gt;&amp;lt;code class=&amp;quot;language-bash&amp;quot; translate=&amp;quot;no&amp;quot; tabindex=&amp;quot;0&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;l-line&amp;quot; data-line=&amp;quot;1&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;--lumis-latte:#1e66f5; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#89b4fa; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;exiftool&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;--lumis-latte:#40a02b; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#a6e3a1; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;&amp;amp;quot;-FileCreateDate=2021:09:28 12:00:00&amp;amp;quot;&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;--lumis-latte:#40a02b; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#a6e3a1; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;&amp;amp;quot;-FileModifyDate=2021:09:28 12:00:00&amp;amp;quot;&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;--lumis-latte:#40a02b; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#a6e3a1; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;-overwrite_original&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;--lumis-latte:#40a02b; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#a6e3a1; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;
&amp;lt;p&amp;gt;The &amp;lt;code&amp;gt;-overwrite_original&amp;lt;/code&amp;gt; flag prevents exiftool from creating backup copies.&amp;lt;/p&amp;gt;</content>
    <published>2025-08-11T00:00:00Z</published>
    <author>
      <name>Phil-Bastian Berndt</name>
    </author>
    <link href="https://pbb.io/blog/macos-change-file-create-date"/>
    <id>https://pbb.io/blog/macos-change-file-create-date</id>
    <title>TIL how to bulk-change file creation dates on macOS</title>
    <updated>2025-08-11T00:00:00Z</updated>
  </entry>
  <entry>
    <content type="html">&amp;lt;p&amp;gt;Bash can open TCP connections via &amp;lt;code&amp;gt;/dev/tcp&amp;lt;/code&amp;gt; without needing &amp;lt;code&amp;gt;curl&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;wget&amp;lt;/code&amp;gt;, or &amp;lt;code&amp;gt;nc&amp;lt;/code&amp;gt; installed.
This is handy for Docker healthchecks in minimal images:&amp;lt;/p&amp;gt;
&amp;lt;pre class=&amp;quot;lumis lumis-themes latte mocha&amp;quot; style=&amp;quot;--lumis-latte:#4c4f69; --lumis-latte-bg:#eff1f5; --lumis-mocha:#cdd6f4; --lumis-mocha-bg:#1e1e2e;&amp;quot;&amp;gt;&amp;lt;code class=&amp;quot;language-yaml&amp;quot; translate=&amp;quot;no&amp;quot; tabindex=&amp;quot;0&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;l-line&amp;quot; data-line=&amp;quot;1&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;--lumis-latte:#7287fd; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#b4befe; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;services&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;--lumis-latte:#7c7f93; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#9399b2; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;:&amp;lt;/span&amp;gt;
&amp;lt;/div&amp;gt;&amp;lt;div class=&amp;quot;l-line&amp;quot; data-line=&amp;quot;2&amp;quot;&amp;gt;  &amp;lt;span style=&amp;quot;--lumis-latte:#7287fd; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#b4befe; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;collabora&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;--lumis-latte:#7c7f93; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#9399b2; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;:&amp;lt;/span&amp;gt;
&amp;lt;/div&amp;gt;&amp;lt;div class=&amp;quot;l-line&amp;quot; data-line=&amp;quot;3&amp;quot;&amp;gt;    &amp;lt;span style=&amp;quot;--lumis-latte:#7287fd; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#b4befe; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;image&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;--lumis-latte:#7c7f93; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#9399b2; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;:&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;--lumis-latte:#40a02b; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#a6e3a1; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;collabora/code&amp;lt;/span&amp;gt;
&amp;lt;/div&amp;gt;&amp;lt;div class=&amp;quot;l-line&amp;quot; data-line=&amp;quot;4&amp;quot;&amp;gt;    &amp;lt;span style=&amp;quot;--lumis-latte:#7287fd; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#b4befe; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;healthcheck&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;--lumis-latte:#7c7f93; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#9399b2; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;:&amp;lt;/span&amp;gt;
&amp;lt;/div&amp;gt;&amp;lt;div class=&amp;quot;l-line&amp;quot; data-line=&amp;quot;5&amp;quot;&amp;gt;      &amp;lt;span style=&amp;quot;--lumis-latte:#7287fd; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#b4befe; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;test&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;--lumis-latte:#7c7f93; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#9399b2; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;:&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;--lumis-latte:#40a02b; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#a6e3a1; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;bash -c &amp;amp;quot;exec 6&amp;amp;lt;&amp;amp;gt; /dev/tcp/localhost/9980&amp;amp;quot;&amp;lt;/span&amp;gt;
&amp;lt;/div&amp;gt;&amp;lt;div class=&amp;quot;l-line&amp;quot; data-line=&amp;quot;6&amp;quot;&amp;gt;      &amp;lt;span style=&amp;quot;--lumis-latte:#7287fd; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#b4befe; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;interval&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;--lumis-latte:#7c7f93; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#9399b2; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;:&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;--lumis-latte:#40a02b; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#a6e3a1; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;15s&amp;lt;/span&amp;gt;
&amp;lt;/div&amp;gt;&amp;lt;div class=&amp;quot;l-line&amp;quot; data-line=&amp;quot;7&amp;quot;&amp;gt;      &amp;lt;span style=&amp;quot;--lumis-latte:#7287fd; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#b4befe; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;retries&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;--lumis-latte:#7c7f93; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#9399b2; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;:&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;--lumis-latte:#fe640b; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#fab387; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;5&amp;lt;/span&amp;gt;
&amp;lt;/div&amp;gt;&amp;lt;div class=&amp;quot;l-line&amp;quot; data-line=&amp;quot;8&amp;quot;&amp;gt;      &amp;lt;span style=&amp;quot;--lumis-latte:#7287fd; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#b4befe; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;start_period&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;--lumis-latte:#7c7f93; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#9399b2; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;:&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;--lumis-latte:#40a02b; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#a6e3a1; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;60s&amp;lt;/span&amp;gt;
&amp;lt;/div&amp;gt;&amp;lt;div class=&amp;quot;l-line&amp;quot; data-line=&amp;quot;9&amp;quot;&amp;gt;      &amp;lt;span style=&amp;quot;--lumis-latte:#7287fd; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#b4befe; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;timeout&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;--lumis-latte:#7c7f93; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#9399b2; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;:&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;--lumis-latte:#40a02b; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#a6e3a1; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;10s&amp;lt;/span&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;exec 6&amp;amp;lt;&amp;amp;gt; /dev/tcp/localhost/9980&amp;lt;/code&amp;gt; tries to open file descriptor 6 as a read-write connection to &amp;lt;code&amp;gt;localhost:9980&amp;lt;/code&amp;gt;.
If the port is not listening, it fails and the healthcheck reports unhealthy.&amp;lt;/p&amp;gt;</content>
    <published>2025-05-16T00:00:00Z</published>
    <author>
      <name>Phil-Bastian Berndt</name>
    </author>
    <link href="https://pbb.io/blog/docker-healthcheck-bash-tcp"/>
    <id>https://pbb.io/blog/docker-healthcheck-bash-tcp</id>
    <title>TIL how to check if a port is open using only Bash</title>
    <updated>2025-05-16T00:00:00Z</updated>
  </entry>
  <entry>
    <content type="html">&amp;lt;p&amp;gt;Tailwind 4 exposes all theme values as CSS custom properties, so you can read them from JavaScript via &amp;lt;code&amp;gt;getComputedStyle&amp;lt;/code&amp;gt; without importing any config:&amp;lt;/p&amp;gt;
&amp;lt;pre class=&amp;quot;lumis lumis-themes latte mocha&amp;quot; style=&amp;quot;--lumis-latte:#4c4f69; --lumis-latte-bg:#eff1f5; --lumis-mocha:#cdd6f4; --lumis-mocha-bg:#1e1e2e;&amp;quot;&amp;gt;&amp;lt;code class=&amp;quot;language-javascript&amp;quot; translate=&amp;quot;no&amp;quot; tabindex=&amp;quot;0&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;l-line&amp;quot; data-line=&amp;quot;1&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;--lumis-latte:#8839ef; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#cba6f7; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;const&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;--lumis-latte:#4c4f69; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#cdd6f4; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;styles&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;--lumis-latte:#04a5e5; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#89dceb; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;=&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;--lumis-latte:#1e66f5; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#89b4fa; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;getComputedStyle&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;--lumis-latte:#7c7f93; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#9399b2; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;(&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;--lumis-latte:#d20f39; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#f38ba8; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;document&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;--lumis-latte:#7c7f93; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#9399b2; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;--lumis-latte:#7287fd; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#b4befe; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;documentElement&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;--lumis-latte:#7c7f93; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#9399b2; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;)&amp;lt;/span&amp;gt;
&amp;lt;/div&amp;gt;&amp;lt;div class=&amp;quot;l-line&amp;quot; data-line=&amp;quot;2&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;--lumis-latte:#8839ef; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#cba6f7; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;const&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;--lumis-latte:#4c4f69; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#cdd6f4; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;primary&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;--lumis-latte:#04a5e5; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#89dceb; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;=&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;--lumis-latte:#4c4f69; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#cdd6f4; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;styles&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;--lumis-latte:#7c7f93; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#9399b2; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;--lumis-latte:#1e66f5; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#89b4fa; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;getPropertyValue&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;--lumis-latte:#7c7f93; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#9399b2; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;(&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;--lumis-latte:#40a02b; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#a6e3a1; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;&amp;amp;quot;--color-primary&amp;amp;quot;&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;--lumis-latte:#7c7f93; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#9399b2; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;)&amp;lt;/span&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;
&amp;lt;p&amp;gt;I used this to style the topbar loading indicator with my theme’s primary color instead of a hardcoded value:&amp;lt;/p&amp;gt;
&amp;lt;pre class=&amp;quot;lumis lumis-themes latte mocha&amp;quot; style=&amp;quot;--lumis-latte:#4c4f69; --lumis-latte-bg:#eff1f5; --lumis-mocha:#cdd6f4; --lumis-mocha-bg:#1e1e2e;&amp;quot;&amp;gt;&amp;lt;code class=&amp;quot;language-javascript&amp;quot; translate=&amp;quot;no&amp;quot; tabindex=&amp;quot;0&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;l-line&amp;quot; data-line=&amp;quot;1&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;--lumis-latte:#4c4f69; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#cdd6f4; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;topbar&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;--lumis-latte:#7c7f93; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#9399b2; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;--lumis-latte:#1e66f5; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#89b4fa; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;config&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;--lumis-latte:#7c7f93; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#9399b2; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;({&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;--lumis-latte:#7287fd; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#b4befe; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;barColors&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;--lumis-latte:#7c7f93; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#9399b2; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;:&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;--lumis-latte:#7c7f93; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#9399b2; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;{&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;--lumis-latte:#fe640b; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#fab387; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;0&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;--lumis-latte:#7c7f93; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#9399b2; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;:&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;--lumis-latte:#4c4f69; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#cdd6f4; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;styles&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;--lumis-latte:#7c7f93; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#9399b2; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;--lumis-latte:#1e66f5; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#89b4fa; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;getPropertyValue&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;--lumis-latte:#7c7f93; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#9399b2; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;(&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;--lumis-latte:#40a02b; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#a6e3a1; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;&amp;amp;quot;--color-primary&amp;amp;quot;&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;--lumis-latte:#7c7f93; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#9399b2; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;)&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;--lumis-latte:#7c7f93; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#9399b2; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;}&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;--lumis-latte:#7c7f93; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#9399b2; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;})&amp;lt;/span&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;
&amp;lt;p&amp;gt;This keeps the color in sync with the theme automatically.&amp;lt;/p&amp;gt;</content>
    <published>2025-04-19T00:00:00Z</published>
    <author>
      <name>Phil-Bastian Berndt</name>
    </author>
    <link href="https://pbb.io/blog/tailwind-theme-vars-in-js"/>
    <id>https://pbb.io/blog/tailwind-theme-vars-in-js</id>
    <title>TIL how to reference Tailwind 4 theme variables in JavaScript</title>
    <updated>2025-04-19T00:00:00Z</updated>
  </entry>
  <entry>
    <content type="html">&amp;lt;p&amp;gt;If you have a Kubernetes CronJob that runs every minute and a job fails, the failed pod sticks around with its resource
reservations still held. With a new pod spawning every minute, your cluster resources can be exhausted very quickly.&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;Consider either removing resource requests from frequent CronJobs or setting a strict &amp;lt;code&amp;gt;failedJobsHistoryLimit&amp;lt;/code&amp;gt;:&amp;lt;/p&amp;gt;
&amp;lt;pre class=&amp;quot;lumis lumis-themes latte mocha&amp;quot; style=&amp;quot;--lumis-latte:#4c4f69; --lumis-latte-bg:#eff1f5; --lumis-mocha:#cdd6f4; --lumis-mocha-bg:#1e1e2e;&amp;quot;&amp;gt;&amp;lt;code class=&amp;quot;language-yaml&amp;quot; translate=&amp;quot;no&amp;quot; tabindex=&amp;quot;0&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;l-line&amp;quot; data-line=&amp;quot;1&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;--lumis-latte:#7287fd; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#b4befe; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;apiVersion&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;--lumis-latte:#7c7f93; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#9399b2; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;:&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;--lumis-latte:#40a02b; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#a6e3a1; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;batch/v1&amp;lt;/span&amp;gt;
&amp;lt;/div&amp;gt;&amp;lt;div class=&amp;quot;l-line&amp;quot; data-line=&amp;quot;2&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;--lumis-latte:#7287fd; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#b4befe; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;kind&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;--lumis-latte:#7c7f93; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#9399b2; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;:&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;--lumis-latte:#40a02b; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#a6e3a1; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;CronJob&amp;lt;/span&amp;gt;
&amp;lt;/div&amp;gt;&amp;lt;div class=&amp;quot;l-line&amp;quot; data-line=&amp;quot;3&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;--lumis-latte:#7287fd; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#b4befe; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;metadata&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;--lumis-latte:#7c7f93; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#9399b2; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;:&amp;lt;/span&amp;gt;
&amp;lt;/div&amp;gt;&amp;lt;div class=&amp;quot;l-line&amp;quot; data-line=&amp;quot;4&amp;quot;&amp;gt;  &amp;lt;span style=&amp;quot;--lumis-latte:#7287fd; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#b4befe; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;name&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;--lumis-latte:#7c7f93; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#9399b2; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;:&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;--lumis-latte:#40a02b; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#a6e3a1; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;my-job&amp;lt;/span&amp;gt;
&amp;lt;/div&amp;gt;&amp;lt;div class=&amp;quot;l-line&amp;quot; data-line=&amp;quot;5&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;--lumis-latte:#7287fd; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#b4befe; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;spec&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;--lumis-latte:#7c7f93; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#9399b2; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;:&amp;lt;/span&amp;gt;
&amp;lt;/div&amp;gt;&amp;lt;div class=&amp;quot;l-line&amp;quot; data-line=&amp;quot;6&amp;quot;&amp;gt;  &amp;lt;span style=&amp;quot;--lumis-latte:#7287fd; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#b4befe; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;schedule&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;--lumis-latte:#7c7f93; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#9399b2; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;:&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;--lumis-latte:#40a02b; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#a6e3a1; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;&amp;amp;quot;* * * * *&amp;amp;quot;&amp;lt;/span&amp;gt;
&amp;lt;/div&amp;gt;&amp;lt;div class=&amp;quot;l-line&amp;quot; data-line=&amp;quot;7&amp;quot;&amp;gt;  &amp;lt;span style=&amp;quot;--lumis-latte:#7287fd; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#b4befe; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;failedJobsHistoryLimit&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;--lumis-latte:#7c7f93; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#9399b2; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;:&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;--lumis-latte:#fe640b; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#fab387; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;1&amp;lt;/span&amp;gt;
&amp;lt;/div&amp;gt;&amp;lt;div class=&amp;quot;l-line&amp;quot; data-line=&amp;quot;8&amp;quot;&amp;gt;  &amp;lt;span style=&amp;quot;--lumis-latte:#7287fd; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#b4befe; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;jobTemplate&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;--lumis-latte:#7c7f93; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#9399b2; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;:&amp;lt;/span&amp;gt;
&amp;lt;/div&amp;gt;&amp;lt;div class=&amp;quot;l-line&amp;quot; data-line=&amp;quot;9&amp;quot;&amp;gt;    &amp;lt;span style=&amp;quot;--lumis-latte:#7287fd; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#b4befe; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;spec&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;--lumis-latte:#7c7f93; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#9399b2; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;:&amp;lt;/span&amp;gt;
&amp;lt;/div&amp;gt;&amp;lt;div class=&amp;quot;l-line&amp;quot; data-line=&amp;quot;10&amp;quot;&amp;gt;      &amp;lt;span style=&amp;quot;--lumis-latte:#7287fd; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#b4befe; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;template&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;--lumis-latte:#7c7f93; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#9399b2; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;:&amp;lt;/span&amp;gt;
&amp;lt;/div&amp;gt;&amp;lt;div class=&amp;quot;l-line&amp;quot; data-line=&amp;quot;11&amp;quot;&amp;gt;        &amp;lt;span style=&amp;quot;--lumis-latte:#7287fd; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#b4befe; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;spec&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;--lumis-latte:#7c7f93; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#9399b2; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;:&amp;lt;/span&amp;gt;
&amp;lt;/div&amp;gt;&amp;lt;div class=&amp;quot;l-line&amp;quot; data-line=&amp;quot;12&amp;quot;&amp;gt;          &amp;lt;span style=&amp;quot;--lumis-latte:#7287fd; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#b4befe; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;containers&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;--lumis-latte:#7c7f93; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#9399b2; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;:&amp;lt;/span&amp;gt;
&amp;lt;/div&amp;gt;&amp;lt;div class=&amp;quot;l-line&amp;quot; data-line=&amp;quot;13&amp;quot;&amp;gt;            &amp;lt;span style=&amp;quot;--lumis-latte:#7c7f93; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#9399b2; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;-&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;--lumis-latte:#7287fd; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#b4befe; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;name&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;--lumis-latte:#7c7f93; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#9399b2; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;:&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;--lumis-latte:#40a02b; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#a6e3a1; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;my-job&amp;lt;/span&amp;gt;
&amp;lt;/div&amp;gt;&amp;lt;div class=&amp;quot;l-line&amp;quot; data-line=&amp;quot;14&amp;quot;&amp;gt;              &amp;lt;span style=&amp;quot;--lumis-latte:#7287fd; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#b4befe; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;image&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;--lumis-latte:#7c7f93; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#9399b2; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;:&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;--lumis-latte:#40a02b; --lumis-latte-font-style:normal; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#a6e3a1; --lumis-mocha-font-style:normal; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;my-image&amp;lt;/span&amp;gt;
&amp;lt;/div&amp;gt;&amp;lt;div class=&amp;quot;l-line&amp;quot; data-line=&amp;quot;15&amp;quot;&amp;gt;              &amp;lt;span style=&amp;quot;--lumis-latte:#7c7f93; --lumis-latte-font-style:italic; --lumis-latte-font-weight:normal; --lumis-latte-text-decoration:none; --lumis-mocha:#9399b2; --lumis-mocha-font-style:italic; --lumis-mocha-font-weight:normal; --lumis-mocha-text-decoration:none;&amp;quot;&amp;gt;# no resources.requests here&amp;lt;/span&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;
&amp;lt;p&amp;gt;Without this, a single downstream outage can cascade into cluster-wide resource pressure just from piling up failed pods.&amp;lt;/p&amp;gt;</content>
    <published>2025-02-06T00:00:00Z</published>
    <author>
      <name>Phil-Bastian Berndt</name>
    </author>
    <link href="https://pbb.io/blog/k8s-cronjob-resource-reservations"/>
    <id>https://pbb.io/blog/k8s-cronjob-resource-reservations</id>
    <title>TIL not to use resource reservations on frequent Kubernetes CronJobs</title>
    <updated>2025-02-06T00:00:00Z</updated>
  </entry>
</feed>