<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet href="https://spiss.dev/feed_style.xsl" type="text/xsl"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
    <tabi:metadata xmlns:tabi="https://github.com/welpo/tabi">
        <tabi:base_url>https:&#x2F;&#x2F;spiss.dev</tabi:base_url>
        <tabi:separator>
            •
        </tabi:separator>
        <tabi:about_feeds>This is a web feed, also known as an Atom feed. Subscribe by copying the URL from the address bar into your newsreader</tabi:about_feeds>
        <tabi:visit_the_site>Visit website</tabi:visit_the_site>
        <tabi:recent_posts>Recent posts</tabi:recent_posts>
        <tabi:last_updated_on>Updated on $DATE</tabi:last_updated_on>
        <tabi:default_theme></tabi:default_theme>
        <tabi:post_listing_date>date</tabi:post_listing_date>
        <tabi:current_section>spiss.dev</tabi:current_section>
    </tabi:metadata><link rel="extra-stylesheet" href="https://spiss.dev/skins/blue.css?h=a4dc1e94d3f5759784d2" /><title>spiss.dev</title>
        <subtitle>Lukas Spiss - personal page and blog.</subtitle>
    <link href="https://spiss.dev/atom.xml" rel="self" type="application/atom+xml"/>
    <link href="https://spiss.dev" rel="alternate" type="text/html"/>
    <generator uri="https://www.getzola.org/">Zola</generator><updated>2026-02-28T00:00:00+00:00</updated><id>https://spiss.dev/atom.xml</id><entry xml:lang="en">
        <title>Mike - Your Mic, Your Rules</title>
        <published>2026-02-28T00:00:00+00:00</published>
        <updated>2026-02-28T00:00:00+00:00</updated>
        <author>
            <name>spissable</name>
        </author>
        <link rel="alternate" href="https://spiss.dev/blog/mike/" type="text/html"/>
        <id>https://spiss.dev/blog/mike/</id>
        
            <content type="html">&lt;h3 id=&quot;the-problem&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#the-problem&quot; aria-label=&quot;Anchor link for: the-problem&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;a&gt;
The Problem&lt;&#x2F;h3&gt;
&lt;p&gt;While working from home is nice and all, there is one thing that has been driving me absolutely insane: macOS resetting my default microphone. Every. Single. Time.&lt;&#x2F;p&gt;
&lt;p&gt;Dock the laptop, and suddenly I&#x27;m on the built-in mic. Wake from sleep, built-in mic. Toggle the KVM switch, you guessed it. And it never happens &lt;em&gt;before&lt;&#x2F;em&gt; the meeting starts - it&#x27;s always mid-sentence, followed by the dreaded &quot;hey, you sound different, are you on your laptop mic?&quot;.&lt;&#x2F;p&gt;
&lt;img class=&quot;dimmable-image&quot; src=&quot;https:&amp;#x2F;&amp;#x2F;spiss.dev&amp;#x2F;blog&amp;#x2F;mike&amp;#x2F;screenshot.png?h=8ed4d3e52a1b10f81c05&quot; loading=&quot;lazy&quot; alt=&quot;Mike menu bar popover showing microphone priority list&quot; width=&quot;692&quot; height=&quot;462&quot; &#x2F;&gt;&lt;h3 id=&quot;the-solution&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#the-solution&quot; aria-label=&quot;Anchor link for: the-solution&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;a&gt;
The Solution&lt;&#x2F;h3&gt;
&lt;p&gt;After one too many of those moments, I figured I&#x27;d just build something to fix it. And so &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;spissable&#x2F;mike&quot;&gt;Mike&lt;&#x2F;a&gt; was born - a tiny macOS menu bar app that enforces a user-defined microphone priority list.&lt;&#x2F;p&gt;
&lt;p&gt;The idea is dead simple: you rank your mics in the order you prefer them, and Mike makes sure the highest-priority connected mic is always the system default. Plug in your good mic? Mike switches to it. Unplug it? Mike falls back to the next best option. macOS tries to override your choice after waking from sleep? Mike overrides it right back.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;how-it-works&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#how-it-works&quot; aria-label=&quot;Anchor link for: how-it-works&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;a&gt;
How It Works&lt;&#x2F;h3&gt;
&lt;p&gt;Mike sits quietly in your menu bar and listens for CoreAudio device changes. Whenever something changes - a device connects, disconnects, or macOS decides to mess with your default - Mike runs through your priority list and picks the best available mic. No polling, no timers, just event-driven reactions.&lt;&#x2F;p&gt;
&lt;p&gt;The whole thing is built with Swift and SwiftUI, targeting macOS 14+. Zero third-party dependencies. The CoreAudio interactions are behind a protocol, so the core logic is fully testable with mock hardware. The priority engine itself is a pure function - give it a list of preferred UIDs and a list of connected devices, and it tells you which one to use.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;install&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#install&quot; aria-label=&quot;Anchor link for: install&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;a&gt;
Install&lt;&#x2F;h3&gt;
&lt;pre data-lang=&quot;bash&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;brew&lt;&#x2F;span&gt;&lt;span&gt; install&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt; --cask&lt;&#x2F;span&gt;&lt;span&gt; spissable&#x2F;tap&#x2F;mike
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;That&#x27;s it. A cat icon (in honor of a neighborhood cat called Mike) appears in your menu bar, you can right-click to reorder your mics, and you never think about it again.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;closing-thoughts&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#closing-thoughts&quot; aria-label=&quot;Anchor link for: closing-thoughts&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;a&gt;
Closing Thoughts&lt;&#x2F;h3&gt;
&lt;p&gt;Truth be told, this is one of those projects where the problem is so small and specific that you question why this isn&#x27;t just built into MacOS already. But after using it for a while now, I can&#x27;t imagine going back. It&#x27;s one of those &quot;set it and forget it&quot; utilities that just quietly does its job.&lt;&#x2F;p&gt;
&lt;p&gt;The source code is on &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;spissable&#x2F;mike&quot;&gt;GitHub&lt;&#x2F;a&gt;. MIT licensed, enjoy.&lt;&#x2F;p&gt;
</content>
        <summary type="html">I built a tiny macOS menu bar app that keeps your preferred microphone active... finally.</summary>
        </entry><entry xml:lang="en">
        <title>One Year of Go</title>
        <published>2025-07-29T00:00:00+00:00</published>
        <updated>2025-07-29T00:00:00+00:00</updated>
        <author>
            <name>spissable</name>
        </author>
        <link rel="alternate" href="https://spiss.dev/blog/one-year-go/" type="text/html"/>
        <id>https://spiss.dev/blog/one-year-go/</id>
        
            <content type="html">&lt;h3 id=&quot;the-start&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#the-start&quot; aria-label=&quot;Anchor link for: the-start&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;a&gt;
