<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Feel the magic of kool.</title><link>https://vladde.net/</link><description>Recent content on Feel the magic of kool.</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Sat, 01 Aug 2026 01:43:39 +0200</lastBuildDate><atom:link href="https://vladde.net/index.xml" rel="self" type="application/rss+xml"/><item><title>Switching to Linux</title><link>https://vladde.net/blog/switching-to-linux/</link><pubDate>Thu, 02 Apr 2026 13:00:00 +0200</pubDate><guid>https://vladde.net/blog/switching-to-linux/</guid><description>&lt;p>making the switch sucked, but i am so happy i did and i will stay on Linux.&lt;/p>
&lt;p>i think it&amp;rsquo;s a bit unfair when sharing frustrations with switching to a new operating system.
i have decades of experience with Windows, i know where to look in the system when i need to fix something, where how to do this or that. when some new &lt;del>obstacle&lt;/del> feature was introduced, i could find out some way around that.&lt;/p></description></item><item><title>I write in lowercase</title><link>https://vladde.net/blog/i-write-lowercase/</link><pubDate>Thu, 02 Apr 2026 12:00:00 +0200</pubDate><guid>https://vladde.net/blog/i-write-lowercase/</guid><description>&lt;p>i decided that from now on, i&amp;rsquo;ll just write my blog posts the way i normally do: i follow pretty much all grammatical rules, except i don&amp;rsquo;t do uppercase letters.&lt;/p>
&lt;p>the exceptions to this are names and shortenings of not too-well-known names. i will capitalize names like Windows, macOS, Debian, POSIX, GNOME, NixOS, GTK, Intel, AMD, POLA, etc.&lt;/p>
&lt;p>i will probably not capitalize names like json, laser, usb, ssd, and such because i think they are common enough for most people to use as just normal words.&lt;/p></description></item><item><title>Replacing Google Search with Kagi</title><link>https://vladde.net/blog/kagi-replacement-for-google-search/</link><pubDate>Mon, 12 May 2025 19:37:36 +0200</pubDate><guid>https://vladde.net/blog/kagi-replacement-for-google-search/</guid><description>&lt;p>&lt;a href="https://kagi.com/">Kagi&lt;/a> is a paid search engine, and I&amp;rsquo;ve been using it for about three months now.&lt;/p>
&lt;p>I like, and I will continue using it. It&amp;rsquo;s not only that it&amp;rsquo;s a competitor with Google (hooray underdog!), but it actually provides some features that I use.&lt;/p>
&lt;h2 id="quality-of-results">Quality of results&lt;/h2>
&lt;p>The quality of the search results are really good. When I first made the switch I was very skeptical of the overall quality of the results.&lt;/p></description></item><item><title>Using Swift macros for better DX</title><link>https://vladde.net/blog/swift-macros-for-ourselves/</link><pubDate>Mon, 12 May 2025 00:00:00 +0200</pubDate><guid>https://vladde.net/blog/swift-macros-for-ourselves/</guid><description>&lt;p>When migrating our app to become Swift 6 compatible, I took the opportunity to take a look into Swift macros, since our storage helper had a lot of duplicate boilerplate code.&lt;/p>
&lt;h2 id="using-macros">Using macros&lt;/h2>
&lt;p>Mapping API data models to Core Data models included a lot of (almost) duplicate code for every method: calling code in the correct context, fetching existing (or creating new) models, saving context, etc.&lt;/p>
&lt;p>I created a macro which smooths out this process, while still being type-safe. This is what a mapping method looks like:&lt;/p></description></item><item><title>My Hacker News is a little bit prettier</title><link>https://vladde.net/blog/prettier-hn/</link><pubDate>Sun, 01 Sep 2024 21:12:20 +0200</pubDate><guid>https://vladde.net/blog/prettier-hn/</guid><description>&lt;p>Hacker News has a dated style. I&amp;rsquo;ve come to like the design, but it could really do with some modernization. So I did.&lt;/p>
&lt;figure>
 &lt;img src="hn-light.png" alt="Hacker News website in light mode" data-theme=light>
 &lt;img src="hn-dark.png" alt="Hacker News website in dark mode" data-theme=dark>
 &lt;figcaption>This is what I see when I go to &lt;a href=https://news.ycombinator.com/news>news.ycombinator.com&lt;/a>&lt;/figcaption>
