<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="/pretty-feed-v3.xsl" type="text/xsl"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
    <title>Luke Hsiao's blog</title>
    <link href="https://luke.hsiao.dev/atom.xml" rel="self" type="application/atom+xml"/>
    <link href="https://luke.hsiao.dev/"/>
    <generator uri="https://www.getzola.org/">Zola</generator>
    <updated>2026-07-07T00:00:00+00:00</updated>
    <id>https://luke.hsiao.dev/atom.xml</id>
    <entry xml:lang="en">
        <title>Omarchy on an ASUS CN60 Chromebox</title>
        <author>
          <name>Luke Hsiao</name>
        </author>
        <published>2026-07-06T00:00:00+00:00</published>
        <updated>2026-07-06T00:00:00+00:00</updated>
        <link href="https://luke.hsiao.dev/blog/omarchy-on-chromebox/"/>
        <link rel="alternate" href="https://luke.hsiao.dev/blog/omarchy-on-chromebox/" type="text/html"/>
        <id>https://luke.hsiao.dev/blog/omarchy-on-chromebox/</id>
        <summary type="html">Turns out it is surprisingly easy to get some more life out of an old Chromebox. This post is some notes on installing the custom coreboot firmware and what it took to run Omarchy.</summary>
        <content type="html">&lt;h2 id=&quot;background&quot;&gt;Background&lt;a class=&quot;zola-anchor&quot; href=&quot;#background&quot; aria-label=&quot;Anchor link for: background&quot; title=&quot;Anchor link for: background&quot;&gt;&lt;svg
    xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;
    stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;
    class=&quot;icon icon-tabler icons-tabler-outline icon-tabler-link&quot; focusable=&quot;false&quot;&gt;
    &lt;path stroke=&quot;none&quot; d=&quot;M0 0h24v24H0z&quot; fill=&quot;none&quot; &#x2F;&gt;
    &lt;path d=&quot;M9 15l6 -6&quot; &#x2F;&gt;
    &lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; &#x2F;&gt;
    &lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; &#x2F;&gt;
  &lt;&#x2F;svg&gt;&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;If you haven’t noticed, AI and the datacenter build-out have taken a real toll on personal computing.
Prices of RAM, NVMe, GPUs, and more have grown astronomically.
As a point-in-time example, the desktop workstation I &lt;a href=&quot;https:&#x2F;&#x2F;luke.hsiao.dev&#x2F;blog&#x2F;2023-workstation-build&#x2F;&quot;&gt;built in 2023&lt;&#x2F;a&gt; for $2075.29 (including tax) now costs $3459.48 (before tax).
That is nearly a 67% increase before tax!&lt;&#x2F;p&gt;
&lt;p&gt;Even before personal computing started getting so expensive, I’ve always been a fan of reducing and reusing old electronics, as have many others [&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;drewdevault.com&#x2F;2020&#x2F;02&#x2F;18&#x2F;Fucking-laptops.html&quot;&gt;1&lt;&#x2F;a&gt;, &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;solar.lowtechmagazine.com&#x2F;2020&#x2F;12&#x2F;how-and-why-i-stopped-buying-new-laptops&quot;&gt;2&lt;&#x2F;a&gt;, &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;atthis.link&#x2F;blog&#x2F;2021&#x2F;reassesstech.html&quot;&gt;3&lt;&#x2F;a&gt;].
But I’m also practical.
There’s a moving threshold: machines older than that often aren’t worth the extra work, or are too slow even for light use.
That threshold is different for everyone.
When the stars align, it feels great to get some use out of an old computer that would’ve otherwise been destined to be e-waste.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;an-asus-cn60-chromebox&quot;&gt;An ASUS CN60 Chromebox&lt;a class=&quot;zola-anchor&quot; href=&quot;#an-asus-cn60-chromebox&quot; aria-label=&quot;Anchor link for: an-asus-cn60-chromebox&quot; title=&quot;Anchor link for: an-asus-cn60-chromebox&quot;&gt;&lt;svg
    xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;
    stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;
    class=&quot;icon icon-tabler icons-tabler-outline icon-tabler-link&quot; focusable=&quot;false&quot;&gt;
    &lt;path stroke=&quot;none&quot; d=&quot;M0 0h24v24H0z&quot; fill=&quot;none&quot; &#x2F;&gt;
    &lt;path d=&quot;M9 15l6 -6&quot; &#x2F;&gt;
    &lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; &#x2F;&gt;
    &lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; &#x2F;&gt;
  &lt;&#x2F;svg&gt;&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Recently, I happened on an old ASUS CN60 Chromebox from March 2014.
This is a dated x86_64 machine that came configured with an Intel Celeron 2955U, 2GB DDR3-1600, and a 16GB SATA SSD.
This machine stopped receiving ChromeOS updates in &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;support.google.com&#x2F;chrome&#x2F;a&#x2F;answer&#x2F;6220366?hl=en#zippy=%2Casus&quot;&gt;September 2019&lt;&#x2F;a&gt;.
(Side rant: this artificial EOL for Chrome devices is responsible for so much e-waste it hurts to think about.)&lt;&#x2F;p&gt;
&lt;p&gt;I have fond memories of using an ASUS C720 Chromebook for most of my college degree, running Linux via crouton.&lt;&#x2F;p&gt;
&lt;p&gt;I was curious to see how running Linux felt on these old Chromeboxes, and I was pleasantly surprised!&lt;&#x2F;p&gt;
&lt;h2 id=&quot;installing-new-firmware&quot;&gt;Installing new firmware&lt;a class=&quot;zola-anchor&quot; href=&quot;#installing-new-firmware&quot; aria-label=&quot;Anchor link for: installing-new-firmware&quot; title=&quot;Anchor link for: installing-new-firmware&quot;&gt;&lt;svg
    xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;
    stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;
    class=&quot;icon icon-tabler icons-tabler-outline icon-tabler-link&quot; focusable=&quot;false&quot;&gt;
    &lt;path stroke=&quot;none&quot; d=&quot;M0 0h24v24H0z&quot; fill=&quot;none&quot; &#x2F;&gt;
    &lt;path d=&quot;M9 15l6 -6&quot; &#x2F;&gt;
    &lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; &#x2F;&gt;
    &lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; &#x2F;&gt;
  &lt;&#x2F;svg&gt;&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;The world of Linux on Chrome devices had moved quite a bit since I last tinkered.
For example, I learned that there is now a nice UEFI Full ROM replacement via &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;docs.mrchromebox.tech&#x2F;docs&#x2F;getting-started.html&quot;&gt;MrChromebox.tech&lt;&#x2F;a&gt;.
In the case of the CN60 (HWID &lt;code&gt;PANTHER&lt;&#x2F;code&gt;), this was as easy as removing the write-protect screw.&lt;&#x2F;p&gt;
&lt;figure &gt;
  &lt;a href=&quot;https:&amp;#x2F;&amp;#x2F;docs.mrchromebox.tech&amp;#x2F;images&amp;#x2F;wp&amp;#x2F;panther_wp.jpg&quot;&gt;
    &lt;img src=&quot;https:&amp;#x2F;&amp;#x2F;docs.mrchromebox.tech&amp;#x2F;images&amp;#x2F;wp&amp;#x2F;panther_wp.jpg&quot; alt=&quot;CN60 write protect screw location&quot; style=&quot;background-color: white;&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  &lt;figcaption&gt;
    The location of the write-protect screw, courtesy MrChromebox.tech.
  &lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;I followed the instructions (Developer Mode, terminal, run the firmware utility script) and it all worked first try.&lt;&#x2F;p&gt;












&lt;div class=&quot;aside aside--tip&quot;&gt;
  &lt;div class=&quot;aside__header&quot; role=&quot;heading&quot; aria-level=&quot;3&quot;&gt;
    &lt;div class=&quot;aside__icon&quot; aria-hidden=&quot;true&quot;&gt;
      
      &lt;svg xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot;
        stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;
        class=&quot;icon icon-tabler icons-tabler-outline icon-tabler-rocket&quot;&gt;
        &lt;path stroke=&quot;none&quot; d=&quot;M0 0h24v24H0z&quot; fill=&quot;none&quot; &#x2F;&gt;
        &lt;path d=&quot;M4 13a8 8 0 0 1 7 7a6 6 0 0 0 3 -5a9 9 0 0 0 6 -8a3 3 0 0 0 -3 -3a9 9 0 0 0 -8 6a6 6 0 0 0 -5 3&quot; &#x2F;&gt;
        &lt;path d=&quot;M7 14a6 6 0 0 0 -3 6a6 6 0 0 0 6 -3&quot; &#x2F;&gt;
        &lt;path d=&quot;M15 9m-1 0a1 1 0 1 0 2 0a1 1 0 1 0 -2 0&quot; &#x2F;&gt;
      &lt;&#x2F;svg&gt;
      
    &lt;&#x2F;div&gt;

    &lt;span class=&quot;aside__title&quot;&gt;Tip&lt;&#x2F;span&gt;
  &lt;&#x2F;div&gt;

  &lt;div class=&quot;aside__body&quot;&gt;&lt;p&gt;I ran into one unique issue during this process: the CN60 does not seem to be able to connect to a high-resolution display on initial boot.
For example, connecting it to my 4K monitor via HDMI or DisplayPort resulted in just a black screen, leaving me unable to get into Developer Mode.
Connecting it to an older 1080p monitor worked just fine.&lt;&#x2F;p&gt;
&lt;&#x2F;div&gt;
&lt;&#x2F;div&gt;&lt;h2 id=&quot;installing-omarchy&quot;&gt;Installing Omarchy&lt;a class=&quot;zola-anchor&quot; href=&quot;#installing-omarchy&quot; aria-label=&quot;Anchor link for: installing-omarchy&quot; title=&quot;Anchor link for: installing-omarchy&quot;&gt;&lt;svg
    xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;
    stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;
    class=&quot;icon icon-tabler icons-tabler-outline icon-tabler-link&quot; focusable=&quot;false&quot;&gt;
    &lt;path stroke=&quot;none&quot; d=&quot;M0 0h24v24H0z&quot; fill=&quot;none&quot; &#x2F;&gt;
    &lt;path d=&quot;M9 15l6 -6&quot; &#x2F;&gt;
    &lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; &#x2F;&gt;
    &lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; &#x2F;&gt;
  &lt;&#x2F;svg&gt;&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;With the firmware replacement done, I moved on to installing Omarchy.
My first attempt at this failed: I ran out of disk space.
It turns out 16GB is not enough for the Omarchy installer!&lt;&#x2F;p&gt;
&lt;p&gt;Because I wanted to see how my “normal” distribution worked (rather than some intentionally stripped-down, lightweight distro), I got a 64GB SATA SSD off eBay for $10 shipped and tried again.&lt;&#x2F;p&gt;












&lt;div class=&quot;aside aside--tip&quot;&gt;
  &lt;div class=&quot;aside__header&quot; role=&quot;heading&quot; aria-level=&quot;3&quot;&gt;
    &lt;div class=&quot;aside__icon&quot; aria-hidden=&quot;true&quot;&gt;
      
      &lt;svg xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot;
        stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;
        class=&quot;icon icon-tabler icons-tabler-outline icon-tabler-rocket&quot;&gt;
        &lt;path stroke=&quot;none&quot; d=&quot;M0 0h24v24H0z&quot; fill=&quot;none&quot; &#x2F;&gt;
        &lt;path d=&quot;M4 13a8 8 0 0 1 7 7a6 6 0 0 0 3 -5a9 9 0 0 0 6 -8a3 3 0 0 0 -3 -3a9 9 0 0 0 -8 6a6 6 0 0 0 -5 3&quot; &#x2F;&gt;
        &lt;path d=&quot;M7 14a6 6 0 0 0 -3 6a6 6 0 0 0 6 -3&quot; &#x2F;&gt;
        &lt;path d=&quot;M15 9m-1 0a1 1 0 1 0 2 0a1 1 0 1 0 -2 0&quot; &#x2F;&gt;
      &lt;&#x2F;svg&gt;
      
    &lt;&#x2F;div&gt;

    &lt;span class=&quot;aside__title&quot;&gt;Tip&lt;&#x2F;span&gt;
  &lt;&#x2F;div&gt;

  &lt;div class=&quot;aside__body&quot;&gt;&lt;p&gt;This is fairly specific to Omarchy.
A more lightweight distribution may work without a higher-capacity SSD.&lt;&#x2F;p&gt;
&lt;&#x2F;div&gt;
&lt;&#x2F;div&gt;&lt;figure &gt;
  &lt;a href=&quot;.&amp;#x2F;assets&amp;#x2F;opened-up.jpg&quot;&gt;
    &lt;img src=&quot;.&amp;#x2F;assets&amp;#x2F;opened-up.jpg&quot; alt=&quot;Opened up&quot; style=&quot;background-color: white;&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  &lt;figcaption&gt;
    After the SSD upgrade.
  &lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;figure &gt;
  &lt;a href=&quot;.&amp;#x2F;assets&amp;#x2F;install-time.jpg&quot;&gt;
    &lt;img src=&quot;.&amp;#x2F;assets&amp;#x2F;install-time.jpg&quot; alt=&quot;Install time screenshot&quot; style=&quot;background-color: white;&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  &lt;figcaption&gt;
    It took 12 minutes, 20 seconds to install.
  &lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;No issues!&lt;&#x2F;p&gt;
&lt;p&gt;After a reboot, I was once again surprised that everything just worked.&lt;&#x2F;p&gt;
&lt;figure &gt;
  &lt;a href=&quot;.&amp;#x2F;assets&amp;#x2F;fastfetch.png&quot;&gt;
    &lt;img src=&quot;.&amp;#x2F;assets&amp;#x2F;fastfetch.png&quot; alt=&quot;Screenshot of fastfetch&quot; style=&quot;background-color: white;&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  &lt;figcaption&gt;
    Fastfetch output in Omarchy.
  &lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;The machine is quite slow; it scores about &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;browser.geekbench.com&#x2F;v6&#x2F;cpu&#x2F;18624080&quot;&gt;280&#x2F;420 single-&#x2F;multi-core on Geekbench 6&lt;&#x2F;a&gt;.
But slow is enough for some use cases.
I also suspect adding RAM for dual-channel memory would noticeably speed things up.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;wrapping-up&quot;&gt;Wrapping up&lt;a class=&quot;zola-anchor&quot; href=&quot;#wrapping-up&quot; aria-label=&quot;Anchor link for: wrapping-up&quot; title=&quot;Anchor link for: wrapping-up&quot;&gt;&lt;svg
    xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;
    stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;
    class=&quot;icon icon-tabler icons-tabler-outline icon-tabler-link&quot; focusable=&quot;false&quot;&gt;
    &lt;path stroke=&quot;none&quot; d=&quot;M0 0h24v24H0z&quot; fill=&quot;none&quot; &#x2F;&gt;
    &lt;path d=&quot;M9 15l6 -6&quot; &#x2F;&gt;
    &lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; &#x2F;&gt;
    &lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; &#x2F;&gt;
  &lt;&#x2F;svg&gt;&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Of course, this machine is slow and only has 2GB of RAM (though this is upgradable).
I’m not going to use it as a dev machine any time soon.
But for some use cases like a silent garage PC for watching YouTube videos, this still works excellently.&lt;&#x2F;p&gt;
&lt;p&gt;The process was easy, especially compared to &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;franklinstrube.com&#x2F;blog&#x2F;omarchy-acer-c720-chromebook&quot;&gt;someone else’s experience installing Omarchy on a Chromebook&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Linux on the desktop has come a long way, and I’m impressed by the custom firmware process.
I’ll definitely be keeping my eye out for other ways to make use of discarded ChromeOS hardware in the future.&lt;&#x2F;p&gt;
&lt;p&gt;If you have old hardware, I hope you give it a chance for a second life, whether that’s putting it to use yourself or passing it on cheap (or free!) to someone else.&lt;&#x2F;p&gt;
</content>
    </entry>
    <entry xml:lang="en">
        <title>Tip: creating a recurring 5th Sunday event in Google Calendar</title>
        <author>
          <name>Luke Hsiao</name>
        </author>
        <published>2026-05-03T00:00:00+00:00</published>
        <updated>2026-05-03T00:00:00+00:00</updated>
        <link href="https://luke.hsiao.dev/blog/5th-sunday-recurring/"/>
        <link rel="alternate" href="https://luke.hsiao.dev/blog/5th-sunday-recurring/" type="text/html"/>
        <id>https://luke.hsiao.dev/blog/5th-sunday-recurring/</id>
        <summary type="html">Here&#x27;s a workaround for creating a recurring event on a 5th Sunday in Google Calendar.</summary>
        <content type="html">&lt;p&gt;I occasionally have the need to create a recurring calendar event on a cadence that isn’t natively supported by Google Calendar.
The most prominent example of this is an event that occurs on every 5th Sunday of the month, if one exists.
This is very different than the “last” Sunday of the month.&lt;&#x2F;p&gt;
&lt;p&gt;One nice workaround that seems to work well is to create an ICS file with the native 5th Sunday syntax and import it.&lt;&#x2F;p&gt;
&lt;p&gt;Here’s an example file for an all-day event.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #CDD6F4; background-color: #1E1E2E;&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;BEGIN:VCALENDAR&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;VERSION:2.0&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;PRODID:-&#x2F;&#x2F;x&#x2F;&#x2F;EN&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;BEGIN:VEVENT&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;UID:5sun@x&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;DTSTAMP:20260503T000000Z&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;DTSTART;VALUE=DATE:20260531&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;RRULE:FREQ=MONTHLY;BYDAY=5SU&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;SUMMARY:5th Sunday Event&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;END:VEVENT&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;END:VCALENDAR&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The secret is the &lt;code&gt;RRULE:FREQ=MONTHLY;BYDAY=5SU&lt;&#x2F;code&gt; rule, which expresses the logic we want.&lt;&#x2F;p&gt;
&lt;p&gt;Here is another example for an event with a specific time window.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #CDD6F4; background-color: #1E1E2E;&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;BEGIN:VCALENDAR&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;VERSION:2.0&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;PRODID:-&#x2F;&#x2F;x&#x2F;&#x2F;EN&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;BEGIN:VEVENT&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;UID:5sun@x&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;DTSTAMP:20260503T000000Z&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;DTSTART;TZID=America&#x2F;Denver:20260531T093000&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;DTEND;TZID=America&#x2F;Denver:20260531T103000&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;RRULE:FREQ=MONTHLY;BYDAY=5SU&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;SUMMARY:5th Sunday Event&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;END:VEVENT&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;END:VCALENDAR&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Copy-paste the appropriate data into a text file with a &lt;code&gt;.ics&lt;&#x2F;code&gt; file extension and import it into Google Calendar, then you can update the title and whatnot as you please.&lt;&#x2F;p&gt;
</content>
    </entry>
    <entry xml:lang="en">
        <title>Using a USB switch as a full KVM</title>
        <author>
          <name>Luke Hsiao</name>
        </author>
        <published>2026-03-31T00:00:00+00:00</published>
        <updated>2026-03-31T00:00:00+00:00</updated>
        <link href="https://luke.hsiao.dev/blog/display-switch/"/>
        <link rel="alternate" href="https://luke.hsiao.dev/blog/display-switch/" type="text/html"/>
        <id>https://luke.hsiao.dev/blog/display-switch/</id>
        <summary type="html">I finally got a monitor that supports DDC&#x2F;CI, so now I can easily switch my monitor and full peripheral set with 1 button!</summary>
        <content type="html">&lt;p&gt;I just found a brilliantly easy quality-of-life improvement I needed to share: &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;haimgel&#x2F;display-switch&quot;&gt;&lt;code&gt;display-switch&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;context&quot;&gt;Context&lt;a class=&quot;zola-anchor&quot; href=&quot;#context&quot; aria-label=&quot;Anchor link for: context&quot; title=&quot;Anchor link for: context&quot;&gt;&lt;svg
    xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;
    stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;
    class=&quot;icon icon-tabler icons-tabler-outline icon-tabler-link&quot; focusable=&quot;false&quot;&gt;
    &lt;path stroke=&quot;none&quot; d=&quot;M0 0h24v24H0z&quot; fill=&quot;none&quot; &#x2F;&gt;
    &lt;path d=&quot;M9 15l6 -6&quot; &#x2F;&gt;
    &lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; &#x2F;&gt;
    &lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; &#x2F;&gt;
  &lt;&#x2F;svg&gt;&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;I’m the type of person who &lt;a href=&quot;https:&#x2F;&#x2F;luke.hsiao.dev&#x2F;blog&#x2F;investing-in-interfaces&#x2F;&quot;&gt;invests in interfaces&lt;&#x2F;a&gt;.
Consequently, I generally like to work at my desk, with my chosen peripherals and tools.
Typically, the two most common computers I use there are a work-issued MacBook, and a personal &lt;a href=&quot;https:&#x2F;&#x2F;luke.hsiao.dev&#x2F;blog&#x2F;2023-workstation-build&#x2F;&quot;&gt;workstation&lt;&#x2F;a&gt; running Linux.
I want to switch between them without dealing with a lot of plugging and unplugging of cables.&lt;&#x2F;p&gt;
&lt;p&gt;For years, my solution was to use a USB switch with my monitor plugged into both computers simultaneously (e.g., one via USB-C, one via DisplayPort).
When I’d switch, I’d click my USB switch to flip my five peripherals (mouse, keyboard, webcam, USB audio interface, YubiKey).
Then, I’d toggle my monitor’s menu to switch inputs.
This is fine.&lt;&#x2F;p&gt;
&lt;p&gt;The USB switch is nice because even if a monitor has built-in KVM functionality, it rarely has enough ports for my use case.
They also often have fatal design flaws that make them not very functional.&lt;&#x2F;p&gt;
&lt;p&gt;Today, my USB switch broke.
Naturally, I took it as an opportunity to revisit the space and see how I could improve my setup.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;what-i-found&quot;&gt;What I found&lt;a class=&quot;zola-anchor&quot; href=&quot;#what-i-found&quot; aria-label=&quot;Anchor link for: what-i-found&quot; title=&quot;Anchor link for: what-i-found&quot;&gt;&lt;svg
    xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;
    stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;
    class=&quot;icon icon-tabler icons-tabler-outline icon-tabler-link&quot; focusable=&quot;false&quot;&gt;
    &lt;path stroke=&quot;none&quot; d=&quot;M0 0h24v24H0z&quot; fill=&quot;none&quot; &#x2F;&gt;
    &lt;path d=&quot;M9 15l6 -6&quot; &#x2F;&gt;
    &lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; &#x2F;&gt;
    &lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; &#x2F;&gt;
  &lt;&#x2F;svg&gt;&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;First, I discovered &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.amazon.com&#x2F;UGREEN-Switcher-Computers-Keyboard-Converter&#x2F;dp&#x2F;B0FDW6Z4J4&quot;&gt;UGREEN&lt;&#x2F;a&gt; makes 2-in, 7-out USB 3.2 switches now.
I picked one up and it’s been great.
I even have two free USB ports now.&lt;&#x2F;p&gt;
&lt;p&gt;Second, and the motivation for this blog post, there are cool software solutions for switching display inputs without touching your monitor settings!&lt;&#x2F;p&gt;
&lt;p&gt;If your monitor supports &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Display_Data_Channel&quot;&gt;DDC&#x2F;CI&lt;&#x2F;a&gt; (display data channel&#x2F;command interface), then it supports being sent commands via software to switch inputs.
With that, you can wire up &lt;code&gt;display-switch&lt;&#x2F;code&gt;, and now your cheap (relative to full-fledged KVMs) USB switch can effectively function as a full KVM, switching your monitor input, too, at the press of a single button!&lt;&#x2F;p&gt;
&lt;p&gt;Simply follow the guide on the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;haimgel&#x2F;display-switch&quot;&gt;&lt;code&gt;display-switch&lt;&#x2F;code&gt; repository README&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;That said, I will leave you with a few tips not covered by the README.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;tip-use-display-switch-for-monitors-normal-kvms-don-t-support&quot;&gt;Tip: use &lt;code&gt;display-switch&lt;&#x2F;code&gt; for monitors normal KVMs don’t support&lt;a class=&quot;zola-anchor&quot; href=&quot;#tip-use-display-switch-for-monitors-normal-kvms-don-t-support&quot; aria-label=&quot;Anchor link for: tip-use-display-switch-for-monitors-normal-kvms-don-t-support&quot; title=&quot;Anchor link for: tip-use-display-switch-for-monitors-normal-kvms-don-t-support&quot;&gt;&lt;svg
    xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;
    stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;
    class=&quot;icon icon-tabler icons-tabler-outline icon-tabler-link&quot; focusable=&quot;false&quot;&gt;
    &lt;path stroke=&quot;none&quot; d=&quot;M0 0h24v24H0z&quot; fill=&quot;none&quot; &#x2F;&gt;
    &lt;path d=&quot;M9 15l6 -6&quot; &#x2F;&gt;
    &lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; &#x2F;&gt;
    &lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; &#x2F;&gt;
  &lt;&#x2F;svg&gt;&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Most KVMs, even higher-end ones, do not support very high resolution displays.
For example, most will do 4K@60Hz or similar.
If you have a higher resolution or refresh-rate monitor, you might have thought that you can’t enjoy the KVM convenience.
&lt;code&gt;display-switch&lt;&#x2F;code&gt; works by assuming you are just directly wired into your monitor on both computers, so this isn’t a problem!&lt;&#x2F;p&gt;
&lt;h3 id=&quot;tip-use-the-brew-path-for-the-service-on-macos&quot;&gt;Tip: use the &lt;code&gt;brew&lt;&#x2F;code&gt; path for the service on macOS&lt;a class=&quot;zola-anchor&quot; href=&quot;#tip-use-the-brew-path-for-the-service-on-macos&quot; aria-label=&quot;Anchor link for: tip-use-the-brew-path-for-the-service-on-macos&quot; title=&quot;Anchor link for: tip-use-the-brew-path-for-the-service-on-macos&quot;&gt;&lt;svg
    xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;
    stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;
    class=&quot;icon icon-tabler icons-tabler-outline icon-tabler-link&quot; focusable=&quot;false&quot;&gt;
    &lt;path stroke=&quot;none&quot; d=&quot;M0 0h24v24H0z&quot; fill=&quot;none&quot; &#x2F;&gt;
    &lt;path d=&quot;M9 15l6 -6&quot; &#x2F;&gt;
    &lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; &#x2F;&gt;
    &lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; &#x2F;&gt;
  &lt;&#x2F;svg&gt;&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;On macOS, it’s simpler to just &lt;code&gt;brew install haimgel&#x2F;tools&#x2F;display_switch&lt;&#x2F;code&gt;.
But, if you do, the README leaves you with a footgun when setting it up to run at startup.
Specifically, the example &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;haimgel&#x2F;display-switch&#x2F;blob&#x2F;b5878f356dc6afcd99928fa614676602572a31b3&#x2F;dev.haim.display-switch.daemon.plist&quot;&gt;&lt;code&gt;dev.haim.display-switch.daemon.plist&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; assumes you have installed it manually and moved it to &lt;code&gt;&#x2F;usr&#x2F;local&#x2F;bin&#x2F;display_switch&lt;&#x2F;code&gt;.
Instead, just install it with &lt;code&gt;brew&lt;&#x2F;code&gt; and update that path to be accurate:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #CDD6F4; background-color: #1E1E2E;&quot;&gt;&lt;code data-lang=&quot;xml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;&amp;lt;?&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;xml&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F9E2AF;&quot;&gt; version&lt;&#x2F;span&gt;&lt;span&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;&amp;quot;1.0&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F9E2AF;&quot;&gt; encoding&lt;&#x2F;span&gt;&lt;span&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;&amp;quot;UTF-8&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;?&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CBA6F7;&quot;&gt;&amp;lt;!DOCTYPE&lt;&#x2F;span&gt;&lt;span&gt; plist PUBLIC &amp;quot;-&#x2F;&#x2F;Apple&#x2F;&#x2F;DTD PLIST 1.0&#x2F;&#x2F;EN&amp;quot; &amp;quot;http:&#x2F;&#x2F;www.apple.com&#x2F;DTDs&#x2F;PropertyList-1.0.dtd&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CBA6F7;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;plist&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F9E2AF;&quot;&gt; version&lt;&#x2F;span&gt;&lt;span&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;&amp;quot;1.0&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;    &amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;dict&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;        &amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;key&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt;Label&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;key&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;        &amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;string&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt;dev.haim.display-switch.daemon&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;string&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;        &amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;key&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt;Program&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;key&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot; style=&quot;background-color: #CDD6F412;&quot;&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;        &amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;string&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt;&#x2F;opt&#x2F;homebrew&#x2F;bin&#x2F;display_switch&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;string&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;        &amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;key&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt;RunAtLoad&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;key&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;        &amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;true&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;&#x2F;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;    &amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;dict&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;plist&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h3 id=&quot;tip-find-usb-device-ids-without-lsusb&quot;&gt;Tip: find USB device IDs without &lt;code&gt;lsusb&lt;&#x2F;code&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#tip-find-usb-device-ids-without-lsusb&quot; aria-label=&quot;Anchor link for: tip-find-usb-device-ids-without-lsusb&quot; title=&quot;Anchor link for: tip-find-usb-device-ids-without-lsusb&quot;&gt;&lt;svg
    xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;
    stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;
    class=&quot;icon icon-tabler icons-tabler-outline icon-tabler-link&quot; focusable=&quot;false&quot;&gt;
    &lt;path stroke=&quot;none&quot; d=&quot;M0 0h24v24H0z&quot; fill=&quot;none&quot; &#x2F;&gt;
    &lt;path d=&quot;M9 15l6 -6&quot; &#x2F;&gt;
    &lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; &#x2F;&gt;
    &lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; &#x2F;&gt;
  &lt;&#x2F;svg&gt;&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;For unknown reasons, I couldn’t get &lt;code&gt;lsusb&lt;&#x2F;code&gt; to work on macOS.
If you find yourself in the same boat, here’s a simple way to get the same information.&lt;&#x2F;p&gt;
&lt;p&gt;I suggest &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;docs.astral.sh&#x2F;uv&#x2F;&quot;&gt;&lt;code&gt;uv&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; so you don’t need to deal with Python virtualenvs manually:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #CDD6F4; background-color: #1E1E2E;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;uv&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; run --with pyusb python&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Then, paste this into your interpreter:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #CDD6F4; background-color: #1E1E2E;&quot;&gt;&lt;code data-lang=&quot;python&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CBA6F7;&quot;&gt;import&lt;&#x2F;span&gt;&lt;span&gt; usb&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;core&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CBA6F7;&quot;&gt;for&lt;&#x2F;span&gt;&lt;span&gt; dev&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CBA6F7;&quot;&gt; in&lt;&#x2F;span&gt;&lt;span&gt; usb&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;core&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;find&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #EBA0AC;font-style: italic;&quot;&gt;find_all&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FAB387;&quot;&gt;True&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;):&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CBA6F7;&quot;&gt;    try&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        name&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;font-style: italic;&quot;&gt; f&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F5C2E7;&quot;&gt;{&lt;&#x2F;span&gt;&lt;span&gt;dev&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;manufacturer&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F5C2E7;&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; — &lt;&#x2F;span&gt;&lt;span style=&quot;color: #F5C2E7;&quot;&gt;{&lt;&#x2F;span&gt;&lt;span&gt;dev&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;product&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F5C2E7;&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CBA6F7;&quot;&gt;    except&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FAB387;font-style: italic;&quot;&gt; Exception&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        name&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; &amp;quot;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FAB387;font-style: italic;&quot;&gt;    print&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;font-style: italic;&quot;&gt;f&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F5C2E7;&quot;&gt;{&lt;&#x2F;span&gt;&lt;span&gt;dev&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;idVendor&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CBA6F7;&quot;&gt;:04x&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F5C2E7;&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F5C2E7;&quot;&gt;{&lt;&#x2F;span&gt;&lt;span&gt;dev&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;idProduct&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CBA6F7;&quot;&gt;:04x&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F5C2E7;&quot;&gt;}  {&lt;&#x2F;span&gt;&lt;span&gt;name&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F5C2E7;&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;This should get you &lt;code&gt;lsusb&lt;&#x2F;code&gt;-like output:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #CDD6F4; background-color: #1E1E2E;&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;046d:0892  None — HD Pro Webcam C920&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;1532:0085  Razer — Razer Basilisk V2&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;07fd:000b  MOTU — M2&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;05e3:0610  GenesysLogic — USB2.1 Hub&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;04fe:0021  PFU Limited — HHKB-Hybrid&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;05e3:0625  GenesysLogic — USB3.2 Hub&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;1050:0406  Yubico — YubiKey FIDO+CCID&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;05e3:0625  GenesysLogic — USB3.2 Hub&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;05e3:0610  GenesysLogic — USB2.1 Hub&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;0b95:1790  ASIX — AX88179A&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;0b05:0411  Generic — USB3.2 Hub&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;0b05:0c23  Generic — USB2.1 Hub&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;0b05:1c55  Cypress Semiconductor — DMC Device&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;8087:0b40  Intel Corporation. — USB3.0 Hub&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;1d5c:5801  Fresco Logic, Inc. — USB2.0 Hub&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h3 id=&quot;tip-use-cargo-to-install-on-linux&quot;&gt;Tip: use &lt;code&gt;cargo&lt;&#x2F;code&gt; to install on Linux&lt;a class=&quot;zola-anchor&quot; href=&quot;#tip-use-cargo-to-install-on-linux&quot; aria-label=&quot;Anchor link for: tip-use-cargo-to-install-on-linux&quot; title=&quot;Anchor link for: tip-use-cargo-to-install-on-linux&quot;&gt;&lt;svg
    xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;
    stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;
    class=&quot;icon icon-tabler icons-tabler-outline icon-tabler-link&quot; focusable=&quot;false&quot;&gt;
    &lt;path stroke=&quot;none&quot; d=&quot;M0 0h24v24H0z&quot; fill=&quot;none&quot; &#x2F;&gt;
    &lt;path d=&quot;M9 15l6 -6&quot; &#x2F;&gt;
    &lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; &#x2F;&gt;
    &lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; &#x2F;&gt;
  &lt;&#x2F;svg&gt;&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;For Linux, rather than downloading releases or building from source manually, use &lt;code&gt;cargo&lt;&#x2F;code&gt;.
Doing so will let you use tools like &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;nabijaczleweli&#x2F;cargo-update&quot;&gt;&lt;code&gt;cargo-update&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; to easily keep it up to date with minimal work (via &lt;code&gt;cargo install-update --all --git&lt;&#x2F;code&gt;).&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #CDD6F4; background-color: #1E1E2E;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;cargo&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; install --locked --git https:&#x2F;&#x2F;github.com&#x2F;haimgel&#x2F;display-switch&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Like the &lt;code&gt;brew&lt;&#x2F;code&gt; case for macOS, you will now need to change the default &lt;code&gt;$XDG_CONFIG_HOME&#x2F;systemd&#x2F;user&#x2F;display-switch.service&lt;&#x2F;code&gt; example to have the right path.
By default it will look like &lt;code&gt;$HOME&#x2F;.cargo&#x2F;bin&#x2F;display_switch&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #CDD6F4; background-color: #1E1E2E;&quot;&gt;&lt;code data-lang=&quot;systemd&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[Unit]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;Description&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span&gt;Display switch via USB switch&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[Service]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;font-style: italic;&quot;&gt;# update this path&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot; style=&quot;background-color: #CDD6F412;&quot;&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;ExecStart&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span&gt;&#x2F;home&#x2F;youruser&#x2F;.cargo&#x2F;bin&#x2F;display_switch&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;Type&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F38BA8;&quot;&gt;simple&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;StandardOutput&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span&gt;journal&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;Restart&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F38BA8;&quot;&gt;always&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[Install]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;WantedBy&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span&gt;default.target&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h3 id=&quot;tip-use-on-usb-disconnect-to-reduce-latency&quot;&gt;Tip: use &lt;code&gt;on_usb_disconnect&lt;&#x2F;code&gt; to reduce latency&lt;a class=&quot;zola-anchor&quot; href=&quot;#tip-use-on-usb-disconnect-to-reduce-latency&quot; aria-label=&quot;Anchor link for: tip-use-on-usb-disconnect-to-reduce-latency&quot; title=&quot;Anchor link for: tip-use-on-usb-disconnect-to-reduce-latency&quot;&gt;&lt;svg
    xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;
    stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;
    class=&quot;icon icon-tabler icons-tabler-outline icon-tabler-link&quot; focusable=&quot;false&quot;&gt;
    &lt;path stroke=&quot;none&quot; d=&quot;M0 0h24v24H0z&quot; fill=&quot;none&quot; &#x2F;&gt;
    &lt;path d=&quot;M9 15l6 -6&quot; &#x2F;&gt;
    &lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; &#x2F;&gt;
    &lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; &#x2F;&gt;
  &lt;&#x2F;svg&gt;&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Finally, &lt;code&gt;display-switch&lt;&#x2F;code&gt; supports an &lt;code&gt;on_usb_disconnect&lt;&#x2F;code&gt; configuration:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #CDD6F4; background-color: #1E1E2E;&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;usb_device = &amp;quot;1050:0407&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;on_usb_connect = &amp;quot;Hdmi1&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;on_usb_disconnect = &amp;quot;Hdmi2&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;But the README notes:&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;The optional &lt;code&gt;on_usb_disconnect&lt;&#x2F;code&gt; settings allows to switch in the other direction when the USB device is disconnected.
Note that the preferred way is to have this app installed on both computers.
Switching “away” is problematic: if the other computer has put the monitors to sleep, they will switch immediately back to the original input.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;While this is true, if your monitor and setup support it, using &lt;code&gt;on_usb_disconnect&lt;&#x2F;code&gt; can significantly reduce the latency of the switch.&lt;&#x2F;p&gt;
&lt;p&gt;Without it, the chain of delays is:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #CDD6F4; background-color: #1E1E2E;&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Push button&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    ↓&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;USB devices switch&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    ↓&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;2nd computer detects new USB devices&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    ↓&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;2nd computer runs display-switch&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    ↓&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Monitor switches input&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    ↓&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;2nd computer ready to use&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;With it, the monitor input switch and the USB handoff happen in parallel.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #CDD6F4; background-color: #1E1E2E;&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; Push button&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      │&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      ├─────────────────────────────────┐&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      ↓                                 ↓&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  USB devices switch         1st computer runs display-switch&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      ↓                                 ↓&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  2nd computer detects           Monitor switches input&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  new USB devices                       │&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      │                                 │&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      └──────────────┬──────────────────┘&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                     ↓&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;             2nd computer ready to use&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h2 id=&quot;summary&quot;&gt;Summary&lt;a class=&quot;zola-anchor&quot; href=&quot;#summary&quot; aria-label=&quot;Anchor link for: summary&quot; title=&quot;Anchor link for: summary&quot;&gt;&lt;svg
    xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;
    stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;
    class=&quot;icon icon-tabler icons-tabler-outline icon-tabler-link&quot; focusable=&quot;false&quot;&gt;
    &lt;path stroke=&quot;none&quot; d=&quot;M0 0h24v24H0z&quot; fill=&quot;none&quot; &#x2F;&gt;
    &lt;path d=&quot;M9 15l6 -6&quot; &#x2F;&gt;
    &lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; &#x2F;&gt;
    &lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; &#x2F;&gt;
  &lt;&#x2F;svg&gt;&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;If you frequently switch between two computers at your desk, you don’t need an expensive KVM.
A USB switch paired with &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;haimgel&#x2F;display-switch&quot;&gt;&lt;code&gt;display-switch&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; gets you the same convenience for a fraction of the price.
It’s a $500+ KVM-like experience for the cost of an $80 USB switch and a free tool.
I’m all about software that reduces friction and makes computing more delightful, and &lt;code&gt;display-switch&lt;&#x2F;code&gt; is a great example of that: switching my monitor and full peripheral set is now a single button press, and meaningfully faster than before.&lt;&#x2F;p&gt;
</content>
    </entry>
    <entry xml:lang="en">
        <title>Using Changesets in a polyglot monorepo</title>
        <author>
          <name>Luke Hsiao</name>
        </author>
        <published>2026-02-20T00:00:00+00:00</published>
        <updated>2026-02-27T00:00:00+00:00</updated>
        <link href="https://luke.hsiao.dev/blog/changesets-polyglot-monorepo/"/>
        <link rel="alternate" href="https://luke.hsiao.dev/blog/changesets-polyglot-monorepo/" type="text/html"/>
        <id>https://luke.hsiao.dev/blog/changesets-polyglot-monorepo/</id>
        <summary type="html">Some notes and tips on how to use Changesets for versioning packages in a polyglot monorepo.</summary>
        <content type="html">&lt;p&gt;One of the nice things about working in a smaller business is you can enjoy using things that don’t need to scale to extreme sizes.
One example in the software world is &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Monorepo&quot;&gt;monorepos&lt;&#x2F;a&gt;.
While monorepos &lt;em&gt;can&lt;&#x2F;em&gt; scale well (see Google, Facebook, and others), doing so requires special tooling and infrastructure.
With plain &lt;code&gt;git&lt;&#x2F;code&gt;, &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;learn.github.com&#x2F;well-architected&#x2F;architecture&#x2F;recommendations&#x2F;scaling-git-repositories&#x2F;repository-architecture-strategy&#x2F;&quot;&gt;you can only go so far&lt;&#x2F;a&gt;.
While you can use it, it has meaningful advantages, like being able to make atomic changes that affect many parts of the system in a single commit, which eliminates whole classes of compatibility and integration issues.
You can always split a monorepo later (see &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;newren&#x2F;git-filter-repo&quot;&gt;&lt;code&gt;git-filter-repo&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;).&lt;&#x2F;p&gt;
&lt;p&gt;So, suppose you’re a small-to-medium team using a monorepo.
Let’s go further and say that this monorepo stores all your company’s code, meaning it spans many different programming languages—it’s a polyglot monorepo.
What tool can you use to manage versioning in a consistent way?&lt;&#x2F;p&gt;
&lt;p&gt;I argue that &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;changesets&#x2F;changesets&quot;&gt;&lt;code&gt;changesets&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; is a solid choice, even if it’s primarily focused on the JavaScript&#x2F;TypeScript ecosystem.&lt;&#x2F;p&gt;












&lt;div class=&quot;aside aside--note&quot;&gt;
  &lt;div class=&quot;aside__header&quot; role=&quot;heading&quot; aria-level=&quot;3&quot;&gt;
    &lt;div class=&quot;aside__icon&quot; aria-hidden=&quot;true&quot;&gt;
      
      &lt;svg xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot;
        stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;
        class=&quot;icon icon-tabler icons-tabler-outline icon-tabler-info-circle&quot;&gt;
        &lt;path stroke=&quot;none&quot; d=&quot;M0 0h24v24H0z&quot; fill=&quot;none&quot; &#x2F;&gt;
        &lt;path d=&quot;M3 12a9 9 0 1 0 18 0a9 9 0 0 0 -18 0&quot; &#x2F;&gt;
        &lt;path d=&quot;M12 9h.01&quot; &#x2F;&gt;
        &lt;path d=&quot;M11 12h1v4h1&quot; &#x2F;&gt;
      &lt;&#x2F;svg&gt;
      
    &lt;&#x2F;div&gt;

    &lt;span class=&quot;aside__title&quot;&gt;Note&lt;&#x2F;span&gt;
  &lt;&#x2F;div&gt;

  &lt;div class=&quot;aside__body&quot;&gt;&lt;p&gt;There is an &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;changesets&#x2F;changesets&#x2F;issues&#x2F;665&quot;&gt;open discussion about native polyglot monorepo support&lt;&#x2F;a&gt;.
However, even without native support, &lt;code&gt;changesets&lt;&#x2F;code&gt; has the hooks needed to implement this as-is for many setups.&lt;&#x2F;p&gt;
&lt;&#x2F;div&gt;
&lt;&#x2F;div&gt;&lt;h2 id=&quot;background&quot;&gt;Background&lt;a class=&quot;zola-anchor&quot; href=&quot;#background&quot; aria-label=&quot;Anchor link for: background&quot; title=&quot;Anchor link for: background&quot;&gt;&lt;svg
    xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;
    stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;
    class=&quot;icon icon-tabler icons-tabler-outline icon-tabler-link&quot; focusable=&quot;false&quot;&gt;
    &lt;path stroke=&quot;none&quot; d=&quot;M0 0h24v24H0z&quot; fill=&quot;none&quot; &#x2F;&gt;
    &lt;path d=&quot;M9 15l6 -6&quot; &#x2F;&gt;
    &lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; &#x2F;&gt;
    &lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; &#x2F;&gt;
  &lt;&#x2F;svg&gt;&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;For any versioning tool, you are typically looking for how to:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;define what content appears in the changelog&#x2F;release notes&lt;&#x2F;li&gt;
&lt;li&gt;influence the version numbers of the packages&lt;&#x2F;li&gt;
&lt;li&gt;automate the commits doing the actual metadata bumps and tagging&lt;&#x2F;li&gt;
&lt;li&gt;automate the builds that happen in response&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;&lt;code&gt;changesets&lt;&#x2F;code&gt; assumes per-package &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;semver.org&#x2F;&quot;&gt;semantic versioning&lt;&#x2F;a&gt; (i.e., all packages have their own version).
In addition, each package has its own &lt;code&gt;CHANGELOG.md&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;The &lt;code&gt;changesets&lt;&#x2F;code&gt; team also has a GitHub Action, &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;changesets&#x2F;action&quot;&gt;&lt;code&gt;changesets&#x2F;action&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; which importantly allows specifying custom scripts for the &lt;code&gt;version&lt;&#x2F;code&gt; and &lt;code&gt;publish&lt;&#x2F;code&gt; commands.
That customization is what gives &lt;code&gt;changesets&lt;&#x2F;code&gt; support for polyglot repositories.&lt;&#x2F;p&gt;
&lt;p&gt;In &lt;code&gt;changesets&lt;&#x2F;code&gt;, engineers commit “changeset” files to the repository that define what content ends up in changelogs, and what packages versions are bumped (i.e., major, minor, patch).&lt;&#x2F;p&gt;
&lt;p&gt;See the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;changesets&#x2F;changesets&#x2F;blob&#x2F;main&#x2F;docs&#x2F;intro-to-using-changesets.md&quot;&gt;&lt;code&gt;changesets&lt;&#x2F;code&gt; documentation&lt;&#x2F;a&gt; for more details.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;implementing-an-automated-release-process-on-github&quot;&gt;Implementing an automated release process on GitHub&lt;a class=&quot;zola-anchor&quot; href=&quot;#implementing-an-automated-release-process-on-github&quot; aria-label=&quot;Anchor link for: implementing-an-automated-release-process-on-github&quot; title=&quot;Anchor link for: implementing-an-automated-release-process-on-github&quot;&gt;&lt;svg
    xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;
    stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;
    class=&quot;icon icon-tabler icons-tabler-outline icon-tabler-link&quot; focusable=&quot;false&quot;&gt;
    &lt;path stroke=&quot;none&quot; d=&quot;M0 0h24v24H0z&quot; fill=&quot;none&quot; &#x2F;&gt;
    &lt;path d=&quot;M9 15l6 -6&quot; &#x2F;&gt;
    &lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; &#x2F;&gt;
    &lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; &#x2F;&gt;
  &lt;&#x2F;svg&gt;&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;I’m a fan of &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;just.systems&#x2F;&quot;&gt;&lt;code&gt;just&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;.
I also really like &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;docs.astral.sh&#x2F;uv&#x2F;guides&#x2F;scripts&#x2F;&quot;&gt;&lt;code&gt;uv&lt;&#x2F;code&gt; scripts&lt;&#x2F;a&gt;.
The example below uses both.&lt;&#x2F;p&gt;
&lt;p&gt;I’m also going to assume you are in a enterprise setting where all your monorepo is private, not open-source.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;repository-setup&quot;&gt;Repository setup&lt;a class=&quot;zola-anchor&quot; href=&quot;#repository-setup&quot; aria-label=&quot;Anchor link for: repository-setup&quot; title=&quot;Anchor link for: repository-setup&quot;&gt;&lt;svg
    xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;
    stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;
    class=&quot;icon icon-tabler icons-tabler-outline icon-tabler-link&quot; focusable=&quot;false&quot;&gt;
    &lt;path stroke=&quot;none&quot; d=&quot;M0 0h24v24H0z&quot; fill=&quot;none&quot; &#x2F;&gt;
    &lt;path d=&quot;M9 15l6 -6&quot; &#x2F;&gt;
    &lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; &#x2F;&gt;
    &lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; &#x2F;&gt;
  &lt;&#x2F;svg&gt;&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;My recommended organization (at least at time of writing) is something like the following.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #CDD6F4; background-color: #1E1E2E;&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;├── .changeset&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│   ├── config.json&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│   └── README.md&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;├── contrib&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│   └── utils&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;├── docker&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│   └── Dockerfile&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;├── docs&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│   ├── package.json&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│   ├── pnpm-lock.yaml&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│   ├── ...&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│   └── pnpm-workspace.yaml&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;├── Justfile&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;├── package-lock.json&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;├── package.json&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;├── packages&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│   ├── python-one&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│   │   ├── ...&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│   │   └── package.json&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│   ├── rust-one&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│   │   ├── ...&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│   │   └── package.json&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│   └── rust-two&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│   │   ├── ...&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│   │   └── package.json&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;├── pnpm-workspace.yaml&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;└── third-party&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Put all packages in a &lt;code&gt;packages&#x2F;&lt;&#x2F;code&gt; directory, no matter what language they are.
I also enjoy having &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.writethedocs.org&#x2F;guide&#x2F;docs-as-code&#x2F;&quot;&gt;documentation as code&lt;&#x2F;a&gt;, so let’s say you have a &lt;code&gt;docs&#x2F;&lt;&#x2F;code&gt; directory, too, and that your docs is written in a javascript-based frontend (like &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;starlight.astro.build&#x2F;&quot;&gt;Starlight&lt;&#x2F;a&gt;), for the purposes of highlighting a nuance later.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;changeset-configuration&quot;&gt;Changeset configuration&lt;a class=&quot;zola-anchor&quot; href=&quot;#changeset-configuration&quot; aria-label=&quot;Anchor link for: changeset-configuration&quot; title=&quot;Anchor link for: changeset-configuration&quot;&gt;&lt;svg
    xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;
    stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;
    class=&quot;icon icon-tabler icons-tabler-outline icon-tabler-link&quot; focusable=&quot;false&quot;&gt;
    &lt;path stroke=&quot;none&quot; d=&quot;M0 0h24v24H0z&quot; fill=&quot;none&quot; &#x2F;&gt;
    &lt;path d=&quot;M9 15l6 -6&quot; &#x2F;&gt;
    &lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; &#x2F;&gt;
    &lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; &#x2F;&gt;
  &lt;&#x2F;svg&gt;&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;With this setup, you can configure &lt;code&gt;changesets&lt;&#x2F;code&gt; with a proxy &lt;code&gt;pnpm&lt;&#x2F;code&gt; workspace at the root with all your packages.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #CDD6F4; background-color: #1E1E2E;&quot;&gt;&lt;code data-lang=&quot;yaml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;font-style: italic;&quot;&gt;# pnpm-workspace.yaml&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;packages&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;  -&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; &amp;quot;packages&#x2F;**&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;And, declare your &lt;code&gt;changesets&lt;&#x2F;code&gt; dependencies:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #CDD6F4; background-color: #1E1E2E;&quot;&gt;&lt;code data-lang=&quot;json&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;font-style: italic;&quot;&gt;&#x2F;&#x2F; package.json&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;  &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;name&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;&amp;quot;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; &amp;quot;example-monorepo&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;  &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;private&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;&amp;quot;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FAB387;&quot;&gt; true&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;  &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;devDependencies&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;&amp;quot;: {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;    &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;@changesets&#x2F;changelog-git&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;&amp;quot;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; &amp;quot;^0.2.0&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;    &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;@changesets&#x2F;cli&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;&amp;quot;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; &amp;quot;^2.29.0&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;  }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;You should now also update your &lt;code&gt;.gitignore&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #CDD6F4; background-color: #1E1E2E;&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;node_modules&#x2F;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Because &lt;code&gt;changesets&lt;&#x2F;code&gt; is built for JavaScript, we also need “proxy” &lt;code&gt;package.json&lt;&#x2F;code&gt; files for all of our packages; &lt;code&gt;changesets&lt;&#x2F;code&gt; uses these to perform version bumps.&lt;&#x2F;p&gt;
&lt;p&gt;These can be as simple as:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #CDD6F4; background-color: #1E1E2E;&quot;&gt;&lt;code data-lang=&quot;json&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;font-style: italic;&quot;&gt;&#x2F;&#x2F; packages&#x2F;python-one&#x2F;package.json&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;  &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;name&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;&amp;quot;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; &amp;quot;python-one&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;  &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;version&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;&amp;quot;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; &amp;quot;0.1.0&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;  &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;private&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;&amp;quot;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FAB387;&quot;&gt; true&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;With this setup, note how we are intentionally trying to &lt;em&gt;exclude&lt;&#x2F;em&gt; our internal &lt;code&gt;docs&#x2F;&lt;&#x2F;code&gt; as a pnpm workspace member—we only want to version packages.
To do so, declare the &lt;code&gt;docs&#x2F;&lt;&#x2F;code&gt; directory its &lt;em&gt;own&lt;&#x2F;em&gt; &lt;code&gt;pnpm&lt;&#x2F;code&gt; workspace, otherwise it will try and combine the &lt;code&gt;docs&#x2F;&lt;&#x2F;code&gt; dependencies into the root &lt;code&gt;package-lock.json&lt;&#x2F;code&gt;.
This can be as simple as:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #CDD6F4; background-color: #1E1E2E;&quot;&gt;&lt;code data-lang=&quot;yaml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;font-style: italic;&quot;&gt;# docs&#x2F;pnpm-workspace.pyml&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;packages&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt; []&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Next, we can add our changeset configuration:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #CDD6F4; background-color: #1E1E2E;&quot;&gt;&lt;code data-lang=&quot;json&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;font-style: italic;&quot;&gt;&#x2F;&#x2F; .changeset&#x2F;config.json&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;  &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;$schema&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;&amp;quot;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; &amp;quot;https:&#x2F;&#x2F;unpkg.com&#x2F;@changesets&#x2F;config@3.1.1&#x2F;schema.json&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;  &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;changelog&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;&amp;quot;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; &amp;quot;@changesets&#x2F;changelog-git&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;  &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;commit&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;&amp;quot;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FAB387;&quot;&gt; false&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;  &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;fixed&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;&amp;quot;: [],&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;  &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;linked&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;&amp;quot;: [],&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;  &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;access&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;&amp;quot;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; &amp;quot;restricted&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;  &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;baseBranch&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;&amp;quot;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; &amp;quot;main&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;  &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;updateInternalDependencies&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;&amp;quot;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; &amp;quot;patch&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;  &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;ignore&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;&amp;quot;: [],&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;  &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;privatePackages&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;&amp;quot;: {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;    &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;version&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;&amp;quot;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FAB387;&quot;&gt; true&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;    &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;tag&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;&amp;quot;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FAB387;&quot;&gt; true&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;  },&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;  &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;___experimentalUnsafeOptions_WILL_CHANGE_IN_PATCH&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;&amp;quot;: {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;    &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;onlyUpdatePeerDependentsWhenOutOfRange&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;&amp;quot;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FAB387;&quot;&gt; true&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;  }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h3 id=&quot;automating-releases-with-github&quot;&gt;Automating releases with GitHub&lt;a class=&quot;zola-anchor&quot; href=&quot;#automating-releases-with-github&quot; aria-label=&quot;Anchor link for: automating-releases-with-github&quot; title=&quot;Anchor link for: automating-releases-with-github&quot;&gt;&lt;svg
    xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;
    stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;
    class=&quot;icon icon-tabler icons-tabler-outline icon-tabler-link&quot; focusable=&quot;false&quot;&gt;
    &lt;path stroke=&quot;none&quot; d=&quot;M0 0h24v24H0z&quot; fill=&quot;none&quot; &#x2F;&gt;
    &lt;path d=&quot;M9 15l6 -6&quot; &#x2F;&gt;
    &lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; &#x2F;&gt;
    &lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; &#x2F;&gt;
  &lt;&#x2F;svg&gt;&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;h4 id=&quot;the-glue-to-create-polyglot-versioning-prs&quot;&gt;The glue to create polyglot versioning PRs&lt;a class=&quot;zola-anchor&quot; href=&quot;#the-glue-to-create-polyglot-versioning-prs&quot; aria-label=&quot;Anchor link for: the-glue-to-create-polyglot-versioning-prs&quot; title=&quot;Anchor link for: the-glue-to-create-polyglot-versioning-prs&quot;&gt;&lt;svg
    xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;
    stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;
    class=&quot;icon icon-tabler icons-tabler-outline icon-tabler-link&quot; focusable=&quot;false&quot;&gt;
    &lt;path stroke=&quot;none&quot; d=&quot;M0 0h24v24H0z&quot; fill=&quot;none&quot; &#x2F;&gt;
    &lt;path d=&quot;M9 15l6 -6&quot; &#x2F;&gt;
    &lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; &#x2F;&gt;
    &lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; &#x2F;&gt;
  &lt;&#x2F;svg&gt;&lt;&#x2F;a&gt;&lt;&#x2F;h4&gt;
&lt;p&gt;Next, we want to automate our releases.
That is, generating the changelog PRs, bumping package metadata, pushing tags, and triggering builds on those tags.&lt;&#x2F;p&gt;
&lt;p&gt;Let’s start with our GitHub Workflow definition, and unpack the scripts it calls.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #CDD6F4; background-color: #1E1E2E;&quot;&gt;&lt;code data-lang=&quot;yaml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;name&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; Release&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FAB387;&quot;&gt;on&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;  push&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;    branches&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;      -&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; main&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;concurrency&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; ${{ github.workflow }}-${{ github.ref }}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;permissions&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;  contents&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; write&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;  pull-requests&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; write&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;jobs&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;  release&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;    name&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; Release&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;    runs-on&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; ubuntu-latest&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;    outputs&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;      published&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; ${{ steps.changesets.outputs.published }}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;    steps&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;      -&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt; uses&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; actions&#x2F;checkout@v6&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;      -&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt; uses&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; actions&#x2F;setup-node@v4&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;        with&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;          cache&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; npm&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;      -&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt; uses&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; astral-sh&#x2F;setup-uv@v7&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;      -&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt; uses&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; taiki-e&#x2F;install-action@just&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;      -&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt; run&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; npm install&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;      -&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt; name&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; Create Release Pull Request or Tag&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;        id&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; changesets&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;        uses&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; changesets&#x2F;action@v1&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;        with&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;          version&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; just version&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;          publish&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; npx @changesets&#x2F;cli publish&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;font-style: italic;&quot;&gt;          # I like conventional commits&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;          commit&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; &amp;quot;chore(release): version packages&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;          title&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; &amp;quot;chore(release): version packages&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;        env&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;          GITHUB_TOKEN&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; ${{ secrets.GITHUB_TOKEN }}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;  docker&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;    needs&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt; [&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;release&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;    if&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; needs.release.outputs.published == &amp;#39;true&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;    uses&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; .&#x2F;.github&#x2F;workflows&#x2F;docker.yml&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;    secrets&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; inherit&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;











&lt;div class=&quot;aside aside--tip&quot;&gt;
  &lt;div class=&quot;aside__header&quot; role=&quot;heading&quot; aria-level=&quot;3&quot;&gt;
    &lt;div class=&quot;aside__icon&quot; aria-hidden=&quot;true&quot;&gt;
      
      &lt;svg xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot;
        stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;
        class=&quot;icon icon-tabler icons-tabler-outline icon-tabler-rocket&quot;&gt;
        &lt;path stroke=&quot;none&quot; d=&quot;M0 0h24v24H0z&quot; fill=&quot;none&quot; &#x2F;&gt;
        &lt;path d=&quot;M4 13a8 8 0 0 1 7 7a6 6 0 0 0 3 -5a9 9 0 0 0 6 -8a3 3 0 0 0 -3 -3a9 9 0 0 0 -8 6a6 6 0 0 0 -5 3&quot; &#x2F;&gt;
        &lt;path d=&quot;M7 14a6 6 0 0 0 -3 6a6 6 0 0 0 6 -3&quot; &#x2F;&gt;
        &lt;path d=&quot;M15 9m-1 0a1 1 0 1 0 2 0a1 1 0 1 0 -2 0&quot; &#x2F;&gt;
      &lt;&#x2F;svg&gt;
      
    &lt;&#x2F;div&gt;

    &lt;span class=&quot;aside__title&quot;&gt;Tip&lt;&#x2F;span&gt;
  &lt;&#x2F;div&gt;

  &lt;div class=&quot;aside__body&quot;&gt;&lt;p&gt;You might be wondering why we run a workflow explicitly, rather than using something like &lt;code&gt;on.push.tags&lt;&#x2F;code&gt; as a trigger.&lt;&#x2F;p&gt;
&lt;p&gt;It turns out GitHub has two fatal flaws with that intuitive approach (at time of writing).
First, if you push &amp;gt;3 tags at once, workflows &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;changesets&#x2F;action&#x2F;issues&#x2F;669&quot;&gt;will not trigger&lt;&#x2F;a&gt;.
Unfortunately, this is a relatively common scenario in a monorepo.
Second, GitHub’s triggering of &lt;code&gt;on.push.tags&lt;&#x2F;code&gt; is &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;orgs&#x2F;community&#x2F;discussions&#x2F;27028&quot;&gt;highly unreliable&lt;&#x2F;a&gt;.
This unreliability is still present, even if you use a PAT &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;docs.github.com&#x2F;en&#x2F;actions&#x2F;how-tos&#x2F;write-workflows&#x2F;choose-when-workflows-run&#x2F;trigger-a-workflow#triggering-a-workflow-from-a-workflow&quot;&gt;as they instruct&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;So, instead consider an explicit &lt;code&gt;workflow_call&lt;&#x2F;code&gt; for the purpose as I’ve done here.&lt;&#x2F;p&gt;
&lt;&#x2F;div&gt;
&lt;&#x2F;div&gt;
&lt;p&gt;Setting &lt;code&gt;version: just version&lt;&#x2F;code&gt; is the key to polyglot support.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #CDD6F4; background-color: #1E1E2E;&quot;&gt;&lt;code data-lang=&quot;Just&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;font-style: italic;&quot;&gt;# Version packages based on changesets&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[doc(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;&amp;#39;Consume changesets: bump versions, update changelogs, sync native version files.&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;)]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[group(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;&amp;#39;release&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;)]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;version&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    npx @changesets&#x2F;cli version&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    uv run --script contrib&#x2F;utils&#x2F;sync-versions.py&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The meat of the glue for polyglot support then, is how you implement &lt;code&gt;sync-versions.py&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;The key bit here is we rely on &lt;code&gt;changesets&lt;&#x2F;code&gt; to bump the versions in &lt;code&gt;package.json&lt;&#x2F;code&gt; for us when we call &lt;code&gt;npx @changesets&#x2F;cli version&lt;&#x2F;code&gt;, but then it is up to us to propagate that version to the respective language’s metadata appropriately.&lt;&#x2F;p&gt;
&lt;p&gt;Here is an example that uses pretty naive parsing.
You can write something similar (or better!) for the languages you use.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #CDD6F4; background-color: #1E1E2E;&quot;&gt;&lt;code data-lang=&quot;python&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;font-style: italic;&quot;&gt;#!&#x2F;usr&#x2F;bin&#x2F;env -S uv run --script&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;font-style: italic;&quot;&gt;#&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;font-style: italic;&quot;&gt;# &#x2F;&#x2F;&#x2F; script&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;font-style: italic;&quot;&gt;# requires-python = &amp;quot;&amp;gt;=3.12&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;font-style: italic;&quot;&gt;# dependencies = []&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;font-style: italic;&quot;&gt;# &#x2F;&#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;font-style: italic;&quot;&gt;#&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;font-style: italic;&quot;&gt;# Sync versions from package.json files (updated by changesets) to native&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;font-style: italic;&quot;&gt;# package manifests (Cargo.toml, pyproject.toml, etc.).&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CBA6F7;&quot;&gt;import&lt;&#x2F;span&gt;&lt;span&gt; json&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CBA6F7;&quot;&gt;import&lt;&#x2F;span&gt;&lt;span&gt; re&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CBA6F7;&quot;&gt;import&lt;&#x2F;span&gt;&lt;span&gt; subprocess&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CBA6F7;&quot;&gt;from&lt;&#x2F;span&gt;&lt;span&gt; enum&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CBA6F7;&quot;&gt; import&lt;&#x2F;span&gt;&lt;span&gt; Enum&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span&gt; auto&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CBA6F7;&quot;&gt;from&lt;&#x2F;span&gt;&lt;span&gt; pathlib&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CBA6F7;&quot;&gt; import&lt;&#x2F;span&gt;&lt;span&gt; Path&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;PACKAGES_DIR&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt; Path&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span&gt;__file__&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;).&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;resolve&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;().&lt;&#x2F;span&gt;&lt;span&gt;parent&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;parent&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;parent&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt; &#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; &amp;quot;packages&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CBA6F7;&quot;&gt;class&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F9E2AF;font-style: italic;&quot;&gt; SyncResult&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F9E2AF;font-style: italic;&quot;&gt;Enum&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;):&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    NOT_FOUND&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt; auto&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;()&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    UP_TO_DATE&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt; auto&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;()&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    UPDATED&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt; auto&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;()&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CBA6F7;&quot;&gt;def&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt; read_package_json&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #EBA0AC;font-style: italic;&quot;&gt;pkg_dir&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #EBA0AC;&quot;&gt; Path&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;) -&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CBA6F7;font-style: italic;&quot;&gt; dict&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt; |&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FAB387;&quot;&gt; None&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;    &amp;quot;&amp;quot;&amp;quot;Read and parse a package.json file.&amp;quot;&amp;quot;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    pkg_json&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; pkg_dir&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt; &#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; &amp;quot;package.json&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CBA6F7;&quot;&gt;    if not&lt;&#x2F;span&gt;&lt;span&gt; pkg_json&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;exists&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;():&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CBA6F7;&quot;&gt;        return&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FAB387;&quot;&gt; None&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CBA6F7;&quot;&gt;    return&lt;&#x2F;span&gt;&lt;span&gt; json&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;loads&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span&gt;pkg_json&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;read_text&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;())&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CBA6F7;&quot;&gt;def&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt; update_cargo_toml&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #EBA0AC;font-style: italic;&quot;&gt;pkg_dir&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #EBA0AC;&quot;&gt; Path&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #EBA0AC;font-style: italic;&quot;&gt; version&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CBA6F7;font-style: italic;&quot;&gt; str&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;) -&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt; SyncResult&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;    &amp;quot;&amp;quot;&amp;quot;Update version in [package] section of Cargo.toml.&amp;quot;&amp;quot;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    cargo_toml&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; pkg_dir&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt; &#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; &amp;quot;Cargo.toml&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CBA6F7;&quot;&gt;    if not&lt;&#x2F;span&gt;&lt;span&gt; cargo_toml&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;exists&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;():&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CBA6F7;&quot;&gt;        return&lt;&#x2F;span&gt;&lt;span&gt; SyncResult&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;NOT_FOUND&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    lines&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; cargo_toml&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;read_text&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;splitlines&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #EBA0AC;font-style: italic;&quot;&gt;keepends&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FAB387;&quot;&gt;True&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    in_package_section&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FAB387;&quot;&gt; False&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CBA6F7;&quot;&gt;    for&lt;&#x2F;span&gt;&lt;span&gt; i&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span&gt; line&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CBA6F7;&quot;&gt; in&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FAB387;font-style: italic;&quot;&gt; enumerate&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span&gt;lines&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;):&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        stripped&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; line&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;strip&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;()&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;font-style: italic;&quot;&gt;        # Track which TOML section we&amp;#39;re in&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CBA6F7;&quot;&gt;        if&lt;&#x2F;span&gt;&lt;span&gt; stripped&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;startswith&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;&amp;quot;[&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;):&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            in_package_section&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; stripped&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt; ==&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; &amp;quot;[package]&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CBA6F7;&quot;&gt;            continue&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CBA6F7;&quot;&gt;        if&lt;&#x2F;span&gt;&lt;span&gt; in_package_section&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CBA6F7;&quot;&gt; and&lt;&#x2F;span&gt;&lt;span&gt; stripped&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;startswith&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;&amp;quot;version&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;):&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            new_line&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; re&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;sub&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A6E3A1;font-style: italic;&quot;&gt;                r&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F5C2E7;&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;^&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;\s&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;*&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;version\s&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;*&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;=\s&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;*&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;)([&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;^&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;]&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;+&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;)(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F5C2E7;&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A6E3A1;font-style: italic;&quot;&gt;                rf&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;&amp;quot;\g&amp;lt;1&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F5C2E7;&quot;&gt;{&lt;&#x2F;span&gt;&lt;span&gt;version&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F5C2E7;&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;\3&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                line&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;            )&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CBA6F7;&quot;&gt;            if&lt;&#x2F;span&gt;&lt;span&gt; new_line&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt; !=&lt;&#x2F;span&gt;&lt;span&gt; line&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #EBA0AC;font-style: italic;&quot;&gt;                lines&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color: #EBA0AC;font-style: italic;&quot;&gt;i&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;]&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; new_line&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                cargo_toml&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;write_text&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;&amp;quot;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;join&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span&gt;lines&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;))&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                rel&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; cargo_toml&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;relative_to&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span&gt;PACKAGES_DIR&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;parent&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FAB387;font-style: italic;&quot;&gt;                print&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;font-style: italic;&quot;&gt;f&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;&amp;quot;  Updated &lt;&#x2F;span&gt;&lt;span style=&quot;color: #F5C2E7;&quot;&gt;{&lt;&#x2F;span&gt;&lt;span&gt;rel&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F5C2E7;&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CBA6F7;&quot;&gt;                return&lt;&#x2F;span&gt;&lt;span&gt; SyncResult&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;UPDATED&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CBA6F7;&quot;&gt;            return&lt;&#x2F;span&gt;&lt;span&gt; SyncResult&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;UP_TO_DATE&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CBA6F7;&quot;&gt;    return&lt;&#x2F;span&gt;&lt;span&gt; SyncResult&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;UP_TO_DATE&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CBA6F7;&quot;&gt;def&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt; update_pyproject_toml&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #EBA0AC;font-style: italic;&quot;&gt;pkg_dir&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #EBA0AC;&quot;&gt; Path&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #EBA0AC;font-style: italic;&quot;&gt; version&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CBA6F7;font-style: italic;&quot;&gt; str&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;) -&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt; SyncResult&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;    &amp;quot;&amp;quot;&amp;quot;Update version in [project] section of pyproject.toml.&amp;quot;&amp;quot;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    pyproject&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; pkg_dir&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt; &#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; &amp;quot;pyproject.toml&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CBA6F7;&quot;&gt;    if not&lt;&#x2F;span&gt;&lt;span&gt; pyproject&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;exists&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;():&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CBA6F7;&quot;&gt;        return&lt;&#x2F;span&gt;&lt;span&gt; SyncResult&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;NOT_FOUND&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    lines&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; pyproject&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;read_text&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;splitlines&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #EBA0AC;font-style: italic;&quot;&gt;keepends&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FAB387;&quot;&gt;True&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    in_project_section&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FAB387;&quot;&gt; False&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CBA6F7;&quot;&gt;    for&lt;&#x2F;span&gt;&lt;span&gt; i&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span&gt; line&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CBA6F7;&quot;&gt; in&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FAB387;font-style: italic;&quot;&gt; enumerate&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span&gt;lines&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;):&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        stripped&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; line&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;strip&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;()&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;font-style: italic;&quot;&gt;        # Track which TOML section we&amp;#39;re in&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CBA6F7;&quot;&gt;        if&lt;&#x2F;span&gt;&lt;span&gt; stripped&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;startswith&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;&amp;quot;[&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;):&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            in_project_section&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; stripped&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt; ==&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; &amp;quot;[project]&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CBA6F7;&quot;&gt;            continue&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CBA6F7;&quot;&gt;        if&lt;&#x2F;span&gt;&lt;span&gt; in_project_section&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CBA6F7;&quot;&gt; and&lt;&#x2F;span&gt;&lt;span&gt; stripped&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;startswith&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;&amp;quot;version&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;):&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            new_line&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; re&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;sub&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A6E3A1;font-style: italic;&quot;&gt;                r&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F5C2E7;&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;^&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;\s&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;*&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;version\s&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;*&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;=\s&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;*&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;)([&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;^&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;]&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;+&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;)(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F5C2E7;&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A6E3A1;font-style: italic;&quot;&gt;                rf&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;&amp;quot;\g&amp;lt;1&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F5C2E7;&quot;&gt;{&lt;&#x2F;span&gt;&lt;span&gt;version&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F5C2E7;&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;\3&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                line&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;            )&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CBA6F7;&quot;&gt;            if&lt;&#x2F;span&gt;&lt;span&gt; new_line&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt; !=&lt;&#x2F;span&gt;&lt;span&gt; line&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #EBA0AC;font-style: italic;&quot;&gt;                lines&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color: #EBA0AC;font-style: italic;&quot;&gt;i&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;]&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; new_line&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                pyproject&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;write_text&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;&amp;quot;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;join&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span&gt;lines&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;))&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                rel&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; pyproject&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;relative_to&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span&gt;PACKAGES_DIR&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;parent&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FAB387;font-style: italic;&quot;&gt;                print&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;font-style: italic;&quot;&gt;f&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;&amp;quot;  Updated &lt;&#x2F;span&gt;&lt;span style=&quot;color: #F5C2E7;&quot;&gt;{&lt;&#x2F;span&gt;&lt;span&gt;rel&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F5C2E7;&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CBA6F7;&quot;&gt;                return&lt;&#x2F;span&gt;&lt;span&gt; SyncResult&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;UPDATED&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CBA6F7;&quot;&gt;            return&lt;&#x2F;span&gt;&lt;span&gt; SyncResult&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;UP_TO_DATE&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CBA6F7;&quot;&gt;    return&lt;&#x2F;span&gt;&lt;span&gt; SyncResult&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;UP_TO_DATE&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CBA6F7;&quot;&gt;def&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt; refresh_lockfiles&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;() -&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FAB387;&quot;&gt; None&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;    &amp;quot;&amp;quot;&amp;quot;Refresh all lockfiles under the repo to match updated versions.&amp;quot;&amp;quot;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    repo_root&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; PACKAGES_DIR&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;parent&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FAB387;font-style: italic;&quot;&gt;    print&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;&amp;quot;Refreshing lockfiles...&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;font-style: italic;&quot;&gt;    # Cargo.lock — root workspace + any standalone crate lockfiles&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    cargo_locks&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FAB387;font-style: italic;&quot;&gt; sorted&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CBA6F7;font-style: italic;&quot;&gt;        set&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span&gt;repo_root&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;glob&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;&amp;quot;Cargo.lock&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;))&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt; |&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CBA6F7;font-style: italic;&quot;&gt; set&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span&gt;PACKAGES_DIR&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;rglob&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;&amp;quot;Cargo.lock&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;))&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;    )&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CBA6F7;&quot;&gt;    for&lt;&#x2F;span&gt;&lt;span&gt; cargo_lock&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CBA6F7;&quot;&gt; in&lt;&#x2F;span&gt;&lt;span&gt; cargo_locks&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        lock_dir&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; cargo_lock&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;parent&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        rel&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; lock_dir&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;relative_to&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span&gt;repo_root&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CBA6F7;&quot;&gt; or&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt; Path&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;&amp;quot;.&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FAB387;font-style: italic;&quot;&gt;        print&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;font-style: italic;&quot;&gt;f&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;&amp;quot;  cargo update --workspace in &lt;&#x2F;span&gt;&lt;span style=&quot;color: #F5C2E7;&quot;&gt;{&lt;&#x2F;span&gt;&lt;span&gt;rel&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F5C2E7;&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        subprocess&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;run&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;([&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;&amp;quot;cargo&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; &amp;quot;update&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; &amp;quot;--workspace&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;],&lt;&#x2F;span&gt;&lt;span style=&quot;color: #EBA0AC;font-style: italic;&quot;&gt; cwd&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span&gt;lock_dir&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #EBA0AC;font-style: italic;&quot;&gt; check&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FAB387;&quot;&gt;True&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;font-style: italic;&quot;&gt;    # uv.lock — Python packages&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CBA6F7;&quot;&gt;    for&lt;&#x2F;span&gt;&lt;span&gt; uv_lock&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CBA6F7;&quot;&gt; in&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FAB387;font-style: italic;&quot;&gt; sorted&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span&gt;PACKAGES_DIR&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;rglob&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;&amp;quot;uv.lock&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;)):&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        lock_dir&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; uv_lock&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;parent&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FAB387;font-style: italic;&quot;&gt;        print&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;font-style: italic;&quot;&gt;f&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;&amp;quot;  uv lock in &lt;&#x2F;span&gt;&lt;span style=&quot;color: #F5C2E7;&quot;&gt;{&lt;&#x2F;span&gt;&lt;span&gt;lock_dir&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;relative_to&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span&gt;repo_root&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F5C2E7;&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        subprocess&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;run&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;([&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;&amp;quot;uv&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; &amp;quot;lock&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;],&lt;&#x2F;span&gt;&lt;span style=&quot;color: #EBA0AC;font-style: italic;&quot;&gt; cwd&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span&gt;lock_dir&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #EBA0AC;font-style: italic;&quot;&gt; check&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FAB387;&quot;&gt;True&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CBA6F7;&quot;&gt;def&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt; main&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;() -&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FAB387;&quot;&gt; None&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FAB387;font-style: italic;&quot;&gt;    print&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;&amp;quot;Syncing versions from package.json to native manifests...&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FAB387;font-style: italic;&quot;&gt;    print&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;()&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    updated&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FAB387;&quot;&gt; 0&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CBA6F7;&quot;&gt;    for&lt;&#x2F;span&gt;&lt;span&gt; pkg_json&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CBA6F7;&quot;&gt; in&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FAB387;font-style: italic;&quot;&gt; sorted&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span&gt;PACKAGES_DIR&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;rglob&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;&amp;quot;package.json&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;)):&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        pkg_dir&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; pkg_json&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;parent&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        pkg_data&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt; read_package_json&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span&gt;pkg_dir&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CBA6F7;&quot;&gt;        if&lt;&#x2F;span&gt;&lt;span&gt; pkg_data&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CBA6F7;&quot;&gt; is&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FAB387;&quot;&gt; None&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CBA6F7;&quot;&gt;            continue&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        version&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; pkg_data&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;get&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;&amp;quot;version&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CBA6F7;&quot;&gt;        if&lt;&#x2F;span&gt;&lt;span&gt; version&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CBA6F7;&quot;&gt; is&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FAB387;&quot;&gt; None&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CBA6F7;&quot;&gt;            continue&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        name&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; pkg_data&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;get&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;&amp;quot;name&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span&gt; pkg_dir&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;name&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FAB387;font-style: italic;&quot;&gt;        print&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;font-style: italic;&quot;&gt;f&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F5C2E7;&quot;&gt;{&lt;&#x2F;span&gt;&lt;span&gt;name&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F5C2E7;&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; @ &lt;&#x2F;span&gt;&lt;span style=&quot;color: #F5C2E7;&quot;&gt;{&lt;&#x2F;span&gt;&lt;span&gt;version&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F5C2E7;&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        results&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt; [&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;            update_cargo_toml&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span&gt;pkg_dir&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span&gt; version&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;),&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;            update_pyproject_toml&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span&gt;pkg_dir&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span&gt; version&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;),&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;        ]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CBA6F7;&quot;&gt;        if&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FAB387;font-style: italic;&quot;&gt; any&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span&gt;r&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt; ==&lt;&#x2F;span&gt;&lt;span&gt; SyncResult&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;UPDATED&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CBA6F7;&quot;&gt; for&lt;&#x2F;span&gt;&lt;span&gt; r&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CBA6F7;&quot;&gt; in&lt;&#x2F;span&gt;&lt;span&gt; results&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;):&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            updated&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt; +=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FAB387;&quot;&gt; 1&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CBA6F7;&quot;&gt;        elif&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FAB387;font-style: italic;&quot;&gt; all&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span&gt;r&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt; ==&lt;&#x2F;span&gt;&lt;span&gt; SyncResult&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;NOT_FOUND&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CBA6F7;&quot;&gt; for&lt;&#x2F;span&gt;&lt;span&gt; r&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CBA6F7;&quot;&gt; in&lt;&#x2F;span&gt;&lt;span&gt; results&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;):&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FAB387;font-style: italic;&quot;&gt;            print&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;&amp;quot;  (no native manifest found)&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CBA6F7;&quot;&gt;        else&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FAB387;font-style: italic;&quot;&gt;            print&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;&amp;quot;  (already up to date)&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FAB387;font-style: italic;&quot;&gt;    print&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;()&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FAB387;font-style: italic;&quot;&gt;    print&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;font-style: italic;&quot;&gt;f&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;&amp;quot;Synced &lt;&#x2F;span&gt;&lt;span style=&quot;color: #F5C2E7;&quot;&gt;{&lt;&#x2F;span&gt;&lt;span&gt;updated&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F5C2E7;&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; package(s).&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FAB387;font-style: italic;&quot;&gt;    print&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;()&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;    refresh_lockfiles&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;()&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FAB387;font-style: italic;&quot;&gt;    print&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;()&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FAB387;font-style: italic;&quot;&gt;    print&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;&amp;quot;Done.&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CBA6F7;&quot;&gt;if&lt;&#x2F;span&gt;&lt;span&gt; __name__&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt; ==&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; &amp;quot;__main__&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;    main&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;()&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h4 id=&quot;reacting-to-package-tags&quot;&gt;Reacting to package tags&lt;a class=&quot;zola-anchor&quot; href=&quot;#reacting-to-package-tags&quot; aria-label=&quot;Anchor link for: reacting-to-package-tags&quot; title=&quot;Anchor link for: reacting-to-package-tags&quot;&gt;&lt;svg
    xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;
    stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;
    class=&quot;icon icon-tabler icons-tabler-outline icon-tabler-link&quot; focusable=&quot;false&quot;&gt;
    &lt;path stroke=&quot;none&quot; d=&quot;M0 0h24v24H0z&quot; fill=&quot;none&quot; &#x2F;&gt;
    &lt;path d=&quot;M9 15l6 -6&quot; &#x2F;&gt;
    &lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; &#x2F;&gt;
    &lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; &#x2F;&gt;
  &lt;&#x2F;svg&gt;&lt;&#x2F;a&gt;&lt;&#x2F;h4&gt;
&lt;p&gt;In the standard &lt;code&gt;changesets&lt;&#x2F;code&gt; flow, you will now have a pull request on GitHub with the appropriate &lt;code&gt;CHANGELOG.md&lt;&#x2F;code&gt; updates, as well as the metadata updates for all the relevant packages.&lt;&#x2F;p&gt;
&lt;p&gt;Once that is merged, the very same action will run, realize all the &lt;code&gt;.changeset&lt;&#x2F;code&gt; files are consumed, and push tags.&lt;&#x2F;p&gt;












&lt;div class=&quot;aside aside--note&quot;&gt;
  &lt;div class=&quot;aside__header&quot; role=&quot;heading&quot; aria-level=&quot;3&quot;&gt;
    &lt;div class=&quot;aside__icon&quot; aria-hidden=&quot;true&quot;&gt;
      
      &lt;svg xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot;
        stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;
        class=&quot;icon icon-tabler icons-tabler-outline icon-tabler-info-circle&quot;&gt;
        &lt;path stroke=&quot;none&quot; d=&quot;M0 0h24v24H0z&quot; fill=&quot;none&quot; &#x2F;&gt;
        &lt;path d=&quot;M3 12a9 9 0 1 0 18 0a9 9 0 0 0 -18 0&quot; &#x2F;&gt;
        &lt;path d=&quot;M12 9h.01&quot; &#x2F;&gt;
        &lt;path d=&quot;M11 12h1v4h1&quot; &#x2F;&gt;
      &lt;&#x2F;svg&gt;
      
    &lt;&#x2F;div&gt;

    &lt;span class=&quot;aside__title&quot;&gt;Note&lt;&#x2F;span&gt;
  &lt;&#x2F;div&gt;

  &lt;div class=&quot;aside__body&quot;&gt;&lt;p&gt;With our example configuration, &lt;code&gt;changesets&lt;&#x2F;code&gt; will only push tags, not publish packages, because we set&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #CDD6F4; background-color: #1E1E2E;&quot;&gt;&lt;code data-lang=&quot;json&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;&amp;quot;privatePackages&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;    &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;version&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;&amp;quot;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FAB387;&quot;&gt; true&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;    &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;tag&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;&amp;quot;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FAB387;&quot;&gt; true&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;in our &lt;code&gt;.changeset&#x2F;config.json&lt;&#x2F;code&gt; and have all the packages set to &lt;code&gt;private: true&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;&#x2F;div&gt;
&lt;&#x2F;div&gt;
&lt;p&gt;Typically, you’ll then want to react to these pushed tags.
For example, to build new docker images.&lt;&#x2F;p&gt;
&lt;p&gt;For that, rather than using an &lt;code&gt;on.push.tags&lt;&#x2F;code&gt; trigger as you would reasonably assume, you probably want a &lt;code&gt;workflow_call&lt;&#x2F;code&gt;.
See the tip earlier in the post for why.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #CDD6F4; background-color: #1E1E2E;&quot;&gt;&lt;code data-lang=&quot;yaml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FAB387;&quot;&gt;on&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;  workflow_call&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt; {}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;  workflow_dispatch&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;    inputs&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;      dry_run&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;        description&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; &amp;#39;Build images without pushing to GHCR&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;        required&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FAB387;&quot;&gt; false&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;        type&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; boolean&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;        default&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FAB387;&quot;&gt; false&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;      no_cache&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;        description&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; &amp;#39;Force a build without using the cache&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;        required&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FAB387;&quot;&gt; false&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;        type&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; boolean&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;        default&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FAB387;&quot;&gt; false&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h2 id=&quot;summary&quot;&gt;Summary&lt;a class=&quot;zola-anchor&quot; href=&quot;#summary&quot; aria-label=&quot;Anchor link for: summary&quot; title=&quot;Anchor link for: summary&quot;&gt;&lt;svg
    xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;
    stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;
    class=&quot;icon icon-tabler icons-tabler-outline icon-tabler-link&quot; focusable=&quot;false&quot;&gt;
    &lt;path stroke=&quot;none&quot; d=&quot;M0 0h24v24H0z&quot; fill=&quot;none&quot; &#x2F;&gt;
    &lt;path d=&quot;M9 15l6 -6&quot; &#x2F;&gt;
    &lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; &#x2F;&gt;
    &lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; &#x2F;&gt;
  &lt;&#x2F;svg&gt;&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;code&gt;changesets&lt;&#x2F;code&gt; can manage per-package semantic versioning and changelogs in polyglot monorepos today, even without direct native support for multiple languages.
The trick is to treat JavaScript package manifests as the canonical source of version bumps, and then syncing those bumps via your own scripts to the language-native manifests.&lt;&#x2F;p&gt;
&lt;p&gt;A few gotchas exist (like explicitly making independent &lt;code&gt;pnpm-workspace.yaml&lt;&#x2F;code&gt; files for subdirectories you want to be independent, or using a separate personal access token to push tags), but none are blockers to being able to benefit from &lt;code&gt;changesets&lt;&#x2F;code&gt;’s convenient workflow.&lt;&#x2F;p&gt;
&lt;p&gt;I used to suggest versioning monorepos with a single global version using a tool like &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;semantic-release&#x2F;semantic-release&quot;&gt;&lt;code&gt;semantic-release&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;.
Since trying &lt;code&gt;changesets&lt;&#x2F;code&gt;, I’m sold on the benefits of letting people write commit messages for future internal engineers while also adding a separate changelog note for end users.
These are often two distinct audiences, and relying on a single conventional commit to serve both is often suboptimal.&lt;&#x2F;p&gt;
</content>
    </entry>
    <entry xml:lang="en">
        <title>Fixing missing Omarchy boot entries</title>
        <author>
          <name>Luke Hsiao</name>
        </author>
        <published>2026-01-24T00:00:00+00:00</published>
        <updated>2026-01-24T00:00:00+00:00</updated>
        <link href="https://luke.hsiao.dev/blog/omarchy-boot-entries/"/>
        <link rel="alternate" href="https://luke.hsiao.dev/blog/omarchy-boot-entries/" type="text/html"/>
        <id>https://luke.hsiao.dev/blog/omarchy-boot-entries/</id>
        <summary type="html">Some notes to self about how to use efibootmgr to fix missing boot entries from a fresh Omarchy install.</summary>
        <content type="html">&lt;p&gt;In a normal Omarchy installation, the expected behavior is that you will see two new boot options in your BIOS: &lt;code&gt;Omarchy&lt;&#x2F;code&gt; and &lt;code&gt;Limine&lt;&#x2F;code&gt;.
There are two for good reason.
&lt;code&gt;Omarchy&lt;&#x2F;code&gt; boots straight to Omarchy, and is what should be first in your boot order, typically.
&lt;code&gt;Limine&lt;&#x2F;code&gt; goes to the Limine boot loader menu, which allows you to &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;learn.omacom.io&#x2F;2&#x2F;the-omarchy-manual&#x2F;101&#x2F;system-snapshots&quot;&gt;restore from snapshots&lt;&#x2F;a&gt;, which is useful.&lt;&#x2F;p&gt;
&lt;p&gt;However, in my experience, sometimes a fresh install will fail to set up these boot entries.
Unfortunately, I have not spent the effort to discover the true root cause.
Regardless, fixing it is easy.&lt;&#x2F;p&gt;
&lt;p&gt;As a concrete example, I recently installed Omarchy on a ThinkPad T14 Gen 4, and after what appeared to be a successful installation, I had the &lt;code&gt;Limine&lt;&#x2F;code&gt; boot entry, but was missing the &lt;code&gt;Omarchy&lt;&#x2F;code&gt; one, meaning when I booted, I was wasting time in the Limine menu each boot.&lt;&#x2F;p&gt;
&lt;p&gt;The &lt;code&gt;&#x2F;boot&lt;&#x2F;code&gt; partition was set up as expected, though.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #CDD6F4; background-color: #1E1E2E;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;❯&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; lt &#x2F;boot&#x2F;EFI&#x2F;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;drwxr-xr-x&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;    - root&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FAB387;&quot;&gt; 23&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; Jan 15:50 &#x2F;boot&#x2F;EFI&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;drwxr-xr-x&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;    - root&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FAB387;&quot;&gt; 23&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; Jan 15:48 ├── BOOT&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;.rwxr-xr-x&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; 291k root&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FAB387;&quot;&gt; 23&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; Jan 15:48 │   ├── BOOTIA32.EFI&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;.rwxr-xr-x&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; 283k root&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FAB387;&quot;&gt; 23&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; Jan 15:48 │   └── BOOTX64.EFI&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;drwxr-xr-x&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;    - root&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FAB387;&quot;&gt; 23&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; Jan 15:49 ├── limine&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;.rwxr-xr-x&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; 287k root&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FAB387;&quot;&gt; 23&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; Jan 15:49 │   ├── limine_x64.bak&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;.rwxr-xr-x&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; 283k root&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FAB387;&quot;&gt; 23&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; Jan 15:49 │   └── limine_x64.efi&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;drwxr-xr-x&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;    - root&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FAB387;&quot;&gt; 23&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; Jan 15:50 └── Linux&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;.rwxr-xr-x&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;  47M root&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FAB387;&quot;&gt;  6&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; Jan 10:29     └── omarchy_linux.efi&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;And, with that, it’s very easy to fix the boot entries with &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;wiki.archlinux.org&#x2F;title&#x2F;EFI_boot_stub&quot;&gt;&lt;code&gt;efibootmgr&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;First, let’s look at drive names.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #CDD6F4; background-color: #1E1E2E;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;❯&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; df -h&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;Filesystem&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;        Size  Used Avail Use% Mounted on&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;dev&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;               7.7G&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FAB387;&quot;&gt;     0&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;  7.7G   0% &#x2F;dev&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;run&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;               7.7G  1.9M  7.7G   1% &#x2F;run&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;efivarfs&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;          196K  118K   74K  62% &#x2F;sys&#x2F;firmware&#x2F;efi&#x2F;efivars&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;&#x2F;dev&#x2F;mapper&#x2F;root&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;  237G   21G  214G   9% &#x2F;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;tmpfs&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;             7.7G  580K  7.7G   1% &#x2F;dev&#x2F;shm&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;none&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;              1.0M&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FAB387;&quot;&gt;     0&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;  1.0M   0% &#x2F;run&#x2F;credentials&#x2F;systemd-journald.service&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;none&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;              1.0M&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FAB387;&quot;&gt;     0&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;  1.0M   0% &#x2F;run&#x2F;credentials&#x2F;systemd-resolved.service&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;none&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;              1.0M&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FAB387;&quot;&gt;     0&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;  1.0M   0% &#x2F;run&#x2F;credentials&#x2F;systemd-networkd.service&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;tmpfs&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;             7.7G  8.0K  7.7G   1% &#x2F;tmp&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;&#x2F;dev&#x2F;mapper&#x2F;root&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;  237G   21G  214G   9% &#x2F;var&#x2F;log&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;&#x2F;dev&#x2F;mapper&#x2F;root&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;  237G   21G  214G   9% &#x2F;var&#x2F;cache&#x2F;pacman&#x2F;pkg&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;&#x2F;dev&#x2F;mapper&#x2F;root&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;  237G   21G  214G   9% &#x2F;home&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;&#x2F;dev&#x2F;nvme0n1p1&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;    2.0G  144M  1.9G   8% &#x2F;boot&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;tmpfs&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;             1.6G  228K  1.6G   1% &#x2F;run&#x2F;user&#x2F;1000&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;With these two pieces of information, adding an &lt;code&gt;Omarchy&lt;&#x2F;code&gt; boot entry is simple.&lt;&#x2F;p&gt;
&lt;p&gt;First, you can run &lt;code&gt;sudo efibootmgr&lt;&#x2F;code&gt; to see your existing boot entries.
You’ll be able to confirm whether you’re missing entries here.&lt;&#x2F;p&gt;












&lt;div class=&quot;aside aside--note&quot;&gt;
  &lt;div class=&quot;aside__header&quot; role=&quot;heading&quot; aria-level=&quot;3&quot;&gt;
    &lt;div class=&quot;aside__icon&quot; aria-hidden=&quot;true&quot;&gt;
      
      &lt;svg xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot;
        stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;
        class=&quot;icon icon-tabler icons-tabler-outline icon-tabler-info-circle&quot;&gt;
        &lt;path stroke=&quot;none&quot; d=&quot;M0 0h24v24H0z&quot; fill=&quot;none&quot; &#x2F;&gt;
        &lt;path d=&quot;M3 12a9 9 0 1 0 18 0a9 9 0 0 0 -18 0&quot; &#x2F;&gt;
        &lt;path d=&quot;M12 9h.01&quot; &#x2F;&gt;
        &lt;path d=&quot;M11 12h1v4h1&quot; &#x2F;&gt;
      &lt;&#x2F;svg&gt;
      
    &lt;&#x2F;div&gt;

    &lt;span class=&quot;aside__title&quot;&gt;Note&lt;&#x2F;span&gt;
  &lt;&#x2F;div&gt;

  &lt;div class=&quot;aside__body&quot;&gt;&lt;p&gt;I should’ve recorded the output before the fix, but didn’t think I’d write a post about it until after the fact.
Hindsight is 20&#x2F;20.&lt;&#x2F;p&gt;
&lt;&#x2F;div&gt;
&lt;&#x2F;div&gt;
&lt;p&gt;Then, to add a new boot entry you can simply run:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #CDD6F4; background-color: #1E1E2E;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; efibootmgr&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F5C2E7;&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;  --create&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F5C2E7;&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;  --disk &#x2F;dev&#x2F;{drive-name}&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F5C2E7;&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;  --part {partition-num}&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F5C2E7;&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;  --loader &#x2F;path&#x2F;from&#x2F;boot&#x2F;to&#x2F;efi&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F5C2E7;&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;  --label &amp;quot;YourLabel&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;So, given the output of &lt;code&gt;df&lt;&#x2F;code&gt;, where I see my &lt;code&gt;&#x2F;boot&lt;&#x2F;code&gt; is mounted to &lt;code&gt;&#x2F;dev&#x2F;nvme0n1p1&lt;&#x2F;code&gt;, I know &lt;code&gt;&#x2F;dev&#x2F;nvme0n1&lt;&#x2F;code&gt; is my drive name, and it’s on &lt;code&gt;p1&lt;&#x2F;code&gt; or partition &lt;code&gt;1&lt;&#x2F;code&gt;.
Thus, my specific call would be the following.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #CDD6F4; background-color: #1E1E2E;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; efibootmgr&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F5C2E7;&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;  --create&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F5C2E7;&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;  --disk &#x2F;dev&#x2F;nvme0n1&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F5C2E7;&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;  --part&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FAB387;&quot;&gt; 1&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F5C2E7;&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;  --loader &#x2F;EFI&#x2F;Linux&#x2F;omarchy_linux.efi&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F5C2E7;&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;  --label &amp;quot;Omarchy&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Same deal if you were missing a Limine entry (using my specifics as an example again).&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #CDD6F4; background-color: #1E1E2E;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; efibootmgr&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F5C2E7;&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;  --create&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F5C2E7;&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;  --disk &#x2F;dev&#x2F;nvme0n1&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F5C2E7;&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;  --part&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FAB387;&quot;&gt; 1&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F5C2E7;&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;  --loader &#x2F;EFI&#x2F;limine&#x2F;limine_x64.efi&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F5C2E7;&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;  --label &amp;quot;Limine&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Once that’s done, you should be able to see the boot entries in &lt;code&gt;efibootmgr&lt;&#x2F;code&gt;, as well as in your BIOS.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #CDD6F4; background-color: #1E1E2E;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;❯&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; sudo efibootmgr&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;BootCurrent:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FAB387;&quot;&gt; 0000&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;Timeout:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FAB387;&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; seconds&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;BootOrder:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; 0000,0001,001E,001F,0021,0020,0022,0023,0024,0025,0026&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;Boot0000*&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; Omarchy       HD&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;1,GPT,e7363f48-0ae8-47bb-bb0f-298baceaff27,0x800,0x400000&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F5C2E7;&quot;&gt;\E&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;FI&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F5C2E7;&quot;&gt;\L&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;inux&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F5C2E7;&quot;&gt;\o&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;marchy_linux.efi&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;Boot0001*&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; Limine        HD&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;1,GPT,e7363f48-0ae8-47bb-bb0f-298baceaff27,0x800,0x400000&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F5C2E7;&quot;&gt;\E&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;FI&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F5C2E7;&quot;&gt;\l&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;imine&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F5C2E7;&quot;&gt;\l&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;imine_x64.efi&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;Boot0010&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;  Setup FvFile&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;721c8b66-426c-4e86-8e99-3457c46ab0b9&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;Boot0011&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;  Boot Menu     FvFile&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;126a762d-5758-4fca-8531-201a7f57f850&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;Boot0012&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;  Diagnostic Splash Screen      FvFile&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;a7d8d9a6-6ab0-4aeb-ad9d-163e59a7a380&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;Boot0013&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;  Lenovo Diagnostics    FvFile&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;3f7e615b-0d45-4f80-88dc-26b234958560&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;Boot0014&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;  Asset Information     FvFile&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;da465b87-a26f-4c12-b78a-0361428fa026&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;Boot0015&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;  Regulatory Information        FvFile&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;478c92a0-2622-42b7-a65d-5894169e4d24&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;Boot0016&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;  ThinkShield secure wipe       FvFile&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;3593a0d5-bd52-43a0-808e-cbff5ece2477&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;Boot0017&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;  ThinkShield Passwordless Power-On Device Manager      FvFile&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;08448b41-7f83-49be-82a7-0e84790ab133&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;Boot0018&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;  Wi-Fi Configuration   FvFile&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;d3aaff0f-cb22-4792-896c-802c2e9383ba&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;2d004100700070000000&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;Boot0019&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;  Reinstall Windows from Cloud  FvFile&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;3edbaac4-5017-4870-8cc4-721f9ef1974f&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;2d004100700070000000&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;Boot001A&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;  Intel&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;R&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; MEBx FvFile&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;29a70110-7762-4211-ae88-fab19b7665be&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;Boot001B&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;  Startup Interrupt Menu        FvFile&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;f46ee6f4-4785-43a3-923d-7f786c3c8479&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;Boot001C&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;  Rescue and Recovery   FvFile&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;665d3f60-ad3e-4cad-8e26-db46eee9f1b5&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;Boot001D&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;  Lenovo Memory Self Repair     FvFile&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;4ddd67e7-bdf5-4473-8ab0-02821c084338&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;Boot001E&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;  USB CD        VenMsg&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;bc7838d2-0f82-4d60-8316-c068ee79d25b,86701296aa5a7848b66cd49dd3ba6a55&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;Boot001F&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;  USB FDD       VenMsg&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;bc7838d2-0f82-4d60-8316-c068ee79d25b,6ff015a28830b543a8b8641009461e49&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;Boot0020&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;  NVMe0 VenMsg&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;bc7838d2-0f82-4d60-8316-c068ee79d25b,001c199932d94c4eae9aa0b6e98eb8a400&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;Boot0021*&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; USB HDD       VenMsg&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;bc7838d2-0f82-4d60-8316-c068ee79d25b,33e821aaaf33bc4789bd419f88c50803&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;Boot0022&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;  PXE BOOT      VenMsg&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;bc7838d2-0f82-4d60-8316-c068ee79d25b,78a84aaf2b2afc4ea79cf5cc8f3d3803&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;Boot0023&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;  LENOVO CLOUD  VenMsg&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;bc7838d2-0f82-4d60-8316-c068ee79d25b,ad38ccbbf7edf04d959cf42aa74d3650&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;&#x2F;Uri&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;https:&#x2F;&#x2F;download.lenovo.com&#x2F;pccbbs&#x2F;cdeploy&#x2F;efi&#x2F;boot.efi&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;Boot0024&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;  ON-PREMISE    VenMsg&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;bc7838d2-0f82-4d60-8316-c068ee79d25b,ad38ccbbf7edf04d959cf42aa74d3650&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;&#x2F;Uri&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;()&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;Boot0025&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;  Other CD      VenMsg&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;bc7838d2-0f82-4d60-8316-c068ee79d25b,aea2090adfde214e8b3a5e471856a35400&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;Boot0026&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;  Other HDD     VenMsg&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;bc7838d2-0f82-4d60-8316-c068ee79d25b,ca88c2349e7ae947beeb43038a5aeae700&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;Boot0027*&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; IDER BOOT CDROM       PciRoot&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;0x0&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;&#x2F;Pci&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;0x14,0x0&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;&#x2F;USB&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;11,1&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;Boot0028*&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; IDER BOOT Floppy      PciRoot&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;0x0&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;&#x2F;Pci&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;0x14,0x0&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;&#x2F;USB&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;11,0&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;Boot0029*&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; ATA HDD       VenMsg&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;bc7838d2-0f82-4d60-8316-c068ee79d25b,91af625956449f41a7b91f4f892ab0f6&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;Boot002A*&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; ATAPI CD      VenMsg&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;bc7838d2-0f82-4d60-8316-c068ee79d25b,aea2090adfde214e8b3a5e471856a354&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Setting &lt;code&gt;Omarchy&lt;&#x2F;code&gt; to your first boot option will then boot straight to Omarchy.&lt;&#x2F;p&gt;
</content>
    </entry>
    <entry xml:lang="en">
        <title>The outsized impact of cultural idiosyncrasies</title>
        <author>
          <name>Luke Hsiao</name>
        </author>
        <published>2026-01-21T00:00:00+00:00</published>
        <updated>2026-06-11T00:00:00+00:00</updated>
        <link href="https://luke.hsiao.dev/blog/cultural-idiosyncrasies/"/>
        <link rel="alternate" href="https://luke.hsiao.dev/blog/cultural-idiosyncrasies/" type="text/html"/>
        <id>https://luke.hsiao.dev/blog/cultural-idiosyncrasies/</id>
        <summary type="html">Cultural idiosyncrasies reveal what a company actually does, not just what it says. They can have an outsized impact on both public company image and internal perception and job satisfaction.</summary>
        <content type="html">&lt;p&gt;In the context of companies, cultural idiosyncrasies are fascinating to me.
I’m of the opinion that culture (including mission, principles, and values) is one of the biggest factors that differentiate companies from one another.
Sure, the product or service is often the largest differentiator, but company cultures—and in particular, their idiosyncrasies—have an outsized impact on public image, internal perception, and job satisfaction.&lt;&#x2F;p&gt;
&lt;p&gt;Why?&lt;&#x2F;p&gt;
&lt;p&gt;I believe it’s because these idiosyncrasies are evidence of what a company &lt;em&gt;does&lt;&#x2F;em&gt;, and not just what it &lt;em&gt;says&lt;&#x2F;em&gt; it does.
They reflect principles and values in uniquely powerful ways to both potential customers and employees.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;some-examples&quot;&gt;Some examples&lt;a class=&quot;zola-anchor&quot; href=&quot;#some-examples&quot; aria-label=&quot;Anchor link for: some-examples&quot; title=&quot;Anchor link for: some-examples&quot;&gt;&lt;svg
    xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;
    stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;
    class=&quot;icon icon-tabler icons-tabler-outline icon-tabler-link&quot; focusable=&quot;false&quot;&gt;
    &lt;path stroke=&quot;none&quot; d=&quot;M0 0h24v24H0z&quot; fill=&quot;none&quot; &#x2F;&gt;
    &lt;path d=&quot;M9 15l6 -6&quot; &#x2F;&gt;
    &lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; &#x2F;&gt;
    &lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; &#x2F;&gt;
  &lt;&#x2F;svg&gt;&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Let me draw some examples from my own lived experience, and I’m sure I’m missing some compelling examples further back (Sun Microsystems, Xerox PARC).&lt;&#x2F;p&gt;
&lt;p&gt;Also, and importantly, I’m not saying any of these idiosyncrasies are “right”, but I am saying they all have an outsized impact on my perception of the companies.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;google&quot;&gt;Google&lt;a class=&quot;zola-anchor&quot; href=&quot;#google&quot; aria-label=&quot;Anchor link for: google&quot; title=&quot;Anchor link for: google&quot;&gt;&lt;svg
    xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;
    stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;
    class=&quot;icon icon-tabler icons-tabler-outline icon-tabler-link&quot; focusable=&quot;false&quot;&gt;
    &lt;path stroke=&quot;none&quot; d=&quot;M0 0h24v24H0z&quot; fill=&quot;none&quot; &#x2F;&gt;
    &lt;path d=&quot;M9 15l6 -6&quot; &#x2F;&gt;
    &lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; &#x2F;&gt;
    &lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; &#x2F;&gt;
  &lt;&#x2F;svg&gt;&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;One of the earliest examples from my own memory is Google.
Not only did I experience how Google Search took over the market with its minimalism and effectiveness, but I also grew up hearing all sorts of news about how Google was “the best place to work”.
In those articles, did they talk about search?
Nope.
They talked about cultural idiosyncrasies: free meals from on-site cooks, nap pods, 20% projects, slides in the lobbies, micro-kitchens, laundry services!&lt;&#x2F;p&gt;
&lt;h3 id=&quot;oxide-computer&quot;&gt;Oxide Computer&lt;a class=&quot;zola-anchor&quot; href=&quot;#oxide-computer&quot; aria-label=&quot;Anchor link for: oxide-computer&quot; title=&quot;Anchor link for: oxide-computer&quot;&gt;&lt;svg
    xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;
    stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;
    class=&quot;icon icon-tabler icons-tabler-outline icon-tabler-link&quot; focusable=&quot;false&quot;&gt;
    &lt;path stroke=&quot;none&quot; d=&quot;M0 0h24v24H0z&quot; fill=&quot;none&quot; &#x2F;&gt;
    &lt;path d=&quot;M9 15l6 -6&quot; &#x2F;&gt;
    &lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; &#x2F;&gt;
    &lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; &#x2F;&gt;
  &lt;&#x2F;svg&gt;&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Oxide is a prime example.
They frequently feature in online discussion, but in my perception, the majority of this discussion isn’t about their product; it’s about their culture, often with highly positive sentiment.
They find this so core to their company that they &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;oxide-and-friends.transistor.fm&#x2F;episodes&#x2F;cultural-idiosyncrasies&quot;&gt;dedicated a podcast episode to it&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Some examples are demo Fridays, morning water-cooler, &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;rfd.shared.oxide.computer&#x2F;rfd&#x2F;0083&quot;&gt;no-meet Wednesdays&lt;&#x2F;a&gt;, recorded meetings, dog-pile debugging, &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;rfd.shared.oxide.computer&#x2F;rfd&#x2F;0001&quot;&gt;RFDs&lt;&#x2F;a&gt; (requests for discussion), no performance reviews, an overwhelmingly &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;rfd.shared.oxide.computer&#x2F;rfd&#x2F;0003&quot;&gt;writing-focused hiring process&lt;&#x2F;a&gt;, and &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;oxide.computer&#x2F;blog&#x2F;compensation-as-a-reflection-of-values&quot;&gt;uniform and transparent pay&lt;&#x2F;a&gt;, to name a few.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;gitlab&quot;&gt;GitLab&lt;a class=&quot;zola-anchor&quot; href=&quot;#gitlab&quot; aria-label=&quot;Anchor link for: gitlab&quot; title=&quot;Anchor link for: gitlab&quot;&gt;&lt;svg
    xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;
    stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;
    class=&quot;icon icon-tabler icons-tabler-outline icon-tabler-link&quot; focusable=&quot;false&quot;&gt;
    &lt;path stroke=&quot;none&quot; d=&quot;M0 0h24v24H0z&quot; fill=&quot;none&quot; &#x2F;&gt;
    &lt;path d=&quot;M9 15l6 -6&quot; &#x2F;&gt;
    &lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; &#x2F;&gt;
    &lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; &#x2F;&gt;
  &lt;&#x2F;svg&gt;&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;GitLab may not have the popularity of GitHub, but they have made a strong impression on me for at least two of their idiosyncrasies.&lt;&#x2F;p&gt;
&lt;p&gt;The first was particularly prominent during the COVID-19 pandemic: &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;handbook.gitlab.com&#x2F;handbook&#x2F;company&#x2F;culture&#x2F;all-remote&#x2F;guide&#x2F;&quot;&gt;a global, all-remote workforce&lt;&#x2F;a&gt;.
They are one of the largest all-remote companies with over 1,500 members in 65+ countries.&lt;&#x2F;p&gt;
&lt;p&gt;They are also known for their &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;handbook.gitlab.com&#x2F;&quot;&gt;transparent, handbook-first approach&lt;&#x2F;a&gt;.
They publish their handbook for all to see.
This is not brief, either.
It comprehensively covers everything: engineering, finance, sales, legal, and more.&lt;&#x2F;p&gt;
&lt;p&gt;This is an incredible show of transparency and goodwill in sharing hard-earned lessons publicly.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;37signals&quot;&gt;37signals&lt;a class=&quot;zola-anchor&quot; href=&quot;#37signals&quot; aria-label=&quot;Anchor link for: 37signals&quot; title=&quot;Anchor link for: 37signals&quot;&gt;&lt;svg
    xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;
    stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;
    class=&quot;icon icon-tabler icons-tabler-outline icon-tabler-link&quot; focusable=&quot;false&quot;&gt;
    &lt;path stroke=&quot;none&quot; d=&quot;M0 0h24v24H0z&quot; fill=&quot;none&quot; &#x2F;&gt;
    &lt;path d=&quot;M9 15l6 -6&quot; &#x2F;&gt;
    &lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; &#x2F;&gt;
    &lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; &#x2F;&gt;
  &lt;&#x2F;svg&gt;&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Not to be outdone, the 37signals folks also &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;basecamp.com&#x2F;handbook&quot;&gt;publish their handbook&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;In their case, they have also published &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;basecamp.com&#x2F;books&quot;&gt;highly profitable books&lt;&#x2F;a&gt; about their idiosyncrasies and culture, such as &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;basecamp.com&#x2F;shapeup&quot;&gt;&lt;em&gt;Shape Up&lt;&#x2F;em&gt;&lt;&#x2F;a&gt; (an engineering methodology that many companies are now adopting), &lt;em&gt;REWORK&lt;&#x2F;em&gt; (unconventional business advice), and &lt;em&gt;REMOTE&lt;&#x2F;em&gt; (on remote work).&lt;&#x2F;p&gt;
&lt;p&gt;They also have idiosyncrasies like &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;world.hey.com&#x2F;dhh&#x2F;all-in-on-omarchy-at-37signals-68162450&quot;&gt;Omarchy&lt;&#x2F;a&gt;, an opinionated distribution of Arch Linux.
They liked it so much they ditched MacBooks as the standard-issue developer laptop and switched to Framework laptops.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;tonari&quot;&gt;Tonari&lt;a class=&quot;zola-anchor&quot; href=&quot;#tonari&quot; aria-label=&quot;Anchor link for: tonari&quot; title=&quot;Anchor link for: tonari&quot;&gt;&lt;svg
    xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;
    stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;
    class=&quot;icon icon-tabler icons-tabler-outline icon-tabler-link&quot; focusable=&quot;false&quot;&gt;
    &lt;path stroke=&quot;none&quot; d=&quot;M0 0h24v24H0z&quot; fill=&quot;none&quot; &#x2F;&gt;
    &lt;path d=&quot;M9 15l6 -6&quot; &#x2F;&gt;
    &lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; &#x2F;&gt;
    &lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; &#x2F;&gt;
  &lt;&#x2F;svg&gt;&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Tonari is a small Japanese tech startup making some of the most interesting audio&#x2F;video portals available.&lt;&#x2F;p&gt;
&lt;p&gt;Despite being very small, they contribute significant pieces of their stack to open source, such as &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;tonarino&#x2F;innernet&quot;&gt;innernet&lt;&#x2F;a&gt;, a private network system using WireGuard under the hood.&lt;&#x2F;p&gt;
&lt;p&gt;They also value a heterogeneous mix of developer machines and were early on &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;blog.tonari.no&#x2F;why-we-love-rust&quot;&gt;the Rust train&lt;&#x2F;a&gt; (note how each of the four engineers mentioned in this blog runs a different operating system: macOS, Arch, Ubuntu, and Pop!_OS).&lt;&#x2F;p&gt;
&lt;h3 id=&quot;palantir&quot;&gt;Palantir&lt;a class=&quot;zola-anchor&quot; href=&quot;#palantir&quot; aria-label=&quot;Anchor link for: palantir&quot; title=&quot;Anchor link for: palantir&quot;&gt;&lt;svg
    xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;
    stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;
    class=&quot;icon icon-tabler icons-tabler-outline icon-tabler-link&quot; focusable=&quot;false&quot;&gt;
    &lt;path stroke=&quot;none&quot; d=&quot;M0 0h24v24H0z&quot; fill=&quot;none&quot; &#x2F;&gt;
    &lt;path d=&quot;M9 15l6 -6&quot; &#x2F;&gt;
    &lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; &#x2F;&gt;
    &lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; &#x2F;&gt;
  &lt;&#x2F;svg&gt;&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Palantir breaks the mold a bit in this list, because most of the public discussion around it is controversial and focused on the ethics of its business.&lt;&#x2F;p&gt;
&lt;p&gt;That said, they are known for their idiosyncratic &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.linkedin.com&#x2F;posts&#x2F;saileshpattnaik_inside-palantir-where-chaos-is-culture-and-activity-7397188784699666433-7usw&#x2F;&quot;&gt;chaos culture&lt;&#x2F;a&gt;, where “everything is up for debate”—even a random engineer confronting the CEO at all-hands—and where they do almost anything to move fast—like chartering a private jet to Palo Alto to get the engineering team together during the COVID-19 pandemic.&lt;&#x2F;p&gt;
&lt;p&gt;People I know who have worked there tell me this is an accurate representation.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;jane-street&quot;&gt;Jane Street&lt;a class=&quot;zola-anchor&quot; href=&quot;#jane-street&quot; aria-label=&quot;Anchor link for: jane-street&quot; title=&quot;Anchor link for: jane-street&quot;&gt;&lt;svg
    xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;
    stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;
    class=&quot;icon icon-tabler icons-tabler-outline icon-tabler-link&quot; focusable=&quot;false&quot;&gt;
    &lt;path stroke=&quot;none&quot; d=&quot;M0 0h24v24H0z&quot; fill=&quot;none&quot; &#x2F;&gt;
    &lt;path d=&quot;M9 15l6 -6&quot; &#x2F;&gt;
    &lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; &#x2F;&gt;
    &lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; &#x2F;&gt;
  &lt;&#x2F;svg&gt;&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Famously, it’s &lt;em&gt;the&lt;&#x2F;em&gt; OCaml shop people know about.
Compensation so high, even for interns, that it’s an idiosyncrasy.&lt;&#x2F;p&gt;
&lt;p&gt;And, most notably to me, they have one of the most interesting tech blogs around.
For example, their &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.janestreet.com&#x2F;tech-talks&#x2F;janestreet-code-review&#x2F;&quot;&gt;code review process&lt;&#x2F;a&gt; has such a good reputation that other tech bloggers &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;tigerbeetle.com&#x2F;blog&#x2F;2025-08-04-code-review-can-be-better&#x2F;&quot;&gt;carve out exceptions for it&lt;&#x2F;a&gt; when talking about code review problems.
They care so much about rigor in tests that they not only leverage &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;blog.janestreet.com&#x2F;getting-from-tested-to-battle-tested&#x2F;&quot;&gt;bleeding-edge strategies&lt;&#x2F;a&gt; like deterministic simulation testing (DST) but also &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.prnewswire.com&#x2F;in&#x2F;news-releases&#x2F;jane-street-leads-antithesiss-105m-series-a-to-make-deterministic-simulation-testing-the-new-standard-302631118.html&quot;&gt;led the funding round of Antithesis, the pioneers in DST&lt;&#x2F;a&gt;.
This is highly idiosyncratic.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;amazon&quot;&gt;Amazon&lt;a class=&quot;zola-anchor&quot; href=&quot;#amazon&quot; aria-label=&quot;Anchor link for: amazon&quot; title=&quot;Anchor link for: amazon&quot;&gt;&lt;svg
    xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;
    stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;
    class=&quot;icon icon-tabler icons-tabler-outline icon-tabler-link&quot; focusable=&quot;false&quot;&gt;
    &lt;path stroke=&quot;none&quot; d=&quot;M0 0h24v24H0z&quot; fill=&quot;none&quot; &#x2F;&gt;
    &lt;path d=&quot;M9 15l6 -6&quot; &#x2F;&gt;
    &lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; &#x2F;&gt;
    &lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; &#x2F;&gt;
  &lt;&#x2F;svg&gt;&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Even for massive companies like Amazon, some cultural idiosyncrasies still have an outsized impact.&lt;&#x2F;p&gt;
&lt;p&gt;For example, I suspect most people have heard of &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.forbes.com&#x2F;councils&#x2F;forbescommunicationscouncil&#x2F;2022&#x2F;08&#x2F;30&#x2F;why-and-how-every-company-should-use-amazons-six-page-memo-format&#x2F;&quot;&gt;Amazon’s 6-page memo&lt;&#x2F;a&gt; approach to meetings.
In this approach, attendees don’t read anything beforehand; instead of using PowerPoint, executives sit around a table and read six-page memos in silence before discussion commences.&lt;&#x2F;p&gt;
&lt;p&gt;Likewise, Amazon is well known for its &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;martinfowler.com&#x2F;bliki&#x2F;TwoPizzaTeam.html&quot;&gt;two-pizza teams&lt;&#x2F;a&gt;, where the idea is that a team should be no larger than two pizzas can feed.
That way it stays small, cohesive, and efficient.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;zappos&quot;&gt;Zappos&lt;a class=&quot;zola-anchor&quot; href=&quot;#zappos&quot; aria-label=&quot;Anchor link for: zappos&quot; title=&quot;Anchor link for: zappos&quot;&gt;&lt;svg
    xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;
    stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;
    class=&quot;icon icon-tabler icons-tabler-outline icon-tabler-link&quot; focusable=&quot;false&quot;&gt;
    &lt;path stroke=&quot;none&quot; d=&quot;M0 0h24v24H0z&quot; fill=&quot;none&quot; &#x2F;&gt;
    &lt;path d=&quot;M9 15l6 -6&quot; &#x2F;&gt;
    &lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; &#x2F;&gt;
    &lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; &#x2F;&gt;
  &lt;&#x2F;svg&gt;&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Zappos is well known for its unique &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.businessinsider.com&#x2F;zappos-tony-hsieh-paid-new-workers-to-quit-the-offer-2020-11?op=1&quot;&gt;pay-to-quit&lt;&#x2F;a&gt; approach to making sure the team is invested.
It provides an attractive off-ramp for those who are less committed to or interested in the company after their training period, instead of staying despite lacking passion for the work.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;patagonia&quot;&gt;Patagonia&lt;a class=&quot;zola-anchor&quot; href=&quot;#patagonia&quot; aria-label=&quot;Anchor link for: patagonia&quot; title=&quot;Anchor link for: patagonia&quot;&gt;&lt;svg
    xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;
    stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;
    class=&quot;icon icon-tabler icons-tabler-outline icon-tabler-link&quot; focusable=&quot;false&quot;&gt;
    &lt;path stroke=&quot;none&quot; d=&quot;M0 0h24v24H0z&quot; fill=&quot;none&quot; &#x2F;&gt;
    &lt;path d=&quot;M9 15l6 -6&quot; &#x2F;&gt;
    &lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; &#x2F;&gt;
    &lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; &#x2F;&gt;
  &lt;&#x2F;svg&gt;&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Patagonia is well known for its &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.patagonia.com&#x2F;product&#x2F;let-my-people-go-surfing-revised-paperback-book&#x2F;BK067.html&quot;&gt;&lt;em&gt;Let My People Go Surfing&lt;&#x2F;em&gt;&lt;&#x2F;a&gt; policy, which prioritizes work-life balance, purpose, and employee autonomy.
The policy encourages staff to embrace flexibility and spontaneity in balancing work and play.
If the waves are good or the powder fresh, staff are trusted to step away, surf, or enjoy nature, returning to work with renewed purpose.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;valve&quot;&gt;Valve&lt;a class=&quot;zola-anchor&quot; href=&quot;#valve&quot; aria-label=&quot;Anchor link for: valve&quot; title=&quot;Anchor link for: valve&quot;&gt;&lt;svg
    xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;
    stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;
    class=&quot;icon icon-tabler icons-tabler-outline icon-tabler-link&quot; focusable=&quot;false&quot;&gt;
    &lt;path stroke=&quot;none&quot; d=&quot;M0 0h24v24H0z&quot; fill=&quot;none&quot; &#x2F;&gt;
    &lt;path d=&quot;M9 15l6 -6&quot; &#x2F;&gt;
    &lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; &#x2F;&gt;
    &lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; &#x2F;&gt;
  &lt;&#x2F;svg&gt;&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Valve is the famously “flat” company, or “flatland”, &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;media.steampowered.com&#x2F;apps&#x2F;valve&#x2F;Valve_Handbook_LowRes.pdf&quot;&gt;as their public handbook calls it&lt;&#x2F;a&gt;.
They “don’t have any management, and nobody reports to anybody.”
They playfully poke at Google’s 20% time by saying that at Valve, it’s 100%.
Of course, this comes with its challenges, but this idiosyncrasy has become an integral part of my perception of Valve.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;vannevar-labs&quot;&gt;Vannevar Labs&lt;a class=&quot;zola-anchor&quot; href=&quot;#vannevar-labs&quot; aria-label=&quot;Anchor link for: vannevar-labs&quot; title=&quot;Anchor link for: vannevar-labs&quot;&gt;&lt;svg
    xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;
    stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;
    class=&quot;icon icon-tabler icons-tabler-outline icon-tabler-link&quot; focusable=&quot;false&quot;&gt;
    &lt;path stroke=&quot;none&quot; d=&quot;M0 0h24v24H0z&quot; fill=&quot;none&quot; &#x2F;&gt;
    &lt;path d=&quot;M9 15l6 -6&quot; &#x2F;&gt;
    &lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; &#x2F;&gt;
    &lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; &#x2F;&gt;
  &lt;&#x2F;svg&gt;&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Sample size of 1, but I have a friend who really appreciates Vannevar’s $250&#x2F;month stipend for mental&#x2F;physical health and $300&#x2F;month stipend to pay for house cleaners.
These dedicated benefits are particularly on point for a mostly remote team.
As a company they heavily hire forward-deployed engineers (FDEs) and empower them with very high autonomy.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;thoughts&quot;&gt;Thoughts&lt;a class=&quot;zola-anchor&quot; href=&quot;#thoughts&quot; aria-label=&quot;Anchor link for: thoughts&quot; title=&quot;Anchor link for: thoughts&quot;&gt;&lt;svg
    xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;
    stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;
    class=&quot;icon icon-tabler icons-tabler-outline icon-tabler-link&quot; focusable=&quot;false&quot;&gt;
    &lt;path stroke=&quot;none&quot; d=&quot;M0 0h24v24H0z&quot; fill=&quot;none&quot; &#x2F;&gt;
    &lt;path d=&quot;M9 15l6 -6&quot; &#x2F;&gt;
    &lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; &#x2F;&gt;
    &lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; &#x2F;&gt;
  &lt;&#x2F;svg&gt;&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;I’m sure this list could be ten times longer with some more thought.
But perhaps that supports the point.
All of these examples came almost immediately off the top of my head!&lt;&#x2F;p&gt;
&lt;p&gt;If you’re running a company, I think it’s important to be intentional about your culture.
Both in the mission, principles, and values you profess and in the idiosyncrasies that uniquely evolve because of them.&lt;&#x2F;p&gt;
&lt;p&gt;People &lt;em&gt;will&lt;&#x2F;em&gt; talk about your cultural idiosyncrasies to the benefit or detriment of your company.
Your employees will reach for your idiosyncrasies when they talk about what is good or bad about working for your company.
Your customers will point to your idiosyncrasies as evidence for or against value alignment.
Your future employees will compare and contrast your idiosyncrasies with their experiences as they consider their next career move.&lt;&#x2F;p&gt;
&lt;p&gt;And random people like me will evidently spend (too much?) time thinking about your idiosyncrasies and trying to theory-craft the perfect set of cultural idiosyncrasies for their hypothetical future company.&lt;&#x2F;p&gt;
</content>
    </entry>
    <entry xml:lang="en">
        <title>2026 is the year I return to rigorous planning</title>
        <author>
          <name>Luke Hsiao</name>
        </author>
        <published>2026-01-08T00:00:00+00:00</published>
        <updated>2026-01-08T00:00:00+00:00</updated>
        <link href="https://luke.hsiao.dev/blog/planning/"/>
        <link rel="alternate" href="https://luke.hsiao.dev/blog/planning/" type="text/html"/>
        <id>https://luke.hsiao.dev/blog/planning/</id>
        <summary type="html">2026 is the year I return to time-block planning and full-task capture. Here are some thoughts around my implementation.</summary>
        <content type="html">&lt;p&gt;2026 is the year I return to some rigorous planning and productivity habits I’ve let slip over the years.
Specifically, &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.timeblockplanner.com&#x2F;&quot;&gt;time-block planning&lt;&#x2F;a&gt; (à la Cal Newport) and full-task capture (à la &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Getting_Things_Done&quot;&gt;Getting Things Done (GTD)&lt;&#x2F;a&gt; by David Allen).&lt;&#x2F;p&gt;
&lt;p&gt;The motivation for this change is that I anticipate this will be an unusually busy year for me at work, at home, and in my communities.
I want to make sure I make the most of the opportunities.&lt;&#x2F;p&gt;
&lt;p&gt;The motivation for this post is twofold.
First, for a bit of documentation and musing on how I have specifically implemented these ideas this time around.
Second, for a little bit of self-accountability.
Who knows, maybe this will also motivate someone else to reevaluate their productivity habits.&lt;&#x2F;p&gt;
&lt;p&gt;While we’re only a week into this year, this is a system I have used extensively since early high school—just less so recently.
Consequently, I already know that it is an effective catalyst for my own productivity.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;the-methods&quot;&gt;The methods&lt;a class=&quot;zola-anchor&quot; href=&quot;#the-methods&quot; aria-label=&quot;Anchor link for: the-methods&quot; title=&quot;Anchor link for: the-methods&quot;&gt;&lt;svg
    xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;
    stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;
    class=&quot;icon icon-tabler icons-tabler-outline icon-tabler-link&quot; focusable=&quot;false&quot;&gt;
    &lt;path stroke=&quot;none&quot; d=&quot;M0 0h24v24H0z&quot; fill=&quot;none&quot; &#x2F;&gt;
    &lt;path d=&quot;M9 15l6 -6&quot; &#x2F;&gt;
    &lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; &#x2F;&gt;
    &lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; &#x2F;&gt;
  &lt;&#x2F;svg&gt;&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;I’ll refer you to the links at the top of this post for more thorough exploration on what these systems mean.
However, for the purpose of this post, I want to briefly describe these two methods.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;time-block-planning&quot;&gt;Time-block planning&lt;a class=&quot;zola-anchor&quot; href=&quot;#time-block-planning&quot; aria-label=&quot;Anchor link for: time-block-planning&quot; title=&quot;Anchor link for: time-block-planning&quot;&gt;&lt;svg
    xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;
    stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;
    class=&quot;icon icon-tabler icons-tabler-outline icon-tabler-link&quot; focusable=&quot;false&quot;&gt;
    &lt;path stroke=&quot;none&quot; d=&quot;M0 0h24v24H0z&quot; fill=&quot;none&quot; &#x2F;&gt;
    &lt;path d=&quot;M9 15l6 -6&quot; &#x2F;&gt;
    &lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; &#x2F;&gt;
    &lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; &#x2F;&gt;
  &lt;&#x2F;svg&gt;&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Time-block planning is an intentional method for planning your days—hopefully a method that leads to being able to do &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.goodreads.com&#x2F;book&#x2F;show&#x2F;30241038-cal-newport-s-deep-work&quot;&gt;deep work&lt;&#x2F;a&gt;, which I, in agreement with Newport, believe is vitally important in our modern distracted world.
This is particularly well-suited to knowledge workers, and it also served me well when I was a student.&lt;&#x2F;p&gt;
&lt;p&gt;Many knowledge workers spend their day &lt;em&gt;reacting&lt;&#x2F;em&gt;.
Reacting to messages, emails, changing priorities, changing requirements, meetings, etc.
This often leads to anxiety, overload, a lack of clarity, a feeling of chaos, and often impedes progress on things that require deep, focused effort.&lt;&#x2F;p&gt;
&lt;p&gt;Time-blocking is all about proactive &lt;em&gt;intention&lt;&#x2F;em&gt;.
Each day you fill out your calendar with time blocks representing a preliminary plan that gives every minute a purpose.
If you get knocked off this schedule, you simply update it the next time you have a chance.&lt;&#x2F;p&gt;
&lt;p&gt;This sounds simple.&lt;&#x2F;p&gt;
&lt;p&gt;It is.&lt;&#x2F;p&gt;
&lt;p&gt;You can &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;staysaasy.com&#x2F;leadership&#x2F;2024&#x2F;03&#x2F;12&#x2F;Getting-Things-Done.html&quot;&gt;get things done in a chaotic environment&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;full-task-capture&quot;&gt;Full task capture&lt;a class=&quot;zola-anchor&quot; href=&quot;#full-task-capture&quot; aria-label=&quot;Anchor link for: full-task-capture&quot; title=&quot;Anchor link for: full-task-capture&quot;&gt;&lt;svg
    xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;
    stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;
    class=&quot;icon icon-tabler icons-tabler-outline icon-tabler-link&quot; focusable=&quot;false&quot;&gt;
    &lt;path stroke=&quot;none&quot; d=&quot;M0 0h24v24H0z&quot; fill=&quot;none&quot; &#x2F;&gt;
    &lt;path d=&quot;M9 15l6 -6&quot; &#x2F;&gt;
    &lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; &#x2F;&gt;
    &lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; &#x2F;&gt;
  &lt;&#x2F;svg&gt;&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;This probably isn’t the right term in a GTD context, but it conveys the methodology I find useful.
The idea here is that you should &lt;strong&gt;capture everything&lt;&#x2F;strong&gt; that has your attention (tasks, ideas, etc.) into an external system so that you can free your mind from lingering unproductively and unreliably on them.
This capture should be both complete and as immediate as possible, and should go into a single designated spot (e.g., an “inbox”).
Then, you can process this list later with intention, either scheduling things, stashing things for later, or intentionally discarding things.&lt;&#x2F;p&gt;
&lt;p&gt;If you’re the type of person who frequently has things “fall through the cracks” or finds yourself up at night repeatedly looping through things you need to do, you might find this technique refreshingly freeing.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;my-implementation&quot;&gt;My implementation&lt;a class=&quot;zola-anchor&quot; href=&quot;#my-implementation&quot; aria-label=&quot;Anchor link for: my-implementation&quot; title=&quot;Anchor link for: my-implementation&quot;&gt;&lt;svg
    xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;
    stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;
    class=&quot;icon icon-tabler icons-tabler-outline icon-tabler-link&quot; focusable=&quot;false&quot;&gt;
    &lt;path stroke=&quot;none&quot; d=&quot;M0 0h24v24H0z&quot; fill=&quot;none&quot; &#x2F;&gt;
    &lt;path d=&quot;M9 15l6 -6&quot; &#x2F;&gt;
    &lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; &#x2F;&gt;
    &lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; &#x2F;&gt;
  &lt;&#x2F;svg&gt;&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;So, now that you have the basic ideas, I want to share my current implementation.&lt;&#x2F;p&gt;
&lt;p&gt;Implementation is a highly personal choice.
Some people prefer pen and paper (like Newport does).
To go further, some people might implement these ideas in the context of notebook-specific systems, like &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;bulletjournal.com&#x2F;&quot;&gt;bullet journaling&lt;&#x2F;a&gt;, or a &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.jetpens.com&#x2F;blog&#x2F;Guide-to-the-Hobonichi-Techo-Planner&#x2F;pt&#x2F;900&quot;&gt;Hobonichi Techo&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Others might use special, purpose-built apps on their computer or phone.
Others might use intentionally basic apps or systems like &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;todotxt.org&#x2F;&quot;&gt;todo.txt&lt;&#x2F;a&gt;.
Others might use a big whiteboard in their office.&lt;&#x2F;p&gt;
&lt;p&gt;While those who know me know I love stationery, I’ve found that the single most important factor for success with these systems is low friction.
If I remember a task in the middle of the night, and that means I need to go find a pen and my notebook, it’s not happening.
But I can always find my phone for a quick note.&lt;&#x2F;p&gt;
&lt;p&gt;So, I use Google Calendar and Google Tasks.
They are already on my phone.
They are easily accessible on both phone and computer.
They have sufficient features to implement the systems.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;time-block-planning-in-google-calendar&quot;&gt;Time block planning in Google Calendar&lt;a class=&quot;zola-anchor&quot; href=&quot;#time-block-planning-in-google-calendar&quot; aria-label=&quot;Anchor link for: time-block-planning-in-google-calendar&quot; title=&quot;Anchor link for: time-block-planning-in-google-calendar&quot;&gt;&lt;svg
    xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;
    stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;
    class=&quot;icon icon-tabler icons-tabler-outline icon-tabler-link&quot; focusable=&quot;false&quot;&gt;
    &lt;path stroke=&quot;none&quot; d=&quot;M0 0h24v24H0z&quot; fill=&quot;none&quot; &#x2F;&gt;
    &lt;path d=&quot;M9 15l6 -6&quot; &#x2F;&gt;
    &lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; &#x2F;&gt;
    &lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; &#x2F;&gt;
  &lt;&#x2F;svg&gt;&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;A good work week usually looks something like this.&lt;&#x2F;p&gt;
&lt;figure &gt;
  &lt;a href=&quot;img&amp;#x2F;gcal.png&quot;&gt;
    &lt;img src=&quot;img&amp;#x2F;gcal.png&quot; alt=&quot;Time-blocking in Google Calendar&quot; style=&quot;background-color: white;&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  &lt;figcaption&gt;
    Time-blocking in Google Calendar.
  &lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;












&lt;div class=&quot;aside aside--note&quot;&gt;
  &lt;div class=&quot;aside__header&quot; role=&quot;heading&quot; aria-level=&quot;3&quot;&gt;
    &lt;div class=&quot;aside__icon&quot; aria-hidden=&quot;true&quot;&gt;
      
      &lt;svg xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot;
        stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;
        class=&quot;icon icon-tabler icons-tabler-outline icon-tabler-info-circle&quot;&gt;
        &lt;path stroke=&quot;none&quot; d=&quot;M0 0h24v24H0z&quot; fill=&quot;none&quot; &#x2F;&gt;
        &lt;path d=&quot;M3 12a9 9 0 1 0 18 0a9 9 0 0 0 -18 0&quot; &#x2F;&gt;
        &lt;path d=&quot;M12 9h.01&quot; &#x2F;&gt;
        &lt;path d=&quot;M11 12h1v4h1&quot; &#x2F;&gt;
      &lt;&#x2F;svg&gt;
      
    &lt;&#x2F;div&gt;

    &lt;span class=&quot;aside__title&quot;&gt;Note&lt;&#x2F;span&gt;
  &lt;&#x2F;div&gt;

  &lt;div class=&quot;aside__body&quot;&gt;&lt;p&gt;I have several Google accounts, so they all feed into a master view on my phone that includes time blocking before and after work hours.&lt;&#x2F;p&gt;
&lt;&#x2F;div&gt;
&lt;&#x2F;div&gt;
&lt;p&gt;While the image above shows a fully-populated week, I actually only time-block one day ahead.
That is, during the “shutdown ritual” of the day, I review the tasks and ideas I may have captured within the context of my current task lists, then time-block the next day based on those tasks.
One exception here is recurring events are scheduled as recurring, and thus are already populated on their respective days.
While the screenshot above doesn’t show this well, it’s also important to have some empty buffer time to absorb unexpected events, or variance in how long things take.
This is another advantage of digital over paper: I can easily schedule events far into the future and not lose the information.
With a paper planner, it’s hard to schedule someone’s wedding in a year.&lt;&#x2F;p&gt;
&lt;p&gt;As the day proceeds, if things do not go according to plan, I adjust the blocks on the calendar to reflect reality.
This is a valuable exercise both as an artifact to review where I actually spent my time on a given day and as useful feedback to improve my time estimations.
For example, you may notice I spent about three full days testing in the screenshot above.
I had initially anticipated that would take a single day.
The act of making things reflect reality is a good way to calibrate myself on how long to expect for similar work.
It goes the other way too: sometimes things take much less time than expected.&lt;&#x2F;p&gt;
&lt;p&gt;When it comes to deep work, it feels good to see those larger, uninterrupted blocks of time.
If those blocks were short and highly interrupted, I’d take it as a signal to make adjustments that allow me to do deeper, more meaningful work with less context switching.&lt;&#x2F;p&gt;
&lt;p&gt;You can see how time-block planning would work effectively in a knowledge worker’s or student’s life, but likely not in the life of an emergency room nurse.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;full-task-capture-in-google-tasks&quot;&gt;Full task capture in Google Tasks&lt;a class=&quot;zola-anchor&quot; href=&quot;#full-task-capture-in-google-tasks&quot; aria-label=&quot;Anchor link for: full-task-capture-in-google-tasks&quot; title=&quot;Anchor link for: full-task-capture-in-google-tasks&quot;&gt;&lt;svg
    xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;
    stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;
    class=&quot;icon icon-tabler icons-tabler-outline icon-tabler-link&quot; focusable=&quot;false&quot;&gt;
    &lt;path stroke=&quot;none&quot; d=&quot;M0 0h24v24H0z&quot; fill=&quot;none&quot; &#x2F;&gt;
    &lt;path d=&quot;M9 15l6 -6&quot; &#x2F;&gt;
    &lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; &#x2F;&gt;
    &lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; &#x2F;&gt;
  &lt;&#x2F;svg&gt;&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;The last time I used Google Tasks was a few years ago, and they’ve made some nice improvements since.
For the purpose of full task capture, I keep a relatively simple system.
Not quite as simple as a &lt;code&gt;todo.txt&lt;&#x2F;code&gt;, but still minimal while offering nice organization features like recurring tasks, scheduled tasks, and sub-tasks.&lt;&#x2F;p&gt;
&lt;figure &gt;
  &lt;a href=&quot;img&amp;#x2F;gtasks.png&quot;&gt;
    &lt;img src=&quot;img&amp;#x2F;gtasks.png&quot; alt=&quot;Full task capture in Google Tasks&quot; style=&quot;background-color: white;&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  &lt;figcaption&gt;
    Full task capture with Google Tasks.
  &lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;I organize Google Tasks somewhat Kanban-style.&lt;&#x2F;p&gt;
&lt;p&gt;Google Tasks has a default list you cannot delete.
I use that as my “inbox”, but I title it “Maybe?”.
All quick notes go into here for later processing if I don’t have time to put it in the right list immediately.
If I decide to do it, it goes into the appropriate list.
If I don’t, it gets deleted from here.
I sort this with “My order” sorting so I can arbitrarily sort it with highest priority at the top.&lt;&#x2F;p&gt;
&lt;p&gt;On the left, I have my “Not now” list.
These are things I want to do at some point, but they aren’t urgent.
I just don’t want to lose them, so this is much like a backlog.
This is also sorted “My order”, with highest priority at the top.&lt;&#x2F;p&gt;
&lt;p&gt;In the middle, I have “In progress”, which could also be named “To do”.
These are things I’m actively working on.
Everything in this list has a date indicating when I intend to work on it.
I might add deadlines if relevant.
I sort this list by “Date” so that the things I need to do today are always up top, and I can quickly see what I need to do next.&lt;&#x2F;p&gt;
&lt;p&gt;This is the &lt;strong&gt;only&lt;&#x2F;strong&gt; list that I mark things as “complete” from!&lt;&#x2F;p&gt;
&lt;p&gt;Conveniently, these also show up in Google Calendar as you do them, providing a useful artifact of tasks you completed that day.&lt;&#x2F;p&gt;
&lt;p&gt;Next, I have “On hold”.
These are things I was working on, but are now blocked for some reason.
A holding area.
When they become unblocked, they will go back to “In progress” with the appropriate dates.
Sorted in “My order”, with highest priority at the top.&lt;&#x2F;p&gt;
&lt;p&gt;Finally, “Ideas”.
This is just a list of ideas sorted in “My order” with most interesting at the top.
I also find it handy to jot down things like gift ideas for people in the moment I discover them.&lt;&#x2F;p&gt;
&lt;p&gt;When I add these items, I also occasionally use &lt;code&gt;todo.txt&lt;&#x2F;code&gt;-style tags like &lt;code&gt;+{project}&lt;&#x2F;code&gt; or &lt;code&gt;@{context}&lt;&#x2F;code&gt;, even though Google Tasks has now way to filter for those.&lt;&#x2F;p&gt;
&lt;p&gt;When I was a student, this was a superpower; I &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;luke.hsiao.dev&#x2F;blog&#x2F;freshman-success&#x2F;#syllabus-ingestion-and-organization&quot;&gt;still give the advice today&lt;&#x2F;a&gt;.
As a student, I would start each semester by inputting all coursework dates from every class syllabus.
I always knew what was due, which weeks would be heavy, and which would be light.&lt;&#x2F;p&gt;
&lt;p&gt;Another common question from fellow knowledge workers is how this fits in with other task tracking systems you might have at work (e.g., Linear, Jira, etc.).
The answer there is that this is far more lightweight.
I’m not writing lengthy descriptions or logging progress and notes on these items.
These are written as “just enough” context to know what they refer to clearly.
This is a personal system that complements the systems your teams might be using.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;thoughts-so-far&quot;&gt;Thoughts so far&lt;a class=&quot;zola-anchor&quot; href=&quot;#thoughts-so-far&quot; aria-label=&quot;Anchor link for: thoughts-so-far&quot; title=&quot;Anchor link for: thoughts-so-far&quot;&gt;&lt;svg
    xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;
    stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;
    class=&quot;icon icon-tabler icons-tabler-outline icon-tabler-link&quot; focusable=&quot;false&quot;&gt;
    &lt;path stroke=&quot;none&quot; d=&quot;M0 0h24v24H0z&quot; fill=&quot;none&quot; &#x2F;&gt;
    &lt;path d=&quot;M9 15l6 -6&quot; &#x2F;&gt;
    &lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; &#x2F;&gt;
    &lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; &#x2F;&gt;
  &lt;&#x2F;svg&gt;&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;I should never have stopped doing this!
When you develop a productivity system that works for you personally, it feels like a bandwidth multiplier.&lt;&#x2F;p&gt;
&lt;p&gt;There is also much more to discuss about setting goals, &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;swizec.com&#x2F;blog&#x2F;your-career-needs-a-vision&#x2F;&quot;&gt;having a vision for your career&lt;&#x2F;a&gt;, and other high-level planning that ultimately feeds your day-to-day work, but those are out of scope for this particular post.&lt;&#x2F;p&gt;
&lt;p&gt;This is all about the nitty-gritty of day-to-day productivity.&lt;&#x2F;p&gt;
&lt;p&gt;This system might not work for you, but I hope it has sparked some ideas as you work on your own systems.&lt;&#x2F;p&gt;
</content>
    </entry>
    <entry xml:lang="en">
        <title>My favorite software in 2025</title>
        <author>
          <name>Luke Hsiao</name>
        </author>
        <published>2025-12-17T00:00:00+00:00</published>
        <updated>2025-12-20T00:00:00+00:00</updated>
        <link href="https://luke.hsiao.dev/blog/favorite-software-2025/"/>
        <link rel="alternate" href="https://luke.hsiao.dev/blog/favorite-software-2025/" type="text/html"/>
        <id>https://luke.hsiao.dev/blog/favorite-software-2025/</id>
        <summary type="html">A big list of my favorite software tools in 2025.</summary>
        <content type="html">&lt;p&gt;As an engineer, I’m always refining which tools are in my toolbox.
Here’s a big list of software I enjoy using in 2025.
Like &lt;a href=&quot;https:&#x2F;&#x2F;luke.hsiao.dev&#x2F;blog&#x2F;favorite-software-2024&#x2F;&quot;&gt;2024&lt;&#x2F;a&gt;, I’m omitting things I don’t touch at least once in a month.
So, please refer to &lt;a href=&quot;https:&#x2F;&#x2F;luke.hsiao.dev&#x2F;blog&#x2F;favorite-software-2023&#x2F;&quot;&gt;2023&lt;&#x2F;a&gt; for some honorable, but less regular, mentions.&lt;&#x2F;p&gt;
&lt;span id=&quot;continue-reading&quot;&gt;&lt;&#x2F;span&gt;&lt;h2 id=&quot;the-list&quot;&gt;The List&lt;a class=&quot;zola-anchor&quot; href=&quot;#the-list&quot; aria-label=&quot;Anchor link for: the-list&quot; title=&quot;Anchor link for: the-list&quot;&gt;&lt;svg
    xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;
    stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;
    class=&quot;icon icon-tabler icons-tabler-outline icon-tabler-link&quot; focusable=&quot;false&quot;&gt;
    &lt;path stroke=&quot;none&quot; d=&quot;M0 0h24v24H0z&quot; fill=&quot;none&quot; &#x2F;&gt;
    &lt;path d=&quot;M9 15l6 -6&quot; &#x2F;&gt;
    &lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; &#x2F;&gt;
    &lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; &#x2F;&gt;
  &lt;&#x2F;svg&gt;&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;aerc-golang-mit-license&quot;&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;aerc-mail.org&#x2F;&quot;&gt;aerc&lt;&#x2F;a&gt; &lt;img src=&quot;https:&#x2F;&#x2F;img.shields.io&#x2F;badge&#x2F;lang-go-cadetblue&quot; alt=&quot;golang&quot; &#x2F;&gt; &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;git.sr.ht&#x2F;~rjarry&#x2F;aerc&#x2F;tree&#x2F;master&#x2F;item&#x2F;LICENSE&quot;&gt;&lt;img src=&quot;https:&#x2F;&#x2F;img.shields.io&#x2F;badge&#x2F;license-MIT-whitesmoke&quot; alt=&quot;MIT License&quot; &#x2F;&gt;&lt;&#x2F;a&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#aerc-golang-mit-license&quot; aria-label=&quot;Anchor link for: aerc-golang-mit-license&quot; title=&quot;Anchor link for: aerc-golang-mit-license&quot;&gt;&lt;svg
    xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;
    stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;
    class=&quot;icon icon-tabler icons-tabler-outline icon-tabler-link&quot; focusable=&quot;false&quot;&gt;
    &lt;path stroke=&quot;none&quot; d=&quot;M0 0h24v24H0z&quot; fill=&quot;none&quot; &#x2F;&gt;
    &lt;path d=&quot;M9 15l6 -6&quot; &#x2F;&gt;
    &lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; &#x2F;&gt;
    &lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; &#x2F;&gt;
  &lt;&#x2F;svg&gt;&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;This is my email client of choice.
I tried &lt;code&gt;mutt&lt;&#x2F;code&gt;, but the configuration was too complex for me.
&lt;code&gt;aerc&lt;&#x2F;code&gt;, on the other hand, is very simple to configure, and works great in the terminal.
I’m an advocate for &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;useplaintext.email&#x2F;&quot;&gt;using plaintext email&lt;&#x2F;a&gt;, and &lt;code&gt;aerc&lt;&#x2F;code&gt; works great for using &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;git-send-email.io&#x2F;&quot;&gt;email for git patches&lt;&#x2F;a&gt;.
It lets me use my &lt;code&gt;$EDITOR&lt;&#x2F;code&gt; of choice, search and filtering works well, and it’s quick.
Let me also call out a new discovery here: &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;man.archlinux.org&#x2F;man&#x2F;carddav-query.1.en&quot;&gt;&lt;code&gt;carddav-query&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;.
This works far better than the largely unmaintained &lt;code&gt;goobook&lt;&#x2F;code&gt; I was using previously.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;atuin-rust-mit-license&quot;&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;aerc-mail.org&#x2F;&quot;&gt;atuin&lt;&#x2F;a&gt; &lt;img src=&quot;https:&#x2F;&#x2F;img.shields.io&#x2F;badge&#x2F;lang-rust-firebrick&quot; alt=&quot;rust&quot; &#x2F;&gt; &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;atuinsh&#x2F;atuin&#x2F;blob&#x2F;main&#x2F;LICENSE&quot;&gt;&lt;img src=&quot;https:&#x2F;&#x2F;img.shields.io&#x2F;badge&#x2F;license-MIT-whitesmoke&quot; alt=&quot;MIT License&quot; &#x2F;&gt;&lt;&#x2F;a&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#atuin-rust-mit-license&quot; aria-label=&quot;Anchor link for: atuin-rust-mit-license&quot; title=&quot;Anchor link for: atuin-rust-mit-license&quot;&gt;&lt;svg
    xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;
    stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;
    class=&quot;icon icon-tabler icons-tabler-outline icon-tabler-link&quot; focusable=&quot;false&quot;&gt;
    &lt;path stroke=&quot;none&quot; d=&quot;M0 0h24v24H0z&quot; fill=&quot;none&quot; &#x2F;&gt;
    &lt;path d=&quot;M9 15l6 -6&quot; &#x2F;&gt;
    &lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; &#x2F;&gt;
    &lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; &#x2F;&gt;
  &lt;&#x2F;svg&gt;&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;You don’t realize how useful synced shell history is until you try it.
You should absolutely try it.
Installed it on a whim, and have been delighted since.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;bat-rust-mit-or-apache-2-0&quot;&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;sharkdp&#x2F;bat&quot;&gt;bat&lt;&#x2F;a&gt; &lt;img src=&quot;https:&#x2F;&#x2F;img.shields.io&#x2F;badge&#x2F;lang-rust-firebrick&quot; alt=&quot;rust&quot; &#x2F;&gt; &lt;img src=&quot;https:&#x2F;&#x2F;img.shields.io&#x2F;badge&#x2F;license-MIT%20or%20Apache--2.0-whitesmoke&quot; alt=&quot;MIT or Apache-2.0&quot; &#x2F;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#bat-rust-mit-or-apache-2-0&quot; aria-label=&quot;Anchor link for: bat-rust-mit-or-apache-2-0&quot; title=&quot;Anchor link for: bat-rust-mit-or-apache-2-0&quot;&gt;&lt;svg
    xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;
    stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;
    class=&quot;icon icon-tabler icons-tabler-outline icon-tabler-link&quot; focusable=&quot;false&quot;&gt;
    &lt;path stroke=&quot;none&quot; d=&quot;M0 0h24v24H0z&quot; fill=&quot;none&quot; &#x2F;&gt;
    &lt;path d=&quot;M9 15l6 -6&quot; &#x2F;&gt;
    &lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; &#x2F;&gt;
    &lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; &#x2F;&gt;
  &lt;&#x2F;svg&gt;&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;I’ve aliased &lt;code&gt;cat&lt;&#x2F;code&gt; to &lt;code&gt;bat&lt;&#x2F;code&gt; and never looked back.
The syntax highlighting, the line numbers, the git integration, the paging, it all just makes it nice to use.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;berkeley-mono-tx-02-proprietary&quot;&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;usgraphics.com&#x2F;products&#x2F;berkeley-mono&quot;&gt;Berkeley Mono&lt;&#x2F;a&gt; (TX-02) &lt;img src=&quot;https:&#x2F;&#x2F;img.shields.io&#x2F;badge&#x2F;closed%20source-black&quot; alt=&quot;proprietary&quot; &#x2F;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#berkeley-mono-tx-02-proprietary&quot; aria-label=&quot;Anchor link for: berkeley-mono-tx-02-proprietary&quot; title=&quot;Anchor link for: berkeley-mono-tx-02-proprietary&quot;&gt;&lt;svg
    xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;
    stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;
    class=&quot;icon icon-tabler icons-tabler-outline icon-tabler-link&quot; focusable=&quot;false&quot;&gt;
    &lt;path stroke=&quot;none&quot; d=&quot;M0 0h24v24H0z&quot; fill=&quot;none&quot; &#x2F;&gt;
    &lt;path d=&quot;M9 15l6 -6&quot; &#x2F;&gt;
    &lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; &#x2F;&gt;
    &lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; &#x2F;&gt;
  &lt;&#x2F;svg&gt;&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;This is my favorite coding font, and this year &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;usgraphics.com&#x2F;products&#x2F;berkeley-mono&#x2F;releases&quot;&gt;they released new versions&lt;&#x2F;a&gt;!
Not only was it worth the initial $75, I paid more for a new web license.
Importantly, the new version includes more slender versions and variable fonts, so I really don’t miss &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;be5invis&#x2F;Iosevka&quot;&gt;Iosevka&lt;&#x2F;a&gt; anymore.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;bottom-rust-mit-license&quot;&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;clementtsang.github.io&#x2F;bottom&#x2F;0.9.3&#x2F;&quot;&gt;bottom&lt;&#x2F;a&gt; &lt;img src=&quot;https:&#x2F;&#x2F;img.shields.io&#x2F;badge&#x2F;lang-rust-firebrick&quot; alt=&quot;rust&quot; &#x2F;&gt; &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;ClementTsang&#x2F;bottom&#x2F;blob&#x2F;main&#x2F;LICENSE&quot;&gt;&lt;img src=&quot;https:&#x2F;&#x2F;img.shields.io&#x2F;badge&#x2F;license-MIT-whitesmoke&quot; alt=&quot;MIT License&quot; &#x2F;&gt;&lt;&#x2F;a&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#bottom-rust-mit-license&quot; aria-label=&quot;Anchor link for: bottom-rust-mit-license&quot; title=&quot;Anchor link for: bottom-rust-mit-license&quot;&gt;&lt;svg
    xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;
    stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;
    class=&quot;icon icon-tabler icons-tabler-outline icon-tabler-link&quot; focusable=&quot;false&quot;&gt;
    &lt;path stroke=&quot;none&quot; d=&quot;M0 0h24v24H0z&quot; fill=&quot;none&quot; &#x2F;&gt;
    &lt;path d=&quot;M9 15l6 -6&quot; &#x2F;&gt;
    &lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; &#x2F;&gt;
    &lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; &#x2F;&gt;
  &lt;&#x2F;svg&gt;&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;code&gt;btm&lt;&#x2F;code&gt; is a better &lt;code&gt;top&lt;&#x2F;code&gt; (and &lt;code&gt;htop&lt;&#x2F;code&gt;).
I originally thought I wouldn’t need more than &lt;code&gt;htop&lt;&#x2F;code&gt;, until I tried to run it on a massive server with over 150 cores.
&lt;code&gt;htop&lt;&#x2F;code&gt; you need to configure differently to see anything at all (dropping all the CPU bars), and it is &lt;em&gt;slow&lt;&#x2F;em&gt;.
&lt;code&gt;btm&lt;&#x2F;code&gt; handles it just fine out of the box.
The filtering on the processes widget is very convenient.
The ability to see all the other stuff like temps, GPU memory usage, network utilization, disk utilization, those are all cherries on top.
I’ll also call out that &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;aristocratos&#x2F;btop&quot;&gt;btop&lt;&#x2F;a&gt; is also very fun, but I find bottom more useful.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;chezmoi-golang-mit-license&quot;&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.chezmoi.io&#x2F;&quot;&gt;chezmoi&lt;&#x2F;a&gt; &lt;img src=&quot;https:&#x2F;&#x2F;img.shields.io&#x2F;badge&#x2F;lang-go-cadetblue&quot; alt=&quot;golang&quot; &#x2F;&gt; &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;twpayne&#x2F;chezmoi&#x2F;blob&#x2F;master&#x2F;LICENSE&quot;&gt;&lt;img src=&quot;https:&#x2F;&#x2F;img.shields.io&#x2F;badge&#x2F;license-MIT-whitesmoke&quot; alt=&quot;MIT License&quot; &#x2F;&gt;&lt;&#x2F;a&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#chezmoi-golang-mit-license&quot; aria-label=&quot;Anchor link for: chezmoi-golang-mit-license&quot; title=&quot;Anchor link for: chezmoi-golang-mit-license&quot;&gt;&lt;svg
    xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;
    stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;
    class=&quot;icon icon-tabler icons-tabler-outline icon-tabler-link&quot; focusable=&quot;false&quot;&gt;
    &lt;path stroke=&quot;none&quot; d=&quot;M0 0h24v24H0z&quot; fill=&quot;none&quot; &#x2F;&gt;
    &lt;path d=&quot;M9 15l6 -6&quot; &#x2F;&gt;
    &lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; &#x2F;&gt;
    &lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; &#x2F;&gt;
  &lt;&#x2F;svg&gt;&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;I’ve tried a few different ways to manage &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;lukehsiao&#x2F;dotfiles&quot;&gt;my personal dotfiles&lt;&#x2F;a&gt;.
Before &lt;code&gt;chezmoi&lt;&#x2F;code&gt;, I stored them &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.atlassian.com&#x2F;git&#x2F;tutorials&#x2F;dotfiles&quot;&gt;as a bare git repo&lt;&#x2F;a&gt;, as found on &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;news.ycombinator.com&#x2F;item?id=11070797&quot;&gt;HN&lt;&#x2F;a&gt;.
But, the killer feature for me was templating.
Even though I don’t use much of &lt;code&gt;chezmoi&lt;&#x2F;code&gt;’s fancier features, just being able to use templates so that I could populate dotfiles based on the machine I was on was great.&lt;&#x2F;p&gt;
&lt;p&gt;Ever since switching to Omarchy, I’ve revamped usage of my dotfile repo.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;choose-rust-gpl-3-0&quot;&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;theryangeary&#x2F;choose&quot;&gt;choose&lt;&#x2F;a&gt; &lt;img src=&quot;https:&#x2F;&#x2F;img.shields.io&#x2F;badge&#x2F;lang-rust-firebrick&quot; alt=&quot;rust&quot; &#x2F;&gt; &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;theryangeary&#x2F;choose&#x2F;blob&#x2F;master&#x2F;LICENSE&quot;&gt;&lt;img src=&quot;https:&#x2F;&#x2F;img.shields.io&#x2F;badge&#x2F;license-GPL--3.0-whitesmoke&quot; alt=&quot;GPL-3.0&quot; &#x2F;&gt;&lt;&#x2F;a&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#choose-rust-gpl-3-0&quot; aria-label=&quot;Anchor link for: choose-rust-gpl-3-0&quot; title=&quot;Anchor link for: choose-rust-gpl-3-0&quot;&gt;&lt;svg
    xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;
    stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;
    class=&quot;icon icon-tabler icons-tabler-outline icon-tabler-link&quot; focusable=&quot;false&quot;&gt;
    &lt;path stroke=&quot;none&quot; d=&quot;M0 0h24v24H0z&quot; fill=&quot;none&quot; &#x2F;&gt;
    &lt;path d=&quot;M9 15l6 -6&quot; &#x2F;&gt;
    &lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; &#x2F;&gt;
    &lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; &#x2F;&gt;
  &lt;&#x2F;svg&gt;&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;code&gt;choose&lt;&#x2F;code&gt; is a human-friendly alternative to &lt;code&gt;cut&lt;&#x2F;code&gt; and (sometimes) &lt;code&gt;awk&lt;&#x2F;code&gt;.
I used to use &lt;code&gt;awk&lt;&#x2F;code&gt; for most of this type of task, but choose just makes it easier.
It makes it easy to chop out columns I want while piping things around.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;codebook-rust-mit-license&quot;&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;blopker&#x2F;codebook&quot;&gt;codebook&lt;&#x2F;a&gt; &lt;img src=&quot;https:&#x2F;&#x2F;img.shields.io&#x2F;badge&#x2F;lang-rust-firebrick&quot; alt=&quot;rust&quot; &#x2F;&gt; &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;blopker&#x2F;codebook&#x2F;blob&#x2F;main&#x2F;LICENSE&quot;&gt;&lt;img src=&quot;https:&#x2F;&#x2F;img.shields.io&#x2F;badge&#x2F;license-MIT-whitesmoke&quot; alt=&quot;MIT License&quot; &#x2F;&gt;&lt;&#x2F;a&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#codebook-rust-mit-license&quot; aria-label=&quot;Anchor link for: codebook-rust-mit-license&quot; title=&quot;Anchor link for: codebook-rust-mit-license&quot;&gt;&lt;svg
    xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;
    stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;
    class=&quot;icon icon-tabler icons-tabler-outline icon-tabler-link&quot; focusable=&quot;false&quot;&gt;
    &lt;path stroke=&quot;none&quot; d=&quot;M0 0h24v24H0z&quot; fill=&quot;none&quot; &#x2F;&gt;
    &lt;path d=&quot;M9 15l6 -6&quot; &#x2F;&gt;
    &lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; &#x2F;&gt;
    &lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; &#x2F;&gt;
  &lt;&#x2F;svg&gt;&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;code&gt;codebook&lt;&#x2F;code&gt; is another spell-checker for code, like &lt;code&gt;typos&lt;&#x2F;code&gt;.
It’s high quality and I enjoy it as a default LSP for text.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;d2-golang-mpl-2-0&quot;&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;d2lang.com&#x2F;&quot;&gt;D2&lt;&#x2F;a&gt; &lt;img src=&quot;https:&#x2F;&#x2F;img.shields.io&#x2F;badge&#x2F;lang-go-cadetblue&quot; alt=&quot;golang&quot; &#x2F;&gt; &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;terrastruct&#x2F;d2&#x2F;blob&#x2F;master&#x2F;LICENSE.txt&quot;&gt;&lt;img src=&quot;https:&#x2F;&#x2F;img.shields.io&#x2F;badge&#x2F;license-MPL--2.0-whitesmoke&quot; alt=&quot;MPL-2.0&quot; &#x2F;&gt;&lt;&#x2F;a&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#d2-golang-mpl-2-0&quot; aria-label=&quot;Anchor link for: d2-golang-mpl-2-0&quot; title=&quot;Anchor link for: d2-golang-mpl-2-0&quot;&gt;&lt;svg
    xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;
    stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;
    class=&quot;icon icon-tabler icons-tabler-outline icon-tabler-link&quot; focusable=&quot;false&quot;&gt;
    &lt;path stroke=&quot;none&quot; d=&quot;M0 0h24v24H0z&quot; fill=&quot;none&quot; &#x2F;&gt;
    &lt;path d=&quot;M9 15l6 -6&quot; &#x2F;&gt;
    &lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; &#x2F;&gt;
    &lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; &#x2F;&gt;
  &lt;&#x2F;svg&gt;&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;This is a new addition.
In general, I’m a big fan of &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;text-to-diagram.com&#x2F;&quot;&gt;“declarative diagraming”&lt;&#x2F;a&gt;, and D2 is the new one on the block (vs &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;plantuml.com&#x2F;&quot;&gt;PlantUML&lt;&#x2F;a&gt;, &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;mermaid.js.org&#x2F;&quot;&gt;MermaidJS&lt;&#x2F;a&gt;, &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;graphviz.org&#x2F;&quot;&gt;GraphViz&lt;&#x2F;a&gt;, etc.)
So far, I love the syntax and functionality.
If I’m drawing up something quick that doesn’t warrant something like &lt;code&gt;draw.io&lt;&#x2F;code&gt;, I’ve been reaching for D2 first and &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;excalidraw.com&#x2F;&quot;&gt;excalidraw&lt;&#x2F;a&gt; second.
Their &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;d2lang.com&#x2F;tour&#x2F;tala&#x2F;&quot;&gt;TALA layout engine&lt;&#x2F;a&gt; is proprietary, but looking quite nice.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;delta-rust-mit&quot;&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;dandavison.github.io&#x2F;delta&#x2F;&quot;&gt;delta&lt;&#x2F;a&gt; &lt;img src=&quot;https:&#x2F;&#x2F;img.shields.io&#x2F;badge&#x2F;lang-rust-firebrick&quot; alt=&quot;rust&quot; &#x2F;&gt; &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;dandavison&#x2F;delta&#x2F;blob&#x2F;main&#x2F;LICENSE&quot;&gt;&lt;img src=&quot;https:&#x2F;&#x2F;img.shields.io&#x2F;badge&#x2F;license-MIT-whitesmoke&quot; alt=&quot;MIT&quot; &#x2F;&gt;&lt;&#x2F;a&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#delta-rust-mit&quot; aria-label=&quot;Anchor link for: delta-rust-mit&quot; title=&quot;Anchor link for: delta-rust-mit&quot;&gt;&lt;svg
    xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;
    stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;
    class=&quot;icon icon-tabler icons-tabler-outline icon-tabler-link&quot; focusable=&quot;false&quot;&gt;
    &lt;path stroke=&quot;none&quot; d=&quot;M0 0h24v24H0z&quot; fill=&quot;none&quot; &#x2F;&gt;
    &lt;path d=&quot;M9 15l6 -6&quot; &#x2F;&gt;
    &lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; &#x2F;&gt;
    &lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; &#x2F;&gt;
  &lt;&#x2F;svg&gt;&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;code&gt;delta&lt;&#x2F;code&gt; is the best syntax-highlighting pager for git, diff, and grep output I’ve seen.
I used to use &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;so-fancy&#x2F;diff-so-fancy&quot;&gt;&lt;code&gt;diff-so-fancy&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;, but since switching to &lt;code&gt;delta&lt;&#x2F;code&gt;, I haven’t looked back.
This makes the experience of using git in the terminal much improved.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;difftastic-rust-mit&quot;&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;difftastic.wilfred.me.uk&#x2F;&quot;&gt;difftastic&lt;&#x2F;a&gt; &lt;img src=&quot;https:&#x2F;&#x2F;img.shields.io&#x2F;badge&#x2F;lang-rust-firebrick&quot; alt=&quot;rust&quot; &#x2F;&gt; &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;Wilfred&#x2F;difftastic&#x2F;blob&#x2F;master&#x2F;LICENSE&quot;&gt;&lt;img src=&quot;https:&#x2F;&#x2F;img.shields.io&#x2F;badge&#x2F;license-MIT-whitesmoke&quot; alt=&quot;MIT&quot; &#x2F;&gt;&lt;&#x2F;a&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#difftastic-rust-mit&quot; aria-label=&quot;Anchor link for: difftastic-rust-mit&quot; title=&quot;Anchor link for: difftastic-rust-mit&quot;&gt;&lt;svg
    xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;
    stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;
    class=&quot;icon icon-tabler icons-tabler-outline icon-tabler-link&quot; focusable=&quot;false&quot;&gt;
    &lt;path stroke=&quot;none&quot; d=&quot;M0 0h24v24H0z&quot; fill=&quot;none&quot; &#x2F;&gt;
    &lt;path d=&quot;M9 15l6 -6&quot; &#x2F;&gt;
    &lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; &#x2F;&gt;
    &lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; &#x2F;&gt;
  &lt;&#x2F;svg&gt;&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;code&gt;difftastic&lt;&#x2F;code&gt; is the another key tool I use side-by-side with &lt;code&gt;delta&lt;&#x2F;code&gt;.
It is a &lt;em&gt;structural diff tool that understand syntax&lt;&#x2F;em&gt;.
This means that many times, it is a much more succinct diff for files.
I have this aliased in &lt;code&gt;git&lt;&#x2F;code&gt; as well, and often use both &lt;code&gt;delta&lt;&#x2F;code&gt; and &lt;code&gt;difftastic&lt;&#x2F;code&gt; when looking at diffs.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;dust-rust-apache-2-0&quot;&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;bootandy&#x2F;dust&quot;&gt;dust&lt;&#x2F;a&gt; &lt;img src=&quot;https:&#x2F;&#x2F;img.shields.io&#x2F;badge&#x2F;lang-rust-firebrick&quot; alt=&quot;rust&quot; &#x2F;&gt; &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;bootandy&#x2F;dust&#x2F;blob&#x2F;master&#x2F;LICENSE&quot;&gt;&lt;img src=&quot;https:&#x2F;&#x2F;img.shields.io&#x2F;badge&#x2F;license-Apache--2.0-whitesmoke&quot; alt=&quot;Apache-2.0&quot; &#x2F;&gt;&lt;&#x2F;a&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#dust-rust-apache-2-0&quot; aria-label=&quot;Anchor link for: dust-rust-apache-2-0&quot; title=&quot;Anchor link for: dust-rust-apache-2-0&quot;&gt;&lt;svg
    xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;
    stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;
    class=&quot;icon icon-tabler icons-tabler-outline icon-tabler-link&quot; focusable=&quot;false&quot;&gt;
    &lt;path stroke=&quot;none&quot; d=&quot;M0 0h24v24H0z&quot; fill=&quot;none&quot; &#x2F;&gt;
    &lt;path d=&quot;M9 15l6 -6&quot; &#x2F;&gt;
    &lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; &#x2F;&gt;
    &lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; &#x2F;&gt;
  &lt;&#x2F;svg&gt;&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;This is like &lt;code&gt;du&lt;&#x2F;code&gt;, but better.
It’s faster, and its visually nicer.
This is my go-to way for figuring out where my disk space is being used.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;eza-rust-mit-license&quot;&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;eza.rocks&#x2F;&quot;&gt;eza&lt;&#x2F;a&gt; &lt;img src=&quot;https:&#x2F;&#x2F;img.shields.io&#x2F;badge&#x2F;lang-rust-firebrick&quot; alt=&quot;rust&quot; &#x2F;&gt; &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;ogham&#x2F;exa&#x2F;blob&#x2F;master&#x2F;LICENCE&quot;&gt;&lt;img src=&quot;https:&#x2F;&#x2F;img.shields.io&#x2F;badge&#x2F;license-MIT-whitesmoke&quot; alt=&quot;MIT License&quot; &#x2F;&gt;&lt;&#x2F;a&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#eza-rust-mit-license&quot; aria-label=&quot;Anchor link for: eza-rust-mit-license&quot; title=&quot;Anchor link for: eza-rust-mit-license&quot;&gt;&lt;svg
    xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;
    stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;
    class=&quot;icon icon-tabler icons-tabler-outline icon-tabler-link&quot; focusable=&quot;false&quot;&gt;
    &lt;path stroke=&quot;none&quot; d=&quot;M0 0h24v24H0z&quot; fill=&quot;none&quot; &#x2F;&gt;
    &lt;path d=&quot;M9 15l6 -6&quot; &#x2F;&gt;
    &lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; &#x2F;&gt;
    &lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; &#x2F;&gt;
  &lt;&#x2F;svg&gt;&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;This is a replacement for &lt;code&gt;ls&lt;&#x2F;code&gt; that is just better.
Similar to &lt;code&gt;bat&lt;&#x2F;code&gt;, after aliasing &lt;code&gt;ls&lt;&#x2F;code&gt; to &lt;code&gt;eza&lt;&#x2F;code&gt;, I haven’t looked back.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;fd-rust-mit-or-apache-2-0&quot;&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;sharkdp&#x2F;fd&quot;&gt;fd&lt;&#x2F;a&gt; &lt;img src=&quot;https:&#x2F;&#x2F;img.shields.io&#x2F;badge&#x2F;lang-rust-firebrick&quot; alt=&quot;rust&quot; &#x2F;&gt; &lt;img src=&quot;https:&#x2F;&#x2F;img.shields.io&#x2F;badge&#x2F;license-MIT%20or%20Apache--2.0-whitesmoke&quot; alt=&quot;MIT or Apache-2.0&quot; &#x2F;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#fd-rust-mit-or-apache-2-0&quot; aria-label=&quot;Anchor link for: fd-rust-mit-or-apache-2-0&quot; title=&quot;Anchor link for: fd-rust-mit-or-apache-2-0&quot;&gt;&lt;svg
    xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;
    stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;
    class=&quot;icon icon-tabler icons-tabler-outline icon-tabler-link&quot; focusable=&quot;false&quot;&gt;
    &lt;path stroke=&quot;none&quot; d=&quot;M0 0h24v24H0z&quot; fill=&quot;none&quot; &#x2F;&gt;
    &lt;path d=&quot;M9 15l6 -6&quot; &#x2F;&gt;
    &lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; &#x2F;&gt;
    &lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; &#x2F;&gt;
  &lt;&#x2F;svg&gt;&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;code&gt;fd&lt;&#x2F;code&gt; is a replacement for &lt;code&gt;find&lt;&#x2F;code&gt;.
Similar to &lt;code&gt;exa&lt;&#x2F;code&gt; and &lt;code&gt;bat&lt;&#x2F;code&gt;, this is another rust-based tool that feels more intuitive and does the job better.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;fish-rust-gpl-2-0&quot;&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;fishshell.com&#x2F;&quot;&gt;fish&lt;&#x2F;a&gt; &lt;img src=&quot;https:&#x2F;&#x2F;img.shields.io&#x2F;badge&#x2F;lang-rust-firebrick&quot; alt=&quot;rust&quot; &#x2F;&gt; &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;fish-shell&#x2F;fish-shell&#x2F;blob&#x2F;master&#x2F;COPYING&quot;&gt;&lt;img src=&quot;https:&#x2F;&#x2F;img.shields.io&#x2F;badge&#x2F;license-GPL--2.0-whitesmoke&quot; alt=&quot;GPL-2.0&quot; &#x2F;&gt;&lt;&#x2F;a&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#fish-rust-gpl-2-0&quot; aria-label=&quot;Anchor link for: fish-rust-gpl-2-0&quot; title=&quot;Anchor link for: fish-rust-gpl-2-0&quot;&gt;&lt;svg
    xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;
    stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;
    class=&quot;icon icon-tabler icons-tabler-outline icon-tabler-link&quot; focusable=&quot;false&quot;&gt;
    &lt;path stroke=&quot;none&quot; d=&quot;M0 0h24v24H0z&quot; fill=&quot;none&quot; &#x2F;&gt;
    &lt;path d=&quot;M9 15l6 -6&quot; &#x2F;&gt;
    &lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; &#x2F;&gt;
    &lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; &#x2F;&gt;
  &lt;&#x2F;svg&gt;&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Fish has been a great shell.
I just used plain bash before this.
I switched a couple of years ago, and while I don’t think there has been any particularly large “killer feature” for me, I have had no reason to switch to anything else since.
The UI niceties (e.g., autosuggestions, tab completions, syntax highlighting, 24-bit color) all make the terminal experience pleasant.
It’s also being slowly &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;fish-shell&#x2F;fish-shell&#x2F;pull&#x2F;9512&quot;&gt;rewritten in rust&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;I’m interested in trying &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.nushell.sh&#x2F;&quot;&gt;&lt;code&gt;nushell&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; at some point soon, but I haven’t jumped in yet.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;ghostty-zig-mit-license&quot;&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;ghostty.org&#x2F;&quot;&gt;Ghostty&lt;&#x2F;a&gt; &lt;img src=&quot;https:&#x2F;&#x2F;img.shields.io&#x2F;badge&#x2F;lang-Zig-orange&quot; alt=&quot;zig&quot; &#x2F;&gt; &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;ghostty-org&#x2F;ghostty&#x2F;blob&#x2F;main&#x2F;LICENSE&quot;&gt;&lt;img src=&quot;https:&#x2F;&#x2F;img.shields.io&#x2F;badge&#x2F;license-MIT-whitesmoke&quot; alt=&quot;MIT License&quot; &#x2F;&gt;&lt;&#x2F;a&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#ghostty-zig-mit-license&quot; aria-label=&quot;Anchor link for: ghostty-zig-mit-license&quot; title=&quot;Anchor link for: ghostty-zig-mit-license&quot;&gt;&lt;svg
    xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;
    stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;
    class=&quot;icon icon-tabler icons-tabler-outline icon-tabler-link&quot; focusable=&quot;false&quot;&gt;
    &lt;path stroke=&quot;none&quot; d=&quot;M0 0h24v24H0z&quot; fill=&quot;none&quot; &#x2F;&gt;
    &lt;path d=&quot;M9 15l6 -6&quot; &#x2F;&gt;
    &lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; &#x2F;&gt;
    &lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; &#x2F;&gt;
  &lt;&#x2F;svg&gt;&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;I’ve switched from &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;wezterm.org&#x2F;&quot;&gt;Wezterm&lt;&#x2F;a&gt; to Ghostty.
While there is still &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;ghostty-org&#x2F;ghostty&#x2F;discussions&#x2F;2394#discussioncomment-148329330&quot;&gt;1 killer feature I’m missing&lt;&#x2F;a&gt;, I’ve thoroughly enjoyed Ghostty’s performance and simplicity.
I appreciate the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.jeffquast.com&#x2F;post&#x2F;state-of-terminal-emulation-2025&#x2F;&quot;&gt;dedication to correctness&lt;&#x2F;a&gt; and performance.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;git-c-gpl-2-0&quot;&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;git-scm.com&#x2F;&quot;&gt;git&lt;&#x2F;a&gt; &lt;img src=&quot;https:&#x2F;&#x2F;img.shields.io&#x2F;badge&#x2F;lang-C-darkslategray&quot; alt=&quot;c&quot; &#x2F;&gt; &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;git&#x2F;git&#x2F;blob&#x2F;master&#x2F;COPYING&quot;&gt;&lt;img src=&quot;https:&#x2F;&#x2F;img.shields.io&#x2F;badge&#x2F;license-GPL--2.0-whitesmoke&quot; alt=&quot;GPL-2.0&quot; &#x2F;&gt;&lt;&#x2F;a&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#git-c-gpl-2-0&quot; aria-label=&quot;Anchor link for: git-c-gpl-2-0&quot; title=&quot;Anchor link for: git-c-gpl-2-0&quot;&gt;&lt;svg
    xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;
    stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;
    class=&quot;icon icon-tabler icons-tabler-outline icon-tabler-link&quot; focusable=&quot;false&quot;&gt;
    &lt;path stroke=&quot;none&quot; d=&quot;M0 0h24v24H0z&quot; fill=&quot;none&quot; &#x2F;&gt;
    &lt;path d=&quot;M9 15l6 -6&quot; &#x2F;&gt;
    &lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; &#x2F;&gt;
    &lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; &#x2F;&gt;
  &lt;&#x2F;svg&gt;&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;code&gt;git&lt;&#x2F;code&gt; is my favorite version control software.
Yes, that might be because it’s pretty much ubiquitous, and I’ve spent the time to get over the learning curve.
It’s a fantastic tool.&lt;&#x2F;p&gt;
&lt;p&gt;If you haven’t leveraged aliases (&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;lukehsiao&#x2F;dotfiles&#x2F;blob&#x2F;a8aa023528d832d562c449c77e5dc578db110e7d&#x2F;dot_gitconfig.tmpl#L38-L74&quot;&gt;here are mine&lt;&#x2F;a&gt;), then I hope reading this is a plug to go enjoy those.&lt;&#x2F;p&gt;
&lt;p&gt;Since it’s git-related, I’ll also mention I’m a strong proponent of &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.conventionalcommits.org&#x2F;en&#x2F;v1.0.0&#x2F;&quot;&gt;conventional commits&lt;&#x2F;a&gt;, and using useful &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;git-scm.com&#x2F;docs&#x2F;SubmittingPatches&quot;&gt;git trailers&lt;&#x2F;a&gt; like they do for git itself and Linux.&lt;&#x2F;p&gt;
&lt;p&gt;While we’re all used to the PR&#x2F;MR type of workflow, if you haven’t experienced working with git the truly distributed way (via &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;git-send-email.io&#x2F;&quot;&gt;git-send-email&lt;&#x2F;a&gt;) its also worth trying.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;git-absorb-rust-bsd-3-clause&quot;&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;tummychow&#x2F;git-absorb&quot;&gt;git-absorb&lt;&#x2F;a&gt; &lt;img src=&quot;https:&#x2F;&#x2F;img.shields.io&#x2F;badge&#x2F;lang-rust-firebrick&quot; alt=&quot;rust&quot; &#x2F;&gt; &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;tummychow&#x2F;git-absorb&#x2F;blob&#x2F;master&#x2F;LICENSE.md&quot;&gt;&lt;img src=&quot;https:&#x2F;&#x2F;img.shields.io&#x2F;badge&#x2F;license-BSD--3--Clause-whitesmoke&quot; alt=&quot;BSD-3-Clause&quot; &#x2F;&gt;&lt;&#x2F;a&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#git-absorb-rust-bsd-3-clause&quot; aria-label=&quot;Anchor link for: git-absorb-rust-bsd-3-clause&quot; title=&quot;Anchor link for: git-absorb-rust-bsd-3-clause&quot;&gt;&lt;svg
    xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;
    stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;
    class=&quot;icon icon-tabler icons-tabler-outline icon-tabler-link&quot; focusable=&quot;false&quot;&gt;
    &lt;path stroke=&quot;none&quot; d=&quot;M0 0h24v24H0z&quot; fill=&quot;none&quot; &#x2F;&gt;
    &lt;path d=&quot;M9 15l6 -6&quot; &#x2F;&gt;
    &lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; &#x2F;&gt;
    &lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; &#x2F;&gt;
  &lt;&#x2F;svg&gt;&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;This fits exactly into my normal git workflow, and it’s algorithm is simple and effective.
If you are used to making &lt;code&gt;fixup&lt;&#x2F;code&gt; commits yourself, definitely try this out!&lt;&#x2F;p&gt;
&lt;h3 id=&quot;git-cliff-rust-mit-or-apache-2-0&quot;&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;git-cliff.org&#x2F;&quot;&gt;git-cliff&lt;&#x2F;a&gt; &lt;img src=&quot;https:&#x2F;&#x2F;img.shields.io&#x2F;badge&#x2F;lang-rust-firebrick&quot; alt=&quot;rust&quot; &#x2F;&gt; &lt;img src=&quot;https:&#x2F;&#x2F;img.shields.io&#x2F;badge&#x2F;license-MIT%20or%20Apache--2.0-whitesmoke&quot; alt=&quot;MIT or Apache-2.0&quot; &#x2F;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#git-cliff-rust-mit-or-apache-2-0&quot; aria-label=&quot;Anchor link for: git-cliff-rust-mit-or-apache-2-0&quot; title=&quot;Anchor link for: git-cliff-rust-mit-or-apache-2-0&quot;&gt;&lt;svg
    xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;
    stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;
    class=&quot;icon icon-tabler icons-tabler-outline icon-tabler-link&quot; focusable=&quot;false&quot;&gt;
    &lt;path stroke=&quot;none&quot; d=&quot;M0 0h24v24H0z&quot; fill=&quot;none&quot; &#x2F;&gt;
    &lt;path d=&quot;M9 15l6 -6&quot; &#x2F;&gt;
    &lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; &#x2F;&gt;
    &lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; &#x2F;&gt;
  &lt;&#x2F;svg&gt;&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;If you’re following &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.conventionalcommits.org&#x2F;en&#x2F;v1.0.0&#x2F;&quot;&gt;conventional commits&lt;&#x2F;a&gt;, then &lt;code&gt;git-cliff&lt;&#x2F;code&gt; is a fantastic tool for automatically generating useful changelogs.
I use this in the vast majority of my repositories.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;git-grab-rust-mit-or-apache-2-0&quot;&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;wezm&#x2F;git-grab&quot;&gt;git-grab&lt;&#x2F;a&gt; &lt;img src=&quot;https:&#x2F;&#x2F;img.shields.io&#x2F;badge&#x2F;lang-rust-firebrick&quot; alt=&quot;rust&quot; &#x2F;&gt; &lt;img src=&quot;https:&#x2F;&#x2F;img.shields.io&#x2F;badge&#x2F;license-MIT%20or%20Apache--2.0-whitesmoke&quot; alt=&quot;MIT or Apache-2.0&quot; &#x2F;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#git-grab-rust-mit-or-apache-2-0&quot; aria-label=&quot;Anchor link for: git-grab-rust-mit-or-apache-2-0&quot; title=&quot;Anchor link for: git-grab-rust-mit-or-apache-2-0&quot;&gt;&lt;svg
    xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;
    stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;
    class=&quot;icon icon-tabler icons-tabler-outline icon-tabler-link&quot; focusable=&quot;false&quot;&gt;
    &lt;path stroke=&quot;none&quot; d=&quot;M0 0h24v24H0z&quot; fill=&quot;none&quot; &#x2F;&gt;
    &lt;path d=&quot;M9 15l6 -6&quot; &#x2F;&gt;
    &lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; &#x2F;&gt;
    &lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; &#x2F;&gt;
  &lt;&#x2F;svg&gt;&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;This is a small tool that clones a git repository to a standard location, organized by domain name and path.
I used to just have a &lt;code&gt;repos&#x2F;&lt;&#x2F;code&gt; directory full of random repos.
At one point, I tried to organize these better (e.g., “personal”, “forks”, etc.), but it didn’t work well.
Now, I just use &lt;code&gt;git-grab&lt;&#x2F;code&gt; and stick with that structure.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;gping-rust-mit-license&quot;&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;orf&#x2F;gping&quot;&gt;gping&lt;&#x2F;a&gt; &lt;img src=&quot;https:&#x2F;&#x2F;img.shields.io&#x2F;badge&#x2F;lang-rust-firebrick&quot; alt=&quot;rust&quot; &#x2F;&gt; &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;orf&#x2F;gping&#x2F;blob&#x2F;master&#x2F;LICENSE&quot;&gt;&lt;img src=&quot;https:&#x2F;&#x2F;img.shields.io&#x2F;badge&#x2F;license-MIT-whitesmoke&quot; alt=&quot;MIT License&quot; &#x2F;&gt;&lt;&#x2F;a&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#gping-rust-mit-license&quot; aria-label=&quot;Anchor link for: gping-rust-mit-license&quot; title=&quot;Anchor link for: gping-rust-mit-license&quot;&gt;&lt;svg
    xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;
    stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;
    class=&quot;icon icon-tabler icons-tabler-outline icon-tabler-link&quot; focusable=&quot;false&quot;&gt;
    &lt;path stroke=&quot;none&quot; d=&quot;M0 0h24v24H0z&quot; fill=&quot;none&quot; &#x2F;&gt;
    &lt;path d=&quot;M9 15l6 -6&quot; &#x2F;&gt;
    &lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; &#x2F;&gt;
    &lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; &#x2F;&gt;
  &lt;&#x2F;svg&gt;&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;“Ping, but with a graph.”
That’s an accurate description, but don’t underestimate the niceness of a graph.
It also has features like graphing multiple hosts at the same time, or graphing execution times of commands.
Similar to &lt;code&gt;bat&lt;&#x2F;code&gt;, &lt;code&gt;exa&lt;&#x2F;code&gt;, &lt;code&gt;fd&lt;&#x2F;code&gt;, &lt;code&gt;btm&lt;&#x2F;code&gt;, if you have &lt;code&gt;gping&lt;&#x2F;code&gt;, you really don’t need to go to &lt;code&gt;ping&lt;&#x2F;code&gt; anymore.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;helix-rust-mpl-2-0&quot;&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;helix-editor.com&#x2F;&quot;&gt;helix&lt;&#x2F;a&gt; &lt;img src=&quot;https:&#x2F;&#x2F;img.shields.io&#x2F;badge&#x2F;lang-rust-firebrick&quot; alt=&quot;rust&quot; &#x2F;&gt; &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;helix-editor&#x2F;helix&#x2F;blob&#x2F;master&#x2F;LICENSE&quot;&gt;&lt;img src=&quot;https:&#x2F;&#x2F;img.shields.io&#x2F;badge&#x2F;license-MPL--2.0-whitesmoke&quot; alt=&quot;MPL-2.0&quot; &#x2F;&gt;&lt;&#x2F;a&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#helix-rust-mpl-2-0&quot; aria-label=&quot;Anchor link for: helix-rust-mpl-2-0&quot; title=&quot;Anchor link for: helix-rust-mpl-2-0&quot;&gt;&lt;svg
    xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;
    stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;
    class=&quot;icon icon-tabler icons-tabler-outline icon-tabler-link&quot; focusable=&quot;false&quot;&gt;
    &lt;path stroke=&quot;none&quot; d=&quot;M0 0h24v24H0z&quot; fill=&quot;none&quot; &#x2F;&gt;
    &lt;path d=&quot;M9 15l6 -6&quot; &#x2F;&gt;
    &lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; &#x2F;&gt;
    &lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; &#x2F;&gt;
  &lt;&#x2F;svg&gt;&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;I’m embarrassed to say, but I didn’t &lt;em&gt;really&lt;&#x2F;em&gt; learn how to use &lt;code&gt;vim&lt;&#x2F;code&gt; until 2017.
But, that was such a positive experience that I’ve been on modal editors since.
I went from &lt;code&gt;vim&lt;&#x2F;code&gt;, to &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;neovim.io&#x2F;&quot;&gt;&lt;code&gt;neovim&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;, and then, most recently, to &lt;code&gt;hx&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Going from electron-based editors to &lt;code&gt;vim&lt;&#x2F;code&gt; was a big jump.
Going from &lt;code&gt;vim&lt;&#x2F;code&gt; to these others was just incremental.
I had developed a very custom &lt;code&gt;nvim&lt;&#x2F;code&gt; experience with plugins and all sorts of customizations.&lt;&#x2F;p&gt;
&lt;p&gt;That, surprisingly, is part of the reason I’ve enjoyed &lt;code&gt;hx&lt;&#x2F;code&gt; so much: I use it pretty much stock.
It’s got all the right basics built-in (LSP, file pickers, tree-sitter, etc.) such that I don’t &lt;em&gt;need&lt;&#x2F;em&gt; to customize it much.&lt;&#x2F;p&gt;
&lt;p&gt;If you’re interested in experimenting with a new editor, I highly recommend helix.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;hurl-rust-apache-2-0&quot;&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;hurl.dev&#x2F;&quot;&gt;hurl&lt;&#x2F;a&gt; &lt;img src=&quot;https:&#x2F;&#x2F;img.shields.io&#x2F;badge&#x2F;lang-rust-firebrick&quot; alt=&quot;rust&quot; &#x2F;&gt; &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;Orange-OpenSource&#x2F;hurl&#x2F;blob&#x2F;master&#x2F;LICENSE&quot;&gt;&lt;img src=&quot;https:&#x2F;&#x2F;img.shields.io&#x2F;badge&#x2F;license-Apache--2.0-whitesmoke&quot; alt=&quot;Apache-2.0&quot; &#x2F;&gt;&lt;&#x2F;a&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#hurl-rust-apache-2-0&quot; aria-label=&quot;Anchor link for: hurl-rust-apache-2-0&quot; title=&quot;Anchor link for: hurl-rust-apache-2-0&quot;&gt;&lt;svg
    xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;
    stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;
    class=&quot;icon icon-tabler icons-tabler-outline icon-tabler-link&quot; focusable=&quot;false&quot;&gt;
    &lt;path stroke=&quot;none&quot; d=&quot;M0 0h24v24H0z&quot; fill=&quot;none&quot; &#x2F;&gt;
    &lt;path d=&quot;M9 15l6 -6&quot; &#x2F;&gt;
    &lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; &#x2F;&gt;
    &lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; &#x2F;&gt;
  &lt;&#x2F;svg&gt;&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;code&gt;hurl&lt;&#x2F;code&gt; is an easy way to test HTTP requests with plain text.
Since it can chain requests, capture values, etc., I actually often use it to “script” some request chains for testing purposes.
I haven’t used this extensively, but so far, it seems very useful.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;hyperfine-rust-mit-or-apache-2-0&quot;&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;sharkdp&#x2F;hyperfine&quot;&gt;hyperfine&lt;&#x2F;a&gt; &lt;img src=&quot;https:&#x2F;&#x2F;img.shields.io&#x2F;badge&#x2F;lang-rust-firebrick&quot; alt=&quot;rust&quot; &#x2F;&gt; &lt;img src=&quot;https:&#x2F;&#x2F;img.shields.io&#x2F;badge&#x2F;license-MIT%20or%20Apache--2.0-whitesmoke&quot; alt=&quot;MIT or Apache-2.0&quot; &#x2F;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#hyperfine-rust-mit-or-apache-2-0&quot; aria-label=&quot;Anchor link for: hyperfine-rust-mit-or-apache-2-0&quot; title=&quot;Anchor link for: hyperfine-rust-mit-or-apache-2-0&quot;&gt;&lt;svg
    xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;
    stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;
    class=&quot;icon icon-tabler icons-tabler-outline icon-tabler-link&quot; focusable=&quot;false&quot;&gt;
    &lt;path stroke=&quot;none&quot; d=&quot;M0 0h24v24H0z&quot; fill=&quot;none&quot; &#x2F;&gt;
    &lt;path d=&quot;M9 15l6 -6&quot; &#x2F;&gt;
    &lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; &#x2F;&gt;
    &lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; &#x2F;&gt;
  &lt;&#x2F;svg&gt;&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;code&gt;hyperfine&lt;&#x2F;code&gt; is the best command-line benchmarking tool around.
It should be the standard, in my opinion.
If you ever want to benchmark how long a particular command-line command takes in a robust way, look no further.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;jaq-rust-mit&quot;&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;01mf02&#x2F;jaq&quot;&gt;jaq&lt;&#x2F;a&gt; &lt;img src=&quot;https:&#x2F;&#x2F;img.shields.io&#x2F;badge&#x2F;lang-rust-firebrick&quot; alt=&quot;rust&quot; &#x2F;&gt; &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;01mf02&#x2F;jaq&#x2F;blob&#x2F;main&#x2F;LICENSE-MIT&quot;&gt;&lt;img src=&quot;https:&#x2F;&#x2F;img.shields.io&#x2F;badge&#x2F;license-MIT-whitesmoke&quot; alt=&quot;MIT&quot; &#x2F;&gt;&lt;&#x2F;a&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#jaq-rust-mit&quot; aria-label=&quot;Anchor link for: jaq-rust-mit&quot; title=&quot;Anchor link for: jaq-rust-mit&quot;&gt;&lt;svg
    xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;
    stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;
    class=&quot;icon icon-tabler icons-tabler-outline icon-tabler-link&quot; focusable=&quot;false&quot;&gt;
    &lt;path stroke=&quot;none&quot; d=&quot;M0 0h24v24H0z&quot; fill=&quot;none&quot; &#x2F;&gt;
    &lt;path d=&quot;M9 15l6 -6&quot; &#x2F;&gt;
    &lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; &#x2F;&gt;
    &lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; &#x2F;&gt;
  &lt;&#x2F;svg&gt;&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;code&gt;jaq&lt;&#x2F;code&gt; is a clone of the ubiquitous &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;stedolan.github.io&#x2F;jq&#x2F;&quot;&gt;&lt;code&gt;jq&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; JSON processing tool.
But, it is more correct and faster.
As long as you aren’t doing crazy stuff with &lt;code&gt;jq&lt;&#x2F;code&gt;, &lt;code&gt;jaq&lt;&#x2F;code&gt; might be an easy alias to make for some small wins.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;jless-rust-mit&quot;&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;jless.io&#x2F;&quot;&gt;jless&lt;&#x2F;a&gt; &lt;img src=&quot;https:&#x2F;&#x2F;img.shields.io&#x2F;badge&#x2F;lang-rust-firebrick&quot; alt=&quot;rust&quot; &#x2F;&gt; &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;PaulJuliusMartinez&#x2F;jless&#x2F;blob&#x2F;main&#x2F;LICENSE&quot;&gt;&lt;img src=&quot;https:&#x2F;&#x2F;img.shields.io&#x2F;badge&#x2F;license-MIT-whitesmoke&quot; alt=&quot;MIT&quot; &#x2F;&gt;&lt;&#x2F;a&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#jless-rust-mit&quot; aria-label=&quot;Anchor link for: jless-rust-mit&quot; title=&quot;Anchor link for: jless-rust-mit&quot;&gt;&lt;svg
    xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;
    stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;
    class=&quot;icon icon-tabler icons-tabler-outline icon-tabler-link&quot; focusable=&quot;false&quot;&gt;
    &lt;path stroke=&quot;none&quot; d=&quot;M0 0h24v24H0z&quot; fill=&quot;none&quot; &#x2F;&gt;
    &lt;path d=&quot;M9 15l6 -6&quot; &#x2F;&gt;
    &lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; &#x2F;&gt;
    &lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; &#x2F;&gt;
  &lt;&#x2F;svg&gt;&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;code&gt;jless&lt;&#x2F;code&gt; is a command-line JSON viewer.
If you’re viewing JSON files with some combination of &lt;code&gt;jq&lt;&#x2F;code&gt; (or &lt;code&gt;jaq&lt;&#x2F;code&gt;), &lt;code&gt;less&lt;&#x2F;code&gt;, &lt;code&gt;cat&lt;&#x2F;code&gt;, etc., then &lt;code&gt;jless&lt;&#x2F;code&gt; might be just what you’re looking for.
It makes it easy to quickly peruse a JSON file and espand&#x2F;collapse objects and arrays.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;jujutsu-rust-apache-2-0&quot;&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;jj-vcs&#x2F;jj&quot;&gt;Jujutsu&lt;&#x2F;a&gt; &lt;img src=&quot;https:&#x2F;&#x2F;img.shields.io&#x2F;badge&#x2F;lang-rust-firebrick&quot; alt=&quot;rust&quot; &#x2F;&gt; &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;jj-vcs&#x2F;jj&#x2F;blob&#x2F;main&#x2F;LICENSE&quot;&gt;&lt;img src=&quot;https:&#x2F;&#x2F;img.shields.io&#x2F;badge&#x2F;license-Apache--2.0-whitesmoke&quot; alt=&quot;Apache-2.0&quot; &#x2F;&gt;&lt;&#x2F;a&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#jujutsu-rust-apache-2-0&quot; aria-label=&quot;Anchor link for: jujutsu-rust-apache-2-0&quot; title=&quot;Anchor link for: jujutsu-rust-apache-2-0&quot;&gt;&lt;svg
    xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;
    stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;
    class=&quot;icon icon-tabler icons-tabler-outline icon-tabler-link&quot; focusable=&quot;false&quot;&gt;
    &lt;path stroke=&quot;none&quot; d=&quot;M0 0h24v24H0z&quot; fill=&quot;none&quot; &#x2F;&gt;
    &lt;path d=&quot;M9 15l6 -6&quot; &#x2F;&gt;
    &lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; &#x2F;&gt;
    &lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; &#x2F;&gt;
  &lt;&#x2F;svg&gt;&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;code&gt;jj&lt;&#x2F;code&gt; is a git-compatible version-control system that is both simple and powerful.
This is the &lt;em&gt;surprise&lt;&#x2F;em&gt; of the year for me.
While it doesn’t really solve any concrete problems for me from &lt;code&gt;git&lt;&#x2F;code&gt;, it does do some fun things, like let me rebase all of my branches at once.&lt;&#x2F;p&gt;
&lt;p&gt;I’ve enjoyed the experiment using this over the past couple months, and suspect I will continue to do so.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;just-rust-cc0-1-0&quot;&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;just.systems&#x2F;man&#x2F;en&#x2F;&quot;&gt;just&lt;&#x2F;a&gt; &lt;img src=&quot;https:&#x2F;&#x2F;img.shields.io&#x2F;badge&#x2F;lang-rust-firebrick&quot; alt=&quot;rust&quot; &#x2F;&gt; &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;casey&#x2F;just&#x2F;blob&#x2F;master&#x2F;LICENSE&quot;&gt;&lt;img src=&quot;https:&#x2F;&#x2F;img.shields.io&#x2F;badge&#x2F;license-CC0--1.0-whitesmoke&quot; alt=&quot;CC0-1.0&quot; &#x2F;&gt;&lt;&#x2F;a&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#just-rust-cc0-1-0&quot; aria-label=&quot;Anchor link for: just-rust-cc0-1-0&quot; title=&quot;Anchor link for: just-rust-cc0-1-0&quot;&gt;&lt;svg
    xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;
    stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;
    class=&quot;icon icon-tabler icons-tabler-outline icon-tabler-link&quot; focusable=&quot;false&quot;&gt;
    &lt;path stroke=&quot;none&quot; d=&quot;M0 0h24v24H0z&quot; fill=&quot;none&quot; &#x2F;&gt;
    &lt;path d=&quot;M9 15l6 -6&quot; &#x2F;&gt;
    &lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; &#x2F;&gt;
    &lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; &#x2F;&gt;
  &lt;&#x2F;svg&gt;&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;code&gt;just&lt;&#x2F;code&gt; is a versatile command runner that takes inspiration from &lt;code&gt;make&lt;&#x2F;code&gt;, but without the baggage.
This is a new entry on this list, and not one I have used as extensively, but so far, it seems nice.
There are many situations where I have a &lt;code&gt;Makefile&lt;&#x2F;code&gt; with a bunch of &lt;code&gt;.PHONY&lt;&#x2F;code&gt; targets because I’m just trying to use &lt;code&gt;make&lt;&#x2F;code&gt; as a command runner.
Well, now I have a nice command runner.&lt;&#x2F;p&gt;
&lt;p&gt;There are several repositories I’ve worked with with a &lt;code&gt;scripts&#x2F;&lt;&#x2F;code&gt; folder that could just be absorbed into a &lt;code&gt;justfile&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;lychee-rust-mit-or-apache-2-0&quot;&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;lychee.cli.rs&#x2F;#&#x2F;&quot;&gt;lychee&lt;&#x2F;a&gt; &lt;img src=&quot;https:&#x2F;&#x2F;img.shields.io&#x2F;badge&#x2F;lang-rust-firebrick&quot; alt=&quot;rust&quot; &#x2F;&gt; &lt;img src=&quot;https:&#x2F;&#x2F;img.shields.io&#x2F;badge&#x2F;license-MIT%20or%20Apache--2.0-whitesmoke&quot; alt=&quot;MIT or Apache-2.0&quot; &#x2F;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#lychee-rust-mit-or-apache-2-0&quot; aria-label=&quot;Anchor link for: lychee-rust-mit-or-apache-2-0&quot; title=&quot;Anchor link for: lychee-rust-mit-or-apache-2-0&quot;&gt;&lt;svg
    xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;
    stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;
    class=&quot;icon icon-tabler icons-tabler-outline icon-tabler-link&quot; focusable=&quot;false&quot;&gt;
    &lt;path stroke=&quot;none&quot; d=&quot;M0 0h24v24H0z&quot; fill=&quot;none&quot; &#x2F;&gt;
    &lt;path d=&quot;M9 15l6 -6&quot; &#x2F;&gt;
    &lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; &#x2F;&gt;
    &lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; &#x2F;&gt;
  &lt;&#x2F;svg&gt;&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;The web is great, but it is unfortunate when you come across broken links.
&lt;code&gt;lychee&lt;&#x2F;code&gt; is a great way to help prevent that (they even have a &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;lycheeverse&#x2F;lychee-action&quot;&gt;GitHub Action&lt;&#x2F;a&gt;).
It’s incredibly fast.
I use it to check most of my repositories for dead links, as well as my blogs.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;mosh-cpp-gpl-3-0&quot;&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;mosh.org&#x2F;&quot;&gt;Mosh&lt;&#x2F;a&gt; &lt;img src=&quot;https:&#x2F;&#x2F;img.shields.io&#x2F;badge&#x2F;lang-C++-purple&quot; alt=&quot;cpp&quot; &#x2F;&gt; &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;mobile-shell&#x2F;mosh&#x2F;blob&#x2F;master&#x2F;COPYING&quot;&gt;&lt;img src=&quot;https:&#x2F;&#x2F;img.shields.io&#x2F;badge&#x2F;license-GPL--3.0-whitesmoke&quot; alt=&quot;GPL-3.0&quot; &#x2F;&gt;&lt;&#x2F;a&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#mosh-cpp-gpl-3-0&quot; aria-label=&quot;Anchor link for: mosh-cpp-gpl-3-0&quot; title=&quot;Anchor link for: mosh-cpp-gpl-3-0&quot;&gt;&lt;svg
    xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;
    stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;
    class=&quot;icon icon-tabler icons-tabler-outline icon-tabler-link&quot; focusable=&quot;false&quot;&gt;
    &lt;path stroke=&quot;none&quot; d=&quot;M0 0h24v24H0z&quot; fill=&quot;none&quot; &#x2F;&gt;
    &lt;path d=&quot;M9 15l6 -6&quot; &#x2F;&gt;
    &lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; &#x2F;&gt;
    &lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; &#x2F;&gt;
  &lt;&#x2F;svg&gt;&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;The mobile shell that allows roaming, supports intermittent connectivity, and provides intelligent local echo.
A &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;mosh.org&#x2F;mosh-1.4.0-released.html&quot;&gt;recent release&lt;&#x2F;a&gt; also brought true color support, which was the only thing that bothered me before.
99% of the time I say I’m “ssh”-ing, I’m actually just using &lt;code&gt;mosh&lt;&#x2F;code&gt;.
The ability to start a session, get a &lt;code&gt;tmux&lt;&#x2F;code&gt; session all set up, close my laptop, go somewhere else, open it and just pick up where I was is too good to ignore.&lt;&#x2F;p&gt;
&lt;p&gt;This is an example of software that is pretty much “complete”.
Lack of activity on the repository shouldn’t scare you one bit, its because it has a rock solid history and does what it sets out to do.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;mpv-c-many&quot;&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;mpv.io&#x2F;&quot;&gt;mpv&lt;&#x2F;a&gt; &lt;img src=&quot;https:&#x2F;&#x2F;img.shields.io&#x2F;badge&#x2F;lang-C-darkslategray&quot; alt=&quot;c&quot; &#x2F;&gt; &lt;img src=&quot;https:&#x2F;&#x2F;img.shields.io&#x2F;badge&#x2F;license-GPL--2.0+,LGPL--2.1+,others-whitesmoke&quot; alt=&quot;many&quot; &#x2F;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#mpv-c-many&quot; aria-label=&quot;Anchor link for: mpv-c-many&quot; title=&quot;Anchor link for: mpv-c-many&quot;&gt;&lt;svg
    xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;
    stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;
    class=&quot;icon icon-tabler icons-tabler-outline icon-tabler-link&quot; focusable=&quot;false&quot;&gt;
    &lt;path stroke=&quot;none&quot; d=&quot;M0 0h24v24H0z&quot; fill=&quot;none&quot; &#x2F;&gt;
    &lt;path d=&quot;M9 15l6 -6&quot; &#x2F;&gt;
    &lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; &#x2F;&gt;
    &lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; &#x2F;&gt;
  &lt;&#x2F;svg&gt;&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;code&gt;mpv&lt;&#x2F;code&gt; is the best media player I know of.
I prefer this to VLC or others.
It “just works” and is extremely minimal and performant.
It’s integration with &lt;code&gt;yt-dl&lt;&#x2F;code&gt; (or better yet, &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;yt-dlp&#x2F;yt-dlp&quot;&gt;&lt;code&gt;yt-dlp&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;) means I often just play web videos (even YouTube) via &lt;code&gt;mpv&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;omarchy-shell-mit-license&quot;&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;omarchy.org&#x2F;&quot;&gt;Omarchy&lt;&#x2F;a&gt; &lt;img src=&quot;https:&#x2F;&#x2F;img.shields.io&#x2F;badge&#x2F;lang-shell-lawngreen&quot; alt=&quot;shell&quot; &#x2F;&gt; &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;basecamp&#x2F;omarchy&#x2F;blob&#x2F;master&#x2F;LICENSE&quot;&gt;&lt;img src=&quot;https:&#x2F;&#x2F;img.shields.io&#x2F;badge&#x2F;license-MIT-whitesmoke&quot; alt=&quot;MIT License&quot; &#x2F;&gt;&lt;&#x2F;a&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#omarchy-shell-mit-license&quot; aria-label=&quot;Anchor link for: omarchy-shell-mit-license&quot; title=&quot;Anchor link for: omarchy-shell-mit-license&quot;&gt;&lt;svg
    xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;
    stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;
    class=&quot;icon icon-tabler icons-tabler-outline icon-tabler-link&quot; focusable=&quot;false&quot;&gt;
    &lt;path stroke=&quot;none&quot; d=&quot;M0 0h24v24H0z&quot; fill=&quot;none&quot; &#x2F;&gt;
    &lt;path d=&quot;M9 15l6 -6&quot; &#x2F;&gt;
    &lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; &#x2F;&gt;
    &lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; &#x2F;&gt;
  &lt;&#x2F;svg&gt;&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Omarchy is a beautiful, modern, and opinionated Linux distribution build on &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;hypr.land&#x2F;&quot;&gt;hyprland&lt;&#x2F;a&gt; and &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;archlinux.org&#x2F;&quot;&gt;Arch&lt;&#x2F;a&gt;.
&lt;strong&gt;This is my favorite find of the year.&lt;&#x2F;strong&gt;
I’m a big fan of tiling window managers and Linux on the desktop.
Earlier in the year, I built my own spin of Wayblue sway, but since Omarchy came out, it has checked every box for me.&lt;&#x2F;p&gt;
&lt;p&gt;There are many things that are just integrated incredibly well within this distro.
I won’t bother calling them out explicitly as items on this list, but I’ll highlight that Omarchy uses tools like &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;pythops&#x2F;impala&quot;&gt;&lt;code&gt;impala&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;, &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;git.dec05eba.com&#x2F;gpu-screen-recorder&#x2F;about&#x2F;&quot;&gt;&lt;code&gt;gpu-screen-recorder&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;, or things like waybar, hyprland, walker, limine, etc., all beautifully.
I wouldn’t know about many of these were it not for Omarchy, and now I just use them.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;passage-shell-gpl-2-0&quot;&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;FiloSottile&#x2F;passage&quot;&gt;passage&lt;&#x2F;a&gt; &lt;img src=&quot;https:&#x2F;&#x2F;img.shields.io&#x2F;badge&#x2F;lang-shell-lawngreen&quot; alt=&quot;shell&quot; &#x2F;&gt; &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;FiloSottile&#x2F;passage&#x2F;blob&#x2F;main&#x2F;COPYING&quot;&gt;&lt;img src=&quot;https:&#x2F;&#x2F;img.shields.io&#x2F;badge&#x2F;license-GPL--2.0+-whitesmoke&quot; alt=&quot;GPL-2.0+&quot; &#x2F;&gt;&lt;&#x2F;a&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#passage-shell-gpl-2-0&quot; aria-label=&quot;Anchor link for: passage-shell-gpl-2-0&quot; title=&quot;Anchor link for: passage-shell-gpl-2-0&quot;&gt;&lt;svg
    xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;
    stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;
    class=&quot;icon icon-tabler icons-tabler-outline icon-tabler-link&quot; focusable=&quot;false&quot;&gt;
    &lt;path stroke=&quot;none&quot; d=&quot;M0 0h24v24H0z&quot; fill=&quot;none&quot; &#x2F;&gt;
    &lt;path d=&quot;M9 15l6 -6&quot; &#x2F;&gt;
    &lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; &#x2F;&gt;
    &lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; &#x2F;&gt;
  &lt;&#x2F;svg&gt;&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;code&gt;passage&lt;&#x2F;code&gt; is a fork of &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.passwordstore.org&#x2F;&quot;&gt;&lt;code&gt;pass&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;, very simple password store that follows &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Unix_philosophy&quot;&gt;Unix philosophy&lt;&#x2F;a&gt;.
Unlike &lt;code&gt;pass&lt;&#x2F;code&gt;, &lt;code&gt;passage&lt;&#x2F;code&gt; uses &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;FiloSottile&#x2F;age&quot;&gt;&lt;code&gt;age&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; encryption as the backend.&lt;&#x2F;p&gt;
&lt;p&gt;I don’t miss having a password manager app on my mobile phone, so on desktop, this has served me well.
I’m a big fan of its simplicity, and the fact that my passwords are just flat files I can version in a &lt;code&gt;git&lt;&#x2F;code&gt; repo.&lt;&#x2F;p&gt;
&lt;p&gt;In addition, I love being able to use a yubikey, and &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;str4d&#x2F;age-plugin-yubikey&quot;&gt;&lt;code&gt;age-plugin-yubikey&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; makes this very easy.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;ripgrep-rust-mit-or-unlicense&quot;&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;BurntSushi&#x2F;ripgrep&quot;&gt;ripgrep&lt;&#x2F;a&gt; &lt;img src=&quot;https:&#x2F;&#x2F;img.shields.io&#x2F;badge&#x2F;lang-rust-firebrick&quot; alt=&quot;rust&quot; &#x2F;&gt; &lt;img src=&quot;https:&#x2F;&#x2F;img.shields.io&#x2F;badge&#x2F;license-MIT%20or%20Unlicense-whitesmoke&quot; alt=&quot;MIT or Unlicense&quot; &#x2F;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#ripgrep-rust-mit-or-unlicense&quot; aria-label=&quot;Anchor link for: ripgrep-rust-mit-or-unlicense&quot; title=&quot;Anchor link for: ripgrep-rust-mit-or-unlicense&quot;&gt;&lt;svg
    xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;
    stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;
    class=&quot;icon icon-tabler icons-tabler-outline icon-tabler-link&quot; focusable=&quot;false&quot;&gt;
    &lt;path stroke=&quot;none&quot; d=&quot;M0 0h24v24H0z&quot; fill=&quot;none&quot; &#x2F;&gt;
    &lt;path d=&quot;M9 15l6 -6&quot; &#x2F;&gt;
    &lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; &#x2F;&gt;
    &lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; &#x2F;&gt;
  &lt;&#x2F;svg&gt;&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;This is &lt;code&gt;grep&lt;&#x2F;code&gt; on steroids.
Stop using &lt;code&gt;grep&lt;&#x2F;code&gt; and start using &lt;code&gt;ripgrep&lt;&#x2F;code&gt; and you’ll never go back.
It is &lt;em&gt;significantly&lt;&#x2F;em&gt; faster, and has a bunch of great features (e.g., searching file types, regex, automatic filtering, etc.).
It is often thought of as the gold standard for excellent Rust code.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;satty-rust-mpl-2-0&quot;&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;Satty-org&#x2F;Satty&quot;&gt;Satty&lt;&#x2F;a&gt; &lt;img src=&quot;https:&#x2F;&#x2F;img.shields.io&#x2F;badge&#x2F;lang-rust-firebrick&quot; alt=&quot;rust&quot; &#x2F;&gt; &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;Satty-org&#x2F;Satty&#x2F;blob&#x2F;main&#x2F;LICENSE&quot;&gt;&lt;img src=&quot;https:&#x2F;&#x2F;img.shields.io&#x2F;badge&#x2F;license-MPL--2.0-whitesmoke&quot; alt=&quot;MPL-2.0&quot; &#x2F;&gt;&lt;&#x2F;a&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#satty-rust-mpl-2-0&quot; aria-label=&quot;Anchor link for: satty-rust-mpl-2-0&quot; title=&quot;Anchor link for: satty-rust-mpl-2-0&quot;&gt;&lt;svg
    xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;
    stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;
    class=&quot;icon icon-tabler icons-tabler-outline icon-tabler-link&quot; focusable=&quot;false&quot;&gt;
    &lt;path stroke=&quot;none&quot; d=&quot;M0 0h24v24H0z&quot; fill=&quot;none&quot; &#x2F;&gt;
    &lt;path d=&quot;M9 15l6 -6&quot; &#x2F;&gt;
    &lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; &#x2F;&gt;
    &lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; &#x2F;&gt;
  &lt;&#x2F;svg&gt;&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;When it comes to taking screenshots, Satty is my favorite on Linux.
(I still use &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;flameshot.org&#x2F;&quot;&gt;Flameshot&lt;&#x2F;a&gt; on macOS.)
Easy to adjust, annotate (i.e., arrows, boxes, text, blur, etc.), and save to clipboard or file.
Integrates well in Omarchy.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;sd-rust-mit&quot;&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;chmln&#x2F;sd&quot;&gt;sd&lt;&#x2F;a&gt; &lt;img src=&quot;https:&#x2F;&#x2F;img.shields.io&#x2F;badge&#x2F;lang-rust-firebrick&quot; alt=&quot;rust&quot; &#x2F;&gt; &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;chmln&#x2F;sd&#x2F;blob&#x2F;master&#x2F;LICENSE&quot;&gt;&lt;img src=&quot;https:&#x2F;&#x2F;img.shields.io&#x2F;badge&#x2F;license-MIT-whitesmoke&quot; alt=&quot;MIT&quot; &#x2F;&gt;&lt;&#x2F;a&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#sd-rust-mit&quot; aria-label=&quot;Anchor link for: sd-rust-mit&quot; title=&quot;Anchor link for: sd-rust-mit&quot;&gt;&lt;svg
    xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;
    stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;
    class=&quot;icon icon-tabler icons-tabler-outline icon-tabler-link&quot; focusable=&quot;false&quot;&gt;
    &lt;path stroke=&quot;none&quot; d=&quot;M0 0h24v24H0z&quot; fill=&quot;none&quot; &#x2F;&gt;
    &lt;path d=&quot;M9 15l6 -6&quot; &#x2F;&gt;
    &lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; &#x2F;&gt;
    &lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; &#x2F;&gt;
  &lt;&#x2F;svg&gt;&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;code&gt;sd&lt;&#x2F;code&gt; is an intuitive rust rewrite of &lt;code&gt;sed&lt;&#x2F;code&gt;.
Much like the other tools in this list (e.g., &lt;code&gt;bat&lt;&#x2F;code&gt;, &lt;code&gt;exa&lt;&#x2F;code&gt;, etc.) it is just a better option in most cases.
I frequently use it in combination with &lt;code&gt;fd&lt;&#x2F;code&gt; to find and replace across a project directory.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;sshx-rust-typescript-mit&quot;&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;ekzhang&#x2F;sshx&quot;&gt;sshx&lt;&#x2F;a&gt; &lt;img src=&quot;https:&#x2F;&#x2F;img.shields.io&#x2F;badge&#x2F;lang-rust-firebrick&quot; alt=&quot;rust&quot; &#x2F;&gt; &amp;amp; &lt;img src=&quot;https:&#x2F;&#x2F;img.shields.io&#x2F;badge&#x2F;lang-typescript-dodgerblue&quot; alt=&quot;typescript&quot; &#x2F;&gt; &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;ekzhang&#x2F;sshx&#x2F;blob&#x2F;main&#x2F;LICENSE&quot;&gt;&lt;img src=&quot;https:&#x2F;&#x2F;img.shields.io&#x2F;badge&#x2F;license-MIT-whitesmoke&quot; alt=&quot;MIT&quot; &#x2F;&gt;&lt;&#x2F;a&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#sshx-rust-typescript-mit&quot; aria-label=&quot;Anchor link for: sshx-rust-typescript-mit&quot; title=&quot;Anchor link for: sshx-rust-typescript-mit&quot;&gt;&lt;svg
    xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;
    stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;
    class=&quot;icon icon-tabler icons-tabler-outline icon-tabler-link&quot; focusable=&quot;false&quot;&gt;
    &lt;path stroke=&quot;none&quot; d=&quot;M0 0h24v24H0z&quot; fill=&quot;none&quot; &#x2F;&gt;
    &lt;path d=&quot;M9 15l6 -6&quot; &#x2F;&gt;
    &lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; &#x2F;&gt;
    &lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; &#x2F;&gt;
  &lt;&#x2F;svg&gt;&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;code&gt;sshx&lt;&#x2F;code&gt; is the best live terminal sharing application I’ve ever used.
I used to reach for things like &lt;code&gt;tmate&lt;&#x2F;code&gt; for this, but it’s more constraining (e.g., I want to still use zellij).
It also does not look as nice.
&lt;code&gt;sshx&lt;&#x2F;code&gt; has a level of polish no other tool I’ve tried in this space has had.
This is by go-to tool for pair programming.
They also just released the killer feature of &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;ekzhang&#x2F;sshx&#x2F;releases&#x2F;tag&#x2F;v0.3.0&quot;&gt;read-only sharing&lt;&#x2F;a&gt;, which makes this extremely handy in a whole slew of scenarios.
This largely solved the screen sharing problem you might have if you use Slack or similar, but have an ultrawide monitor and your coworkers do not.
With &lt;code&gt;sshx&lt;&#x2F;code&gt;, the latency is impressively low and the text will be crystal clear.
In a screen share, you have a compressed mess.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;starlight-typescript-mit&quot;&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;starlight.astro.build&#x2F;&quot;&gt;Starlight&lt;&#x2F;a&gt; &lt;img src=&quot;https:&#x2F;&#x2F;img.shields.io&#x2F;badge&#x2F;lang-typescript-dodgerblue&quot; alt=&quot;typescript&quot; &#x2F;&gt; &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;withastro&#x2F;starlight&#x2F;blob&#x2F;main&#x2F;LICENSE&quot;&gt;&lt;img src=&quot;https:&#x2F;&#x2F;img.shields.io&#x2F;badge&#x2F;license-MIT-whitesmoke&quot; alt=&quot;MIT&quot; &#x2F;&gt;&lt;&#x2F;a&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#starlight-typescript-mit&quot; aria-label=&quot;Anchor link for: starlight-typescript-mit&quot; title=&quot;Anchor link for: starlight-typescript-mit&quot;&gt;&lt;svg
    xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;
    stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;
    class=&quot;icon icon-tabler icons-tabler-outline icon-tabler-link&quot; focusable=&quot;false&quot;&gt;
    &lt;path stroke=&quot;none&quot; d=&quot;M0 0h24v24H0z&quot; fill=&quot;none&quot; &#x2F;&gt;
    &lt;path d=&quot;M9 15l6 -6&quot; &#x2F;&gt;
    &lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; &#x2F;&gt;
    &lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; &#x2F;&gt;
  &lt;&#x2F;svg&gt;&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Starlight is my new go-to documentation framework.
It does all of the important things I used from Material for MkDocs, but often in more intuitive, ergonomic ways.
It is blazingly fast.
It looks good.
I don’t have to deal with ridiculous Python virtual environments.&lt;&#x2F;p&gt;
&lt;p&gt;While we’re talking about documentation, I’ll mention that I’m a strong proponent of the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;diataxis.fr&#x2F;&quot;&gt;Diátaxis documentation system&lt;&#x2F;a&gt;.
If you’re wondering how you should organize your documentation, please consider it!&lt;&#x2F;p&gt;
&lt;h3 id=&quot;starship-rust-isc&quot;&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;starship.rs&#x2F;&quot;&gt;starship&lt;&#x2F;a&gt; &lt;img src=&quot;https:&#x2F;&#x2F;img.shields.io&#x2F;badge&#x2F;lang-rust-firebrick&quot; alt=&quot;rust&quot; &#x2F;&gt; &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;starship&#x2F;starship&#x2F;blob&#x2F;main&#x2F;LICENSE&quot;&gt;&lt;img src=&quot;https:&#x2F;&#x2F;img.shields.io&#x2F;badge&#x2F;license-ISC-whitesmoke&quot; alt=&quot;ISC&quot; &#x2F;&gt;&lt;&#x2F;a&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#starship-rust-isc&quot; aria-label=&quot;Anchor link for: starship-rust-isc&quot; title=&quot;Anchor link for: starship-rust-isc&quot;&gt;&lt;svg
    xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;
    stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;
    class=&quot;icon icon-tabler icons-tabler-outline icon-tabler-link&quot; focusable=&quot;false&quot;&gt;
    &lt;path stroke=&quot;none&quot; d=&quot;M0 0h24v24H0z&quot; fill=&quot;none&quot; &#x2F;&gt;
    &lt;path d=&quot;M9 15l6 -6&quot; &#x2F;&gt;
    &lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; &#x2F;&gt;
    &lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; &#x2F;&gt;
  &lt;&#x2F;svg&gt;&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;I started using &lt;code&gt;starship&lt;&#x2F;code&gt; about the same time I started using &lt;code&gt;fish&lt;&#x2F;code&gt;.
It’s a fun, fast, extremely customizable prompt with nice defaults.
I’ve enjoyed it enough that I just haven’t stopped using it since first adding it to try.
If you’re the type that has some line in your &lt;code&gt;.bashrc&lt;&#x2F;code&gt; to know what git branch your on, you might enjoy starship as well.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;tailscale-golang&quot;&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;tailscale.com&#x2F;&quot;&gt;Tailscale&lt;&#x2F;a&gt; &lt;img src=&quot;https:&#x2F;&#x2F;img.shields.io&#x2F;badge&#x2F;lang-go-cadetblue&quot; alt=&quot;golang&quot; &#x2F;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#tailscale-golang&quot; aria-label=&quot;Anchor link for: tailscale-golang&quot; title=&quot;Anchor link for: tailscale-golang&quot;&gt;&lt;svg
    xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;
    stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;
    class=&quot;icon icon-tabler icons-tabler-outline icon-tabler-link&quot; focusable=&quot;false&quot;&gt;
    &lt;path stroke=&quot;none&quot; d=&quot;M0 0h24v24H0z&quot; fill=&quot;none&quot; &#x2F;&gt;
    &lt;path d=&quot;M9 15l6 -6&quot; &#x2F;&gt;
    &lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; &#x2F;&gt;
    &lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; &#x2F;&gt;
  &lt;&#x2F;svg&gt;&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Thanks to &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.wireguard.com&#x2F;&quot;&gt;wireguard&lt;&#x2F;a&gt;, tailscale makes private mesh networking stupid easy.
It’s my go-to tool when it comes to sharing things on a private network (e.g., self-hosted stuff with my family, ssh-ing into my desktop when out and about, etc.).
It’s performant, well documented, and pretty much just works and gets out of your way.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;tokei-rust-mit-or-apache-2-0&quot;&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;XAMPPRocky&#x2F;tokei&quot;&gt;tokei&lt;&#x2F;a&gt; &lt;img src=&quot;https:&#x2F;&#x2F;img.shields.io&#x2F;badge&#x2F;lang-rust-firebrick&quot; alt=&quot;rust&quot; &#x2F;&gt; &lt;img src=&quot;https:&#x2F;&#x2F;img.shields.io&#x2F;badge&#x2F;license-MIT%20or%20Apache--2.0-whitesmoke&quot; alt=&quot;MIT or Apache-2.0&quot; &#x2F;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#tokei-rust-mit-or-apache-2-0&quot; aria-label=&quot;Anchor link for: tokei-rust-mit-or-apache-2-0&quot; title=&quot;Anchor link for: tokei-rust-mit-or-apache-2-0&quot;&gt;&lt;svg
    xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;
    stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;
    class=&quot;icon icon-tabler icons-tabler-outline icon-tabler-link&quot; focusable=&quot;false&quot;&gt;
    &lt;path stroke=&quot;none&quot; d=&quot;M0 0h24v24H0z&quot; fill=&quot;none&quot; &#x2F;&gt;
    &lt;path d=&quot;M9 15l6 -6&quot; &#x2F;&gt;
    &lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; &#x2F;&gt;
    &lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; &#x2F;&gt;
  &lt;&#x2F;svg&gt;&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;code&gt;tokei&lt;&#x2F;code&gt; is the best way to get statistics around counting code in a repository.
It shows you the total number of files and total lines within those files broken down by code, comments, blanks, and organized by language.&lt;&#x2F;p&gt;
&lt;p&gt;It seems both faster and more accurate than tools like &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;cloc.sourceforge.net&#x2F;&quot;&gt;cloc&lt;&#x2F;a&gt;, &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;dwheeler.com&#x2F;sloccount&#x2F;&quot;&gt;sloccount&lt;&#x2F;a&gt;, etc.
There are other &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;boyter.org&#x2F;posts&#x2F;sloc-cloc-code&#x2F;&quot;&gt;great blogs posts about code counters&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;typos-rust-mit-or-apache-2-0&quot;&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;crate-ci&#x2F;typos&quot;&gt;typos&lt;&#x2F;a&gt; &lt;img src=&quot;https:&#x2F;&#x2F;img.shields.io&#x2F;badge&#x2F;lang-rust-firebrick&quot; alt=&quot;rust&quot; &#x2F;&gt; &lt;img src=&quot;https:&#x2F;&#x2F;img.shields.io&#x2F;badge&#x2F;license-MIT%20or%20Apache--2.0-whitesmoke&quot; alt=&quot;MIT or Apache-2.0&quot; &#x2F;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#typos-rust-mit-or-apache-2-0&quot; aria-label=&quot;Anchor link for: typos-rust-mit-or-apache-2-0&quot; title=&quot;Anchor link for: typos-rust-mit-or-apache-2-0&quot;&gt;&lt;svg
    xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;
    stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;
    class=&quot;icon icon-tabler icons-tabler-outline icon-tabler-link&quot; focusable=&quot;false&quot;&gt;
    &lt;path stroke=&quot;none&quot; d=&quot;M0 0h24v24H0z&quot; fill=&quot;none&quot; &#x2F;&gt;
    &lt;path d=&quot;M9 15l6 -6&quot; &#x2F;&gt;
    &lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; &#x2F;&gt;
    &lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; &#x2F;&gt;
  &lt;&#x2F;svg&gt;&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;code&gt;typos&lt;&#x2F;code&gt; is a very handy spellchecker that seems to work in a code context better than other things I’ve tried.
They have a CLI, as well as an LSP.
It’s worth checking out!&lt;&#x2F;p&gt;
&lt;p&gt;I usually have a config like this:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #CDD6F4; background-color: #1E1E2E;&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[files]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;extend-exclude = [&amp;quot;*.svg&amp;quot;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[default]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;extend-ignore-re = [&amp;quot;\\w{51,}&amp;quot;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h3 id=&quot;typst-rust-apache-2-0&quot;&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;typst.app&#x2F;&quot;&gt;Typst&lt;&#x2F;a&gt; &lt;img src=&quot;https:&#x2F;&#x2F;img.shields.io&#x2F;badge&#x2F;lang-rust-firebrick&quot; alt=&quot;rust&quot; &#x2F;&gt; &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;typst&#x2F;typst&#x2F;blob&#x2F;main&#x2F;LICENSE&quot;&gt;&lt;img src=&quot;https:&#x2F;&#x2F;img.shields.io&#x2F;badge&#x2F;license-Apache--2.0-whitesmoke&quot; alt=&quot;Apache-2.0&quot; &#x2F;&gt;&lt;&#x2F;a&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#typst-rust-apache-2-0&quot; aria-label=&quot;Anchor link for: typst-rust-apache-2-0&quot; title=&quot;Anchor link for: typst-rust-apache-2-0&quot;&gt;&lt;svg
    xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;
    stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;
    class=&quot;icon icon-tabler icons-tabler-outline icon-tabler-link&quot; focusable=&quot;false&quot;&gt;
    &lt;path stroke=&quot;none&quot; d=&quot;M0 0h24v24H0z&quot; fill=&quot;none&quot; &#x2F;&gt;
    &lt;path d=&quot;M9 15l6 -6&quot; &#x2F;&gt;
    &lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; &#x2F;&gt;
    &lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; &#x2F;&gt;
  &lt;&#x2F;svg&gt;&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Almost anytime I would’ve reached for LaTeX, I now reach for &lt;code&gt;typst&lt;&#x2F;code&gt;.
The ecosystem has seriously grown over the years.
The performance, control, and error messages remain excellent.&lt;&#x2F;p&gt;
&lt;p&gt;And, it looks just as good as LaTeX.&lt;&#x2F;p&gt;
&lt;p&gt;The only thing still on my wishlist is &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;typst&#x2F;typst&#x2F;issues&#x2F;185#issuecomment-3448484559&quot;&gt;variable font support&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;watchexec-rust-apache-2-0&quot;&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;watchexec.github.io&#x2F;&quot;&gt;watchexec&lt;&#x2F;a&gt; &lt;img src=&quot;https:&#x2F;&#x2F;img.shields.io&#x2F;badge&#x2F;lang-rust-firebrick&quot; alt=&quot;rust&quot; &#x2F;&gt; &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;watchexec&#x2F;watchexec&#x2F;blob&#x2F;main&#x2F;LICENSE&quot;&gt;&lt;img src=&quot;https:&#x2F;&#x2F;img.shields.io&#x2F;badge&#x2F;license-Apache--2.0-whitesmoke&quot; alt=&quot;Apache-2.0&quot; &#x2F;&gt;&lt;&#x2F;a&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#watchexec-rust-apache-2-0&quot; aria-label=&quot;Anchor link for: watchexec-rust-apache-2-0&quot; title=&quot;Anchor link for: watchexec-rust-apache-2-0&quot;&gt;&lt;svg
    xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;
    stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;
    class=&quot;icon icon-tabler icons-tabler-outline icon-tabler-link&quot; focusable=&quot;false&quot;&gt;
    &lt;path stroke=&quot;none&quot; d=&quot;M0 0h24v24H0z&quot; fill=&quot;none&quot; &#x2F;&gt;
    &lt;path d=&quot;M9 15l6 -6&quot; &#x2F;&gt;
    &lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; &#x2F;&gt;
    &lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; &#x2F;&gt;
  &lt;&#x2F;svg&gt;&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;code&gt;watchexec&lt;&#x2F;code&gt; simply runs a command when files in the current directory change (and it’s awesome).
Made my the same folks who make &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;watchexec&#x2F;cargo-watch&quot;&gt;cargo watch&lt;&#x2F;a&gt;, this is a general purpose tool that can make your development loop &lt;em&gt;feel&lt;&#x2F;em&gt; faster when immediately starting long processes (linting, tests, etc.) immediately in response to code changes.
Oftentimes, the checks&#x2F;build&#x2F;tests are finished by the time I’m ready to craft my commit.
Definitely worth trying.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;xh-rust-mit&quot;&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;ducaale&#x2F;xh&quot;&gt;xh&lt;&#x2F;a&gt; &lt;img src=&quot;https:&#x2F;&#x2F;img.shields.io&#x2F;badge&#x2F;lang-rust-firebrick&quot; alt=&quot;rust&quot; &#x2F;&gt; &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;ducaale&#x2F;xh&#x2F;blob&#x2F;master&#x2F;LICENSE&quot;&gt;&lt;img src=&quot;https:&#x2F;&#x2F;img.shields.io&#x2F;badge&#x2F;license-MIT-whitesmoke&quot; alt=&quot;MIT&quot; &#x2F;&gt;&lt;&#x2F;a&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#xh-rust-mit&quot; aria-label=&quot;Anchor link for: xh-rust-mit&quot; title=&quot;Anchor link for: xh-rust-mit&quot;&gt;&lt;svg
    xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;
    stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;
    class=&quot;icon icon-tabler icons-tabler-outline icon-tabler-link&quot; focusable=&quot;false&quot;&gt;
    &lt;path stroke=&quot;none&quot; d=&quot;M0 0h24v24H0z&quot; fill=&quot;none&quot; &#x2F;&gt;
    &lt;path d=&quot;M9 15l6 -6&quot; &#x2F;&gt;
    &lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; &#x2F;&gt;
    &lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; &#x2F;&gt;
  &lt;&#x2F;svg&gt;&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;code&gt;xh&lt;&#x2F;code&gt; is very similar to &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;httpie.io&#x2F;&quot;&gt;HTTPie&lt;&#x2F;a&gt;.
While I haven’t used the latter, I’m a big fan of &lt;code&gt;xh&lt;&#x2F;code&gt; over &lt;code&gt;curl&lt;&#x2F;code&gt;.
The interface just seems more intuitive and friendly.
And, it still has a &lt;code&gt;--curl&lt;&#x2F;code&gt; flag so I can get a curl command in case I need to share it with a teammate.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;ynab-proprietary&quot;&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.ynab.com&#x2F;&quot;&gt;YNAB&lt;&#x2F;a&gt; &lt;img src=&quot;https:&#x2F;&#x2F;img.shields.io&#x2F;badge&#x2F;closed%20source-black&quot; alt=&quot;proprietary&quot; &#x2F;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#ynab-proprietary&quot; aria-label=&quot;Anchor link for: ynab-proprietary&quot; title=&quot;Anchor link for: ynab-proprietary&quot;&gt;&lt;svg
    xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;
    stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;
    class=&quot;icon icon-tabler icons-tabler-outline icon-tabler-link&quot; focusable=&quot;false&quot;&gt;
    &lt;path stroke=&quot;none&quot; d=&quot;M0 0h24v24H0z&quot; fill=&quot;none&quot; &#x2F;&gt;
    &lt;path d=&quot;M9 15l6 -6&quot; &#x2F;&gt;
    &lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; &#x2F;&gt;
    &lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; &#x2F;&gt;
  &lt;&#x2F;svg&gt;&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;I used to use Mint, but when they shut down, I migrated to YNAB.
I wanted to be more hands on, more intentional, and more aware of my spending, and YNAB seems to be a great tool for that job.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;zellij-rust-mit&quot;&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;zellij-org&#x2F;zellij&quot;&gt;zellij&lt;&#x2F;a&gt; &lt;img src=&quot;https:&#x2F;&#x2F;img.shields.io&#x2F;badge&#x2F;lang-rust-firebrick&quot; alt=&quot;rust&quot; &#x2F;&gt; &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;zellij-org&#x2F;zellij&#x2F;blob&#x2F;main&#x2F;LICENSE.md&quot;&gt;&lt;img src=&quot;https:&#x2F;&#x2F;img.shields.io&#x2F;badge&#x2F;license-MIT-whitesmoke&quot; alt=&quot;MIT&quot; &#x2F;&gt;&lt;&#x2F;a&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#zellij-rust-mit&quot; aria-label=&quot;Anchor link for: zellij-rust-mit&quot; title=&quot;Anchor link for: zellij-rust-mit&quot;&gt;&lt;svg
    xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;
    stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;
    class=&quot;icon icon-tabler icons-tabler-outline icon-tabler-link&quot; focusable=&quot;false&quot;&gt;
    &lt;path stroke=&quot;none&quot; d=&quot;M0 0h24v24H0z&quot; fill=&quot;none&quot; &#x2F;&gt;
    &lt;path d=&quot;M9 15l6 -6&quot; &#x2F;&gt;
    &lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; &#x2F;&gt;
    &lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; &#x2F;&gt;
  &lt;&#x2F;svg&gt;&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;I spend the vast majority of my time every day inside a &lt;code&gt;zellij&lt;&#x2F;code&gt; session.
I’m a fairly basic user, but the terminal multiplexing, scrollback buffer&#x2F;search, ability to have multiple sessions and attach&#x2F;detach is all I really need.
&lt;code&gt;zellij&lt;&#x2F;code&gt; and &lt;code&gt;mosh&lt;&#x2F;code&gt; are a perfect combo.
I like the visuals and UX enough to have had this replace &lt;code&gt;tmux&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;zola-rust-mit&quot;&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.getzola.org&#x2F;&quot;&gt;Zola&lt;&#x2F;a&gt; &lt;img src=&quot;https:&#x2F;&#x2F;img.shields.io&#x2F;badge&#x2F;lang-rust-firebrick&quot; alt=&quot;rust&quot; &#x2F;&gt; &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;getzola&#x2F;zola&#x2F;blob&#x2F;master&#x2F;LICENSE&quot;&gt;&lt;img src=&quot;https:&#x2F;&#x2F;img.shields.io&#x2F;badge&#x2F;license-MIT-whitesmoke&quot; alt=&quot;MIT&quot; &#x2F;&gt;&lt;&#x2F;a&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#zola-rust-mit&quot; aria-label=&quot;Anchor link for: zola-rust-mit&quot; title=&quot;Anchor link for: zola-rust-mit&quot;&gt;&lt;svg
    xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;
    stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;
    class=&quot;icon icon-tabler icons-tabler-outline icon-tabler-link&quot; focusable=&quot;false&quot;&gt;
    &lt;path stroke=&quot;none&quot; d=&quot;M0 0h24v24H0z&quot; fill=&quot;none&quot; &#x2F;&gt;
    &lt;path d=&quot;M9 15l6 -6&quot; &#x2F;&gt;
    &lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; &#x2F;&gt;
    &lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; &#x2F;&gt;
  &lt;&#x2F;svg&gt;&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;For non-documentation sites, my favorite static site generator is Zola.
The template engine is great, and its fairly simple and easy to grok how themes work and can be modified.
I use it for this site, as well as several others I’ve made.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;final-thoughts&quot;&gt;Final thoughts&lt;a class=&quot;zola-anchor&quot; href=&quot;#final-thoughts&quot; aria-label=&quot;Anchor link for: final-thoughts&quot; title=&quot;Anchor link for: final-thoughts&quot;&gt;&lt;svg
    xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;
    stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;
    class=&quot;icon icon-tabler icons-tabler-outline icon-tabler-link&quot; focusable=&quot;false&quot;&gt;
    &lt;path stroke=&quot;none&quot; d=&quot;M0 0h24v24H0z&quot; fill=&quot;none&quot; &#x2F;&gt;
    &lt;path d=&quot;M9 15l6 -6&quot; &#x2F;&gt;
    &lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; &#x2F;&gt;
    &lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; &#x2F;&gt;
  &lt;&#x2F;svg&gt;&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Omarchy and the cascade of software that that showed me was the big change this year, with a couple of other fun highlights like Ghostty, &lt;code&gt;jj&lt;&#x2F;code&gt;, and &lt;code&gt;age&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Otherwise, the trusty toolbox has largely remained trusty!&lt;&#x2F;p&gt;
</content>
    </entry>
    <entry xml:lang="en">
        <title>Switching from GPG to age</title>
        <author>
          <name>Luke Hsiao</name>
        </author>
        <published>2025-11-04T00:00:00+00:00</published>
        <updated>2025-11-26T00:00:00+00:00</updated>
        <link href="https://luke.hsiao.dev/blog/gpg-to-age/"/>
        <link rel="alternate" href="https://luke.hsiao.dev/blog/gpg-to-age/" type="text/html"/>
        <id>https://luke.hsiao.dev/blog/gpg-to-age/</id>
        <summary type="html">Some notes about my switch from using GPG for encryption to using age, and how it has changed my workflows.</summary>
        <content type="html">&lt;p&gt;It’s been several years since I went through all the trouble of setting up my own &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;gnupg.org&#x2F;&quot;&gt;GPG&lt;&#x2F;a&gt; keys and securing them in YubiKeys following &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;drduh.github.io&#x2F;YubiKey-Guide&#x2F;&quot;&gt;drduh’s guide&lt;&#x2F;a&gt;.
With that approach, you generate one key securely offline and store it on multiple YubiKeys, along with a backup.&lt;&#x2F;p&gt;
&lt;p&gt;It has worked well for me for years, and as the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Lindy_effect&quot;&gt;Lindy effect&lt;&#x2F;a&gt; suggests, it would almost certainly continue to.&lt;&#x2F;p&gt;
&lt;p&gt;But as my sub-keys were nearing expiration, I was faced with either renewing (more convenient, no &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Forward_secrecy&quot;&gt;forward secrecy&lt;&#x2F;a&gt;) or rotating them (rather painful, but potentially more secure).
However, I’ve realized that I essentially only use these keys for encryption, and almost never for signing.
So, instead of doing either of the usual options, I’m going to let my keys expire entirely.&lt;&#x2F;p&gt;
&lt;p&gt;I’m now experimenting with &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;FiloSottile&#x2F;age&quot;&gt;&lt;code&gt;age&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;, which touts itself as “simple, modern, and secure encryption”.
If needed, I will use &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;jedisct1&#x2F;minisign&quot;&gt;&lt;code&gt;minisign&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; for signatures.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;workflow-changes&quot;&gt;Workflow changes&lt;a class=&quot;zola-anchor&quot; href=&quot;#workflow-changes&quot; aria-label=&quot;Anchor link for: workflow-changes&quot; title=&quot;Anchor link for: workflow-changes&quot;&gt;&lt;svg
    xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;
    stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;
    class=&quot;icon icon-tabler icons-tabler-outline icon-tabler-link&quot; focusable=&quot;false&quot;&gt;
    &lt;path stroke=&quot;none&quot; d=&quot;M0 0h24v24H0z&quot; fill=&quot;none&quot; &#x2F;&gt;
    &lt;path d=&quot;M9 15l6 -6&quot; &#x2F;&gt;
    &lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; &#x2F;&gt;
    &lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; &#x2F;&gt;
  &lt;&#x2F;svg&gt;&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;This required changing a couple of things in my typical workflow.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;password-manager&quot;&gt;Password manager&lt;a class=&quot;zola-anchor&quot; href=&quot;#password-manager&quot; aria-label=&quot;Anchor link for: password-manager&quot; title=&quot;Anchor link for: password-manager&quot;&gt;&lt;svg
    xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;
    stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;
    class=&quot;icon icon-tabler icons-tabler-outline icon-tabler-link&quot; focusable=&quot;false&quot;&gt;
    &lt;path stroke=&quot;none&quot; d=&quot;M0 0h24v24H0z&quot; fill=&quot;none&quot; &#x2F;&gt;
    &lt;path d=&quot;M9 15l6 -6&quot; &#x2F;&gt;
    &lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; &#x2F;&gt;
    &lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; &#x2F;&gt;
  &lt;&#x2F;svg&gt;&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;First, and foremost, I needed to switch from &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.passwordstore.org&#x2F;&quot;&gt;&lt;code&gt;pass&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; to &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;FiloSottile&#x2F;passage&quot;&gt;&lt;code&gt;passage&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;, a fork of &lt;code&gt;pass&lt;&#x2F;code&gt; that uses &lt;code&gt;age&lt;&#x2F;code&gt; as the backend.
This was actually surprisingly easy because &lt;code&gt;passage&lt;&#x2F;code&gt; includes a simple bash script to do the migration.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #CDD6F4; background-color: #1E1E2E;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #F5C2E7;font-style: italic;&quot;&gt;#! &#x2F;usr&#x2F;bin&#x2F;env bash&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #F38BA8;font-style: italic;&quot;&gt;set&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; -eou pipefail&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #F38BA8;font-style: italic;&quot;&gt;cd&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;${PASSWORD_STORE_DIR&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;:-&lt;&#x2F;span&gt;&lt;span&gt;$HOME&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;password-store}&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CBA6F7;&quot;&gt;while&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F38BA8;font-style: italic;&quot;&gt; read&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; -r -d &amp;quot;&amp;quot; passfile&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CBA6F7;&quot;&gt; do&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  name&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;${passfile&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;;&lt;&#x2F;span&gt;&lt;span&gt; name&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;${name&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;%&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;gpg}&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;  [[&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt; -f&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;${PASSAGE_DIR&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;:-&lt;&#x2F;span&gt;&lt;span&gt;$HOME&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;passage&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span&gt;store}&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span&gt;$name&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;.age&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt; ]] &amp;amp;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CBA6F7;&quot;&gt; continue&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;  pass&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;$name&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt; |&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt; passage&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; insert -m &amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;$name&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt; ||&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt; {&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt; passage&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; rm &amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;$name&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CBA6F7;&quot;&gt; break&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;; }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CBA6F7;&quot;&gt;done&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt; &amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; &amp;lt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;find&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; . -path &amp;#39;*&#x2F;.git&amp;#39; -prune -o -iname &amp;#39;*.gpg&amp;#39; -print0)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;There is no installer for &lt;code&gt;passage&lt;&#x2F;code&gt;, and no Arch packages.
But it’s easy enough to install because it’s just a shell script you can throw on your &lt;code&gt;$PATH&lt;&#x2F;code&gt;.
Note that for Arch, I also needed to install &lt;code&gt;tree&lt;&#x2F;code&gt;, which it assumes you have.&lt;&#x2F;p&gt;
&lt;p&gt;I also name &lt;code&gt;passage&lt;&#x2F;code&gt; as &lt;code&gt;pass&lt;&#x2F;code&gt; on my machine.&lt;&#x2F;p&gt;
&lt;p&gt;The benefit of this is everything that had &lt;code&gt;pass&lt;&#x2F;code&gt; integration has continued to “just work”.
For example, &lt;code&gt;aerc&lt;&#x2F;code&gt;, my email client of choice, behaved exactly the same after the migration.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;no-more-gpg-agent&quot;&gt;No more &lt;code&gt;gpg-agent&lt;&#x2F;code&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#no-more-gpg-agent&quot; aria-label=&quot;Anchor link for: no-more-gpg-agent&quot; title=&quot;Anchor link for: no-more-gpg-agent&quot;&gt;&lt;svg
    xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;
    stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;
    class=&quot;icon icon-tabler icons-tabler-outline icon-tabler-link&quot; focusable=&quot;false&quot;&gt;
    &lt;path stroke=&quot;none&quot; d=&quot;M0 0h24v24H0z&quot; fill=&quot;none&quot; &#x2F;&gt;
    &lt;path d=&quot;M9 15l6 -6&quot; &#x2F;&gt;
    &lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; &#x2F;&gt;
    &lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; &#x2F;&gt;
  &lt;&#x2F;svg&gt;&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;I would occasionally use &lt;code&gt;gpg-agent&lt;&#x2F;code&gt; as my SSH agent on my machines.
It was convenient.
However, I also like the idea of having a dedicated SSH key per machine.
It makes monitoring their usage and revoking them much finer-grained.&lt;&#x2F;p&gt;
&lt;p&gt;The absence of &lt;code&gt;gpg-agent&lt;&#x2F;code&gt; forced me to set up new keys on all my machines and add them to various servers&#x2F;services.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;benefits-of-the-age-approach&quot;&gt;Benefits of the &lt;code&gt;age&lt;&#x2F;code&gt; approach&lt;a class=&quot;zola-anchor&quot; href=&quot;#benefits-of-the-age-approach&quot; aria-label=&quot;Anchor link for: benefits-of-the-age-approach&quot; title=&quot;Anchor link for: benefits-of-the-age-approach&quot;&gt;&lt;svg
    xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;
    stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;
    class=&quot;icon icon-tabler icons-tabler-outline icon-tabler-link&quot; focusable=&quot;false&quot;&gt;
    &lt;path stroke=&quot;none&quot; d=&quot;M0 0h24v24H0z&quot; fill=&quot;none&quot; &#x2F;&gt;
    &lt;path d=&quot;M9 15l6 -6&quot; &#x2F;&gt;
    &lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; &#x2F;&gt;
    &lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; &#x2F;&gt;
  &lt;&#x2F;svg&gt;&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;easy-encryption-with-chezmoi&quot;&gt;Easy encryption with chezmoi&lt;a class=&quot;zola-anchor&quot; href=&quot;#easy-encryption-with-chezmoi&quot; aria-label=&quot;Anchor link for: easy-encryption-with-chezmoi&quot; title=&quot;Anchor link for: easy-encryption-with-chezmoi&quot;&gt;&lt;svg
    xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;
    stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;
    class=&quot;icon icon-tabler icons-tabler-outline icon-tabler-link&quot; focusable=&quot;false&quot;&gt;
    &lt;path stroke=&quot;none&quot; d=&quot;M0 0h24v24H0z&quot; fill=&quot;none&quot; &#x2F;&gt;
    &lt;path d=&quot;M9 15l6 -6&quot; &#x2F;&gt;
    &lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; &#x2F;&gt;
    &lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; &#x2F;&gt;
  &lt;&#x2F;svg&gt;&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;While I was tending to the encryption area of my personal tech “garden”, I also started leveraging &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.chezmoi.io&#x2F;user-guide&#x2F;encryption&#x2F;age&#x2F;&quot;&gt;chezmoi’s encryption features&lt;&#x2F;a&gt;.
I already use &lt;code&gt;chezmoi&lt;&#x2F;code&gt; for my configuration files, but with encryption, I could also easily add “secrets” to my public &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;lukehsiao&#x2F;dotfiles&quot;&gt;dotfiles repo&lt;&#x2F;a&gt;.
In my case so far, this just means my copies of my favorite paid font: &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;usgraphics.com&#x2F;products&#x2F;berkeley-mono?ref=featuredtype.com&quot;&gt;Berkeley Mono&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;code&gt;chezmoi&lt;&#x2F;code&gt; also has a nice &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.chezmoi.io&#x2F;user-guide&#x2F;frequently-asked-questions&#x2F;encryption&#x2F;&quot;&gt;guide for configuring chezmoi to encrypt while asking for a passphrase only once&lt;&#x2F;a&gt; for &lt;code&gt;age&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;easy-yubikey-configuration&quot;&gt;Easy YubiKey configuration&lt;a class=&quot;zola-anchor&quot; href=&quot;#easy-yubikey-configuration&quot; aria-label=&quot;Anchor link for: easy-yubikey-configuration&quot; title=&quot;Anchor link for: easy-yubikey-configuration&quot;&gt;&lt;svg
    xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;
    stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;
    class=&quot;icon icon-tabler icons-tabler-outline icon-tabler-link&quot; focusable=&quot;false&quot;&gt;
    &lt;path stroke=&quot;none&quot; d=&quot;M0 0h24v24H0z&quot; fill=&quot;none&quot; &#x2F;&gt;
    &lt;path d=&quot;M9 15l6 -6&quot; &#x2F;&gt;
    &lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; &#x2F;&gt;
    &lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; &#x2F;&gt;
  &lt;&#x2F;svg&gt;&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;I was also very pleasantly surprised with how easy it was to switch to &lt;code&gt;age&lt;&#x2F;code&gt;!
Last time I set up the GPG keys on my YubiKeys, I spent several hours.&lt;&#x2F;p&gt;
&lt;p&gt;This time, with the help of &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;str4d&#x2F;age-plugin-yubikey&quot;&gt;&lt;code&gt;age-plugin-yubikey&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; and embracing the idea of having unique keys on each YubiKey, but encrypting everything for multiple recipients, setting up my keys was surprisingly trivial.
It also generates the keys securely on the hardware key itself, which is nice.
The whole process probably took 30 minutes.
It was so easy that in the future, I’m very much &lt;em&gt;not&lt;&#x2F;em&gt; intimidated by the thought of rotating keys.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;thoughts&quot;&gt;Thoughts&lt;a class=&quot;zola-anchor&quot; href=&quot;#thoughts&quot; aria-label=&quot;Anchor link for: thoughts&quot; title=&quot;Anchor link for: thoughts&quot;&gt;&lt;svg
    xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;
    stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;
    class=&quot;icon icon-tabler icons-tabler-outline icon-tabler-link&quot; focusable=&quot;false&quot;&gt;
    &lt;path stroke=&quot;none&quot; d=&quot;M0 0h24v24H0z&quot; fill=&quot;none&quot; &#x2F;&gt;
    &lt;path d=&quot;M9 15l6 -6&quot; &#x2F;&gt;
    &lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; &#x2F;&gt;
    &lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; &#x2F;&gt;
  &lt;&#x2F;svg&gt;&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Did I &lt;em&gt;need&lt;&#x2F;em&gt; to switch to &lt;code&gt;age&lt;&#x2F;code&gt;?
Of course not.&lt;&#x2F;p&gt;
&lt;p&gt;However, over my career, I repeatedly find that exploring new tools for your core workflows (part of &lt;a href=&quot;https:&#x2F;&#x2F;luke.hsiao.dev&#x2F;blog&#x2F;investing-in-interfaces&#x2F;&quot;&gt;investing in interfaces&lt;&#x2F;a&gt;) is just plain fun.
I often learn new ways of thinking about problems.
Sometimes, you walk away with a new default that brings some fresh ideas and some delight to your life.
Other times, you walk away with your trusty old tool, with greater appreciation for its history and the hard-earned approach it has established.
For my uses at the moment, &lt;code&gt;age&lt;&#x2F;code&gt; definitely falls into the former camp.&lt;&#x2F;p&gt;












&lt;div class=&quot;aside aside--tip&quot;&gt;
  &lt;div class=&quot;aside__header&quot; role=&quot;heading&quot; aria-level=&quot;3&quot;&gt;
    &lt;div class=&quot;aside__icon&quot; aria-hidden=&quot;true&quot;&gt;
      
      &lt;svg xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot;
        stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;
        class=&quot;icon icon-tabler icons-tabler-outline icon-tabler-rocket&quot;&gt;
        &lt;path stroke=&quot;none&quot; d=&quot;M0 0h24v24H0z&quot; fill=&quot;none&quot; &#x2F;&gt;
        &lt;path d=&quot;M4 13a8 8 0 0 1 7 7a6 6 0 0 0 3 -5a9 9 0 0 0 6 -8a3 3 0 0 0 -3 -3a9 9 0 0 0 -8 6a6 6 0 0 0 -5 3&quot; &#x2F;&gt;
        &lt;path d=&quot;M7 14a6 6 0 0 0 -3 6a6 6 0 0 0 6 -3&quot; &#x2F;&gt;
        &lt;path d=&quot;M15 9m-1 0a1 1 0 1 0 2 0a1 1 0 1 0 -2 0&quot; &#x2F;&gt;
      &lt;&#x2F;svg&gt;
      
    &lt;&#x2F;div&gt;

    &lt;span class=&quot;aside__title&quot;&gt;Tip&lt;&#x2F;span&gt;
  &lt;&#x2F;div&gt;

  &lt;div class=&quot;aside__body&quot;&gt;&lt;p&gt;This post made it to Hacker News.
See the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;news.ycombinator.com&#x2F;item?id=45825040&quot;&gt;thread&lt;&#x2F;a&gt; for some additional discussion.&lt;&#x2F;p&gt;
&lt;&#x2F;div&gt;
&lt;&#x2F;div&gt;</content>
    </entry>
    <entry xml:lang="en">
        <title>First impressions of jj from a git fan</title>
        <author>
          <name>Luke Hsiao</name>
        </author>
        <published>2025-10-25T00:00:00+00:00</published>
        <updated>2026-02-07T00:00:00+00:00</updated>
        <link href="https://luke.hsiao.dev/blog/initial-thoughts-jj/"/>
        <link rel="alternate" href="https://luke.hsiao.dev/blog/initial-thoughts-jj/" type="text/html"/>
        <id>https://luke.hsiao.dev/blog/initial-thoughts-jj/</id>
        <summary type="html">Some notes about jj, a fresh version control system, as a user that is deeply familiar with and fond of git.</summary>
        <content type="html">&lt;h2 id=&quot;what-is-jj&quot;&gt;What is &lt;code&gt;jj&lt;&#x2F;code&gt;?&lt;a class=&quot;zola-anchor&quot; href=&quot;#what-is-jj&quot; aria-label=&quot;Anchor link for: what-is-jj&quot; title=&quot;Anchor link for: what-is-jj&quot;&gt;&lt;svg
    xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;
    stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;
    class=&quot;icon icon-tabler icons-tabler-outline icon-tabler-link&quot; focusable=&quot;false&quot;&gt;
    &lt;path stroke=&quot;none&quot; d=&quot;M0 0h24v24H0z&quot; fill=&quot;none&quot; &#x2F;&gt;
    &lt;path d=&quot;M9 15l6 -6&quot; &#x2F;&gt;
    &lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; &#x2F;&gt;
    &lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; &#x2F;&gt;
  &lt;&#x2F;svg&gt;&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;martinvonz&#x2F;jj&quot;&gt;Jujutsu&lt;&#x2F;a&gt; (&lt;code&gt;jj&lt;&#x2F;code&gt;) is a distributed version control system (like &lt;code&gt;git&lt;&#x2F;code&gt;, &lt;code&gt;hg&lt;&#x2F;code&gt;, &lt;code&gt;darcs&lt;&#x2F;code&gt;, &lt;code&gt;pijul&lt;&#x2F;code&gt;, etc.).
However, it is rather unique in that it is &lt;code&gt;git&lt;&#x2F;code&gt;-compatible—it uses &lt;code&gt;git&lt;&#x2F;code&gt; as a storage layer, meaning you can use it right now on your existing &lt;code&gt;git&lt;&#x2F;code&gt; repos without disrupting anyone else.&lt;&#x2F;p&gt;
&lt;p&gt;It also provides other features, such as&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;conflicts as a first-class object&lt;&#x2F;li&gt;
&lt;li&gt;no explicit index&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;docs.jj-vcs.dev&#x2F;latest&#x2F;revsets&#x2F;&quot;&gt;revset&lt;&#x2F;a&gt; language&lt;&#x2F;li&gt;
&lt;li&gt;operation log and powerful undo&lt;&#x2F;li&gt;
&lt;li&gt;automatic rebase and conflict resolution&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;It also clearly has a (currently small but) passionate group of users, which is a good sign of a useful tool.&lt;&#x2F;p&gt;
&lt;p&gt;Some of these users strongly dislike &lt;code&gt;git&lt;&#x2F;code&gt;, finding its user interface unintuitive and clunky.
I, however, am very much not part of that group.
I &lt;em&gt;love&lt;&#x2F;em&gt; &lt;code&gt;git&lt;&#x2F;code&gt;.
Over the years, I’ve &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;lukehsiao&#x2F;dotfiles&#x2F;tree&#x2F;main&#x2F;private_dot_config&#x2F;git&quot;&gt;curated a configuration&lt;&#x2F;a&gt; that I find a joy to use.
I’ve built up years’ worth of muscle memory.
As a result, even though I love &lt;a href=&quot;https:&#x2F;&#x2F;luke.hsiao.dev&#x2F;blog&#x2F;investing-in-interfaces&#x2F;&quot;&gt;investing in interfaces&lt;&#x2F;a&gt;, such as new software tools, I haven’t ever felt motivated enough to try &lt;code&gt;jj&lt;&#x2F;code&gt;.
That changed this past week when I learned that &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;steveklabnik.com&#x2F;writing&#x2F;i-see-a-future-in-jj&#x2F;&quot;&gt;Steve Klabnik found &lt;code&gt;jj&lt;&#x2F;code&gt; so interesting that he’s leaving Oxide to pursue it further&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;As an experiment, I’ve committed to using only &lt;code&gt;jj&lt;&#x2F;code&gt; for at least a couple of weeks.&lt;&#x2F;p&gt;
&lt;p&gt;As a &lt;code&gt;git&lt;&#x2F;code&gt; user, the tutorial that clicked best for me is &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;steveklabnik.github.io&#x2F;jujutsu-tutorial&#x2F;introduction&#x2F;introduction.html&quot;&gt;Steve’s&lt;&#x2F;a&gt;.
So, if you’re a &lt;code&gt;git&lt;&#x2F;code&gt; fan, I suggest starting there.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;first-impressions&quot;&gt;First impressions&lt;a class=&quot;zola-anchor&quot; href=&quot;#first-impressions&quot; aria-label=&quot;Anchor link for: first-impressions&quot; title=&quot;Anchor link for: first-impressions&quot;&gt;&lt;svg
    xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;
    stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;
    class=&quot;icon icon-tabler icons-tabler-outline icon-tabler-link&quot; focusable=&quot;false&quot;&gt;
    &lt;path stroke=&quot;none&quot; d=&quot;M0 0h24v24H0z&quot; fill=&quot;none&quot; &#x2F;&gt;
    &lt;path d=&quot;M9 15l6 -6&quot; &#x2F;&gt;
    &lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; &#x2F;&gt;
    &lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; &#x2F;&gt;
  &lt;&#x2F;svg&gt;&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;what-i-miss-from-git&quot;&gt;What I miss from &lt;code&gt;git&lt;&#x2F;code&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#what-i-miss-from-git&quot; aria-label=&quot;Anchor link for: what-i-miss-from-git&quot; title=&quot;Anchor link for: what-i-miss-from-git&quot;&gt;&lt;svg
    xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;
    stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;
    class=&quot;icon icon-tabler icons-tabler-outline icon-tabler-link&quot; focusable=&quot;false&quot;&gt;
    &lt;path stroke=&quot;none&quot; d=&quot;M0 0h24v24H0z&quot; fill=&quot;none&quot; &#x2F;&gt;
    &lt;path d=&quot;M9 15l6 -6&quot; &#x2F;&gt;
    &lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; &#x2F;&gt;
    &lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; &#x2F;&gt;
  &lt;&#x2F;svg&gt;&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;I quickly ran into two features that I wish were supported.&lt;&#x2F;p&gt;
&lt;p&gt;First, &lt;code&gt;jj&lt;&#x2F;code&gt; &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;jj-vcs&#x2F;jj&#x2F;issues&#x2F;494&quot;&gt;does not support submodules&lt;&#x2F;a&gt;.
Sure, submodules are not great in many cases.
However, one very common case I use them for is &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.getzola.org&#x2F;&quot;&gt;Zola&lt;&#x2F;a&gt; themes, such as the theme for this blog.
My customization lives in my repository, and the theme for the site lives in a &lt;code&gt;git&lt;&#x2F;code&gt; submodule.
However, it looks like they are working on that actively and with great care.&lt;&#x2F;p&gt;
&lt;p&gt;Second, I missed &lt;code&gt;git-format-patch&lt;&#x2F;code&gt;.
This one is more minor, because I can always just fall back to &lt;code&gt;git&lt;&#x2F;code&gt; to do so.
Even in just a few days, I’ve wanted to serialize a patch to a file (i.e., &lt;code&gt;git format-patch&lt;&#x2F;code&gt;) or apply some patch I have sitting around with &lt;code&gt;git am&lt;&#x2F;code&gt;.
One example is a patch file I keep around that customizes an environment for debugging purposes.
As a &lt;code&gt;jj&lt;&#x2F;code&gt;-native approach, I’ve been keeping a change separate that I can rebase into my patch series and move out later if needed.&lt;&#x2F;p&gt;
&lt;p&gt;Then, there are a handful of more rarely used things that I have not needed yet, and consequently have not figured out equivalents for.
For example, I’m not sure about an equivalent for view release notes via tags.
With &lt;code&gt;git&lt;&#x2F;code&gt;, I used an alias like&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #CDD6F4; background-color: #1E1E2E;&quot;&gt;&lt;code data-lang=&quot;ini&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F9E2AF;&quot;&gt;alias&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;    tlog&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; tag --&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;sort&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span&gt;-v:refname -l --&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;format&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;&amp;#39;%(color:red)%(refname:strip=2)%(color:reset) - %(color:yellow)%(contents:subject)%(color:reset) by %(taggername) on %(taggerdate:human)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F5C2E7;&quot;&gt;\n\n&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;%(contents:body)&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;But, then it seems right now &lt;code&gt;jj&lt;&#x2F;code&gt; only supports lightweight tags, not annotated git tags.&lt;&#x2F;p&gt;
&lt;p&gt;I’m not sure an equivalent for &lt;code&gt;git shortlog&lt;&#x2F;code&gt;.
Most likely would need to build some template.&lt;&#x2F;p&gt;
&lt;p&gt;I don’t have some &lt;code&gt;jj&lt;&#x2F;code&gt; equivalent of &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;lukehsiao&#x2F;git-stats&quot;&gt;&lt;code&gt;git-stats&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;.
But again, it’s &lt;code&gt;git&lt;&#x2F;code&gt;-compatible, so I can just keep using &lt;code&gt;git-stats&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;I’m sure there will be a long tail of things like this.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;things-i-like-more-about-jj&quot;&gt;Things I like more about &lt;code&gt;jj&lt;&#x2F;code&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#things-i-like-more-about-jj&quot; aria-label=&quot;Anchor link for: things-i-like-more-about-jj&quot; title=&quot;Anchor link for: things-i-like-more-about-jj&quot;&gt;&lt;svg
    xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;
    stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;
    class=&quot;icon icon-tabler icons-tabler-outline icon-tabler-link&quot; focusable=&quot;false&quot;&gt;
    &lt;path stroke=&quot;none&quot; d=&quot;M0 0h24v24H0z&quot; fill=&quot;none&quot; &#x2F;&gt;
    &lt;path d=&quot;M9 15l6 -6&quot; &#x2F;&gt;
    &lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; &#x2F;&gt;
    &lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; &#x2F;&gt;
  &lt;&#x2F;svg&gt;&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Steve and others have described &lt;code&gt;jj&lt;&#x2F;code&gt; as “both simpler and easier than git, but at the same time, it is more powerful.”
I’m not sure I fully agree.
In some ways, it has better defaults (e.g., &lt;code&gt;jj split&lt;&#x2F;code&gt;, &lt;code&gt;jj absorb&lt;&#x2F;code&gt;), but in other ways, it is complex (e.g., revset language).
That said, I do see how it is more powerful.&lt;&#x2F;p&gt;
&lt;p&gt;You cannot exactly your &lt;code&gt;git&lt;&#x2F;code&gt; mental model to directly onto &lt;code&gt;jj&lt;&#x2F;code&gt;’s.
That said, one of the main things I enjoy at $WORK is that for a repository, &lt;code&gt;git&lt;&#x2F;code&gt;’s default “view” (for lack of a better word) is a branch, whereas &lt;code&gt;jj&lt;&#x2F;code&gt;’s default view is much higher level.
I find &lt;code&gt;jj&lt;&#x2F;code&gt;’s approach more intuitive: it’s always pretty trivial to see what branches&#x2F;PRs I have ongoing at a glance (i.e., with &lt;code&gt;jj log -r &quot;@ | ancestors(trunk()..(visible_heads() &amp;amp; mine()), 2) | trunk()&quot;&lt;&#x2F;code&gt;).
It also means you can easily do fun stuff like rebase &lt;em&gt;all&lt;&#x2F;em&gt; of your branches at the same time, and push them all simultaneously to your remote!
This is made even better by the fact that conflicts are first-class objects, meaning you can rebase all your branches, and deal with conflicts later.&lt;&#x2F;p&gt;
&lt;p&gt;In a similar vein: &lt;code&gt;jj&lt;&#x2F;code&gt; emphasizes commits or changes in a way I find pleasing.
Even though in &lt;code&gt;git&lt;&#x2F;code&gt; I have ways to do similar things, &lt;code&gt;jj&lt;&#x2F;code&gt; does indeed make them easier.
For example, splitting one commit into multiple is easier.
In &lt;code&gt;git&lt;&#x2F;code&gt;, you’d probably do something like&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #CDD6F4; background-color: #1E1E2E;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;git&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; rebase -i&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;font-style: italic;&quot;&gt;# select the commit you want to split for editing&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;git&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; reset HEAD~1 --mixed&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;font-style: italic;&quot;&gt;# add the subset of changes you want in the first commit&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;git&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; commit -c ORIG_HEAD&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;font-style: italic;&quot;&gt;# tweak if necessary&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;git&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; add -u&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;git&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; commit&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;font-style: italic;&quot;&gt;# write a commit message for the 2nd patch from scratch&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;In &lt;code&gt;jj&lt;&#x2F;code&gt;, &lt;code&gt;jj split&lt;&#x2F;code&gt; just does the more intuitive thing.
Instead, the same process looks more like&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #CDD6F4; background-color: #1E1E2E;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;jj&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; split -r {REVISION}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;font-style: italic;&quot;&gt;# select the subset of changes you want in the first commit&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;font-style: italic;&quot;&gt;# automatically presented with the original commit message, tweak if necessary&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;font-style: italic;&quot;&gt;# remaining changes automatically put in 2nd commit, presented with original commit message to tweak again&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;As another example, I’m a huge fan of &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;tummychow&#x2F;git-absorb&quot;&gt;&lt;code&gt;git-absorb&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;.
It makes folding follow-up changes into an appropriate earlier commit easy and effective.&lt;&#x2F;p&gt;
&lt;p&gt;However, it isn’t built into &lt;code&gt;git&lt;&#x2F;code&gt;.
Meanwhile, &lt;code&gt;jj&lt;&#x2F;code&gt; ships with &lt;code&gt;jj absorb&lt;&#x2F;code&gt;, which does the same thing.&lt;&#x2F;p&gt;
&lt;p&gt;I found that in &lt;code&gt;git&lt;&#x2F;code&gt;, I was already following a workflow close to the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;steveklabnik.github.io&#x2F;jujutsu-tutorial&#x2F;real-world-workflows&#x2F;the-squash-workflow.html&quot;&gt;squash workflow&lt;&#x2F;a&gt; recommended by &lt;code&gt;jj&lt;&#x2F;code&gt;’s creator, Martin.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;things-i-still-find-awkward&quot;&gt;Things I still find awkward&lt;a class=&quot;zola-anchor&quot; href=&quot;#things-i-still-find-awkward&quot; aria-label=&quot;Anchor link for: things-i-still-find-awkward&quot; title=&quot;Anchor link for: things-i-still-find-awkward&quot;&gt;&lt;svg
    xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;
    stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;
    class=&quot;icon icon-tabler icons-tabler-outline icon-tabler-link&quot; focusable=&quot;false&quot;&gt;
    &lt;path stroke=&quot;none&quot; d=&quot;M0 0h24v24H0z&quot; fill=&quot;none&quot; &#x2F;&gt;
    &lt;path d=&quot;M9 15l6 -6&quot; &#x2F;&gt;
    &lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; &#x2F;&gt;
    &lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; &#x2F;&gt;
  &lt;&#x2F;svg&gt;&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;The main thing I still feel clumsy with is named bookmarks (similar to &lt;code&gt;git&lt;&#x2F;code&gt; branches).
Specifically, I find it hard to remember to &lt;code&gt;set&lt;&#x2F;code&gt; the bookmark when I make updates, and how to rebase them without looking up commands.
That said, it’s becoming more familiar over time.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;my-configs&quot;&gt;My configs&lt;a class=&quot;zola-anchor&quot; href=&quot;#my-configs&quot; aria-label=&quot;Anchor link for: my-configs&quot; title=&quot;Anchor link for: my-configs&quot;&gt;&lt;svg
    xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;
    stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;
    class=&quot;icon icon-tabler icons-tabler-outline icon-tabler-link&quot; focusable=&quot;false&quot;&gt;
    &lt;path stroke=&quot;none&quot; d=&quot;M0 0h24v24H0z&quot; fill=&quot;none&quot; &#x2F;&gt;
    &lt;path d=&quot;M9 15l6 -6&quot; &#x2F;&gt;
    &lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; &#x2F;&gt;
    &lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; &#x2F;&gt;
  &lt;&#x2F;svg&gt;&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Much like &lt;code&gt;git&lt;&#x2F;code&gt;, I’ve also found that &lt;code&gt;jj&lt;&#x2F;code&gt;’s defaults aren’t entirely sufficient for me.
I needed to make some tweaks.
You can see my &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;lukehsiao&#x2F;dotfiles&#x2F;blob&#x2F;main&#x2F;private_dot_config&#x2F;private_jj&#x2F;config.toml.tmpl&quot;&gt;up-to-date dotfiles here&lt;&#x2F;a&gt;, but as a snapshot, these are changes I found to be particularly valuable right from the start.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #CDD6F4; background-color: #1E1E2E;&quot;&gt;&lt;code data-lang=&quot;toml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;font-style: italic;&quot;&gt;#:schema https:&#x2F;&#x2F;jj-vcs.github.io&#x2F;jj&#x2F;latest&#x2F;config-schema.json&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;[&lt;&#x2F;span&gt;&lt;span&gt;user&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;name&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; &amp;quot;Luke Hsiao&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;email&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; &amp;quot;{{ .email }}&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;[&lt;&#x2F;span&gt;&lt;span&gt;git&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;auto-local-bookmark&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FAB387;&quot;&gt; true&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;font-style: italic;&quot;&gt;# Prevent pushing work in progress or anything explicitly labeled &amp;quot;private&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;private-commits&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; &amp;quot;description(glob:&amp;#39;wip:*&amp;#39;) | description(glob:&amp;#39;private:*&amp;#39;)&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;[&lt;&#x2F;span&gt;&lt;span&gt;ui&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;editor&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; &amp;quot;hx&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;pager&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;&amp;quot;delta&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; &amp;quot;--pager&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; &amp;quot;less -FRX&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;]&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;font-style: italic;&quot;&gt; # Keeps output from the terminal after closing the pager&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;diff-formatter&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; &amp;quot;:git&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;font-style: italic;&quot;&gt; # required by `delta`&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;font-style: italic;&quot;&gt;# These options allow for `jj diff` and `jj show` to clear the output from the terminal after closing the pager.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;[[&lt;&#x2F;span&gt;&lt;span&gt;--scope&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;]]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;--when&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;commands&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt; [&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;&amp;quot;diff&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; &amp;quot;show&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;[&lt;&#x2F;span&gt;&lt;span&gt;--scope.ui&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;pager&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; &amp;quot;delta&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;[&lt;&#x2F;span&gt;&lt;span&gt;template-aliases&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;commit_template&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; &amp;#39;&amp;#39;&amp;#39;&amp;quot;JJ: &amp;lt;type&amp;gt;(&amp;lt;scope&amp;gt;): (If applied, this commit will...) &amp;lt;subject&amp;gt; (Max 50 char)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;JJ: |&amp;lt;---- Try to limit to a max of 50 char ----&amp;gt;|&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;JJ: Explain why this change is being made&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;JJ: |&amp;lt;----- Try to limit each line to a maximum of 72 characters -----&amp;gt;|&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;JJ: Provide links or keys to any relevant tickets, articles or other resources&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;JJ: Example: GitHub issue #23, BREAKING CHANGE: &amp;lt;description&amp;gt;, Ref: 5119ae&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;JJ: --- COMMIT END ---&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;JJ: Type can be&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;JJ:   build:    changes that affect the build system or external dependencies&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;JJ:   chore:    updating grunt tasks; no production code change&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;JJ:   ci:       changes to our ci configuration files and scripts&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;JJ:   docs:     changes to documentation&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;JJ:   feat:     new feature, correlates with MINOR&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;JJ:   fix:      bug fix, correlates with PATCH&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;JJ:   perf:     a code change that improves performance&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;JJ:   refactor: refactoring production code; neither fixes a bug nor adds a feature&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;JJ:   revert:   for reverts, revert: &amp;lt;old subject&amp;gt;; state reverted hash in body&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;JJ:   style:    formatting, missing semicolons, etc; no change in code behavior&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;JJ:   test:     adding or refactoring tests; no production code change&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;JJ:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;JJ: Scope refers to the file, directory, or system that is being modified.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;JJ:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;JJ: Follow the type(scope) with an &amp;#39;!&amp;#39; to indicate a breaking change.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;JJ: Example: refactor(api)!: remove the accident-prone delete_all button&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;JJ: --------------------&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;JJ: Remember to&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;JJ:    Use the imperative mood in the subject line&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;JJ:    Do not end the subject line with a period&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;JJ:    Separate subject from body with a blank line&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;JJ:    Use the body to explain what and why vs. how&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;JJ:    Can use multiple lines with &amp;#39;-&amp;#39; for bullet points in body&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;JJ:    BREAKING CHANGE: to correlate with MAJOR&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;JJ:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;JJ: See: https:&#x2F;&#x2F;www.conventionalcommits.org&#x2F;en&#x2F;v1.0.0&#x2F;)&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;&amp;#39;&amp;#39;&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;[&lt;&#x2F;span&gt;&lt;span&gt;templates&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;git_push_bookmark&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; &amp;#39;&amp;quot;lwh&#x2F;&amp;quot; ++ change_id.short()&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;draft_commit_description&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;&amp;#39;&amp;#39;&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;    concat(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;      coalesce(description, commit_template, &amp;quot;\n&amp;quot;),&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;      surround(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;        &amp;quot;\nJJ: This commit contains the following changes:\n&amp;quot;, &amp;quot;&amp;quot;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;        indent(&amp;quot;JJ:     &amp;quot;, diff.stat(72)),&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;      ),&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;      &amp;quot;\nJJ: ignore-rest\n&amp;quot;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;      diff.git(),&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;    )&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;&amp;#39;&amp;#39;&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;[&lt;&#x2F;span&gt;&lt;span&gt;aliases&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;cl&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt; [&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;&amp;quot;log&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; &amp;quot;-r&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; &amp;quot;trunk()..@-&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; &amp;quot;--reversed&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; &amp;quot;-T&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; &amp;quot;description ++ &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F5C2E7;&quot;&gt;\n&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;---&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F5C2E7;&quot;&gt;\n\n&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;&amp;#39;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; &amp;quot;--no-graph&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; &amp;quot;--no-pager&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;l&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt; [&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;&amp;quot;log&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; &amp;quot;-r&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; &amp;quot;@ | ancestors(trunk()..(visible_heads() &amp;amp; mine()), 2) | trunk()&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;la&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt; [&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;&amp;quot;log&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; &amp;quot;-r&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; &amp;quot;all()&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;pba&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt; [&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;&amp;quot;git&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; &amp;quot;push&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; &amp;quot;-b&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; &amp;quot;glob:lwh&#x2F;*&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;rba&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt; [&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;&amp;quot;rebase&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; &amp;quot;-s&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; &amp;quot;all:roots(mutable())&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; &amp;quot;-d&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; &amp;quot;trunk()&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;tug&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt; [&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;&amp;quot;bookmark&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; &amp;quot;move&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; &amp;quot;--from&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; &amp;quot;heads(::@- &amp;amp; bookmarks())&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; &amp;quot;--to&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; &amp;quot;@-&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;First, I strongly prefer &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;dandavison&#x2F;delta&quot;&gt;&lt;code&gt;delta&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; over the default viewer.
&lt;code&gt;jj&lt;&#x2F;code&gt; also makes it easy to view with another tool with &lt;code&gt;--tool&lt;&#x2F;code&gt;.
For example, I also like using &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;Wilfred&#x2F;difftastic&quot;&gt;&lt;code&gt;difft&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;I added a config from &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;jj-vcs&#x2F;jj&#x2F;discussions&#x2F;4690&quot;&gt;this discussion&lt;&#x2F;a&gt; so &lt;code&gt;jj log&lt;&#x2F;code&gt; doesn’t clear the screen on quit.&lt;&#x2F;p&gt;
&lt;p&gt;Second, I like having my &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.conventionalcommits.org&#x2F;en&#x2F;v1.0.0&#x2F;&quot;&gt;conventional commit&lt;&#x2F;a&gt; template automatically populated on &lt;code&gt;jj describe&lt;&#x2F;code&gt;.
I also have the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;jj-vcs&#x2F;jj&#x2F;issues&#x2F;1946#issuecomment-2561045057&quot;&gt;diff included&lt;&#x2F;a&gt;, which mimics the config I had with &lt;code&gt;git&lt;&#x2F;code&gt; using&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #CDD6F4; background-color: #1E1E2E;&quot;&gt;&lt;code data-lang=&quot;ini&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F9E2AF;&quot;&gt;commit&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;    template&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; ~&#x2F;.config&#x2F;git&#x2F;commit-template&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;    verbose&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; true&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Third, I changed the default &lt;code&gt;git push&lt;&#x2F;code&gt; bookmark prefix to &lt;code&gt;lwh&#x2F;&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Finally, I added a bunch of aliases I use frequently.
I use &lt;code&gt;jj cl&lt;&#x2F;code&gt; to copy-paste commit descriptions into PR descriptions.
I use &lt;code&gt;jj l&lt;&#x2F;code&gt; to view all the logs most relevant to me.
This was discovered courtesy of &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;willhbr.net&#x2F;2024&#x2F;08&#x2F;18&#x2F;understanding-revsets-for-a-better-jj-log-output&#x2F;&quot;&gt;Will Richardson&lt;&#x2F;a&gt;.
I use &lt;code&gt;jj la&lt;&#x2F;code&gt; to view all logs.
I use &lt;code&gt;jj pba&lt;&#x2F;code&gt; and &lt;code&gt;jj rba&lt;&#x2F;code&gt; to push all my bookmarks, and rebase all my changes on main, respectively.
Finally, I use &lt;code&gt;jj tug&lt;&#x2F;code&gt; to move my bookmark to the latest change (I found this one thanks to &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;shaddy.dev&#x2F;notes&#x2F;jj-tug&#x2F;&quot;&gt;Shaddy&lt;&#x2F;a&gt;).&lt;&#x2F;p&gt;
&lt;h2 id=&quot;thoughts-so-far&quot;&gt;Thoughts so far&lt;a class=&quot;zola-anchor&quot; href=&quot;#thoughts-so-far&quot; aria-label=&quot;Anchor link for: thoughts-so-far&quot; title=&quot;Anchor link for: thoughts-so-far&quot;&gt;&lt;svg
    xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;
    stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;
    class=&quot;icon icon-tabler icons-tabler-outline icon-tabler-link&quot; focusable=&quot;false&quot;&gt;
    &lt;path stroke=&quot;none&quot; d=&quot;M0 0h24v24H0z&quot; fill=&quot;none&quot; &#x2F;&gt;
    &lt;path d=&quot;M9 15l6 -6&quot; &#x2F;&gt;
    &lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; &#x2F;&gt;
    &lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; &#x2F;&gt;
  &lt;&#x2F;svg&gt;&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;I actually find &lt;code&gt;jj&lt;&#x2F;code&gt; quite fun!
Again, I do not think it “solved” any pain points I had with &lt;code&gt;git&lt;&#x2F;code&gt;.
I was already a very happy user.
Ultimately, &lt;code&gt;jj&lt;&#x2F;code&gt;’s interface and mental model do feel refreshing enough that I’m likely to continue using it.&lt;&#x2F;p&gt;
</content>
    </entry>
    <entry xml:lang="en">
        <title>ASUS PA32QCV: a programmer&#x27;s review</title>
        <author>
          <name>Luke Hsiao</name>
        </author>
        <published>2025-10-15T00:00:00+00:00</published>
        <updated>2026-01-17T00:00:00+00:00</updated>
        <link href="https://luke.hsiao.dev/blog/pa32qcv/"/>
        <link rel="alternate" href="https://luke.hsiao.dev/blog/pa32qcv/" type="text/html"/>
        <id>https://luke.hsiao.dev/blog/pa32qcv/</id>
        <summary type="html">A short-term review of the PA32QCV from a programmer, as well as a compatibility tip for Linux.</summary>
        <content type="html">&lt;p&gt;Those who know me know that I &lt;a href=&quot;https:&#x2F;&#x2F;luke.hsiao.dev&#x2F;blog&#x2F;investing-in-interfaces&#x2F;&quot;&gt;invest in interfaces&lt;&#x2F;a&gt;.
Previously, I had an &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.lg.com&#x2F;us&#x2F;monitors&#x2F;lg-38gn950-b-gaming-monitor&quot;&gt;LG 38GN950-B&lt;&#x2F;a&gt; (38“ Ultrawide, 3840×1600 @ 144Hz).
It was expensive, but had a little extra vertical resolution vs its competitors, and the high refresh rate was great for casual gaming.
But, over the years, I play games less, and my eyes are aging!
I find myself appreciating larger and more crisp fonts for programming.&lt;&#x2F;p&gt;
&lt;p&gt;With that in mind, I started looking for a high resolution “retina”-class display.
There are only a handful of these around at the time of writing.
In the 27“ 5K group: &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.apple.com&#x2F;studio-display&#x2F;&quot;&gt;Apple Studio Display&lt;&#x2F;a&gt;&#x2F;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.asus.com&#x2F;us&#x2F;displays-desktops&#x2F;monitors&#x2F;proart&#x2F;proart-display-5k-pa27jcv&#x2F;&quot;&gt;ProArt PA27JCV&lt;&#x2F;a&gt;&#x2F;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.samsung.com&#x2F;us&#x2F;monitors&#x2F;flat&#x2F;27-viewfinity-s9-5k-monitor-with-thunderbolt-4-matte-display-and-smart-features-sku-ls27c900panxza&#x2F;&quot;&gt;Samsung S9&lt;&#x2F;a&gt;&#x2F;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;kuycon.us&#x2F;monitors&#x2F;G27P&quot;&gt;Kuycon G27P&lt;&#x2F;a&gt;.
Then, there is the 32“ 6K group: Apple Pro Display XDR&#x2F;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.asus.com&#x2F;displays-desktops&#x2F;monitors&#x2F;proart&#x2F;proart-display-6k-pa32qcv&#x2F;&quot;&gt;ProArt PA32QCV&lt;&#x2F;a&gt;&#x2F;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;kuycon.us&#x2F;monitors&#x2F;G32P&quot;&gt;Kuycon G32P&lt;&#x2F;a&gt;&#x2F;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.dell.com&#x2F;en-us&#x2F;shop&#x2F;dell-ultrasharp-32-6k-monitor-u3224kb&#x2F;apd&#x2F;210-bhbz&#x2F;monitors-monitor-accessories&quot;&gt;Dell U3225KB&lt;&#x2F;a&gt;&#x2F;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.lg.com&#x2F;ca_en&#x2F;monitors&#x2F;uhd-4k-5k&#x2F;32u990a-s&#x2F;&quot;&gt;LG 32U990A-S&lt;&#x2F;a&gt;.
Then, there is the even more sparse 8K group: &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.dell.com&#x2F;en-us&#x2F;shop&#x2F;dell-ultrasharp-32-8k-monitor-up3218k&#x2F;apd&#x2F;210-alez&#x2F;monitors-monitor-accessories&quot;&gt;Dell UP3218K&lt;&#x2F;a&gt;&#x2F;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.asus.com&#x2F;displays-desktops&#x2F;monitors&#x2F;proart&#x2F;proart-display-8k-pa32kcx&#x2F;&quot;&gt;ProArt PA32KCX&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;I know I wanted to avoid fractional scaling, so I was searching for either 6K or 8K.&lt;&#x2F;p&gt;
&lt;p&gt;I immediately discovered that 8K is way out of my price range.&lt;&#x2F;p&gt;
&lt;p&gt;In the land of 6K, this &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.asus.com&#x2F;displays-desktops&#x2F;monitors&#x2F;proart&#x2F;proart-display-6k-pa32qcv&#x2F;&quot;&gt;ProArt PA32QCV&lt;&#x2F;a&gt; met a sweet spot: (1) being available for purchase right now, (2) having relatively modern hardware, and (3) not being ridiculously expensive.
So, I bought it.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;first-impressions&quot;&gt;First impressions&lt;a class=&quot;zola-anchor&quot; href=&quot;#first-impressions&quot; aria-label=&quot;Anchor link for: first-impressions&quot; title=&quot;Anchor link for: first-impressions&quot;&gt;&lt;svg
    xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;
    stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;
    class=&quot;icon icon-tabler icons-tabler-outline icon-tabler-link&quot; focusable=&quot;false&quot;&gt;
    &lt;path stroke=&quot;none&quot; d=&quot;M0 0h24v24H0z&quot; fill=&quot;none&quot; &#x2F;&gt;
    &lt;path d=&quot;M9 15l6 -6&quot; &#x2F;&gt;
    &lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; &#x2F;&gt;
    &lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; &#x2F;&gt;
  &lt;&#x2F;svg&gt;&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;strong&gt;WOW.&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;I’m a big fan.
As soon as I switched, I understood why people like these high-resolution displays.
Text is crisp and delightful to look at!
I do not miss the ultrawide at all.&lt;&#x2F;p&gt;
&lt;p&gt;I run at 2× scaling, and have been loving looking at it.&lt;&#x2F;p&gt;
&lt;p&gt;Yes, I do notice the drop from 144Hz to 60Hz.
However, because I’m mostly programming, I really don’t notice it during a typical workday unless I go looking for it (e.g., dragging a window quickly).&lt;&#x2F;p&gt;
&lt;p&gt;The colors look great.&lt;&#x2F;p&gt;
&lt;p&gt;In other words, when it comes to the display itself, it seems fantastic, which is what I was looking for.&lt;&#x2F;p&gt;
&lt;p&gt;Some people complain about the matte “LuxPixel” finish.
I think it looks fantastic, and appreciate the lack of glare.
This is an important feature, in my opinion.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;the-less-good&quot;&gt;The less good&lt;a class=&quot;zola-anchor&quot; href=&quot;#the-less-good&quot; aria-label=&quot;Anchor link for: the-less-good&quot; title=&quot;Anchor link for: the-less-good&quot;&gt;&lt;svg
    xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;
    stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;
    class=&quot;icon icon-tabler icons-tabler-outline icon-tabler-link&quot; focusable=&quot;false&quot;&gt;
    &lt;path stroke=&quot;none&quot; d=&quot;M0 0h24v24H0z&quot; fill=&quot;none&quot; &#x2F;&gt;
    &lt;path d=&quot;M9 15l6 -6&quot; &#x2F;&gt;
    &lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; &#x2F;&gt;
    &lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; &#x2F;&gt;
  &lt;&#x2F;svg&gt;&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;When it comes to some of the other features, they are notably less useful.&lt;&#x2F;p&gt;
&lt;h4 id=&quot;speakers&quot;&gt;Speakers&lt;a class=&quot;zola-anchor&quot; href=&quot;#speakers&quot; aria-label=&quot;Anchor link for: speakers&quot; title=&quot;Anchor link for: speakers&quot;&gt;&lt;svg
    xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;
    stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;
    class=&quot;icon icon-tabler icons-tabler-outline icon-tabler-link&quot; focusable=&quot;false&quot;&gt;
    &lt;path stroke=&quot;none&quot; d=&quot;M0 0h24v24H0z&quot; fill=&quot;none&quot; &#x2F;&gt;
    &lt;path d=&quot;M9 15l6 -6&quot; &#x2F;&gt;
    &lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; &#x2F;&gt;
    &lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; &#x2F;&gt;
  &lt;&#x2F;svg&gt;&lt;&#x2F;a&gt;&lt;&#x2F;h4&gt;
&lt;p&gt;These are fairly awful, as one would expect.
What confuses me is why these are here at all.
This is a “pro” monitor, and I see no value in having speakers.
I wish they saved some cost or reduced size&#x2F;weight instead.&lt;&#x2F;p&gt;
&lt;h4 id=&quot;kvm&quot;&gt;KVM&lt;a class=&quot;zola-anchor&quot; href=&quot;#kvm&quot; aria-label=&quot;Anchor link for: kvm&quot; title=&quot;Anchor link for: kvm&quot;&gt;&lt;svg
    xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;
    stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;
    class=&quot;icon icon-tabler icons-tabler-outline icon-tabler-link&quot; focusable=&quot;false&quot;&gt;
    &lt;path stroke=&quot;none&quot; d=&quot;M0 0h24v24H0z&quot; fill=&quot;none&quot; &#x2F;&gt;
    &lt;path d=&quot;M9 15l6 -6&quot; &#x2F;&gt;
    &lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; &#x2F;&gt;
    &lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; &#x2F;&gt;
  &lt;&#x2F;svg&gt;&lt;&#x2F;a&gt;&lt;&#x2F;h4&gt;
&lt;p&gt;I frequently multiplex between a work laptop and a personal desktop.
So, a built-in KVM is actually very appealing!
However, I’ve never found one that works well for my needs, so I’ve always reverted to separate display cables and a USB switch.
The same is true here.&lt;&#x2F;p&gt;
&lt;p&gt;Yes, this monitor has a KVM, but it does not have enough USB ports for my needs.
It has 3 USB ports, and 1 thunderbolt port.
The good news is that this lets me use 4 USB devices just fine on MacOS.
The bad news is that the 1 thunderbolt port does NOT work on my desktop, leaving me with just 3 devices.
Typically, I want four: a mouse, keyboard, webcam, and audio interface.
Five, if you count a security key.
So, good idea and will work for just a keyboard an mouse, but not enough for me.&lt;&#x2F;p&gt;
&lt;p&gt;Another fatal flaw is that the KVM doesn’t appear to activate immediately upon switching input.
This is vital because if your other machine goes to sleep, the input button &lt;em&gt;will not switch&lt;&#x2F;em&gt; until there is a display signal on that input—a signal that you have no way to initiate without a keyboard or mouse active!
With a USB switch, that means I typically switch, wake up the machine, and then switch the input.
With the built-in KVM, that means there is simply &lt;em&gt;no way&lt;&#x2F;em&gt; to actually switch without waking up the machine first some other way.
Not cool.&lt;&#x2F;p&gt;
&lt;p&gt;That said, my normal USB switch setup works well.&lt;&#x2F;p&gt;












&lt;div class=&quot;aside aside--note&quot;&gt;
  &lt;div class=&quot;aside__header&quot; role=&quot;heading&quot; aria-level=&quot;3&quot;&gt;
    &lt;div class=&quot;aside__icon&quot; aria-hidden=&quot;true&quot;&gt;
      
      &lt;svg xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot;
        stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;
        class=&quot;icon icon-tabler icons-tabler-outline icon-tabler-info-circle&quot;&gt;
        &lt;path stroke=&quot;none&quot; d=&quot;M0 0h24v24H0z&quot; fill=&quot;none&quot; &#x2F;&gt;
        &lt;path d=&quot;M3 12a9 9 0 1 0 18 0a9 9 0 0 0 -18 0&quot; &#x2F;&gt;
        &lt;path d=&quot;M12 9h.01&quot; &#x2F;&gt;
        &lt;path d=&quot;M11 12h1v4h1&quot; &#x2F;&gt;
      &lt;&#x2F;svg&gt;
      
    &lt;&#x2F;div&gt;

    &lt;span class=&quot;aside__title&quot;&gt;Note&lt;&#x2F;span&gt;
  &lt;&#x2F;div&gt;

  &lt;div class=&quot;aside__body&quot;&gt;&lt;p&gt;I recently improved this setup to be &lt;a href=&quot;https:&#x2F;&#x2F;luke.hsiao.dev&#x2F;blog&#x2F;display-switch&#x2F;&quot;&gt;even better&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;&#x2F;div&gt;
&lt;&#x2F;div&gt;&lt;h4 id=&quot;light-sync&quot;&gt;Light sync&lt;a class=&quot;zola-anchor&quot; href=&quot;#light-sync&quot; aria-label=&quot;Anchor link for: light-sync&quot; title=&quot;Anchor link for: light-sync&quot;&gt;&lt;svg
    xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;
    stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;
    class=&quot;icon icon-tabler icons-tabler-outline icon-tabler-link&quot; focusable=&quot;false&quot;&gt;
    &lt;path stroke=&quot;none&quot; d=&quot;M0 0h24v24H0z&quot; fill=&quot;none&quot; &#x2F;&gt;
    &lt;path d=&quot;M9 15l6 -6&quot; &#x2F;&gt;
    &lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; &#x2F;&gt;
    &lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; &#x2F;&gt;
  &lt;&#x2F;svg&gt;&lt;&#x2F;a&gt;&lt;&#x2F;h4&gt;
&lt;p&gt;The “Light Sync” feature actually sounded great: I work right by a window, and frequently do adjust brightness to compensate for the ambient light.
It would be awesome if it could do it for me!&lt;&#x2F;p&gt;
&lt;p&gt;However, after using it, as far as I can tell there is no way to set the baseline&#x2F;target brightness you want.
Instead, it ranges from acceptable (in &lt;code&gt;Native&lt;&#x2F;code&gt; color preset) to unusably dim (in &lt;code&gt;M Model-P3&lt;&#x2F;code&gt;).
It is a good idea, but the implementation seems to only be viable in &lt;code&gt;Native&lt;&#x2F;code&gt; mode of the ones I tried, which means this forces you to make a color preset trade-off.
Instead, they should’ve just let me set the target brightness.&lt;&#x2F;p&gt;
&lt;p&gt;That said, as someone &lt;em&gt;not&lt;&#x2F;em&gt; using this monitor for color accuracy, specifically, I’ve been quite satisfied with &lt;code&gt;Native&lt;&#x2F;code&gt; mode’s behavior thus far.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;the-surprising&quot;&gt;The surprising&lt;a class=&quot;zola-anchor&quot; href=&quot;#the-surprising&quot; aria-label=&quot;Anchor link for: the-surprising&quot; title=&quot;Anchor link for: the-surprising&quot;&gt;&lt;svg
    xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;
    stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;
    class=&quot;icon icon-tabler icons-tabler-outline icon-tabler-link&quot; focusable=&quot;false&quot;&gt;
    &lt;path stroke=&quot;none&quot; d=&quot;M0 0h24v24H0z&quot; fill=&quot;none&quot; &#x2F;&gt;
    &lt;path d=&quot;M9 15l6 -6&quot; &#x2F;&gt;
    &lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; &#x2F;&gt;
    &lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; &#x2F;&gt;
  &lt;&#x2F;svg&gt;&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Some features&#x2F;design choices I was pleasantly surprised at.
Not surprised they existed, but surprised how much I liked them.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;I really like buttons being on the front of the monitor, rather than needing to blindly click around on a side or bottom.&lt;&#x2F;li&gt;
&lt;li&gt;No giant power supply!
I appreciate the saved desk space of having the power supply built-in.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;compatibility&quot;&gt;Compatibility&lt;a class=&quot;zola-anchor&quot; href=&quot;#compatibility&quot; aria-label=&quot;Anchor link for: compatibility&quot; title=&quot;Anchor link for: compatibility&quot;&gt;&lt;svg
    xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;
    stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;
    class=&quot;icon icon-tabler icons-tabler-outline icon-tabler-link&quot; focusable=&quot;false&quot;&gt;
    &lt;path stroke=&quot;none&quot; d=&quot;M0 0h24v24H0z&quot; fill=&quot;none&quot; &#x2F;&gt;
    &lt;path d=&quot;M9 15l6 -6&quot; &#x2F;&gt;
    &lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; &#x2F;&gt;
    &lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; &#x2F;&gt;
  &lt;&#x2F;svg&gt;&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;The box came with the display itself, a stand, a Thunderbolt 4 cable, an “ultra 8K” HDMI cable, and a power cable.&lt;&#x2F;p&gt;
&lt;p&gt;After reading &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;michael.stapelberg.ch&#x2F;posts&#x2F;2023-07-03-dell-u3224kba-32-inch-6k-monitor&#x2F;&quot;&gt;Michael Stapelberg’s review of the 6K Dell&lt;&#x2F;a&gt;, I was a little worried about compatibility.
I was optimistic that with a brand-new release, more compatibility issues would’ve been ironed out.&lt;&#x2F;p&gt;
&lt;p&gt;I have two machines I use with this display: an M1 MacBook Pro, and my &lt;a href=&quot;https:&#x2F;&#x2F;luke.hsiao.dev&#x2F;blog&#x2F;2023-workstation-build&#x2F;&quot;&gt;custom workstation&lt;&#x2F;a&gt; (Radeon RX 7800 XT), running both Windows and Linux.&lt;&#x2F;p&gt;
&lt;p&gt;The monitor was clearly built with a MacBook in mind.
Using the Thunderbolt 4 cable, I instantly got power and display—full 6K no problems.
Colors do indeed seem highly matched with the &lt;code&gt;M Model-P3&lt;&#x2F;code&gt; color preset.&lt;&#x2F;p&gt;
&lt;p&gt;On my desktop with Windows via the included HDMI cable there was no problem.
It instantly recognized full 6K@60Hz.&lt;&#x2F;p&gt;
&lt;p&gt;My desktop with Linux via the included HDMI cable?
No 6K at all.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #CDD6F4; background-color: #1E1E2E;&quot;&gt;&lt;code data-lang=&quot;fish&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;❯ hyprctl monitors&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;Monitor&lt;&#x2F;span&gt;&lt;span&gt; HDMI-A-2 &lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;ID&lt;&#x2F;span&gt;&lt;span&gt; 0&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;        3008x1692&lt;&#x2F;span&gt;&lt;span&gt;@59.96700 at 0x0&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;        description&lt;&#x2F;span&gt;&lt;span&gt;: ASUSTek COMPUTER INC PA32QCV T7LMSV006894&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;        make&lt;&#x2F;span&gt;&lt;span&gt;: ASUSTek COMPUTER INC&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;        model&lt;&#x2F;span&gt;&lt;span&gt;: PA32QCV&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;        physical&lt;&#x2F;span&gt;&lt;span&gt; size &lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;mm&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span&gt;: 700x390&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;        serial&lt;&#x2F;span&gt;&lt;span&gt;: T7LMSV006894&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;        active&lt;&#x2F;span&gt;&lt;span&gt; workspace: 1 &lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;        special&lt;&#x2F;span&gt;&lt;span&gt; workspace: 0 &lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;()&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;        reserved&lt;&#x2F;span&gt;&lt;span&gt;: 0 26 0 0&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;        scale&lt;&#x2F;span&gt;&lt;span&gt;: 1.00&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;        transform&lt;&#x2F;span&gt;&lt;span&gt;: 0&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;        focused&lt;&#x2F;span&gt;&lt;span&gt;: yes&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;        dpmsStatus&lt;&#x2F;span&gt;&lt;span&gt;: 1&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;        vrr&lt;&#x2F;span&gt;&lt;span&gt;: false&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;        solitary&lt;&#x2F;span&gt;&lt;span&gt;: 0&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;        solitaryBlockedBy&lt;&#x2F;span&gt;&lt;span&gt;: windowed mode,missing candidate&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;        activelyTearing&lt;&#x2F;span&gt;&lt;span&gt;: false&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;        tearingBlockedBy&lt;&#x2F;span&gt;&lt;span&gt;: next frame is not torn,user settings,missing candidate&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;        directScanoutTo&lt;&#x2F;span&gt;&lt;span&gt;: 0&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;        directScanoutBlockedBy&lt;&#x2F;span&gt;&lt;span&gt;: user settings,missing candidate&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;        disabled&lt;&#x2F;span&gt;&lt;span&gt;: false&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;        currentFormat&lt;&#x2F;span&gt;&lt;span&gt;: XRGB8888&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;        mirrorOf&lt;&#x2F;span&gt;&lt;span&gt;: none&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;        availableModes&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;            3008x1692&lt;&#x2F;span&gt;&lt;span&gt;@59.97Hz&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;            4096x2160&lt;&#x2F;span&gt;&lt;span&gt;@60.00Hz&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;            4096x2160&lt;&#x2F;span&gt;&lt;span&gt;@59.94Hz&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;            4096x2160&lt;&#x2F;span&gt;&lt;span&gt;@50.00Hz&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;            4096x2160&lt;&#x2F;span&gt;&lt;span&gt;@30.00Hz&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;            4096x2160&lt;&#x2F;span&gt;&lt;span&gt;@29.97Hz&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;            4096x2160&lt;&#x2F;span&gt;&lt;span&gt;@25.00Hz&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;            4096x2160&lt;&#x2F;span&gt;&lt;span&gt;@24.00Hz&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;            4096x2160&lt;&#x2F;span&gt;&lt;span&gt;@23.98Hz&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;            3840x2160&lt;&#x2F;span&gt;&lt;span&gt;@60.00Hz&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;            3840x2160&lt;&#x2F;span&gt;&lt;span&gt;@59.94Hz&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;            3840x2160&lt;&#x2F;span&gt;&lt;span&gt;@60.00Hz&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;            ...&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;I first went down a bit of a rabbit hole assuming it was a Linux software issue (the same hardware works with Windows!).
But, I’m running Arch, with a very recent kernel and all up-to-date drivers.
I decided to try a DisplayPort cable instead.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #CDD6F4; background-color: #1E1E2E;&quot;&gt;&lt;code data-lang=&quot;fish&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;❯ hyprctl monitors&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;Monitor&lt;&#x2F;span&gt;&lt;span&gt; DP-1 &lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;ID&lt;&#x2F;span&gt;&lt;span&gt; 0&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;        6016x3384&lt;&#x2F;span&gt;&lt;span&gt;@59.99200 at 0x0&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;        description&lt;&#x2F;span&gt;&lt;span&gt;: ASUSTek COMPUTER INC PA32QCV T7LMSV006894&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;        make&lt;&#x2F;span&gt;&lt;span&gt;: ASUSTek COMPUTER INC&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;        model&lt;&#x2F;span&gt;&lt;span&gt;: PA32QCV&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;        physical&lt;&#x2F;span&gt;&lt;span&gt; size &lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;mm&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span&gt;: 700x390&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;        serial&lt;&#x2F;span&gt;&lt;span&gt;: T7LMSV006894&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;        active&lt;&#x2F;span&gt;&lt;span&gt; workspace: 1 &lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;        special&lt;&#x2F;span&gt;&lt;span&gt; workspace: 0 &lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;()&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;        reserved&lt;&#x2F;span&gt;&lt;span&gt;: 0 26 0 0&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;        scale&lt;&#x2F;span&gt;&lt;span&gt;: 2.00&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;        transform&lt;&#x2F;span&gt;&lt;span&gt;: 0&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;        focused&lt;&#x2F;span&gt;&lt;span&gt;: yes&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;        dpmsStatus&lt;&#x2F;span&gt;&lt;span&gt;: 1&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;        vrr&lt;&#x2F;span&gt;&lt;span&gt;: false&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;        solitary&lt;&#x2F;span&gt;&lt;span&gt;: 0&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;        solitaryBlockedBy&lt;&#x2F;span&gt;&lt;span&gt;: windowed mode,missing candidate&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;        activelyTearing&lt;&#x2F;span&gt;&lt;span&gt;: false&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;        tearingBlockedBy&lt;&#x2F;span&gt;&lt;span&gt;: next frame is not torn,user settings,missing candidate&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;        directScanoutTo&lt;&#x2F;span&gt;&lt;span&gt;: 0&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;        directScanoutBlockedBy&lt;&#x2F;span&gt;&lt;span&gt;: user settings,missing candidate&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;        disabled&lt;&#x2F;span&gt;&lt;span&gt;: false&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;        currentFormat&lt;&#x2F;span&gt;&lt;span&gt;: XRGB8888&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;        mirrorOf&lt;&#x2F;span&gt;&lt;span&gt;: none&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;        availableModes&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;            6016x3384&lt;&#x2F;span&gt;&lt;span&gt;@59.99Hz&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;            3008x1692&lt;&#x2F;span&gt;&lt;span&gt;@59.97Hz&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;            6016x3384&lt;&#x2F;span&gt;&lt;span&gt;@29.99Hz&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;            4096x2160&lt;&#x2F;span&gt;&lt;span&gt;@60.00Hz&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;            4096x2160&lt;&#x2F;span&gt;&lt;span&gt;@59.94Hz&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;            4096x2160&lt;&#x2F;span&gt;&lt;span&gt;@50.00Hz&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;            4096x2160&lt;&#x2F;span&gt;&lt;span&gt;@30.00Hz&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;            ...&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Whew!
Instantly recognized the 6K@60Hz.&lt;&#x2F;p&gt;
&lt;p&gt;So, that’s the tip: use DisplayPort on Linux.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;verdict&quot;&gt;Verdict&lt;a class=&quot;zola-anchor&quot; href=&quot;#verdict&quot; aria-label=&quot;Anchor link for: verdict&quot; title=&quot;Anchor link for: verdict&quot;&gt;&lt;svg
    xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;
    stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;
    class=&quot;icon icon-tabler icons-tabler-outline icon-tabler-link&quot; focusable=&quot;false&quot;&gt;
    &lt;path stroke=&quot;none&quot; d=&quot;M0 0h24v24H0z&quot; fill=&quot;none&quot; &#x2F;&gt;
    &lt;path d=&quot;M9 15l6 -6&quot; &#x2F;&gt;
    &lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; &#x2F;&gt;
    &lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; &#x2F;&gt;
  &lt;&#x2F;svg&gt;&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;So far, after a bit more than 3 months of daily use, I’m &lt;em&gt;very&lt;&#x2F;em&gt; pleased.&lt;&#x2F;p&gt;
&lt;p&gt;One of the biggest evidences of how nice it is was when I went back to my old monitor for a little bit.
The lack of text clarity was just as apparent as my initial shock at the clarity going the other direction.&lt;&#x2F;p&gt;
&lt;p&gt;We’ll see how it fares long term, but this is absolutely a keeper right now.&lt;&#x2F;p&gt;
</content>
    </entry>
    <entry xml:lang="en">
        <title>AI etiquette</title>
        <author>
          <name>Luke Hsiao</name>
        </author>
        <published>2025-10-05T00:00:00+00:00</published>
        <updated>2026-06-12T00:00:00+00:00</updated>
        <link href="https://luke.hsiao.dev/blog/ai-etiquette/"/>
        <link rel="alternate" href="https://luke.hsiao.dev/blog/ai-etiquette/" type="text/html"/>
        <id>https://luke.hsiao.dev/blog/ai-etiquette/</id>
        <summary type="html">Reflections on proof-of-thought and why showing AI output to people is rude, along with my pledge to keep this place human-authored.</summary>
        <content type="html">&lt;h2 id=&quot;it-s-the-thought-that-counts&quot;&gt;It’s the thought that counts&lt;a class=&quot;zola-anchor&quot; href=&quot;#it-s-the-thought-that-counts&quot; aria-label=&quot;Anchor link for: it-s-the-thought-that-counts&quot; title=&quot;Anchor link for: it-s-the-thought-that-counts&quot;&gt;&lt;svg
    xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;
    stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;
    class=&quot;icon icon-tabler icons-tabler-outline icon-tabler-link&quot; focusable=&quot;false&quot;&gt;
    &lt;path stroke=&quot;none&quot; d=&quot;M0 0h24v24H0z&quot; fill=&quot;none&quot; &#x2F;&gt;
    &lt;path d=&quot;M9 15l6 -6&quot; &#x2F;&gt;
    &lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; &#x2F;&gt;
    &lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; &#x2F;&gt;
  &lt;&#x2F;svg&gt;&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;I recently read a great &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;distantprovince.by&#x2F;posts&#x2F;its-rude-to-show-ai-output-to-people&#x2F;&quot;&gt;blog post from Alex Martsinovich&lt;&#x2F;a&gt;.
It expressed a concept that I’ve been feeling, too: &lt;em&gt;proof-of-thought&lt;&#x2F;em&gt;.&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;For the longest time, writing was more expensive than reading.
If you encountered a body of written text, you could be sure that at the very least, a human spent some time writing it down.
The text used to have an innate proof-of-thought, a basic token of humanity.&lt;&#x2F;p&gt;
&lt;p&gt;Now, AI has made text very, very, very cheap.
Not only text, in fact.
Code, images, video.
All kinds of media.
We can’t rely on proof-of-thought anymore.
Any text can be AI slop.
If you read it, you’re injured in this war.
You engaged and replied – you’re as good as dead.
The dead internet is not just dead it’s poisoned.
So what do we do?&lt;&#x2F;p&gt;
&lt;p&gt;Luckily for us, AI only talks in response.
Unlike Earth, AI does not emit comedy sketches into outer space on its own.
To get AI slop, somebody needs to ask for it.
To send it further, someone needs to retransmit it.
Our problem is other humans, really.&lt;&#x2F;p&gt;
&lt;p&gt;There’s nothing wrong with using AI.
When you do, you know what you’re getting.
The transaction is fully consensual.
But whenever you propagate AI output, you’re at risk of intentionally or unintentionally legitimizing it with your good name, providing it with a fake proof-of-thought.
In some cases, it’s fine, because you did think it through and adopted the AI output as your own.
But in other cases, it is not, and our scrambler brain feels violated.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;He goes on to propose a simple new sense of etiquette: &lt;strong&gt;AI output can only be relayed if it’s either adopted as your own or there is explicit consent from the receiving party&lt;&#x2F;strong&gt;, otherwise, it is horribly rude.
I’d add that essentially, you either are providing proof-of-thought, or, you’re explicitly acknowledging the lack of it.&lt;&#x2F;p&gt;
&lt;p&gt;This resonates.&lt;&#x2F;p&gt;
&lt;p&gt;Another way to put this is: &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;tombedor.dev&#x2F;human-attention-and-human-effort&#x2F;&quot;&gt;if you are requesting human attention, demonstrate human effort&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;relatable-example-in-the-wild&quot;&gt;Relatable example in the wild&lt;a class=&quot;zola-anchor&quot; href=&quot;#relatable-example-in-the-wild&quot; aria-label=&quot;Anchor link for: relatable-example-in-the-wild&quot; title=&quot;Anchor link for: relatable-example-in-the-wild&quot;&gt;&lt;svg
    xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;
    stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;
    class=&quot;icon icon-tabler icons-tabler-outline icon-tabler-link&quot; focusable=&quot;false&quot;&gt;
    &lt;path stroke=&quot;none&quot; d=&quot;M0 0h24v24H0z&quot; fill=&quot;none&quot; &#x2F;&gt;
    &lt;path d=&quot;M9 15l6 -6&quot; &#x2F;&gt;
    &lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; &#x2F;&gt;
    &lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; &#x2F;&gt;
  &lt;&#x2F;svg&gt;&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;It reminds me of &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;mrgan.com&#x2F;ai-email-from-a-friend&#x2F;&quot;&gt;Neven Mrgan’s reflection on how it feels to get an AI email from a friend&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;Recently I received an AI-written email from a friend.
It wasn’t sent to test AI, or to show it off, as in “ha ha check this out”; my friend had a question to ask me, and the email asked it over the course of a few paragraphs.
It then disclosed that, oh by the way, I used AI to write this.
My reaction to this surprised me: I was repelled, as if digital anthrax had poured out of the app.
I’m trying to figure out why.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;He then really breaks down how it did and didn’t feel as a recipient.
For example, it didn’t feel like they were using it as an autocorrect to type better.
It did feel like a family fridge decorated with printed stock art of children’s drawings.&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;Years from now, could an AI that was trained on all of my friend’s emails and texts and personal documents sound convincingly like them?
Could it be so advanced that I wouldn’t even be able to tell that my friend hadn’t written to me at all?
Possibly.
And that idea saddens me the most.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;Another is the bleakly entertaining rant by Bryan Cantrill: &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;bcantrill.dtrace.org&#x2F;2025&#x2F;12&#x2F;05&#x2F;your-intellectual-fly-is-open&#x2F;&quot;&gt;Your intellectual fly is open&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;When you use an LLM to author a post, you may think you are generating plausible writing, but you aren’t: to anyone who has seen even a modicum of LLM-generated content (a rapidly expanding demographic!), the LLM tells are impossible to ignore.
Bluntly, your intellectual fly is open: lots of people notice — but no one is pointing it out.
And the problem isn’t merely embarrassment: when you — person whose perspective I want to hear! — are obviously using an LLM to write posts for you, I don’t know what’s real and what is in fact generated fanfic.
You definitely don’t sound like you, so…is the actual content real?
I mean, maybe?
But also maybe not.
Regardless, I stop reading — and so do lots of others.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;h2 id=&quot;my-pledge&quot;&gt;My pledge&lt;a class=&quot;zola-anchor&quot; href=&quot;#my-pledge&quot; aria-label=&quot;Anchor link for: my-pledge&quot; title=&quot;Anchor link for: my-pledge&quot;&gt;&lt;svg
    xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;
    stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;
    class=&quot;icon icon-tabler icons-tabler-outline icon-tabler-link&quot; focusable=&quot;false&quot;&gt;
    &lt;path stroke=&quot;none&quot; d=&quot;M0 0h24v24H0z&quot; fill=&quot;none&quot; &#x2F;&gt;
    &lt;path d=&quot;M9 15l6 -6&quot; &#x2F;&gt;
    &lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; &#x2F;&gt;
    &lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; &#x2F;&gt;
  &lt;&#x2F;svg&gt;&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;The words on this blog have been and will always be, manually and intentionally typed by me (on a keyboard that I find delightful).
Yes, I am a big em dash (and en dash!) user—I even have &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;lukehsiao&#x2F;dotfiles&#x2F;blob&#x2F;f1c6c95e1ac79ff1bf937a0a0a70dc1ae12cacb3&#x2F;private_dot_config&#x2F;helix&#x2F;config.toml#L33&quot;&gt;macros in my editor&lt;&#x2F;a&gt; to make the substitutions.
No, that’s not AI.
Yes, you’ll find typos and grammar errors in my posts; I’m human (but if you do, please send me a note so I can fix it).
Still, I find writing a good way to clarify my own thoughts and, while I primarily write for myself, occasionally someone else benefits, too.&lt;&#x2F;p&gt;
&lt;p&gt;While we have no formal way to provide proof-of-thought, my pledge to both you and myself is that this place will remain a place for human thought, and more specifically, my personal ramblings.&lt;&#x2F;p&gt;
</content>
    </entry>
    <entry xml:lang="en">
        <title>Repairing my Windows bootloader after Omarchy</title>
        <author>
          <name>Luke Hsiao</name>
        </author>
        <published>2025-09-09T00:00:00+00:00</published>
        <updated>2025-09-09T00:00:00+00:00</updated>
        <link href="https://luke.hsiao.dev/blog/repairing-windows-bootloader/"/>
        <link rel="alternate" href="https://luke.hsiao.dev/blog/repairing-windows-bootloader/" type="text/html"/>
        <id>https://luke.hsiao.dev/blog/repairing-windows-bootloader/</id>
        <summary type="html">Some quick notes on repairing my Windows bootloader after installing Omarchy.</summary>
        <content type="html">&lt;h2 id=&quot;the-problem&quot;&gt;The problem&lt;a class=&quot;zola-anchor&quot; href=&quot;#the-problem&quot; aria-label=&quot;Anchor link for: the-problem&quot; title=&quot;Anchor link for: the-problem&quot;&gt;&lt;svg
    xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;
    stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;
    class=&quot;icon icon-tabler icons-tabler-outline icon-tabler-link&quot; focusable=&quot;false&quot;&gt;
    &lt;path stroke=&quot;none&quot; d=&quot;M0 0h24v24H0z&quot; fill=&quot;none&quot; &#x2F;&gt;
    &lt;path d=&quot;M9 15l6 -6&quot; &#x2F;&gt;
    &lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; &#x2F;&gt;
    &lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; &#x2F;&gt;
  &lt;&#x2F;svg&gt;&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Before I switched to Omarchy, I was running &lt;code&gt;omakase-blue&lt;&#x2F;code&gt; on one NVME drive, and Windows on another.
Part of this is because I want to use full disk encryption, and part of this is because I was originally playing with &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;docs.projectbluefin.io&#x2F;installation&#x2F;#requirements&quot;&gt;Project Bluefin&lt;&#x2F;a&gt;, which doesn’t support dual-boot off of a single disk.&lt;&#x2F;p&gt;
&lt;p&gt;I installed Omarchy via online ISO, and pointed it at my Linux drive.&lt;&#x2F;p&gt;
&lt;p&gt;After it installed, I no longer could boot into Windows.
My BIOS didn’t even show the 2nd NVME drive as a boot option.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;the-solution&quot;&gt;The solution&lt;a class=&quot;zola-anchor&quot; href=&quot;#the-solution&quot; aria-label=&quot;Anchor link for: the-solution&quot; title=&quot;Anchor link for: the-solution&quot;&gt;&lt;svg
    xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;
    stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;
    class=&quot;icon icon-tabler icons-tabler-outline icon-tabler-link&quot; focusable=&quot;false&quot;&gt;
    &lt;path stroke=&quot;none&quot; d=&quot;M0 0h24v24H0z&quot; fill=&quot;none&quot; &#x2F;&gt;
    &lt;path d=&quot;M9 15l6 -6&quot; &#x2F;&gt;
    &lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; &#x2F;&gt;
    &lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; &#x2F;&gt;
  &lt;&#x2F;svg&gt;&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;After some digging, I figured out a way to get things back without needing to reinstall any operating systems.
My system looked like this after the Omarchy install:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #CDD6F4; background-color: #1E1E2E;&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;❯ lsblk --output NAME,PTTYPE,PARTLABEL,FSTYPE,FSVER,LABEL,FSSIZE,FSAVAIL,FSUSE%,MOUNTPOINTS&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;NAME        PTTYPE PARTLABEL                    FSTYPE      FSVER LABEL FSSIZE FSAVAIL FSUSE% MOUNTPOINTS&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;zram0                                           swap        1     zram0                       [SWAP]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;nvme0n1     gpt&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;├─nvme0n1p1 gpt                                 vfat        FAT32           2G    1.8G     9% &#x2F;boot&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;└─nvme0n1p2 gpt                                 crypto_LUKS 2&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  └─root                                        btrfs                     1.8T    1.8T     2% &#x2F;var&#x2F;log&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                                                                                              &#x2F;home&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                                                                                              &#x2F;var&#x2F;cache&#x2F;pacman&#x2F;pkg&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                                                                                              &#x2F;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;nvme1n1     gpt&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;├─nvme1n1p1 gpt    Microsoft reserved partition&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;├─nvme1n1p2 gpt    Basic data partition         ntfs&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;└─nvme1n1p3 gpt                                 ntfs&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;That is, the &lt;code&gt;vfat&lt;&#x2F;code&gt;, &lt;code&gt;FAT32&lt;&#x2F;code&gt; partition with the bootloader was on &lt;code&gt;nvme0n1&lt;&#x2F;code&gt;, and it didn’t seem there was any corresponding partition on &lt;code&gt;nvme1n1&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;The good news is that this indicated that I could probably just restore the required boot files to &lt;code&gt;nvme0n1p1&lt;&#x2F;code&gt; for Windows and be on my way.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;repairing-the-windows-bootloader-files&quot;&gt;Repairing the Windows bootloader files&lt;a class=&quot;zola-anchor&quot; href=&quot;#repairing-the-windows-bootloader-files&quot; aria-label=&quot;Anchor link for: repairing-the-windows-bootloader-files&quot; title=&quot;Anchor link for: repairing-the-windows-bootloader-files&quot;&gt;&lt;svg
    xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;
    stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;
    class=&quot;icon icon-tabler icons-tabler-outline icon-tabler-link&quot; focusable=&quot;false&quot;&gt;
    &lt;path stroke=&quot;none&quot; d=&quot;M0 0h24v24H0z&quot; fill=&quot;none&quot; &#x2F;&gt;
    &lt;path d=&quot;M9 15l6 -6&quot; &#x2F;&gt;
    &lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; &#x2F;&gt;
    &lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; &#x2F;&gt;
  &lt;&#x2F;svg&gt;&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;To do so, I used &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.hirensbootcd.org&#x2F;&quot;&gt;Hiren’s BootCD PE&lt;&#x2F;a&gt; on a USB drive with &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.ventoy.net&#x2F;en&#x2F;index.html&quot;&gt;Ventoy&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Once in the Windows PE environment, we can restore the files with &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;learn.microsoft.com&#x2F;en-us&#x2F;windows-server&#x2F;administration&#x2F;windows-commands&#x2F;diskpart&quot;&gt;&lt;code&gt;diskpart&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; and &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;learn.microsoft.com&#x2F;en-us&#x2F;windows-hardware&#x2F;manufacture&#x2F;desktop&#x2F;bcdboot-command-line-options-techref-di?view=windows-11&quot;&gt;&lt;code&gt;bcdboot&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; in the command prompt.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #CDD6F4; background-color: #1E1E2E;&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;diskpart&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;&amp;gt; list volumes&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;# find the fat32 one, let&amp;#39;s call it X&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;&amp;gt; select volume X&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;&amp;gt; assign letter K:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Now that we’ve assigned a letter, we can fix the files:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #CDD6F4; background-color: #1E1E2E;&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  bcdboot C:\Windows &#x2F;s K: &#x2F;f ALL&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;where &lt;code&gt;&#x2F;s&lt;&#x2F;code&gt; specifies the volume letter of the system partition, and &lt;code&gt;&#x2F;f&lt;&#x2F;code&gt; specifies the firmware type (&lt;code&gt;ALL&lt;&#x2F;code&gt; copies all of them).&lt;&#x2F;p&gt;
&lt;p&gt;At this point, I could once again boot from this drive and land in Windows.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;adding-windows-to-limine&quot;&gt;Adding Windows to Limine&lt;a class=&quot;zola-anchor&quot; href=&quot;#adding-windows-to-limine&quot; aria-label=&quot;Anchor link for: adding-windows-to-limine&quot; title=&quot;Anchor link for: adding-windows-to-limine&quot;&gt;&lt;svg
    xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;
    stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;
    class=&quot;icon icon-tabler icons-tabler-outline icon-tabler-link&quot; focusable=&quot;false&quot;&gt;
    &lt;path stroke=&quot;none&quot; d=&quot;M0 0h24v24H0z&quot; fill=&quot;none&quot; &#x2F;&gt;
    &lt;path d=&quot;M9 15l6 -6&quot; &#x2F;&gt;
    &lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; &#x2F;&gt;
    &lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; &#x2F;&gt;
  &lt;&#x2F;svg&gt;&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;But, we could do even better!
Having to use the BIOS boot menu is annoying: you typically have to spam an &lt;code&gt;F&lt;&#x2F;code&gt;-key at startup, and if you miss your opportunity, need to restart again.
It would be nice to be able to just boot to the same bootloader and select Windows, like in a traditional single-drive, dual-boot setup.&lt;&#x2F;p&gt;
&lt;p&gt;Turns out that isn’t hard, since Omarchy uses &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;wiki.archlinux.org&#x2F;title&#x2F;Limine#Windows_entry_(UEFI)&quot;&gt;Limine&lt;&#x2F;a&gt; out of the box.&lt;&#x2F;p&gt;
&lt;p&gt;In Linux, we can just edit the boot config.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #CDD6F4; background-color: #1E1E2E;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;sudoedit&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; &#x2F;boot&#x2F;limine.conf&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Then, I added the following entry after the Omarchy ones, and before the EFI fallback.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #CDD6F4; background-color: #1E1E2E;&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;&#x2F;Windows&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;comment: Windows&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;comment: order-priority=40&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    protocol: efi&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    path: boot():&#x2F;EFI&#x2F;Microsoft&#x2F;Boot&#x2F;bootmgfw.efi&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;With this, I then configured my BIOS to with Limine as the first boot option, and disabled the others.
Now, it boots to Limine on startup, and my Windows drive is once again an easy option to select.
Nice.&lt;&#x2F;p&gt;
</content>
    </entry>
    <entry xml:lang="en">
        <title>Berkeley Mono Variable (TX-02) in Ghostty</title>
        <author>
          <name>Luke Hsiao</name>
        </author>
        <published>2025-09-07T00:00:00+00:00</published>
        <updated>2025-09-07T00:00:00+00:00</updated>
        <link href="https://luke.hsiao.dev/blog/berkeley-mono-ghostty/"/>
        <link rel="alternate" href="https://luke.hsiao.dev/blog/berkeley-mono-ghostty/" type="text/html"/>
        <id>https://luke.hsiao.dev/blog/berkeley-mono-ghostty/</id>
        <summary type="html">How to use Berkeley Mono Variable (TX-02) in Ghostty</summary>
        <content type="html">&lt;p&gt;Inspired by &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;michaelbommarito.com&#x2F;wiki&#x2F;programming&#x2F;tools&#x2F;ghostty-berkeley-font-configuration&#x2F;&quot;&gt;Michael Bommarito’s post&lt;&#x2F;a&gt;, I’m just dropping some quick notes on getting Berkeley Mono Variable (TX-02) to work in Ghostty.
Specifically, Berkeley Mono &lt;code&gt;2.002&lt;&#x2F;code&gt;, released on 2024-12-31, running in Ghostty &lt;code&gt;1.1.3-arch1&lt;&#x2F;code&gt;.
Using the variable version of the font is highly convenient: it is very fast to change styles and tweak things until it is exactly how you like it, without having to iterate with installing static fonts.&lt;&#x2F;p&gt;
&lt;p&gt;I suggest you read his post first for lots of nice context on fonts and their features.&lt;&#x2F;p&gt;
&lt;p&gt;Then, the key bit of information I needed to get this working was the following.
TX-02, the updated version of Berkeley Mono, has different OpenType features than the original.
There is no documentation I could find on exactly what they mean, but via some trial and error, I’ve landed on the following config.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #CDD6F4; background-color: #1E1E2E;&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;font-family = &amp;quot;Berkeley Mono Variable&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;# Font width (60 to 100)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#  60 = UltraCondensed&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#  70 = ExtraCondensed&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#  80 = Condensed&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#  90 = SemiCondensed&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;# 100 = Normal&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;font-variation = wdth=90&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;# Font weight (100 to 900)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;# 100 = Thin&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;# 200 = ExtraLight&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;# 300 = Light&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;# 350 = SemiLight&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;# 400 = Regular&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;# 500 = Medium&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;# 600 = SemiBold&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;# 700 = Bold&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;# 800 = ExtraBold&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;# 900 = Black&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;font-variation = wght=400&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;# Font slant (0 to -16)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#   0 = Regular&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;# -16 = Oblique&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;font-variation = slnt=0&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;# otfinfo -f ~&#x2F;.local&#x2F;share&#x2F;fonts&#x2F;Berkeley\ Mono\ Variable.otf&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;# aalt    Access All Alternates&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;# calt    Contextual Alternates&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;# ccmp    Glyph Composition&#x2F;Decomposition&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;# mark    Mark Positioning&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;# mkmk    Mark to Mark Positioning&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;# salt    Stylistic Alternates&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;# ss01    Stylistic Set 1 &amp;lt;- slashed 0&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;# ss02    Stylistic Set 2 &amp;lt;- dotted 0&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;# ss03    Stylistic Set 3 &amp;lt;- gap 0&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;# ss04    Stylistic Set 4 &amp;lt;- slashed 0, slash 7&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;# ss05    Stylistic Set 5 &amp;lt;- dotted 0, slash 7&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;# ss06    Stylistic Set 6 &amp;lt;- gap 0, slash 7&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;font-feature = +calt&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;font-feature = +ss02&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;font-size = 13&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;# Personal preference&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;adjust-cell-height = -2%&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Specifically, I found that &lt;code&gt;aalt&lt;&#x2F;code&gt; and &lt;code&gt;salt&lt;&#x2F;code&gt; appear to change what the stylistic sets do (to different things than my comments).
&lt;code&gt;ccmp&lt;&#x2F;code&gt;, &lt;code&gt;mark&lt;&#x2F;code&gt;, and &lt;code&gt;mkmk&lt;&#x2F;code&gt; don’t do anything that I noticed.
So, effectively, it seems to me that the only two features you actually care about are your &lt;code&gt;font-variation&lt;&#x2F;code&gt; settings, and then whether you want ligatures with &lt;code&gt;calt&lt;&#x2F;code&gt;, and what style of &lt;code&gt;0&lt;&#x2F;code&gt;&#x2F;&lt;code&gt;7&lt;&#x2F;code&gt; you want via stylistic sets.&lt;&#x2F;p&gt;
&lt;p&gt;Another tip: if you have static versions of Berkeley Mono installed, I noticed that that sometimes breaks Ghostty from loading Berkeley Mono Variable.
I’m unsure why, but I was able to resolve it by removing the static fonts, configuring things, and then putting them back.&lt;&#x2F;p&gt;
</content>
    </entry>
    <entry xml:lang="en">
        <title>The youngest sibling advantage</title>
        <author>
          <name>Luke Hsiao</name>
        </author>
        <published>2025-08-31T00:00:00+00:00</published>
        <updated>2025-09-30T00:00:00+00:00</updated>
        <link href="https://luke.hsiao.dev/blog/youngest-sibling/"/>
        <link rel="alternate" href="https://luke.hsiao.dev/blog/youngest-sibling/" type="text/html"/>
        <id>https://luke.hsiao.dev/blog/youngest-sibling/</id>
        <summary type="html">Some musings about what I think is the biggest advantage of being a youngest sibling.</summary>
        <content type="html">&lt;p&gt;I am the youngest child in my family.&lt;&#x2F;p&gt;
&lt;p&gt;I’ve heard a lot of discussion around the stereotypical traits of the youngest child.
In fact, many of these are so commonly echoed that they have their own name: &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;health.clevelandclinic.org&#x2F;oldest-child-syndrome-and-birth-order&quot;&gt;youngest child syndrome&lt;&#x2F;a&gt;.
Sure, some of these arguably apply to me (certainly my older siblings would label me spoiled), and others do not.
But, what I haven’t heard in many of these discussions is what I consider to be the biggest single advantage: &lt;strong&gt;life scouts&lt;&#x2F;strong&gt;.
No, not like Boys Scouts of America “Life” scouts, like people scouting ahead for you in life.&lt;&#x2F;p&gt;
&lt;p&gt;The youngest child often has older siblings they have observed keenly, maintained a strong and open rapport with, and with whom they have shared significant life experiences.
They know them at a profound level.&lt;&#x2F;p&gt;
&lt;p&gt;They then get to observe these older siblings blaze a variety of trails through life, years ahead of them.
The youngest get to observe the decisions the older siblings make, often well aware of context, and then see the consequences of those decisions play out.
Sometimes those consequences are positive, and sometimes they are not.
Sometimes the outcome seems causal, and sometimes it seems that luck played a large role.
Sometimes that whole decision-consequence cycle can happen well before a younger sibling might be faced with a similar decision.&lt;&#x2F;p&gt;
&lt;p&gt;In many ways, this is like mentorship on an amplified level.
Not mentorship in terms of career or school advice, but mentorship in life—hard earned advice and examples in real time, with real stakes, resulting in real impact.&lt;&#x2F;p&gt;
&lt;p&gt;The advantage of having life scouts naturally follows.
The youngest now has deeply detailed experience of highly trusted people to draw from when navigating the world ahead of them.
As a kid, you already know the best parks or playgrounds nearby.
You also know what areas of the neighborhood are dangerous.
As a student, you’re confident in navigating the school system, and the trade-offs of different schedule choices.
As an adult, you have gleaned some insight on dating and partner choices, and how those can affect directions in life.
You have observed different fields of study or career choices, and how those areas affect stress, income, flexibility, and more.
You have witnessed glimpses of different parenting styles and parenting choices.
The examples are endless.&lt;&#x2F;p&gt;
&lt;p&gt;Sure, not everything directly transfers, but I’ve found these “life scouts” to be priceless in my life.
A shout-out to all the older siblings out there who pave paths and building organizational knowledge for those of us who come afterward.
We appreciate you!&lt;&#x2F;p&gt;
&lt;p&gt;As for me, I think benefiting from such mentorship (from siblings) is also why I value mentorship in general so highly.
As the youngest sibling, I might not be able to provide powerful mentorship this particular way, but I still can hopefully pay it forward to nieces and nephews and other youth in my community.&lt;&#x2F;p&gt;
</content>
    </entry>
    <entry xml:lang="en">
        <title>Comparing UTOPIA ISPs</title>
        <author>
          <name>Luke Hsiao</name>
        </author>
        <published>2025-08-03T00:00:00+00:00</published>
        <updated>2025-08-15T00:00:00+00:00</updated>
        <link href="https://luke.hsiao.dev/blog/utopia-isps/"/>
        <link rel="alternate" href="https://luke.hsiao.dev/blog/utopia-isps/" type="text/html"/>
        <id>https://luke.hsiao.dev/blog/utopia-isps/</id>
        <summary type="html">A snapshot comparison of the internet service providers that UTOPIA fiber supports.</summary>
        <content type="html">&lt;p&gt;I currently use &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.utopiafiber.com&#x2F;&quot;&gt;UTOPIA&lt;&#x2F;a&gt; for my fiber connection.
Their model is that they charge for the infrastructure, and then they have many ISPs on top that provide competing internet services.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;pricing&quot;&gt;Pricing&lt;a class=&quot;zola-anchor&quot; href=&quot;#pricing&quot; aria-label=&quot;Anchor link for: pricing&quot; title=&quot;Anchor link for: pricing&quot;&gt;&lt;svg
    xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;
    stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;
    class=&quot;icon icon-tabler icons-tabler-outline icon-tabler-link&quot; focusable=&quot;false&quot;&gt;
    &lt;path stroke=&quot;none&quot; d=&quot;M0 0h24v24H0z&quot; fill=&quot;none&quot; &#x2F;&gt;
    &lt;path d=&quot;M9 15l6 -6&quot; &#x2F;&gt;
    &lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; &#x2F;&gt;
    &lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; &#x2F;&gt;
  &lt;&#x2F;svg&gt;&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;As a snapshot comparison (primarily for my own notes), here’s a comparison of pricing for &lt;em&gt;residential&lt;&#x2F;em&gt; service, on the tier of 1Gbps download and upload (symmetric).
This is the tier I’m currently on.&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th style=&quot;text-align: left&quot;&gt;ISP&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: right&quot;&gt;Price ($)&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: left&quot;&gt;Notes&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;centrafiox.com&#x2F;utopia&quot;&gt;Centra&lt;&#x2F;a&gt;&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;&lt;code&gt;43.95&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;Appear more honest on their Broadband label (showing 841Mbps&#x2F;884Mbps down&#x2F;up, rather than 1000Mbps).&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;etstelco.com&#x2F;residential#service-lookup&quot;&gt;ETS&lt;&#x2F;a&gt;&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;&lt;code&gt;45.00&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;Up to 10Gbps.&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;fusionnetworks.me&#x2F;services&#x2F;fiber-internet&#x2F;&quot;&gt;Fusion Networks&lt;&#x2F;a&gt;&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;&lt;code&gt;45.00&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;1Gb is their fastest plan.&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.3wave.net&#x2F;?0#HomePlansAndPricing&quot;&gt;3wave&lt;&#x2F;a&gt;&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;&lt;code&gt;48.00&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;portal.senawave.com&#x2F;utopiasignup&#x2F;&quot;&gt;SenaWave&lt;&#x2F;a&gt;&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;&lt;code&gt;48.00&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;Very sparse on details.&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.voonami.com&#x2F;internet&#x2F;residential-internet&#x2F;utopia&#x2F;&quot;&gt;Voonami&lt;&#x2F;a&gt;&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;&lt;code&gt;48.95&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;Comes with a free static IP on request. Also offers colo services. 2.5 Gbps fastest.&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.sumofiber.com&#x2F;internet&quot;&gt;SumoFiber&lt;&#x2F;a&gt;&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;&lt;code&gt;49.95&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;Appear slightly more honest, stating 980 Mbps up&#x2F;down.&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;signup.intellipop.com&#x2F;plan&#x2F;internet&quot;&gt;IntelliPop&lt;&#x2F;a&gt;&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;&lt;code&gt;49.95&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.connectfast.net&#x2F;Residential&#x2F;&quot;&gt;ConnectFast&lt;&#x2F;a&gt;&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;&lt;code&gt;53.95&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;Only a single plan: 1Gb&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.fiber.net&#x2F;internet-service-providers-in-utah&#x2F;residential-fiber-internet-utah&#x2F;&quot;&gt;FiberNet&lt;&#x2F;a&gt;&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;&lt;code&gt;53.95&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;1Gb is their fastest plan, but they have infra (i.e., offers colo services).&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;xmission.com&#x2F;utopia?cid=utopia_internet-service-providers&quot;&gt;XMission&lt;&#x2F;a&gt;&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;&lt;code&gt;54.00&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;Runs an extra firewall layer than can break some websites.&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;milesbroadband.com&#x2F;#&#x2F;pricing&quot;&gt;Miles Broadband&lt;&#x2F;a&gt;&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;&lt;code&gt;54.00&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.wifipros.co&#x2F;utopiafiber&quot;&gt;WiFiPros&lt;&#x2F;a&gt;&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;&lt;code&gt;55.00&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;I dislike the company name.&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.advancedstream.com&#x2F;broadband_disclosure_labels&#x2F;F002228961500001GbpsUTOPIA.html&quot;&gt;Advanced Stream&lt;&#x2F;a&gt;&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;&lt;code&gt;55.00&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;10 TB data cap, others are unlimited. Honest with specific speeds.&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.brigham.net&#x2F;residential-pricing&#x2F;&quot;&gt;Brigham&lt;&#x2F;a&gt;&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;&lt;code&gt;58.95&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;Wordpress site, sloppy errors like discrepancies in pricing.&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;infowest.com&#x2F;&quot;&gt;InfoWest&lt;&#x2F;a&gt;&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;&lt;code&gt;80.00&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;Unclear to me if this $80 includes UTOPIA’s $30. Probably?&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.beehive.net&#x2F;&quot;&gt;Beehive Broadband&lt;&#x2F;a&gt;&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;N&#x2F;A&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;Hard to find pricing is a dark pattern.&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.risebroadband.com&#x2F;fiber-internet&#x2F;&quot;&gt;Rise Broadband&lt;&#x2F;a&gt;&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;N&#x2F;A&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;Couldn’t find price.&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;fastel.com&#x2F;&quot;&gt;Fastel&lt;&#x2F;a&gt;&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;N&#x2F;A&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;Sketchily sparse website and no pricing. Dark patterns.&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;At some point, I want to go through and learn more about their nuances.
For example, XMission has an annoying trait of running their own firewall, which breaks websites occasionally.
But, they also run their own datacenters and have some nice peering agreements that likely improve latency and performance.&lt;&#x2F;p&gt;
&lt;p&gt;Here’s a &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.utopiafiber.com&#x2F;wp-content&#x2F;uploads&#x2F;2025&#x2F;01&#x2F;New-ISP-Comparison-Sheet_2025.pdf&quot;&gt;UTOPIA-provided comparison sheet&lt;&#x2F;a&gt;, too.
There is some discrepancy in the pricing and the ISPs themselves, though.&lt;&#x2F;p&gt;
</content>
    </entry>
    <entry xml:lang="en">
        <title>Variable fonts and italics across browsers</title>
        <author>
          <name>Luke Hsiao</name>
        </author>
        <published>2025-05-25T00:00:00+00:00</published>
        <updated>2025-05-25T00:00:00+00:00</updated>
        <link href="https://luke.hsiao.dev/blog/variable-fonts/"/>
        <link rel="alternate" href="https://luke.hsiao.dev/blog/variable-fonts/" type="text/html"/>
        <id>https://luke.hsiao.dev/blog/variable-fonts/</id>
        <summary type="html">Some notes on getting variable web fonts to work with italics across Chrome and Firefox.</summary>
        <content type="html">&lt;p&gt;I’m a big fan of &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.brailleinstitute.org&#x2F;freefont&#x2F;&quot;&gt;Atkinson Hyperlegible Next&lt;&#x2F;a&gt; and &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;usgraphics.com&#x2F;products&#x2F;berkeley-mono&quot;&gt;Berkeley Mono&lt;&#x2F;a&gt; (TX-02).
It is my opinion that they both look great, unique, and provide valuable legibility features.&lt;&#x2F;p&gt;
&lt;p&gt;I recently refactored this site to use the variable, web versions of these fonts.
I was happy that I now had only a single &lt;code&gt;@font-face&lt;&#x2F;code&gt; definition, not a handful, and went on my way.
(I had haphazardly picked up these parameters on the Internet somewhere.)&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #CDD6F4; background-color: #1E1E2E;&quot;&gt;&lt;code data-lang=&quot;css&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CBA6F7;&quot;&gt;@font-face&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;    font-family&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; &amp;#39;Berkeley Mono&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;    src&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt; url&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;&amp;#39;..&#x2F;fonts&#x2F;Berkeley Mono Variable.woff2&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt; format&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;&amp;#39;woff2&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;    font-stretch&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FAB387;&quot;&gt; 60 100&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;    font-weight&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FAB387;&quot;&gt; 100 900&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;    font-style&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span&gt; oblique&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FAB387;&quot;&gt; -16&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CBA6F7;&quot;&gt;deg&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FAB387;&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CBA6F7;&quot;&gt;deg&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;    font-feature-settings&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span&gt; calt&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;    font-variant-ligatures&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span&gt; contextual&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CBA6F7;&quot;&gt;@font-face&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;    font-family&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; &amp;#39;Atkinson Hyperlegible Next&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;    src&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt; url&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;&amp;#39;..&#x2F;fonts&#x2F;AtkinsonHyperlegibleNextVF-Variable.woff2&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt; format&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;&amp;#39;woff2&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;    font-weight&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FAB387;&quot;&gt; 100 900&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;    font-style&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span&gt; oblique&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FAB387;&quot;&gt; -16&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CBA6F7;&quot;&gt;deg&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FAB387;&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CBA6F7;&quot;&gt;deg&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Then, just recently, I realized that my italics were broken on this site for weeks!
They worked on Chrome as I had it configured.
They did not work on Firefox.&lt;&#x2F;p&gt;
&lt;p&gt;I tried a few things.&lt;&#x2F;p&gt;
&lt;p&gt;First, I tried duplicating the &lt;code&gt;@font-face&lt;&#x2F;code&gt; definition, but with &lt;code&gt;font-style: italic&lt;&#x2F;code&gt;.
This made it work on Firefox, but broke Chrome.&lt;&#x2F;p&gt;
&lt;p&gt;I then found there is a new way to specify italics for variable web fonts, specifically (assuming it is supported by the font): &lt;code&gt;font-variation-settings&lt;&#x2F;code&gt;.
In the case of Atkinson Hyperlegible Next, I could get my italics looking right on both Firefox and Chrome by adding the following CSS.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #CDD6F4; background-color: #1E1E2E;&quot;&gt;&lt;code data-lang=&quot;css&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;em&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;  font-variation-settings&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; &amp;quot;ital&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FAB387;&quot;&gt; 1&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;  font-synthesis&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span&gt; none&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;But, this didn’t work for Berkeley Mono.&lt;&#x2F;p&gt;
&lt;p&gt;I also tried things like using &lt;code&gt;woff2-variations&lt;&#x2F;code&gt; in my &lt;code&gt;@font-face&lt;&#x2F;code&gt; definitions and other little tweaks to no avail.&lt;&#x2F;p&gt;
&lt;p&gt;Finally, after more experimentation, I was pleasantly surprised that I could get everything working just by &lt;em&gt;simplifying&lt;&#x2F;em&gt;.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #CDD6F4; background-color: #1E1E2E;&quot;&gt;&lt;code data-lang=&quot;css&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CBA6F7;&quot;&gt;@font-face&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;    font-family&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; &amp;#39;Berkeley Mono&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;    src&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt; url&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;&amp;#39;..&#x2F;fonts&#x2F;Berkeley Mono Variable.woff2&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt; format&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;&amp;#39;woff2&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;    font-stretch&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FAB387;&quot;&gt; 60 100&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;    font-weight&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FAB387;&quot;&gt; 100 900&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;    font-feature-settings&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span&gt; calt&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;    font-variant-ligatures&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span&gt; contextual&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CBA6F7;&quot;&gt;@font-face&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;    font-family&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; &amp;#39;Atkinson Hyperlegible Next&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;    src&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt; url&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;&amp;#39;..&#x2F;fonts&#x2F;AtkinsonHyperlegibleNextVF-Variable.woff2&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt; format&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;&amp;#39;woff2&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;    font-weight&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FAB387;&quot;&gt; 100 900&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;I dropped the (likely incorrect) &lt;code&gt;font-style&lt;&#x2F;code&gt; attribute.
No need for the &lt;code&gt;em&lt;&#x2F;code&gt; class override, now, either.&lt;&#x2F;p&gt;
&lt;p&gt;With that, I have &lt;em&gt;italics&lt;&#x2F;em&gt;, both for my normal font, and for my &lt;em&gt;&lt;code&gt;monospace &lt;&#x2F;code&gt;&lt;&#x2F;em&gt; font that work on both Firefox and Chrome.
All I needed to do was delete the right two lines.&lt;&#x2F;p&gt;
</content>
    </entry>
    <entry xml:lang="en">
        <title>Performance gains of undervolting a T480s</title>
        <author>
          <name>Luke Hsiao</name>
        </author>
        <published>2025-05-23T00:00:00+00:00</published>
        <updated>2025-12-04T00:00:00+00:00</updated>
        <link href="https://luke.hsiao.dev/blog/undervolting-t480s/"/>
        <link rel="alternate" href="https://luke.hsiao.dev/blog/undervolting-t480s/" type="text/html"/>
        <id>https://luke.hsiao.dev/blog/undervolting-t480s/</id>
        <summary type="html">I undervolted and reapplied thermal paste to an old T480s to find surprising improvements of 12% and 24% CPU performance for single- and multi-core workloads, respectively.</summary>
        <content type="html">&lt;p&gt;I have been using a self-refurbished &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;psref.lenovo.com&#x2F;syspool&#x2F;Sys&#x2F;PDF&#x2F;withdrawnbook&#x2F;ThinkPad_X230.pdf&quot;&gt;Thinkpad X230&lt;&#x2F;a&gt; for quite a while as a personal machine.
I believe in the benefits of continuing to use old laptops [&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;drewdevault.com&#x2F;2020&#x2F;02&#x2F;18&#x2F;Fucking-laptops.html&quot;&gt;1&lt;&#x2F;a&gt;, &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;solar.lowtechmagazine.com&#x2F;2020&#x2F;12&#x2F;how-and-why-i-stopped-buying-new-laptops&quot;&gt;2&lt;&#x2F;a&gt;, &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;atthis.link&#x2F;blog&#x2F;2021&#x2F;reassesstech.html&quot;&gt;3&lt;&#x2F;a&gt;].
However, recently, I’ve started to need to use a laptop to do presentations frequently, and the HDMI port on my X230 is not functioning fully, resulting in distorted colors and other distracting artifacts.
I might try and repair that, someday.&lt;&#x2F;p&gt;
&lt;p&gt;However, due to pressing need, I instead picked up a used &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;psref.lenovo.com&#x2F;syspool&#x2F;Sys&#x2F;PDF&#x2F;withdrawnbook&#x2F;ThinkPad_X230.pdf&quot;&gt;T480s&lt;&#x2F;a&gt; from a good friend, which had a working HDMI port.&lt;&#x2F;p&gt;
&lt;p&gt;Over the first couple days of use, I noticed that this thing ran &lt;em&gt;hot&lt;&#x2F;em&gt;.
Sure, I have the &lt;code&gt;i7-8650u&lt;&#x2F;code&gt; version, but the fans were spinning up far more than I’d like, and CPU temps would frequently exceed 95 °C for bursts at a time.&lt;&#x2F;p&gt;
&lt;p&gt;Naturally, I did a little digging.&lt;&#x2F;p&gt;
&lt;p&gt;It turns out, Linux and the T480s have a longstanding problem!
I don’t understand the problem well enough to explain it here.
But, essentially, people were seeing throttling and temperature issues with these machines on Linux (but not Windows).
To be clear, this issue was found on an old Linux kernel (4.15, I’m on 6.14).
I do not know if this specific problem is affecting me.
However, through this, I learned about a fun tool for undervolting a T480s: &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;erpalma&#x2F;throttled&quot;&gt;&lt;code&gt;throttled&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Even if this issue was resolved in newer kernels, I imagined that some undervolting could still help my thermals and performance.
So, I tried it.
In addition, to give the attempt the best chance it had, I also replaced the thermal paste with fresh &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.thermal-grizzly.com&#x2F;en&#x2F;duronaut&#x2F;s-tg-d&quot;&gt;Duronaut&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;I was surprised to find a &lt;strong&gt;12% improvement&lt;&#x2F;strong&gt; in single-core performance and a &lt;strong&gt;24% improvement&lt;&#x2F;strong&gt; in multi-core on Geekbench 6!&lt;&#x2F;p&gt;
&lt;div align=&quot;center&quot; &gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th style=&quot;text-align: left&quot;&gt;Metric&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: right&quot;&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;browser.geekbench.com&#x2F;v6&#x2F;cpu&#x2F;12075976&quot;&gt;Original&lt;&#x2F;a&gt;&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: right&quot;&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;browser.geekbench.com&#x2F;v6&#x2F;cpu&#x2F;12105681&quot;&gt;Optimized&lt;&#x2F;a&gt;&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: right&quot;&gt;Change (%)&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;Single-core&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;&lt;code&gt;1341&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;&lt;code&gt;1499&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;&lt;code&gt;+11.8&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;Multi-core&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;&lt;code&gt;3989&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;&lt;code&gt;4948&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;&lt;code&gt;+24.0&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;&#x2F;div&gt;
&lt;p&gt;The laptop runs much cooler, and the fans spin up much less.
It’s much more pleasant to use.&lt;&#x2F;p&gt;
&lt;p&gt;I ultimately landed on the following undervolt for this machine.
(Remember, each chip is different, you might not be able to use these values.)&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #CDD6F4; background-color: #1E1E2E;&quot;&gt;&lt;code data-lang=&quot;toml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;font-style: italic;&quot;&gt;# All voltage values are expressed in mV and *MUST* be negative (i.e. undervolt)!&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;[&lt;&#x2F;span&gt;&lt;span&gt;UNDERVOLT&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;font-style: italic;&quot;&gt;# CPU core voltage offset (mV)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;CORE: -135&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;font-style: italic;&quot;&gt;# Integrated GPU voltage offset (mV)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;GPU: -105&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;font-style: italic;&quot;&gt;# CPU cache voltage offset (mV)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;CACHE: -135&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;font-style: italic;&quot;&gt;# System Agent voltage offset (mV)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;UNCORE: -105&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;font-style: italic;&quot;&gt;# Analog I&#x2F;O voltage offset (mV)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;ANALOGIO: 0&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;What a satisfying way to squeeze a little more performance out of a still-great laptop.&lt;&#x2F;p&gt;
</content>
    </entry>
    <entry xml:lang="en">
        <title>Steel man arguments, or arguing intelligently</title>
        <author>
          <name>Luke Hsiao</name>
        </author>
        <published>2025-03-22T00:00:00+00:00</published>
        <updated>2025-03-22T00:00:00+00:00</updated>
        <link href="https://luke.hsiao.dev/blog/steel-man/"/>
        <link rel="alternate" href="https://luke.hsiao.dev/blog/steel-man/" type="text/html"/>
        <id>https://luke.hsiao.dev/blog/steel-man/</id>
        <summary type="html">If the goal is to actually come to some solution, consider using a steel man approach, it&#x27;s a more effective way to debate.</summary>
        <content type="html">&lt;p&gt;I’m a big fan of the idea of “steel man” argument.
However, I’ve found that this term is far less widely known than its “straw man” counterpart.
I’ve heard some people just call this “arguing intelligently”.&lt;&#x2F;p&gt;
&lt;p&gt;Here are two good definitions if you’re unfamiliar with the idea.
First, Wikipedia’s for the more abstract definition, and then Robin Sloan’s practical example.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Straw_man&quot;&gt;Wikipedia&lt;&#x2F;a&gt;:&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;A steel man argument (or steelmanning) is the opposite of a straw man argument. Steelmanning is the practice of applying the rhetorical principle of charity through addressing the strongest form of the other person’s argument, even if it is not the one they explicitly presented. Creating the strongest form of the opponent’s argument may involve removing flawed assumptions that could be easily refuted or developing the strongest points which counter one’s own position. Developing counters to steel man arguments may produce a stronger argument for one’s own position.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;archive.is&#x2F;5xJKc&quot;&gt;Robin Sloan&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;There are two debaters, Alice and Bob. Alice takes the podium, makes her argument. Then Bob takes her place, but before he can present his counter-argument, he must summarize Alice’s argument to her satisfaction — a demonstration of respect and good faith. Only when Alice agrees that Bob has got it right is he permitted to proceed with his own argument — and then, when he’s finished, Alice must summarize it to his satisfaction.&lt;&#x2F;p&gt;
&lt;p&gt;The first time I saw one of these debates, it blew my mind.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;Or, as Stephen R. Covey put it: “&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;The_7_Habits_of_Highly_Effective_People&quot;&gt;Seek first to understand, then to be understood&lt;&#x2F;a&gt;”.&lt;&#x2F;p&gt;
&lt;p&gt;Imagine if the default mode of debate was like this.
A tool for persuasion, consideration, exploration, and achieving consensus (or at least clearly understanding the shape of disagreement).
Instead, culturally, we’re more used to debate as a stage for name-calling, politics, distraction, point-scoring, and drama.&lt;&#x2F;p&gt;
&lt;p&gt;Next time you’re debating something, consider arguing more intelligently, and treating the other parties with that same human respect.&lt;&#x2F;p&gt;
</content>
    </entry>
    <entry xml:lang="en">
        <title>Sharing intro cards</title>
        <author>
          <name>Luke Hsiao</name>
        </author>
        <published>2025-03-16T00:00:00+00:00</published>
        <updated>2026-06-17T00:00:00+00:00</updated>
        <link href="https://luke.hsiao.dev/blog/intro-cards/"/>
        <link rel="alternate" href="https://luke.hsiao.dev/blog/intro-cards/" type="text/html"/>
        <id>https://luke.hsiao.dev/blog/intro-cards/</id>
        <summary type="html">Have you ever considered giving out &quot;intro cards&quot; to neighbors or other people in your proximity?</summary>
        <content type="html">&lt;p&gt;Those who know me know that I am fairly introverted.
But, I am also someone who strongly values community, and thinks there are huge benefits to be had by building or connecting to one.&lt;&#x2F;p&gt;
&lt;p&gt;A big part of building or integrating into communities is getting to know the people in them.
Some people have a natural talent for this.
Others have built that skill through many years of deliberate practice.
There are also some people who use software to manage and track these relationships “personal CRM”-style (e.g., &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.monicahq.com&#x2F;&quot;&gt;Monica&lt;&#x2F;a&gt;, or really detailed notes in Google Contacts).&lt;&#x2F;p&gt;
&lt;p&gt;I am currently none of these people.&lt;&#x2F;p&gt;
&lt;p&gt;But, I would like to build the skill.&lt;&#x2F;p&gt;
&lt;p&gt;One reason knowing people is valuable is that it helps facilitate connection.
“Oh, I know &lt;code&gt;X&lt;&#x2F;code&gt; is in that industry, let me connect you.”
“The &lt;code&gt;Y&lt;&#x2F;code&gt; family has kids that line up with your kids age and go to &lt;code&gt;Z&lt;&#x2F;code&gt; Junior High, too.”
“Oh &lt;code&gt;A&lt;&#x2F;code&gt; used to live right around there, let’s ask them for advice.”
These types of serendipitous connections can build strong bonds and strengthen a community, but you can only make them if you know enough.&lt;&#x2F;p&gt;
&lt;p&gt;To that end, I think “intro cards” are an interesting idea.
Imagine that when you moved in somewhere, or went to a new neighborhood meeting or church event, or met with the other parents for your kid’s soccer team, you could get a small &lt;em&gt;physical&lt;&#x2F;em&gt; card of pertinent information about these new people you met.&lt;&#x2F;p&gt;
&lt;p&gt;In big social settings like that, where you’re meeting a lot of new people, it’s very easy (for me, anyway) to have forgotten the names of the people I &lt;em&gt;just&lt;&#x2F;em&gt; talked to.
Now, instead imagine that throughout the event, you were exchanging intro cards, something like the following.&lt;&#x2F;p&gt;
&lt;figure &gt;
  &lt;a href=&quot;.&amp;#x2F;bart.png&quot;&gt;
    &lt;img src=&quot;.&amp;#x2F;bart.png&quot; alt=&quot;An example intro card&quot; style=&quot;background-color: white;&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  &lt;figcaption&gt;
    An example intro card, 3&amp;quot;×5&amp;quot; sized.
  &lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;During the event, you could focus completely on the current conversations, knowing you already have some notes provided to you to recall the previous ones.&lt;&#x2F;p&gt;
&lt;p&gt;Is the concept so wild?
In Japan, there is a whole interesting culture around &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.japanlivingguide.com&#x2F;career&#x2F;business-etiquette&#x2F;japan-business-card-etiquette&#x2F;&quot;&gt;exchanging business cards&lt;&#x2F;a&gt;.
In the US, we rarely do so.
A small Japanese town recently went even further, making a whole &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.tokyoweekender.com&#x2F;entertainment&#x2F;middle-aged-man-trading-cards-go-viral-in-japan&#x2F;&quot;&gt;trading card game&lt;&#x2F;a&gt; for the middle-aged members of their town, connecting the youth to older generations in a heartwarming way.&lt;&#x2F;p&gt;
&lt;p&gt;Naturally, these intro cards might include personal information you probably wouldn’t put on the Internet, but might want to provide to people depending on the context.
So, of course, you should tune the content to the purpose.
You should also feel things out first, before you just go handing these to everyone.
For example, in the context of introducing yourself to neighbors, maybe it is something like Bart’s above.
If it’s meeting coworkers, maybe it highlights parts of the system you’re familiar with, or your favorite software or languages.
If it’s a hobby group, maybe it highlights more about your specific niche interests.&lt;&#x2F;p&gt;
&lt;p&gt;I’ve started trying this idea out in a few scenarios, to positive reception.
To make it easy, I just print these on 3“×5“ index cards at home rather than deal with producing actual cards.
An example Typst document for it is included below.&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;details open&gt;&lt;summary&gt;Source Code: Example Intro Card in &lt;a href=&quot;https:&#x2F;&#x2F;typst.app&#x2F;docs&#x2F;&quot;&gt;Typst&lt;&#x2F;a&gt;&lt;&#x2F;summary&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #CDD6F4; background-color: #1E1E2E;&quot;&gt;&lt;code data-lang=&quot;typst&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CBA6F7;&quot;&gt;#set&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt; text&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #EBA0AC;font-style: italic;&quot;&gt;font&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; &amp;quot;Berkeley Mono&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CBA6F7;&quot;&gt;#set&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt; text&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FAB387;&quot;&gt;9pt&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CBA6F7;&quot;&gt;#set&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt; par&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #EBA0AC;font-style: italic;&quot;&gt;leading&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FAB387;&quot;&gt; 0.35em&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CBA6F7;&quot;&gt;#set&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt; page&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #EBA0AC;font-style: italic;&quot;&gt;  width&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FAB387;&quot;&gt; 3in&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #EBA0AC;font-style: italic;&quot;&gt;  height&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FAB387;&quot;&gt; 5in&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #EBA0AC;font-style: italic;&quot;&gt;  margin&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FAB387;&quot;&gt; 0.25in&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;font-style: italic;&quot;&gt;  &#x2F;&#x2F; background: rect(width: 100%, height: 100%, stroke: 1pt + black),&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;font-style: italic;&quot;&gt;&#x2F;&#x2F; Placed here because these are reused to make links&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CBA6F7;&quot;&gt;#let&lt;&#x2F;span&gt;&lt;span&gt; telephone_number&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; &amp;quot;xxx-xxx-xxxx&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CBA6F7;&quot;&gt;#let&lt;&#x2F;span&gt;&lt;span&gt; email_address&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; &amp;quot;xxxx@example.com&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CBA6F7;&quot;&gt;#let&lt;&#x2F;span&gt;&lt;span&gt; website&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; &amp;quot;www.example.com&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;grid&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #EBA0AC;font-style: italic;&quot;&gt;  columns&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FAB387;&quot;&gt; 100%&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #EBA0AC;font-style: italic;&quot;&gt;  rows&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;: (&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FAB387;&quot;&gt;1%&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FAB387;&quot;&gt; 1%&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FAB387;&quot;&gt; 40%&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FAB387;&quot;&gt; 2%&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FAB387;&quot;&gt; 2%&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FAB387;&quot;&gt; 1fr&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;),&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #EBA0AC;font-style: italic;&quot;&gt;  gutter&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FAB387;&quot;&gt; 1.0mm&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  grid.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;cell&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;    text&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #EBA0AC;font-style: italic;&quot;&gt;size&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FAB387;&quot;&gt; 11pt&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #EBA0AC;font-style: italic;&quot;&gt; weight&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; &amp;quot;bold&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; &amp;quot;Bart Simpson&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;),&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #EBA0AC;font-style: italic;&quot;&gt;    align&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;: (&lt;&#x2F;span&gt;&lt;span&gt;left&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt; +&lt;&#x2F;span&gt;&lt;span&gt; horizon&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;),&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;  ),&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;  [],&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  grid.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;cell&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;    block&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #EBA0AC;font-style: italic;&quot;&gt;clip&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FAB387;&quot;&gt; true&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #EBA0AC;font-style: italic;&quot;&gt; radius&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FAB387;&quot;&gt; 3mm&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt; image&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;&amp;quot;bart.png&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;)),&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #EBA0AC;font-style: italic;&quot;&gt;    align&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;: (&lt;&#x2F;span&gt;&lt;span&gt;center&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt; +&lt;&#x2F;span&gt;&lt;span&gt; horizon&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;),&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;  ),&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;  [],&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  grid.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;hline&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #EBA0AC;font-style: italic;&quot;&gt;stroke&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;: (&lt;&#x2F;span&gt;&lt;span&gt;paint&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span&gt; gray&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span&gt; thickness&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FAB387;&quot;&gt; 0.75pt&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span&gt; cap&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; &amp;quot;round&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;),&lt;&#x2F;span&gt;&lt;span style=&quot;color: #EBA0AC;font-style: italic;&quot;&gt; y&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FAB387;&quot;&gt; 4&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;),&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;  [],&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;  grid&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #EBA0AC;font-style: italic;&quot;&gt;    columns&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;: (&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FAB387;&quot;&gt;20%&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FAB387;&quot;&gt; 1fr&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;),&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #EBA0AC;font-style: italic;&quot;&gt;    column-gutter&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FAB387;&quot;&gt; 2mm&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #EBA0AC;font-style: italic;&quot;&gt;    row-gutter&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FAB387;&quot;&gt; 2.20mm&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;font-style: italic;&quot;&gt;    &#x2F;&#x2F; stroke: 1pt + silver,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    grid.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;cell&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;([*&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F38BA8;font-weight: bold;&quot;&gt;age&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;*],&lt;&#x2F;span&gt;&lt;span style=&quot;color: #EBA0AC;font-style: italic;&quot;&gt; align&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span&gt; right&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;),&lt;&#x2F;span&gt;&lt;span&gt; grid.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;cell&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;      [&lt;&#x2F;span&gt;&lt;span&gt;Born in XXXX&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;],&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #EBA0AC;font-style: italic;&quot;&gt;      align&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span&gt; left&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;    ),&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    grid.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;cell&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;([*&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F38BA8;font-weight: bold;&quot;&gt;family&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;*],&lt;&#x2F;span&gt;&lt;span style=&quot;color: #EBA0AC;font-style: italic;&quot;&gt; align&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span&gt; right&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;),&lt;&#x2F;span&gt;&lt;span&gt; grid.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;cell&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;      [&lt;&#x2F;span&gt;&lt;span&gt;Spouse: Susan &lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;\&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        Children: Johnny (M, XXXX)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;],&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #EBA0AC;font-style: italic;&quot;&gt;      align&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span&gt; left&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;    ),&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    grid.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;cell&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;([*&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F38BA8;font-weight: bold;&quot;&gt;rel-to&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;*],&lt;&#x2F;span&gt;&lt;span style=&quot;color: #EBA0AC;font-style: italic;&quot;&gt; align&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span&gt; right&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;),&lt;&#x2F;span&gt;&lt;span&gt; grid.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;cell&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;      [&lt;&#x2F;span&gt;&lt;span&gt;Marge (mom), Homer (dad), Lisa (sis), Maggie (sis)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;],&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #EBA0AC;font-style: italic;&quot;&gt;      align&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span&gt; left&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;    ),&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    grid.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;cell&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;([*&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F38BA8;font-weight: bold;&quot;&gt;from&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;*],&lt;&#x2F;span&gt;&lt;span style=&quot;color: #EBA0AC;font-style: italic;&quot;&gt; align&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span&gt; right&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;),&lt;&#x2F;span&gt;&lt;span&gt; grid.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;cell&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;      [&lt;&#x2F;span&gt;&lt;span&gt;New York, NY (&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;--&lt;&#x2F;span&gt;&lt;span&gt;XXXX) &lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;\&lt;&#x2F;span&gt;&lt;span&gt; Chicago, IL (&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;--&lt;&#x2F;span&gt;&lt;span&gt;XXXX)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;],&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #EBA0AC;font-style: italic;&quot;&gt;      align&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span&gt; left&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;    ),&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    grid.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;cell&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;([*&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F38BA8;font-weight: bold;&quot;&gt;job&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;*],&lt;&#x2F;span&gt;&lt;span style=&quot;color: #EBA0AC;font-style: italic;&quot;&gt; align&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span&gt; right&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;),&lt;&#x2F;span&gt;&lt;span&gt; grid.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;cell&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;      [&lt;&#x2F;span&gt;&lt;span&gt;Manager at &lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;link&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;&amp;quot;https:&#x2F;&#x2F;www.example.com&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span&gt;[Example&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;]&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #EBA0AC;font-style: italic;&quot;&gt;      align&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span&gt; left&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;    ),&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    grid.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;cell&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;([*&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F38BA8;font-weight: bold;&quot;&gt;edu&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;*],&lt;&#x2F;span&gt;&lt;span style=&quot;color: #EBA0AC;font-style: italic;&quot;&gt; align&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span&gt; right&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;),&lt;&#x2F;span&gt;&lt;span&gt; grid.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;cell&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;      [&lt;&#x2F;span&gt;&lt;span&gt;NYU (BS in PR, &amp;#39;XX)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;],&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #EBA0AC;font-style: italic;&quot;&gt;      align&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span&gt; left&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;    ),&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    grid.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;cell&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;([*&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F38BA8;font-weight: bold;&quot;&gt;email&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;*],&lt;&#x2F;span&gt;&lt;span style=&quot;color: #EBA0AC;font-style: italic;&quot;&gt; align&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span&gt; right&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;),&lt;&#x2F;span&gt;&lt;span&gt; grid.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;cell&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;      link&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;&amp;quot;mailto:&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt; +&lt;&#x2F;span&gt;&lt;span&gt; email_address&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span&gt; email_address&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;),&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #EBA0AC;font-style: italic;&quot;&gt;      align&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span&gt; left&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;    ),&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    grid.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;cell&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;([*&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F38BA8;font-weight: bold;&quot;&gt;phone&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;*],&lt;&#x2F;span&gt;&lt;span style=&quot;color: #EBA0AC;font-style: italic;&quot;&gt; align&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span&gt; right&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;),&lt;&#x2F;span&gt;&lt;span&gt; grid.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;cell&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;      link&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;&amp;quot;tel:&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt; +&lt;&#x2F;span&gt;&lt;span&gt; telephone_number&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span&gt; telephone_number&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;),&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #EBA0AC;font-style: italic;&quot;&gt;      align&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span&gt; left&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;    ),&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    grid.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;cell&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;([*&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F38BA8;font-weight: bold;&quot;&gt;website&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;*],&lt;&#x2F;span&gt;&lt;span style=&quot;color: #EBA0AC;font-style: italic;&quot;&gt; align&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span&gt; right&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;),&lt;&#x2F;span&gt;&lt;span&gt; grid.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;cell&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;      link&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;&amp;quot;https:&#x2F;&#x2F;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt; +&lt;&#x2F;span&gt;&lt;span&gt; website&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span&gt; website&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;),&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #EBA0AC;font-style: italic;&quot;&gt;      align&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span&gt; left&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;    ),&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;    [],&lt;&#x2F;span&gt;&lt;span&gt; grid.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;cell&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #89B4FA;font-style: italic;&quot;&gt;      text&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #EBA0AC;font-style: italic;&quot;&gt;size&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FAB387;&quot;&gt; 5pt&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #EBA0AC;font-style: italic;&quot;&gt; style&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; &amp;quot;italic&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;)[&lt;&#x2F;span&gt;&lt;span&gt;v25.03&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;],&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;font-style: italic;&quot;&gt; &#x2F;&#x2F; calver&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #EBA0AC;font-style: italic;&quot;&gt;      align&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span&gt; right&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt; +&lt;&#x2F;span&gt;&lt;span&gt; top&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;    ),&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;  )&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;&#x2F;details&gt;
</content>
    </entry>
</feed>