The Start&lt;&#x2F;h3&gt;
&lt;p&gt;While I&#x27;m sure there are more qualified people out there to give recommendations and suggestions on how to best get started with Go,
there is one resource that I keep recommending to everyone: &lt;a href=&quot;https:&#x2F;&#x2F;100go.co&quot;&gt;100 Go Mistakes and How to Avoid Them
&lt;&#x2F;a&gt;.
I can&#x27;t overstate how positive an influence this book has been for me and how much of a head start it gave me. Take this from someone
who generally isn&#x27;t too keen on reading technical books.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;the-positives&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#the-positives&quot; aria-label=&quot;Anchor link for: the-positives&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;a&gt;
The Positives&lt;&#x2F;h3&gt;
&lt;p&gt;I&#x27;ll keep it quick and to the point—some of the things I&#x27;ve enjoyed about Go and its ecosystem over the past year:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Simplicity&lt;&#x2F;strong&gt;: Coming from Node.js&#x2F;TypeScript where one codebase can look completely upside-down compared to the next, Go repos just look all &lt;em&gt;the same&lt;&#x2F;em&gt;, relatively speaking.
There is usually one idiomatic way of doing things, and the standard library gets you mostly there. Bye bye JS framework flavor of the week.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Stability&lt;&#x2F;strong&gt;: I can barely remember the last time I had a Dependabot update and something actually broke. And when it did, it was a major version with relevant release notes. Go updates are
painless, given the promise of no breaking changes.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Improvements&lt;&#x2F;strong&gt;: After mentioning how stable something is, one could expect it comes at the expense of improvements being shipped. But it doesn&#x27;t feel like that&#x27;s the case. Shipped with &lt;a href=&quot;https:&#x2F;&#x2F;go.dev&#x2F;blog&#x2F;go1.24&quot;&gt;Go 1.24&lt;&#x2F;a&gt;,
there is now a great built-in way of dealing with tools, and with the upcoming 1.25 the &lt;a href=&quot;https:&#x2F;&#x2F;go.dev&#x2F;blog&#x2F;synctest&quot;&gt;synctest&lt;&#x2F;a&gt; feature is coming out of the &quot;experimental phase&quot;—just to mention a couple of awesome improvements.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;the-negatives&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#the-negatives&quot; aria-label=&quot;Anchor link for: the-negatives&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;a&gt;
The Negatives&lt;&#x2F;h3&gt;
&lt;p&gt;On the flip side, there are of course some negatives as well:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Zero Initialization&lt;&#x2F;strong&gt;: I&#x27;m sure some smart people have really good arguments about this. But so far I can&#x27;t wrap my head around why this is the way to go (pun intended).&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Mocking&lt;&#x2F;strong&gt;: Writing interfaces for the sole purpose of having a way of mocking them—using a 3rd party package. I don&#x27;t think I need to elaborate.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Rawness&lt;&#x2F;strong&gt;: Some things could just use a fresh coat of paint to make them a bit more user-friendly right out of the box. One thing that comes to mind specifically is the &lt;code&gt;go test&lt;&#x2F;code&gt; output. The raw out-of-the-box experience is just not good. Luckily there is the &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;gotestyourself&#x2F;gotestsum&quot;&gt;gotestsum&lt;&#x2F;a&gt; package.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;gophercon-eu-2025&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#gophercon-eu-2025&quot; aria-label=&quot;Anchor link for: gophercon-eu-2025&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;a&gt;
GopherCon EU 2025&lt;&#x2F;h3&gt;
&lt;p&gt;Finally, I also had the chance to visit GopherCon EU this year, and it&#x27;s an experience I can wholeheartedly recommend. Lots of interesting talks, passionate people, and all in all just great vibes.&lt;&#x2F;p&gt;
&lt;img class=&quot;dimmable-image&quot; src=&quot;https:&amp;#x2F;&amp;#x2F;spiss.dev&amp;#x2F;blog&amp;#x2F;one-year-go&amp;#x2F;img&amp;#x2F;gophercon.jpeg?h=f9db4c5d25a8bc0f8d85&quot; loading=&quot;lazy&quot; alt=&quot;Gopher Eating Microsoft Logo&quot; width=&quot;1024&quot; height=&quot;768&quot; &#x2F;&gt;</content>
        <summary type="html">A little over a year ago I started a new endeavour in a new backend role and a new programming language, Go. I figured I&#x27;d take the occasion now and have a little recap of the experience thus far.</summary>
        </entry><entry xml:lang="en">
        <title>My Tech Stack - 2025 Edition</title>
        <published>2025-02-09T00:00:00+00:00</published>
        <updated>2025-02-09T00:00:00+00:00</updated>
        <author>
            <name>spissable</name>
        </author>
        <link rel="alternate" href="https://spiss.dev/blog/techstack-2025/" type="text/html"/>
        <id>https://spiss.dev/blog/techstack-2025/</id>
        
            <content type="html">&lt;p&gt;&lt;img class=&quot;dimmable-image&quot; src=&quot;https:&amp;#x2F;&amp;#x2F;spiss.dev&amp;#x2F;desk.jpg?h=7afdb0246b8a42663dc3&quot; loading=&quot;lazy&quot; alt=&quot;Photo of desk with laptop and PC&quot; width=&quot;2090&quot; height=&quot;1504&quot; &#x2F;&gt;&lt;br&gt;&lt;&#x2F;p&gt;
&lt;h3 id=&quot;first-the-hardware&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#first-the-hardware&quot; aria-label=&quot;Anchor link for: first-the-hardware&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;a&gt;
First, the hardware&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;Work Laptop: 16&quot; Macbook Pro M1 Pro&lt;&#x2F;li&gt;
&lt;li&gt;Home PC: Custom mini-itx desktop running Fedora Silverblue&lt;&#x2F;li&gt;
&lt;li&gt;Keyboard: Nuphy Air75 V2&lt;&#x2F;li&gt;
&lt;li&gt;Mouse: Razer Pro Click Mini&lt;&#x2F;li&gt;
&lt;li&gt;Mic: Blue Yeti Nano&lt;&#x2F;li&gt;
&lt;li&gt;Webcam: Razer Kiyo Pro&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;second-the-software&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#second-the-software&quot; aria-label=&quot;Anchor link for: second-the-software&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;a&gt;
Second, the software&lt;&#x2F;h3&gt;
&lt;h4 id=&quot;amethyst&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#amethyst&quot; aria-label=&quot;Anchor link for: amethyst&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;a&gt;
&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;ianyh&#x2F;Amethyst&quot;&gt;Amethyst&lt;&#x2F;a&gt;&lt;&#x2F;h4&gt;
&lt;p&gt;This is probably my most essential piece of software. As you would assume from reading my &lt;a href=&quot;..&#x2F;i3wm&#x2F;&quot;&gt;i3wm&lt;&#x2F;a&gt; blogpost, having a decent tiling window manager is essential for me. This amazing piece of open-source software works perfectly well for me, emulating most things that I was already used to before using macOS.&lt;&#x2F;p&gt;
&lt;h4 id=&quot;vscode&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#vscode&quot; aria-label=&quot;Anchor link for: vscode&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;a&gt;
&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;microsoft&#x2F;vscode&quot;&gt;VSCode&lt;&#x2F;a&gt;&lt;&#x2F;h4&gt;
&lt;p&gt;This one is a bit of an odd one for me. I&#x27;ve been going back and forth between the Jetbrains IDEs and VSCode for many years at this point. While generally finding the Jetbrains experience more polished (e.g. running Go table test cases individually), at some point last year the debugger just &lt;a href=&quot;https:&#x2F;&#x2F;youtrack.jetbrains.com&#x2F;issue&#x2F;GO-17369&quot;&gt;stopped working altogether&lt;&#x2F;a&gt; with an update for me and my team, which made me switch over.&lt;&#x2F;p&gt;
&lt;h4 id=&quot;tableplus&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#tableplus&quot; aria-label=&quot;Anchor link for: tableplus&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;a&gt;
&lt;a href=&quot;https:&#x2F;&#x2F;tableplus.com&#x2F;&quot;&gt;TablePlus&lt;&#x2F;a&gt;&lt;&#x2F;h4&gt;
&lt;p&gt;As someone who browses databases almost every day and is a sucker for a simple, clean UI, TablePlus is the perfect database client for me. Aside from that, the absolute killer feature is the &quot;Safe-Mode&quot;, which, when enabled, asks for your password (the fingerprint sensor works on Mac as well) for every write operation.&lt;&#x2F;p&gt;
&lt;h4 id=&quot;podman&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#podman&quot; aria-label=&quot;Anchor link for: podman&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;a&gt;
&lt;a href=&quot;https:&#x2F;&#x2F;podman.io&#x2F;&quot;&gt;Podman&lt;&#x2F;a&gt;&lt;&#x2F;h4&gt;
&lt;p&gt;As this has become the default already on Fedora, I figured I could also give it a try on the Macbook. And well, it just works and it&#x27;s free. Nothing much else to add here to be honest.&lt;&#x2F;p&gt;
&lt;h4 id=&quot;firefox&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#firefox&quot; aria-label=&quot;Anchor link for: firefox&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;a&gt;
&lt;a href=&quot;https:&#x2F;&#x2F;www.mozilla.org&#x2F;en-US&#x2F;firefox&quot;&gt;Firefox&lt;&#x2F;a&gt;&lt;&#x2F;h4&gt;
&lt;p&gt;I have to admit, this is probably one of the pieces of software where I&#x27;ve become a bit old-school and resistant to change. I really don&#x27;t need much from my browser. Pinned tabs, bookmarks and a healthy dose of privacy. That being said, I do really like the UX of the &lt;a href=&quot;https:&#x2F;&#x2F;arc.net&#x2F;&quot;&gt;Arc Browser&lt;&#x2F;a&gt;, but the project seems to already have been abandoned by its creators. Perhaps the &lt;a href=&quot;https:&#x2F;&#x2F;zen-browser.app&#x2F;&quot;&gt;Zen Browser&lt;&#x2F;a&gt; will become the perfect mix of the two.&lt;&#x2F;p&gt;
&lt;h4 id=&quot;duck-goes-ai&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#duck-goes-ai&quot; aria-label=&quot;Anchor link for: duck-goes-ai&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;a&gt;
&lt;a href=&quot;https:&#x2F;&#x2F;duck.ai&quot;&gt;Duck Goes AI&lt;&#x2F;a&gt;&lt;&#x2F;h4&gt;
&lt;p&gt;While not being the hugest advocate of the AI&#x2F;LLM trend, I found the frontend of Duckduckgo to be great. No log-in requirement, a selection of different language models and the promise of some privacy are everything I really need at this point. I&#x27;m sure I&#x27;ll also use GitHub&#x27;s Copilot more and more as well, but since last year has been the year of learning Go for me, I figured it&#x27;s smarter to type your own code for a while until reaching a certain proficiency.&lt;&#x2F;p&gt;
&lt;h4 id=&quot;mos&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#mos&quot; aria-label=&quot;Anchor link for: mos&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;a&gt;
&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;Caldis&#x2F;Mos&quot;&gt;Mos&lt;&#x2F;a&gt;&lt;&#x2F;h4&gt;
&lt;p&gt;Last but not least, this little utility is a live saver for me. For whatever reason, you cannot have a different scroll direction for your trackpad and mouse in the macOS settings. Thanks to this tool, however, I have a peace of mind and don&#x27;t need to flip settings whenever switching to the mouse inputs.&lt;&#x2F;p&gt;
</content>
        <summary type="html">After writing already about some specific software choices, I thought it&#x27;s about time to look at the topic a bit from a broader spectrum.</summary>
        </entry><entry xml:lang="en">
        <title>Domain-Driven Design - A personal tale</title>
        <published>2024-09-20T00:00:00+00:00</published>
        <updated>2024-09-20T00:00:00+00:00</updated>
        <author>
            <name>spissable</name>
        </author>
        <link rel="alternate" href="https://spiss.dev/blog/ddd-tale/" type="text/html"/>
        <id>https://spiss.dev/blog/ddd-tale/</id>
        
            <content type="html">&lt;h3 id=&quot;a-little-bit-of-backstory&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#a-little-bit-of-backstory&quot; aria-label=&quot;Anchor link for: a-little-bit-of-backstory&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;a&gt;