&lt;/figure>
&lt;p>This is not a clone of the site. This is what I see when I go to &lt;em>Hacker News&lt;/em> – all done with some custom injected CSS (and JavaScript). I will put all the code at the bottom of this post.&lt;/p></description></item><item><title>My Involvement in the Inscryption Community</title><link>https://vladde.net/blog/projects/</link><pubDate>Sun, 07 Jul 2024 20:16:57 +0200</pubDate><guid>https://vladde.net/blog/projects/</guid><description>&lt;p>Ever since the release of the game Inscryption I&amp;rsquo;ve been part of the community, building tools and creating content around it.&lt;/p>
&lt;p>I&amp;rsquo;ve done so many different things, that I felt the need to write these down. This list is non-exhaustive, as I&amp;rsquo;ve probably forgtten some things.&lt;/p>
&lt;h2 id="the-list">The list&lt;/h2>
&lt;p>I made a &lt;a href="https://generator.cards">fan-made card generator&lt;/a> for the game Inscryption, that has been used over 400k times. This project started when I made &lt;a href="https://cards.vladde.me">some easily printable PDFs&lt;/a> for the base game cards.&lt;/p></description></item><item><title>SwiftUI iOS list styles (with images)</title><link>https://vladde.net/blog/swiftui-ios-list-styles/</link><pubDate>Mon, 02 Oct 2023 09:17:48 +0200</pubDate><guid>https://vladde.net/blog/swiftui-ios-list-styles/</guid><description>&lt;h2 data-rfc-heading=plain id=introduction>Introduction&lt;/h2>
&lt;p>SwiftUI provides multiple styles for list, but it might not always be obvious what difference there are between them.&lt;/p>
&lt;p>This is a comparison grid of all iOS list styles, described in [&lt;a href="https://developer.apple.com/documentation/swiftui/liststyle">STYLES&lt;/a>]. The code for the list is written out at the bottom of the page.&lt;/p>
&lt;h2 id="comparisons">Comparisons&lt;/h2>
&lt;div style='display: grid; grid-template-columns: 1fr 1fr; align-items: start;'>
 &lt;figure>
 &lt;figcaption>.plain&lt;/figcaption>
 &lt;img alt='plain style list' width=1170 height=876 src=plain.png>
 &lt;/figure>
 &lt;figure>
 &lt;figcaption>.inset&lt;/figcaption>
 &lt;img alt='inset style list' width=1170 height=876 src=inset.png>
 &lt;/figure>
 &lt;figure>
 &lt;figcaption>.grouped&lt;/figcaption>
 &lt;img alt='grouped style list' width=1170 height=876 src=grouped.png>
 &lt;/figure>
 &lt;figure>
 &lt;figcaption>.insetGrouped&lt;/figcaption>
 &lt;img alt='insetGrouped style list' width=1170 height=876 src=insetGrouped.png>
 &lt;/figure>
 &lt;figure>
 &lt;figcaption>.sidebar&lt;/figcaption>
 &lt;img alt='sidebar style list' width=1170 height=876 src=sidebar.png>
 &lt;/figure>
&lt;/div>
&lt;h3 id="code">Code&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-swift" data-lang="swift">&lt;span style="display:flex;">&lt;span>List {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> Section {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> Text(&lt;span style="color:#0ff;font-weight:bold">&amp;#34;Apple&amp;#34;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> Text(&lt;span style="color:#0ff;font-weight:bold">&amp;#34;Banana&amp;#34;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> } header: {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> Text(&lt;span style="color:#0ff;font-weight:bold">&amp;#34;Favorites&amp;#34;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> } footer: {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> Text(&lt;span style="color:#0ff;font-weight:bold">&amp;#34;The fruits which are most tasty&amp;#34;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> Section {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> Text(&lt;span style="color:#0ff;font-weight:bold">&amp;#34;Orange&amp;#34;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="references">References&lt;/h2>
&lt;dl>
 &lt;dt>[STYLES]&lt;/dt>
 &lt;dd>Apple Inc., &lt;a href="https://developer.apple.com/documentation/swiftui/liststyle">ListStyle&lt;/a>, Apple Developer Documentation&lt;/dd>
&lt;/dl></description></item><item><title>SwiftUI iOS List default selection with NavigationSplitView</title><link>https://vladde.net/blog/swiftui-splitview-default/</link><pubDate>Thu, 17 Aug 2023 02:48:52 +0200</pubDate><guid>https://vladde.net/blog/swiftui-splitview-default/</guid><description>&lt;h2 data-rfc-heading=plain id=introduction>Introduction&lt;/h2>
&lt;p>Looking through Apple&amp;rsquo;s documentation, I found no clear example of how to set a default selected option for a List in a NavigationSplitView.&lt;/p>
&lt;p>This post shows how to the the default selected option in a list, and how to best interact with a split view.&lt;/p>
&lt;h2 id="example">Example&lt;/h2>
&lt;p>Clear example of how to set a default selected option for a sidebar List in a NavigationSplitView.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-swift" data-lang="swift">&lt;span style="display:flex;">&lt;span>@State &lt;span style="color:#fff;font-weight:bold">private&lt;/span> &lt;span style="color:#fff;font-weight:bold">var&lt;/span> selectedId: &lt;span style="color:#fff;font-weight:bold">String&lt;/span>? = &lt;span style="color:#0ff;font-weight:bold">&amp;#34;banana&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>NavigationSplitView {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> List(selection: &lt;span style="color:#f00">$&lt;/span>selectedId) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> NavigationLink(value: &lt;span style="color:#0ff;font-weight:bold">&amp;#34;apple&amp;#34;&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> Text(&lt;span style="color:#0ff;font-weight:bold">&amp;#34;Apple&amp;#34;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> NavigationLink(value: &lt;span style="color:#0ff;font-weight:bold">&amp;#34;banana&amp;#34;&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> Text(&lt;span style="color:#0ff;font-weight:bold">&amp;#34;Banana&amp;#34;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>} detail: {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> Text(&lt;span style="color:#0ff;font-weight:bold">&amp;#34;&lt;/span>&lt;span style="color:#0ff;font-weight:bold">\(&lt;/span>selectedId ?? &lt;span style="color:#0ff;font-weight:bold">&amp;#34;Nothing selected&amp;#34;&lt;/span>&lt;span style="color:#0ff;font-weight:bold">)&lt;/span>&lt;span style="color:#0ff;font-weight:bold">&amp;#34;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>We use &amp;quot;&lt;code>NavigationLink&lt;/code>&amp;quot; with a &amp;quot;&lt;code>value:&lt;/code>&amp;quot; parameter instead of navigating to a new view, and keep track of the selection in &amp;quot;&lt;code>selectedId&lt;/code>&amp;quot;; the &amp;ldquo;selected&amp;rdquo; value must be optional for iOS [1].&lt;/p></description></item><item><title>Salary transparency</title><link>https://vladde.net/blog/salary/</link><pubDate>Sun, 09 Oct 2022 14:30:51 +0200</pubDate><guid>https://vladde.net/blog/salary/</guid><description>&lt;p>This is a list of all my yearly salaries for each tech job I have had.&lt;/p>
&lt;blockquote>
 
 &lt;p>By open, voluntary transparency we can help to end stigmas around discussing pay and help ensure that the next generations of people in tech are treated fairly.&lt;/p>

 &lt;footer style="text-align: right">
 &amp;mdash; Xe Iaso, &lt;cite>&lt;a href="https://xeiaso.net/blog/site-update-salary-transparency">Salary Transparency&lt;/a>&lt;/cite>
 &lt;/footer>
&lt;/blockquote>

&lt;p>Salaries are listed in Swedish kronor (SEK). To get an approximation in American dollars (USD), the rule of thumb is to divide by 10.&lt;/p></description></item></channel></rss>