A little bit of backstory&lt;&#x2F;h3&gt;
&lt;p&gt;I’m a very pragmatic and hands-on person, for the better and for the worse. It probably originates from many different things, genetics, experiences and definitely my upbringing in a rural place with a difficult access to the internet.&lt;&#x2F;p&gt;
&lt;p&gt;Instead of Googling why our first family computer was acting up yet again, it was a long and painful troubleshooting process. Studying technical books always felt less appealing than simply hacking away on a hobby project, doing internships or quitting university and starting to work full-time.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;learning-on-the-job&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#learning-on-the-job&quot; aria-label=&quot;Anchor link for: learning-on-the-job&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;a&gt;
Learning on the job&lt;&#x2F;h3&gt;
&lt;p&gt;Learning on the job has been an amazing journey. Not only from a technical perspective, but I’ve also become an absolute sucker for domain knowledge.&lt;&#x2F;p&gt;
&lt;p&gt;Every time I started a new job, I found myself in a completely new domain. From smart home appliances, to waste logistics and finally the football industry. And if there is one thing that’s certain, it’s that I love sponging up all of this knowledge and putting it to good use.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;hello-ddd&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#hello-ddd&quot; aria-label=&quot;Anchor link for: hello-ddd&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;a&gt;
Hello DDD&lt;&#x2F;h3&gt;
&lt;p&gt;My first introduction to DDD was an interesting one. At the time, I was definitely one of the domain experts within the company relatively speaking, when a new colleague arrived.&lt;&#x2F;p&gt;
&lt;p&gt;Right from the beginning they had big plans. CQRS here, bounded context there… my head was spinning, but I was intrigued and asked question after question. Just to become more and more skeptical. Even the simplest things seemed to become so unnecessarily complicated.&lt;&#x2F;p&gt;
&lt;p&gt;So I blamed myself. Clearly, this person has more experience than me and is much more educated. I just don’t understand these concepts... yet.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;learning-ddd&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#learning-ddd&quot; aria-label=&quot;Anchor link for: learning-ddd&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;a&gt;
Learning DDD&lt;&#x2F;h3&gt;
&lt;p&gt;To combat my shortcomings, I decided to finally grab a book about DDD. Specifically I chose &lt;a href=&quot;https:&#x2F;&#x2F;www.oreilly.com&#x2F;library&#x2F;view&#x2F;learning-domain-driven-design&#x2F;9781098100124&#x2F;&quot;&gt;Learning Domain-Driven Design&lt;&#x2F;a&gt; whose reviews seemed to resonate much better with me, compared to “the blue book” and others. And boy oh boy did it resonate with me.&lt;&#x2F;p&gt;
&lt;p&gt;Instead of preaching a specific solution, the book, or rather its author Vlad, does an amazing job explaining how to make good decisions for yourself. How to choose a good solution out of different potential ones, depending on various heuristics and other factors. He doesn’t just say “it depends”, which is just an empty statement. But rather he explains on what it depends.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;closing-thoughts&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#closing-thoughts&quot; aria-label=&quot;Anchor link for: closing-thoughts&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;a&gt;
Closing thoughts&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;Having all the technical knowledge in the world, isn’t enough to make great decisions.&lt;&#x2F;li&gt;
&lt;li&gt;Having all the domain knowledge isn’t enough to make great decisions.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;A sophisticated solution for a simple problem can be just as bad as a naive solution for a complex problem. At the end of the day, what matters is having great collaboration and being open minded.&lt;&#x2F;p&gt;
&lt;p&gt;And if you’re an expert in everything, you should probably look for a new challenge ;)&lt;&#x2F;p&gt;
</content>
        <summary type="html">This is not yet another blog post about what DDD is and how to implement it, but rather a personal tale of my early struggles and finally making peace with it.</summary>
        </entry><entry xml:lang="en">
        <title>Go Snake - Having a little fun</title>
        <published>2024-05-04T00:00:00+00:00</published>
        <updated>2024-05-04T00:00:00+00:00</updated>
        <author>
            <name>spissable</name>
        </author>
        <link rel="alternate" href="https://spiss.dev/blog/go-snake/" type="text/html"/>
        <id>https://spiss.dev/blog/go-snake/</id>
        
            <content type="html">&lt;h2 id=&quot;the-game&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#the-game&quot; aria-label=&quot;Anchor link for: the-game&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;a&gt;
The Game&lt;&#x2F;h2&gt;
&lt;p&gt;The game is a super simplistic version of the good ol&#x27; snake, written with the Go game engine &lt;a href=&quot;https:&#x2F;&#x2F;ebitengine.org&quot;&gt;Ebitengine&lt;&#x2F;a&gt; and compiled to WebAssembly, so you can enjoy it in its full glory right from this blog post.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;some-hot-keys&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#some-hot-keys&quot; aria-label=&quot;Anchor link for: some-hot-keys&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;a&gt;
Some hot-keys:&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;Arrow keys&amp;gt;&lt;&#x2F;code&gt; - Navigate the snake&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;Esc&amp;gt;&lt;&#x2F;code&gt; - Pause the game&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;r&amp;gt;&lt;&#x2F;code&gt; - Restart the game&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;w&amp;gt;&lt;&#x2F;code&gt; - Toggle walls on&#x2F;off (only if you have 0 points)&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;P.S. You have to first click on the visible game area for the input keys to work.&lt;&#x2F;p&gt;
&lt;div class=&quot;go-snake&quot;&gt;
    &lt;iframe
        src=&quot;https:&amp;#x2F;&amp;#x2F;snake.spiss.dev&quot;&gt;
    &lt;&#x2F;iframe&gt;
&lt;&#x2F;div&gt;
&lt;h3 id=&quot;conclusion&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#conclusion&quot; aria-label=&quot;Anchor link for: conclusion&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;a&gt;
Conclusion&lt;&#x2F;h3&gt;
&lt;p&gt;It&#x27;s really nothing fancy, but as someone who primarily learns by doing, it&#x27;s a cool little project to hack on and get familiar with some Go concepts. Feels almost like high school again when I was first introduced to Java and programming in general and I started emulating some tiny games.&lt;&#x2F;p&gt;
</content>
        <summary type="html">Recently I started learning Go, due to a little career switch. What better way to get the ball rolling than playing around with a little Go game engine.</summary>
        </entry><entry xml:lang="en">
        <title>Fish Shell - 90s shell for a 90s kid</title>
        <published>2023-11-18T00:00:00+00:00</published>
        <updated>2023-11-18T00:00:00+00:00</updated>
        <author>
            <name>spissable</name>
        </author>
        <link rel="alternate" href="https://spiss.dev/blog/fish-shell/" type="text/html"/>
        <id>https://spiss.dev/blog/fish-shell/</id>
        
            <content type="html">&lt;h3 id=&quot;backstory&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#backstory&quot; aria-label=&quot;Anchor link for: backstory&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;a&gt;
Backstory&lt;&#x2F;h3&gt;
&lt;p&gt;Many years ago, in the early days of my professional career, I remember looking over my on-boarding buddy&#x27;s shoulders. What caught my eye was his terminal, which looked far different from the standard terminal running pure bash. This is how I got introduced to &lt;em&gt;zsh&lt;&#x2F;em&gt; and &lt;em&gt;ohmyzsh&lt;&#x2F;em&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Many config changes and installed plugins later, I was delighted with my shiny-looking terminal. However, as a chronic distro-hopper, I already started looking for other tools that I haven&#x27;t heard about.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;fish&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#fish&quot; aria-label=&quot;Anchor link for: fish&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;a&gt;
Fish&lt;&#x2F;h3&gt;
&lt;p&gt;Soon I came across fish. I have to admit, I wasn&#x27;t impressed by the website, but I was more than happy to look past that. And for the better.
The main thing that struck me was the out-of-the-box experience. I had everything I ever wanted and more, without a single config change, or a single plugin. Some of these are:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Case insensitive auto-complete&lt;&#x2F;li&gt;
&lt;li&gt;Git integration&lt;&#x2F;li&gt;
&lt;li&gt;Responsiveness&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;The only real config changes that I eventually made were un-setting the greeting message:&lt;&#x2F;p&gt;
&lt;pre style=&quot;background-color:#2b303b;color:#c0c5ce;&quot;&gt;&lt;code&gt;&lt;span&gt;set fish_greeting
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;and adding a bunch of folders to the path:&lt;&#x2F;p&gt;
&lt;pre style=&quot;background-color:#2b303b;color:#c0c5ce;&quot;&gt;&lt;code&gt;&lt;span&gt;set -gx PATH &amp;quot;$HOME&#x2F;.cargo&#x2F;bin&amp;quot; $PATH
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h3 id=&quot;a-long-boring-time-later&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#a-long-boring-time-later&quot; aria-label=&quot;Anchor link for: a-long-boring-time-later&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;a&gt;
A long boring time later&lt;&#x2F;h3&gt;
&lt;p&gt;And here I am now, in 2023, still completely happy with my fish shell experience. I guess it&#x27;s just the right amount of features and old-school
familiarity that has kept me happy for so long. Or perhaps I&#x27;m just getting old 😅.&lt;&#x2F;p&gt;
&lt;p&gt;That being said, I&#x27;m sure there are new shiny things on the horizon (like &lt;a href=&quot;https:&#x2F;&#x2F;www.warp.dev&quot;&gt;Warp&lt;&#x2F;a&gt;) that I&#x27;ll give a try, especially now in the times of generative AI.&lt;&#x2F;p&gt;
</content>
        <summary type="html">Years ago I installed the fish shell and simply stuck with it, without ever really thinking about it much again. Maybe it&#x27;s time to finally reflect on why.</summary>
        </entry><entry xml:lang="en">
        <title>Jest Memory Leaks - some lessons learnt</title>
        <published>2022-05-03T00:00:00+00:00</published>
        <updated>2023-11-18T00:00:00+00:00</updated>
        <author>
            <name>spissable</name>
        </author>
        <link rel="alternate" href="https://spiss.dev/blog/jestmemoryleak/" type="text/html"/>
        <id>https://spiss.dev/blog/jestmemoryleak/</id>
        
            <content type="html">&lt;h3 id=&quot;project-infos&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#project-infos&quot; aria-label=&quot;Anchor link for: project-infos&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;a&gt;
Project Infos&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;Nest.JS v8&lt;&#x2F;li&gt;
&lt;li&gt;Node.JS v14&lt;&#x2F;li&gt;
&lt;li&gt;~800 unit tests using Jest&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;the-build-up&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#the-build-up&quot; aria-label=&quot;Anchor link for: the-build-up&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;a&gt;
The Build Up&lt;&#x2F;h3&gt;
&lt;p&gt;Every once in a while, the GitHub Actions pipeline would run out of memory during a test run. This is what it looked like:&lt;&#x2F;p&gt;
&lt;pre style=&quot;background-color:#2b303b;color:#c0c5ce;&quot;&gt;&lt;code&gt;&lt;span&gt;&amp;lt;--- JS stacktrace ---&amp;gt;
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;FATAL ERROR: Reached heap limit Allocation failed - JavaScript heap out of memory
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;While it didn&#x27;t happen consistently, it was still becoming annoying enough. To make matters worse, a Node.JS update to v16 seemed to make the problem unbearable. Time to investigate 🕵🏽‍♂️.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;node-v16&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#node-v16&quot; aria-label=&quot;Anchor link for: node-v16&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;a&gt;
Node v16&lt;&#x2F;h3&gt;
&lt;p&gt;There seems to be a &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;facebook&#x2F;jest&#x2F;issues&#x2F;11956&quot;&gt;bug&lt;&#x2F;a&gt;, introduced with Node v16.11, causing memory leaks with Jest. While this bug is certainly putting my Node 16 update to a halt until it&#x27;s resolved, the mentioned Github issue also gives quite some insight on how to debug these kinds of issues. Back to Node 14 🔙.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;early-suspicions&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#early-suspicions&quot; aria-label=&quot;Anchor link for: early-suspicions&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;a&gt;
Early Suspicions&lt;&#x2F;h3&gt;
&lt;p&gt;Some early ideas about what could be causing the issues were:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;A bad jest&#x2F;ts-jest&#x2F;... package update&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;www.npmjs.com&#x2F;package&#x2F;jest-ts-auto-mock&quot;&gt;Jest-ts-auto-mock&lt;&#x2F;a&gt; as this is messing with the transformer&lt;&#x2F;li&gt;
&lt;li&gt;The &lt;code&gt;setupFilesBeforeEnv&lt;&#x2F;code&gt; which I had added recently&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;In order to verify any assumptions and changes made, the following command was used to see if any memory was leaking:&lt;&#x2F;p&gt;
&lt;p&gt;&lt;code&gt;node --expose-gc .&#x2F;node_modules&#x2F;.bin&#x2F;jest --runInBand --logHeapUsage&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;h3 id=&quot;going-back-in-time&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#going-back-in-time&quot; aria-label=&quot;Anchor link for: going-back-in-time&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;a&gt;
Going Back in Time&lt;&#x2F;h3&gt;
&lt;p&gt;In order to see if the problem has been happening for a while, just at a smaller scale, I went back to a commit some months ago and ran the above command. Turns out, back then everything was looking fine!&lt;&#x2F;p&gt;
&lt;p&gt;With that knowledge, I proceeded to test whether package updates are responsible for what&#x27;s happening, but no luck there.&lt;&#x2F;p&gt;
&lt;p&gt;I figured I should try and pinpoint the exact commit where the problem started, but with the normal memory fluctuation, it was impossible to spot. To make matters even worse, there seems to be a different &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;facebook&#x2F;jest&#x2F;issues&#x2F;12142&quot;&gt;memory issue&lt;&#x2F;a&gt; when using the &lt;code&gt;--runInBand&lt;&#x2F;code&gt; flag.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;detectleaks-flag-to-the-rescue&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#detectleaks-flag-to-the-rescue&quot; aria-label=&quot;Anchor link for: detectleaks-flag-to-the-rescue&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;a&gt;
detectLeaks Flag to the Rescue&lt;&#x2F;h3&gt;
&lt;p&gt;Thankfully there is yet another flag called &lt;code&gt;--detectLeaks&lt;&#x2F;code&gt; which will force the garbage collection and fail the test suite if it detects any memory leak.&lt;&#x2F;p&gt;
&lt;p&gt;The updated command: &lt;code&gt;node --expose-gc .&#x2F;node_modules&#x2F;.bin&#x2F;jest --detectLeaks&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Going back to the same &quot;suspected-memory-leak-free-commit&quot;, this command proved exactly that. Jumping around commits &quot;bisection&quot; style, while running the leak detection every time, very quickly gave me the exact commit which turned every test suite red.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;setupfilesafterenv-nock&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#setupfilesafterenv-nock&quot; aria-label=&quot;Anchor link for: setupfilesafterenv-nock&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;a&gt;
setupFilesAfterEnv + nock&lt;&#x2F;h3&gt;
&lt;p&gt;Turns out, the issue was the following jest setup file which I introduced to globally disable any external HTTP requests in tests:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;typescript&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-typescript &quot;&gt;&lt;code class=&quot;language-typescript&quot; data-lang=&quot;typescript&quot;&gt;&lt;span style=&quot;color:#65737e;&quot;&gt;&#x2F;&#x2F; jest.setup.ts
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;import &lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;* &lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;as &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;nock &lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;from &lt;&#x2F;span&gt;&lt;span&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;nock&lt;&#x2F;span&gt;&lt;span&gt;&amp;#39;;
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;nock&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#8fa1b3;&quot;&gt;disableNetConnect&lt;&#x2F;span&gt;&lt;span&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;nock&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#8fa1b3;&quot;&gt;enableNetConnect&lt;&#x2F;span&gt;&lt;span&gt;(&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;127.0.0.1&lt;&#x2F;span&gt;&lt;span&gt;&amp;#39;)
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;There is a section in the &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;nock&#x2F;nock#memory-issues-with-jest&quot;&gt;nock README&lt;&#x2F;a&gt; that describes that exact issue. There is also some more context linked there.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;key-lessons-learnt&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#key-lessons-learnt&quot; aria-label=&quot;Anchor link for: key-lessons-learnt&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;a&gt;
Key lessons learnt&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;RTFM&lt;&#x2F;li&gt;
&lt;li&gt;Run tests with &lt;code&gt;--detectLeaks&lt;&#x2F;code&gt; flag, perhaps even in the CI to detect issues right away, instead of facing 5 different issues at the same time once it all bubbles up.&lt;&#x2F;li&gt;
&lt;li&gt;Try out newer transformers such as swc&#x2F;jest or esbuild&#x2F;jest for new projects.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</content>
        <summary type="html">Recently I was facing some memory leaks in the test suits of one of my projects. As I spent a couple of days analyzing the issue and finally fixing it, I wanted to summarize the lessons learnt.</summary>
        </entry><entry xml:lang="en">
        <title>Code-Server - taking the home office to the outside</title>
        <published>2021-08-20T00:00:00+00:00</published>
        <updated>2023-11-18T00:00:00+00:00</updated>
        <author>
            <name>spissable</name>
        </author>
        <link rel="alternate" href="https://spiss.dev/blog/codeserver/" type="text/html"/>
        <id>https://spiss.dev/blog/codeserver/</id>
        
            <content type="html">&lt;h3 id=&quot;the-challenge&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#the-challenge&quot; aria-label=&quot;Anchor link for: the-challenge&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;a&gt;
The Challenge&lt;&#x2F;h3&gt;
&lt;p&gt;While iPads got the shiny new M1 processor and therefore loads of processing power, the coding experience is still pretty much nonexistent, due to the software limitations of iPadOS.
And that&#x27;s where &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;cdr&#x2F;code-server&quot;&gt;code-server&lt;&#x2F;a&gt; comes into play:&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;Run VS Code on any machine anywhere and access it in the browser.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;Sounds perfect for my use case!&lt;&#x2F;p&gt;
&lt;p&gt;Below are some of the key steps I had to take to make it all work. However, this is not a detailed step-by-step guide.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;setting-up-code-server&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#setting-up-code-server&quot; aria-label=&quot;Anchor link for: setting-up-code-server&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;a&gt;
Setting up Code-Server&lt;&#x2F;h3&gt;
&lt;p&gt;The code-server is available via the AUR for Arch Linux users at &lt;a href=&quot;https:&#x2F;&#x2F;aur.archlinux.org&#x2F;packages&#x2F;code-server&#x2F;&quot;&gt;AUR link&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Once installed, the actual setup is pretty easy.&lt;&#x2F;p&gt;
&lt;pre style=&quot;background-color:#2b303b;color:#c0c5ce;&quot;&gt;&lt;code&gt;&lt;span&gt;$ cat ~&#x2F;.config&#x2F;code-server&#x2F;config.yaml
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;bind-addr: 0.0.0.0:1897
&lt;&#x2F;span&gt;&lt;span&gt;auth: password
&lt;&#x2F;span&gt;&lt;span&gt;password: XXXXXXXXXX
&lt;&#x2F;span&gt;&lt;span&gt;cert: false
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;pre style=&quot;background-color:#2b303b;color:#c0c5ce;&quot;&gt;&lt;code&gt;&lt;span&gt;$ sudo systemctl edit --full code-server@USER
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;...
&lt;&#x2F;span&gt;&lt;span&gt;ExecStart=&#x2F;usr&#x2F;bin&#x2F;code-server --proxy-domain *.XXXXXXXXXX.spiss.dev
&lt;&#x2F;span&gt;&lt;span&gt;...
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h3 id=&quot;setting-up-caddy&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#setting-up-caddy&quot; aria-label=&quot;Anchor link for: setting-up-caddy&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;a&gt;
Setting up Caddy&lt;&#x2F;h3&gt;
&lt;p&gt;As the code-server docs suggest, I decided to go for Caddy as my reverse proxy. This made the next part of the set-up pretty easy as well.
The only sort of annoying part was that I couldn&#x27;t use the caddy package from the Arch repo, but I had to compile it from source together with the Route 53 plugin, which I use to manage my domain. See the GitHub Repo for more details: &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;caddy-dns&#x2F;route53&quot;&gt;GitHub link&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Once installed, I added this config file:&lt;&#x2F;p&gt;
&lt;pre style=&quot;background-color:#2b303b;color:#c0c5ce;&quot;&gt;&lt;code&gt;&lt;span&gt;$ cat &#x2F;etc&#x2F;caddy&#x2F;Caddyfile
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;XXXXXXXXXX.spiss.dev *.XXXXXXXXXX.spiss.dev {
&lt;&#x2F;span&gt;&lt;span&gt;  tls {
&lt;&#x2F;span&gt;&lt;span&gt;    dns route53 {
&lt;&#x2F;span&gt;&lt;span&gt;      max_retries 10
&lt;&#x2F;span&gt;&lt;span&gt;    }
&lt;&#x2F;span&gt;&lt;span&gt;  }
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;  reverse_proxy 127.0.0.1:1897
&lt;&#x2F;span&gt;&lt;span&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;In order for Caddy to obtain a &lt;strong&gt;wildcard&lt;&#x2F;strong&gt; SSL certificate, I had to add a user who is allowed to manage my Route 53. See the GitHub repo for more details: &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;libdns&#x2F;route53&quot;&gt;GitHub link&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;pre style=&quot;background-color:#2b303b;color:#c0c5ce;&quot;&gt;&lt;code&gt;&lt;span&gt;$ sudo systemctl edit --full caddy.service
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;...
&lt;&#x2F;span&gt;&lt;span&gt;[Service]
&lt;&#x2F;span&gt;&lt;span&gt;Environment=AWS_ACCESS_KEY_ID=XXXXXXXXXX
&lt;&#x2F;span&gt;&lt;span&gt;Environment=AWS_SECRET_ACCESS_KEY=XXXXXXXXXX
&lt;&#x2F;span&gt;&lt;span&gt;...
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h3 id=&quot;setting-up-the-router&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#setting-up-the-router&quot; aria-label=&quot;Anchor link for: setting-up-the-router&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;a&gt;
Setting up the Router&lt;&#x2F;h3&gt;
&lt;p&gt;Almost done, phew. After starting all the necessary systemd services, this should be the first time a beautiful VS Code window is accessible on the iPad, but only on the same network.
Because I wanted to go outside my WI-FI range, I still had to open the 443 port on my router. Kinda scary, but code-server got us covered by blocking too many wrong password attempts. Since this is very router-dependent, I&#x27;ll let you figure that one out. It&#x27;s probably a good time to configure a firewall on your PC as well.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;dyndns&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#dyndns&quot; aria-label=&quot;Anchor link for: dyndns&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;a&gt;
DynDNS&lt;&#x2F;h3&gt;
&lt;p&gt;Everything is working now, and if you have a static IP, you&#x27;re done. Since my ISP doesn&#x27;t give me one, I still had to configure some kind of DynDNS service to keep my IP address up-to-date in Route 53.
To achieve this, I configured yet another systemd service: &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;famzah&#x2F;aws-dyndns&quot;&gt;GitHub link&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;h3 id=&quot;et-voila&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#et-voila&quot; aria-label=&quot;Anchor link for: et-voila&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;a&gt;
Et Voilà&lt;&#x2F;h3&gt;
&lt;p&gt;Using the power of my desktop PC right from the browser, including forwarding of locally hosted web services. In fact, I wrote this whole blog post on my iPad via code-server on my PC. The locally running &lt;code&gt;0.0.0.0:1111&lt;&#x2F;code&gt; Zola site was automatically served via &lt;code&gt;1111.XXXXXXXXXX.spiss.dev&lt;&#x2F;code&gt; behind the same password protection.
And nowadays, I even find myself connecting to the code-server from my Dell XPS 13, as the Desktop PC is just way more powerful, especially when compiling large Rust projects ;)&lt;&#x2F;p&gt;
&lt;div class=&quot;full-width&quot;&gt;
    &lt;img src=&quot;https:&amp;#x2F;&amp;#x2F;spiss.dev&amp;#x2F;blog&amp;#x2F;codeserver&amp;#x2F;img&amp;#x2F;codeserver.png?h=d47ffaf1ffa24414f3ba&quot; alt=&quot;VS Code on iPad&quot; width=&quot;1600&quot; height=&quot;2133&quot; loading=&quot;lazy&quot;&#x2F;&gt;
&lt;&#x2F;div&gt;
</content>
        <summary type="html">While working from home is nice and all, I wanted to level up my home office experience to allow me to work from basically anywhere, without having too many compromises. And because using my Dell XPS 13 would have been too easy of a choice, I challenged myself to use an iPad instead.</summary>
        </entry><entry xml:lang="en">
        <title>Arch Linux - it&#x27;s really not that complicated</title>
        <published>2020-07-23T00:00:00+00:00</published>
        <updated>2023-11-18T00:00:00+00:00</updated>
        <author>
            <name>spissable</name>
        </author>
        <link rel="alternate" href="https://spiss.dev/blog/arch-linux/" type="text/html"/>
        <id>https://spiss.dev/blog/arch-linux/</id>
        
            <content type="html">&lt;h3 id=&quot;overview&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#overview&quot; aria-label=&quot;Anchor link for: overview&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;a&gt;
Overview&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;2 partitions: boot (fat32), root (f2fs - encrypted)&lt;&#x2F;li&gt;
&lt;li&gt;Bootloader: Systemd-boot (formerly gummiboot)&lt;&#x2F;li&gt;
&lt;li&gt;Desktop Environment: Gnome&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Please also consult the official &lt;a href=&quot;https:&#x2F;&#x2F;wiki.archlinux.org&#x2F;index.php&#x2F;Installation_Guide&quot;&gt;Arch Linux Documentation&lt;&#x2F;a&gt;.
The step-by-step instructions can also be found on my &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;Spissable&#x2F;arch-linux-installation&quot;&gt;Github&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;enter-bios-with-f2-and-configure&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#enter-bios-with-f2-and-configure&quot; aria-label=&quot;Anchor link for: enter-bios-with-f2-and-configure&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;a&gt;
Enter BIOS with F2 and configure:&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;&quot;System Configuration&quot; &amp;gt; &quot;SATA Operation&quot;: &quot;AHCI&quot;&lt;&#x2F;li&gt;
&lt;li&gt;&quot;Secure Boot&quot; &amp;gt; &quot;Secure Boot Enable&quot;: &quot;Disabled&quot;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;boot-from-usb&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#boot-from-usb&quot; aria-label=&quot;Anchor link for: boot-from-usb&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;a&gt;
Boot from USB&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;strong&gt;Make sure to boot from USB using UEFI - this is required by systemd-boot!&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;h3 id=&quot;set-the-desired-keymap&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#set-the-desired-keymap&quot; aria-label=&quot;Anchor link for: set-the-desired-keymap&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;a&gt;
Set the desired keymap&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;code&gt;loadkeys en_US-utf8&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;h3 id=&quot;optional-connect-to-wifi&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#optional-connect-to-wifi&quot; aria-label=&quot;Anchor link for: optional-connect-to-wifi&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;a&gt;
(Optional) Connect to wifi&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;code&gt;wifi-menu&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Once done it can take some seconds - confirm it worked using &lt;em&gt;ping&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;code&gt;ping 1.1.1.1&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;h3 id=&quot;sync-clock&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#sync-clock&quot; aria-label=&quot;Anchor link for: sync-clock&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;a&gt;
Sync clock&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;code&gt;timedatectl set-ntp true&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;h3 id=&quot;create-two-partitions&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#create-two-partitions&quot; aria-label=&quot;Anchor link for: create-two-partitions&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;a&gt;
Create two partitions:&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;1000MB EFI partition with hex code &lt;strong&gt;ef00&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
&lt;li&gt;100% Linux partition (to be encrypted) with hex code &lt;strong&gt;8300&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;&lt;strong&gt;CAUTION&lt;&#x2F;strong&gt; Find the correct disk&#x2F;partition names for yourself using &lt;code&gt;lsblk&lt;&#x2F;code&gt;. From here on I am using mine as an example. Do not blindly copy and paste these, it might not work or you might destroy partitions you don&#x27;t want to destroy.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;code&gt;cgdisk &#x2F;dev&#x2F;nvme0n1&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;h3 id=&quot;optional-install-f2fs-tools&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#optional-install-f2fs-tools&quot; aria-label=&quot;Anchor link for: optional-install-f2fs-tools&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;a&gt;
(Optional) Install f2fs-tools&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;code&gt;pacman -S f2fs-tools&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;h3 id=&quot;formatting-and-encryption&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#formatting-and-encryption&quot; aria-label=&quot;Anchor link for: formatting-and-encryption&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;a&gt;
Formatting and encryption&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;strong&gt;Boot&lt;&#x2F;strong&gt; partition&lt;&#x2F;p&gt;
&lt;p&gt;&lt;code&gt;mkfs.fat -F32 &#x2F;dev&#x2F;nvme0n1p1&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Root&lt;&#x2F;strong&gt; partition&lt;&#x2F;p&gt;
&lt;p&gt;&lt;code&gt;cryptsetup luksFormat --type=luks2 &#x2F;dev&#x2F;nvme0n1p2&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;code&gt;cryptsetup open &#x2F;dev&#x2F;nvme0n1p2 luks&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;(choose filesystem - assuming f2fs)&lt;&#x2F;p&gt;
&lt;p&gt;&lt;code&gt;mkfs.f2fs -l luks &#x2F;dev&#x2F;mapper&#x2F;luks&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;h3 id=&quot;mount-root-and-boot-partition&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#mount-root-and-boot-partition&quot; aria-label=&quot;Anchor link for: mount-root-and-boot-partition&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;a&gt;
Mount root and boot partition&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;code&gt;mount &#x2F;dev&#x2F;mapper&#x2F;luks &#x2F;mnt&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;code&gt;mkdir -p &#x2F;mnt&#x2F;boot&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;code&gt;mount &#x2F;dev&#x2F;nvme0n1p1 &#x2F;mnt&#x2F;boot&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;h3 id=&quot;change-pacman-mirror-priority-move-the-closer-mirrors-to-the-top&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#change-pacman-mirror-priority-move-the-closer-mirrors-to-the-top&quot; aria-label=&quot;Anchor link for: change-pacman-mirror-priority-move-the-closer-mirrors-to-the-top&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;a&gt;
Change Pacman mirror priority, move the closer mirrors to the top&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;code&gt;vim &#x2F;etc&#x2F;pacman.d&#x2F;mirrorlist&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;h3 id=&quot;install-the-base-system-plus-a-few-extra-packages&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#install-the-base-system-plus-a-few-extra-packages&quot; aria-label=&quot;Anchor link for: install-the-base-system-plus-a-few-extra-packages&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;a&gt;
Install the base system plus a few extra packages&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;strong&gt;f2fs-tools is needed if you chose f2fs as your partition&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;With some recent XPS Laptops linux-zen seems to be working better, e.g. resolves screen flickering issues&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;pre style=&quot;background-color:#2b303b;color:#c0c5ce;&quot;&gt;&lt;code&gt;&lt;span&gt;pacstrap &#x2F;mnt base linux linux-firmware zsh vim git sudo efibootmgr wpa_supplicant
&lt;&#x2F;span&gt;&lt;span&gt;dialog iw f2fs-tools
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h3 id=&quot;generate-fstab&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#generate-fstab&quot; aria-label=&quot;Anchor link for: generate-fstab&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;a&gt;
Generate fstab&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;code&gt;genfstab -L &#x2F;mnt &amp;gt;&amp;gt; &#x2F;mnt&#x2F;etc&#x2F;fstab&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;h3 id=&quot;enter-the-new-system&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#enter-the-new-system&quot; aria-label=&quot;Anchor link for: enter-the-new-system&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;a&gt;
Enter the new system&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;code&gt;arch-chroot &#x2F;mnt&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;h3 id=&quot;setup-time&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#setup-time&quot; aria-label=&quot;Anchor link for: setup-time&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;a&gt;
Setup time&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;code&gt;rm &#x2F;etc&#x2F;localtime&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;code&gt;ln -s &#x2F;usr&#x2F;share&#x2F;zoneinfo&#x2F;Europe&#x2F;Berlin &#x2F;etc&#x2F;localtime&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;code&gt;hwclock --systohc&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;h3 id=&quot;generate-required-locales&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#generate-required-locales&quot; aria-label=&quot;Anchor link for: generate-required-locales&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;a&gt;
Generate required locales&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;code&gt;vim &#x2F;etc&#x2F;locale.gen&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;code&gt;locale-gen&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;h3 id=&quot;set-the-desired-locale&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#set-the-desired-locale&quot; aria-label=&quot;Anchor link for: set-the-desired-locale&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;a&gt;
Set the desired locale&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;code&gt;echo &#x27;LANG=en_US.UTF-8&#x27; &amp;gt; &#x2F;etc&#x2F;locale.conf&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;h3 id=&quot;set-desired-keymap-and-font&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#set-desired-keymap-and-font&quot; aria-label=&quot;Anchor link for: set-desired-keymap-and-font&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;a&gt;
Set desired keymap and font&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;code&gt;echo &#x27;KEYMAP=us&#x27; &amp;gt; &#x2F;etc&#x2F;vconsole.conf&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;h3 id=&quot;set-the-hostname&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#set-the-hostname&quot; aria-label=&quot;Anchor link for: set-the-hostname&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;a&gt;
Set the hostname&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;code&gt;echo &#x27;&amp;lt;hostname&amp;gt;&#x27; &amp;gt; &#x2F;etc&#x2F;hostname&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;h3 id=&quot;add-hostname-to-etc-hosts&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#add-hostname-to-etc-hosts&quot; aria-label=&quot;Anchor link for: add-hostname-to-etc-hosts&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;a&gt;
Add hostname to &#x2F;etc&#x2F;hosts:&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;code&gt;vim &#x2F;etc&#x2F;hosts&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;pre style=&quot;background-color:#2b303b;color:#c0c5ce;&quot;&gt;&lt;code&gt;&lt;span&gt;127.0.0.1	localhost
&lt;&#x2F;span&gt;&lt;span&gt;::1		localhost
&lt;&#x2F;span&gt;&lt;span&gt;127.0.1.1	&amp;lt;hostname&amp;gt;.localdomain &amp;lt;hostname&amp;gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h3 id=&quot;set-password-for-root&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#set-password-for-root&quot; aria-label=&quot;Anchor link for: set-password-for-root&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;a&gt;
Set password for root&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;code&gt;passwd&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;h3 id=&quot;add-real-user&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#add-real-user&quot; aria-label=&quot;Anchor link for: add-real-user&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;a&gt;
Add real user&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;code&gt;useradd -m -g users -G wheel -s &#x2F;bin&#x2F;zsh &amp;lt;username&amp;gt;&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;code&gt;passwd &amp;lt;username&amp;gt;&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;code&gt;echo &#x27;&amp;lt;username&amp;gt; ALL=(ALL) ALL&#x27; &amp;gt; &#x2F;etc&#x2F;sudoers.d&#x2F;&amp;lt;username&amp;gt;&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;h3 id=&quot;configure-mkinitcpio-with-modules-needed-for-the-initrd-image&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#configure-mkinitcpio-with-modules-needed-for-the-initrd-image&quot; aria-label=&quot;Anchor link for: configure-mkinitcpio-with-modules-needed-for-the-initrd-image&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;a&gt;
Configure mkinitcpio with modules needed for the initrd image&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;code&gt;vim &#x2F;etc&#x2F;mkinitcpio.conf&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;pre style=&quot;background-color:#2b303b;color:#c0c5ce;&quot;&gt;&lt;code&gt;&lt;span&gt;# Optional - for f2fs module crypto-crc32 is required however
&lt;&#x2F;span&gt;&lt;span&gt;MODULES=(crypto-crc32)
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;# Important - Use the correct order
&lt;&#x2F;span&gt;&lt;span&gt;HOOKS=(base systemd autodetect modconf block keyboard sd-vconsole sd-encrypt filesystems)
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h3 id=&quot;regenerate-the-initrd-image&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#regenerate-the-initrd-image&quot; aria-label=&quot;Anchor link for: regenerate-the-initrd-image&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;a&gt;
Regenerate the initrd image&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;code&gt;mkinitcpio -P&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;h3 id=&quot;setup-systemd-boot&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#setup-systemd-boot&quot; aria-label=&quot;Anchor link for: setup-systemd-boot&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;a&gt;
Setup systemd-boot&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;code&gt;bootctl --path=&#x2F;boot install&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;h3 id=&quot;enable-intel-microcode-updates&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#enable-intel-microcode-updates&quot; aria-label=&quot;Anchor link for: enable-intel-microcode-updates&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;a&gt;
Enable Intel microcode updates&lt;&#x2F;h3&gt;
&lt;p&gt;(For AMD replace &lt;strong&gt;intel-ucode&lt;&#x2F;strong&gt; with &lt;strong&gt;amd-ucode&lt;&#x2F;strong&gt; in every step that follows)&lt;&#x2F;p&gt;
&lt;p&gt;&lt;code&gt;pacman -S intel-ucode&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;h3 id=&quot;create-bootloader-entry&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#create-bootloader-entry&quot; aria-label=&quot;Anchor link for: create-bootloader-entry&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;a&gt;
Create bootloader entry&lt;&#x2F;h3&gt;
&lt;p&gt;Get luks-uuid with:&lt;&#x2F;p&gt;
&lt;p&gt;&lt;code&gt;cryptsetup luksUUID &#x2F;dev&#x2F;nvme0n1p2&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Create the entry:&lt;&#x2F;p&gt;
&lt;p&gt;&lt;code&gt;vim &#x2F;boot&#x2F;loader&#x2F;entries&#x2F;arch.conf&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;pre style=&quot;background-color:#2b303b;color:#c0c5ce;&quot;&gt;&lt;code&gt;&lt;span&gt;title		Arch Linux
&lt;&#x2F;span&gt;&lt;span&gt;linux		&#x2F;vmlinuz-linux
&lt;&#x2F;span&gt;&lt;span&gt;initrd		&#x2F;intel-ucode.img
&lt;&#x2F;span&gt;&lt;span&gt;initrd		&#x2F;initramfs-linux.img
&lt;&#x2F;span&gt;&lt;span&gt;options		rw luks.uuid=&amp;lt;uuid&amp;gt; luks.name=&amp;lt;uuid&amp;gt;=luks root=&#x2F;dev&#x2F;mapper&#x2F;luks
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h3 id=&quot;set-default-bootloader-entry&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#set-default-bootloader-entry&quot; aria-label=&quot;Anchor link for: set-default-bootloader-entry&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;a&gt;
Set default bootloader entry&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;code&gt;vim &#x2F;boot&#x2F;loader&#x2F;loader.conf&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;pre style=&quot;background-color:#2b303b;color:#c0c5ce;&quot;&gt;&lt;code&gt;&lt;span&gt;default		arch
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h3 id=&quot;optional-setup-gnome&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#optional-setup-gnome&quot; aria-label=&quot;Anchor link for: optional-setup-gnome&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;a&gt;
(Optional) - Setup Gnome&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;code&gt;pacman -S gnome&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;code&gt;systemctl enable gdm&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;h3 id=&quot;exit-unmount-and-reboot&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#exit-unmount-and-reboot&quot; aria-label=&quot;Anchor link for: exit-unmount-and-reboot&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;a&gt;
Exit, unmount and reboot&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;code&gt;exit&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;code&gt;umount -R &#x2F;mnt&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;code&gt;reboot&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
</content>
        <summary type="html">This is a step by step installation documentation on how I install Arch Linux on my Dell XPS 13 (9370) - my primary work setup. This is quite opinionated (e.g. f2fs root partition) and not applicable on every machine out there. But perhaps a rough guideline on how to easily install Arch Linux nonetheless.</summary>
        </entry><entry xml:lang="en">
        <title>Giving Clear Linux a try</title>
        <published>2020-03-01T00:00:00+00:00</published>
        <updated>2023-11-18T00:00:00+00:00</updated>
        <author>
            <name>spissable</name>
        </author>
        <link rel="alternate" href="https://spiss.dev/blog/clear-linux/" type="text/html"/>
        <id>https://spiss.dev/blog/clear-linux/</id>
        
            <content type="html">&lt;h3 id=&quot;installation&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#installation&quot; aria-label=&quot;Anchor link for: installation&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;a&gt;
Installation&lt;&#x2F;h3&gt;
&lt;p&gt;The installation experience was very straightforward, similar to the one of Ubuntu I&#x27;d say. The graphical interface leaves next to no room for mistakes and presents you with a ready-to-go system with just a few clicks.&lt;&#x2F;p&gt;
&lt;p&gt;The only thing I was missing was F2FS (Flash-Friendly File System) support, which is my preferred filesystem. However, at the time of my writing this post, a pull request adding support for it has been &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;clearlinux&#x2F;clr-installer&#x2F;pull&#x2F;654#event-3079095310&quot;&gt;merged&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;the-good&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#the-good&quot; aria-label=&quot;Anchor link for: the-good&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;a&gt;
The Good&lt;&#x2F;h3&gt;
&lt;p&gt;The very first thing I noticed when booting Clear Linux, was the boot process itself. It is &lt;em&gt;blazing fast&lt;&#x2F;em&gt;! Despite full root encryption. I also found confirmation of that impression &lt;a href=&quot;https:&#x2F;&#x2F;phoronix.com&#x2F;scan.php?page=news_item&amp;amp;px=Clear-Linux-Kernel-3s-to-300ms&quot;&gt;here&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Since the default desktop environment of the distro is Gnome, I was then greeted by the Gnome Desktop Manager. A choice I very much support, as Gnome gives a very complete desktop experience in my opinion, including support for X11 and Wayland.&lt;&#x2F;p&gt;
&lt;p&gt;Last but not least, all the software I installed was up-to-date, which is one of the big promises on the distro&#x27;s website.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;the-bad&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#the-bad&quot; aria-label=&quot;Anchor link for: the-bad&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;a&gt;
The Bad&lt;&#x2F;h3&gt;
&lt;p&gt;While the software I installed was up-to-date, it still cost me quite some frustration. Clear Linux offers a lot of its packages in bundles, e.g. the desktop-dev bundle, which includes lots of different packages that you might need or might not. As for me, I prefer being in control of what is being installed, rather than having to get a whole bundle of things of which half of it is useless to me.&lt;&#x2F;p&gt;
&lt;p&gt;Another packaging format that is supported is &lt;a href=&quot;https:&#x2F;&#x2F;flatpak.org&#x2F;&quot;&gt;Flatpak&lt;&#x2F;a&gt;. A containerized, distribution-independent packaging format that claims to be &quot;The Future Of Apps On Linux.&quot; As they offer Visual Studio Code, which is my main code editor, I gave it a try. The first problem, the integrated terminal was not working as I was used to. The Z shell didn&#x27;t respect my config files, certain executables weren&#x27;t usable... and I am &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;Microsoft&#x2F;vscode&#x2F;issues&#x2F;44646&quot;&gt;not the only one&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Last but not least, only 1 week into the experiment, my Gnome Wayland setup didn&#x27;t load anymore, instead, I was greeted with a black screen on log-in. The X11 variant still worked though, so I tried to repair it from there. However, attempt after attempt the frustration grew bigger and bigger and I needed my system to be reliable at work, so I just decided to pull the plug and re-install the trusted Arch Linux.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;conclusion&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#conclusion&quot; aria-label=&quot;Anchor link for: conclusion&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;a&gt;
Conclusion&lt;&#x2F;h3&gt;
&lt;p&gt;I am still glad I gave Clear Linux a try and despite the problems that I faced, I am still very impressed with how far this very young distro has come. The performance is astonishing, and I hope other distros can integrate some of Clear Linux&#x27;s patches. I can&#x27;t wait to try out the next up-and-coming distro, whichever it might be.&lt;&#x2F;p&gt;
</content>
        <summary type="html">After over a year of exclusively using Arch Linux on my work laptop, the distro hopping itch has gotten the better of me and I decided to give [Clear Linux](https:&#x2F;&#x2F;clearlinux.org&#x2F;) a try. And since I don&#x27;t do half arsed things, I wiped my disk and used Clear Linux as my main distro... at least for a while.</summary>
        </entry><entry xml:lang="en">
        <title>i3wm - the world of tiling window managers</title>
        <published>2019-05-25T00:00:00+00:00</published>
        <updated>2023-11-18T00:00:00+00:00</updated>
        <author>
            <name>spissable</name>
        </author>
        <link rel="alternate" href="https://spiss.dev/blog/i3wm/" type="text/html"/>
        <id>https://spiss.dev/blog/i3wm/</id>
        
            <content type="html">&lt;h3 id=&quot;floating-vs-tiling&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#floating-vs-tiling&quot; aria-label=&quot;Anchor link for: floating-vs-tiling&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;a&gt;
Floating vs. Tiling&lt;&#x2F;h3&gt;
&lt;p&gt;The window manager landscape for the Linux ecosystem is quite crowded. Major names like Gnome, KDE or XFCE satisfy most users&#x27; needs and give a lot of room for customization. One feature that unites them is, that they are all floating window managers. It&#x27;s the concept of dragging windows around freely (mostly with your mouse), which probably everyone is familiar with from using Windows or MacOS.&lt;&#x2F;p&gt;
&lt;p&gt;On the other side, there are tiling window managers like i3, awesome or herbstluft, just to name a few. They are way less popular amongst the average user, but the concept of automatically tiling windows by default, not just helps you to stay organized, but enforces it. And once you get accustomed to it, you&#x27;ll find your workflow to be vastly improved in speed.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;i3wm&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#i3wm&quot; aria-label=&quot;Anchor link for: i3wm&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;a&gt;
i3wm&lt;&#x2F;h3&gt;
&lt;p&gt;i3wm has been my window manager of choice for some years now whenever I&#x27;m working on a Linux machine. Initially, I encountered it during a presentation at the university. I had been using Linux for years at that point, but I wasn&#x27;t familiar with the concept of tiling window managers. Clearly impressed, I installed it right away and well... it was a game changer. A few of the main features (for me):&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Tiling (duh.)&lt;&#x2F;li&gt;
&lt;li&gt;Binding applications to workspaces&lt;&#x2F;li&gt;
&lt;li&gt;Horizontal &#x2F; Vertical &#x2F; Tabbed &#x2F; Stacked &#x2F; Floating&lt;&#x2F;li&gt;
&lt;li&gt;Configuration in a single config file&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;binding-applications-to-workspaces&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#binding-applications-to-workspaces&quot; aria-label=&quot;Anchor link for: binding-applications-to-workspaces&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;a&gt;
Binding applications to workspaces&lt;&#x2F;h3&gt;
&lt;p&gt;In order to stay truly organized in a tiling window manager environment, it&#x27;s quite fundamental that your windows open in pre-defined workspaces. Otherwise, your screen would become really crowded, really fast. This is how I organize my workspaces:&lt;&#x2F;p&gt;
&lt;p&gt;1: Browsers&lt;&#x2F;p&gt;
&lt;p&gt;2: Editors&lt;&#x2F;p&gt;
&lt;p&gt;3: Terminals&lt;&#x2F;p&gt;
&lt;p&gt;4: Communication&lt;&#x2F;p&gt;
&lt;p&gt;5: Music&lt;&#x2F;p&gt;
&lt;p&gt;Scratchpad: Notes&lt;&#x2F;p&gt;
&lt;p&gt;With this setup, I got my everyday needs covered. It became second nature to me and going back to any other window manager without this feature (which I occasionally do, because I love to experiment) is just a pain in the ass.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;configuration&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#configuration&quot; aria-label=&quot;Anchor link for: configuration&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;a&gt;
Configuration&lt;&#x2F;h3&gt;
&lt;p&gt;All keybinds, workspaces etc. are configured in one config file (~&#x2F;.config&#x2F;i3&#x2F;config). While this might be a little bit intimidating at first, it becomes more and more advantageous with time. i3 has great documentation for beginners, making it quite easy to tailor the window manager the way you like it. And once configured, you can just backup your configuration file and have it ready whenever you decide to install a new OS.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;additional-tools&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#additional-tools&quot; aria-label=&quot;Anchor link for: additional-tools&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;a&gt;
Additional tools&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;strong&gt;Polybar:&lt;&#x2F;strong&gt; Alternative, feature-rich and beautiful status bar&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Rofi:&lt;&#x2F;strong&gt; Application launcher, window switcher and much more&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Udev rule + systemd service + bash script:&lt;&#x2F;strong&gt; to properly manage monitor hotplug&lt;&#x2F;p&gt;
&lt;h3 id=&quot;helpful-resources&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#helpful-resources&quot; aria-label=&quot;Anchor link for: helpful-resources&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;a&gt;
Helpful resources&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;i3wm.org&#x2F;docs&#x2F;&quot;&gt;i3 documentation&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;swaywm.org&#x2F;&quot;&gt;Sway (Wayland implementation of i3)&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;www.reddit.com&#x2F;r&#x2F;unixporn&#x2F;&quot;&gt;Subreddit for inspiration&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;Spissable&#x2F;dotfiles&#x2F;&quot;&gt;My dotfiles&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
</content>
        <summary type="html">Disclaimer: If you prefer your system to be production ready right away, shiny to the very last pixel and intuitive without spending some time to get used to it, then i3 is most likely not for you. For anyone else, enjoy the post and I hope you&#x27;ll give it a try yourself!</summary>
        </entry>
</feed>
